16. 2D Konturen mit polygon() oder durch SVG-Import
In diesem Abschnitt soll das Pferd etwas aufgepeppt werden. Im Bild sehen wir, wie es aussehen soll. Es bekommt einen Sockel wie der Turm und ein vereinfachtes „Pferdeprofil".
Wenn wir mit den bekannten Befehlen ein solches Profil als 2D-Figur machen wollten, müssten wir von einem Basis-cube() mit sieben weiteren cube() mit difference() zurechtschneiden. So dargestellt im letzten der drei Bilder.

Einfacher wäre es, wenn wir eine Reihe von Punkten mit x,y aufzählen könnten, die das Programm zu einem Polygon verbinden könnte.
Was ist ein Polygon?
Wiki: Ein Polygon oder auch Vieleck ist in der elementaren Geometrie eine ebene geometrische Figur, die durch einen geschlossenen Streckenzug gebildet wird.
16.1 Der Befehl polygon()
Der Basisaufbau von polygon() wird im ersten Teil des Beispiels beschrieben. Dabei werden vier x,y-Punkte in eckigen Klammern und mit einem Komma getrennt aneinandergereiht:
- [0,0],[20,0],[20,10],[0,10],[0,0]
- Um das Ganze kommt nochmals eine eckige Klammer: [[0,0],[20,0],[20,10],[0,10],[0,0]]
- Und davor das Wort points=
Das polygon() bekommt dann mit linear_extrude() noch die Höhe von 5.
Der zweite Teil zeigt das gleiche Resultat, aber mit einem cube() gemacht.
translate([0,0,0])
linear_extrude(5)
polygon(points=[[0,0],[20,0],[20,10],[0,10],[0,0]]);
color("green")
translate([0,20,0])
cube([20,10,5]);
Die beiden Objekte haben die genau gleiche Grösse. Um einen einfachen cube() zu machen, eignet sich polygon() daher nicht.

Was aber, wenn wir mitten im polygon() einen Punkt einfügen?
translate([0,0,0])
linear_extrude(5)
polygon(points=[[0,0],[20,0],[20,10],[10,5],[0,10],[0,0]]);
Ahh, nun beginnt der Befehl Sinn zu machen. Der drittletzte Punkt [10,5] macht uns einen Einschnitt.

Auf diese Art können wir beliebig viele Punkte eines Umrisses aneinanderreihen.
16.1.1 Grundform des Pferdeprofils
Wenn wir die Punkte des Pferdeprofils im Gegenuhrzeigersinn beschreiben, sieht das wie folgt aus:
hoch=18;
feld=hoch/8;
linear_extrude(4)
polygon(points=[[0,0],[4*feld,0],
[2*feld,3*feld],[2*feld,5*feld],
[4*feld,5*feld],[4*feld,6*feld],
[2*feld,7*feld],[2*feld,8*feld],
[1*feld,7*feld],[1*feld,5*feld]]);
Wie in der Skizze ersichtlich, wurde ein hoch=18 und ein feld=hoch/8 definiert. Mit diesen beiden Werten wird jeder Punkt beschrieben. Den letzten Punkt [0,0] können wir weglassen. Die Funktion polygon() schliesst die Punktfolge selber ab.
Macht sich doch schon ganz gut.

16.1.2 Pferdeprofil gedreht und mit Sockel
Das Ganze muss nun noch gedreht und mit einem Sockel versehen werden:
module pferd(x,y,farbe) {
color(farbe) {
translate([(x-1)*feld+feld/2,(y-1)*feld+feld/2,dick]) {
union(){
// Boden
linear_extrude(skale*z_sockel)
circle(skale*sockel);
// Kegel 1
translate([0,0,skale*z_sockel-0.1])
cylinder(skale*z_erster+0.1,skale*sockel,skale*r_unten);
// Pferd
hoch=18;
feld=hoch/8;
translate([-(skale*2),-(2*feld),skale*(z_sockel+z_sockel)-0.1]) {
rotate([90,0,90])
linear_extrude(skale*4)
polygon(points=[[0,0],[4*feld,0],
[2*feld,3*feld],[2*feld,5*feld],
[4*feld,5*feld],[4*feld,6*feld],
[2*feld,7*feld],[2*feld,8*feld],
[1*feld,7*feld],[1*feld,5*feld]]);
}
}
}
}
}
Das Pferd sieht nun schon ganz hübsch aus.

Aber leider genügt das noch nicht. Das schwarze Pferd muss ja in die andere Richtung schauen!
Als Erstes wird der Aufruf von pferd() mit einem weiteren Parameter erweitert.
pferd(2,1,"dimgray",false);
module pferd(x,y,farbe,normal) {
...
Das false soll definieren, ob das Pferd normal dasteht oder eben nicht. Mit einem if (normal) können wir die Drehrichtung wie gewünscht steuern. Der Code zeigt nur den polygon()-Abschnitt, der nun zweimal, aber mit verschiedenem rotate() versehen ist. Der gesamte Code für das „neue" Pferd ist im Anhang.
if (normal) {
translate([-(skale*2),-(2*feld),skale*(z_sockel+z_sockel)-0.1])
rotate([90,0,90])
linear_extrude(skale*4)
polygon(points=[[0,0],[4*feld,0],
[2*feld,3*feld],[2*feld,5*feld],
[4*feld,5*feld],[4*feld,6*feld],
[2*feld,7*feld],[2*feld,8*feld],
[1*feld,7*feld],[1*feld,5*feld]]);
} else {
translate([(skale*2),(2*feld),skale*(z_sockel+z_sockel)-0.1])
rotate([90,0,-90])
linear_extrude(skale*4)
polygon(points=[[0,0],[4*feld,0],
[2*feld,3*feld],[2*feld,5*feld],
[4*feld,5*feld],[4*feld,6*feld],
[2*feld,7*feld],[2*feld,8*feld],
[1*feld,7*feld],[1*feld,5*feld]]);
}
Im Bild sehen wir, dass die weissen Pferde in Richtung der schwarzen Steine schauen und die schwarzen Pferde in Richtung der weissen Steine schauen

16.2 2D Konturen durch SVG-Import
Was, wenn das gewünschte Polygon viel komplexer und mit Kurven oder Bögen versehen sein muss? OpenSCAD kennt die Möglichkeit, externe SVG-Dateien zu laden.
Scalable Vector Graphics (kurz auch SVG, englisch für skalierbare Vektorgrafik) ist die vom World Wide Web Consortium (W3C) empfohlene Spezifikation zur Beschreibung zweidimensionaler Vektorgrafiken.
SVG-Dateien sind 2D-Vektorgrafiken – genau wie auch ein polygon(). SVG-Grafiken können in verschiedensten Apps erstellt werden, zum Beispiel in LibreOffice Draw, Affinity Publisher und vielen mehr.
16.2.1 Dann halt mit Affinity
Ich habe verschiedene Online-Apps gesucht, konnte aber keine finden, die die nötigen Funktionen hat, die wir für unsere Projekte brauchen. Affinity ist mittlerweile eine Gratis-App und kann alles – und noch viel mehr –, was wir brauchen. Alles können heisst aber auch etwas komplexer.
Hier zum Download von Affinity: https://www.affinity.studio/de_de/download
Die Installation funktioniert wie bei „normalen" Programmen. Vermutlich muss noch ein Konto bei Affinity erstellt werden. Da ich Affinity mit Konto bereits länger habe, kann ich diesen Vorgang hier nicht zeigen – das wird aber keine Hexerei sein.
Nach dem Start von Affinity 2 erscheint ein Startdialog mit verschiedenen Seiten für Konto, Neu, Öffnen und mehr …

Wählen wir „Neu" und wählen ein A4-Blatt. Ränder etc. können wir so belassen, wie es vorgeschlagen wird. Über die Schaltfläche Erstellen wird das leere A4-Blatt erstellt.

Das Aussehen und die Anordnung der verschiedenen Bereiche können vom Bild stark abweichen. Das Programm öffnet jeweils in der letzten Anordnung aller Werkzeuge und eingeblendeten Funktionen!
Schauen wir uns die Oberfläche anhand des Bildes an:
- Der Pfeil (1) und der kleinere ausgefüllte Pfeil stehen für den Selektionspfeil und den Bearbeitungspfeil.
- Alle Schaltflächen (2) darunter stehen für verschiedene Elemente und Funktionen, die eingefügt werden können.
- Jedes eingefügte Element hat eine „Farbe", „Farbfelder" und „Kontur", die je nach aktivem Reiter (3) bearbeitet werden können.
- Elemente und Punkte von Elementen haben eine X-, Y-, B-, H-Koordinate (4) sowie einen Drehwinkel, die manuell eingegeben werden können.
- Hier ist unser Arbeitsfeld.(5)

Als erstes erstellen wir ein Polygon mit mehreren Punkten.
- Funktion Linie wählen (1)
- Eine Reihe Punkte aneinander reihen (2,3,4,5)
- Der letzte Punkt (6) präzis auf den ersten Punkt setzen

Schon fertig!
Nun exportieren wir unser Polygon und achten auf folgende Einstellungen:
- Datei/Exportiren (1)
- Wählen des Dateityps - SVG (2)
- Dateieinstellung - SVG (für Export)(3)
- Bereich - Nur Auswahl (4)
- Exportieren (5)

Es braucht dann noch ein Zielverzeichnis und einen Namen für die SVG-Datei. Ich wähle gleich wieder das Schach-Verzeichnis, in dem schon andere SVG-Dateien gespeichert sind
16.2.2 Importieren der SVG-Datei
Hier ist der korrigierte Text:„Nun kommt noch das Importieren der erstellten SVG-Datei. Mit OpenSCAD ist es dann nur eine Zeile Code, um die SVG-Datei zu laden. Der Befehl import("affinity_1.svg"); setzt aber voraus, dass die OpenSCAD-Datei – im Beispiel „Lernen_16_polygon.scad" – im gleichen Verzeichnis wie die Datei „affinity_1.svg" gespeichert ist. Wenn die beiden Dateien nicht am gleichen Ort gespeichert sind, braucht es den entsprechenden Dateipfad.
import("affinity_1.svg");
Ein kompletter Dateipfad könnte unter Windows wie folgt aussehen:
import("G:/3d/OpenSCAD/Verschiedenes/Schach/affinity_1.svg");
Das Resultat schaut dann so aus:

Nun können wir alle OpenSCAD-Transformationen auf das Objekt anwenden. Im Beispiel wurde nur ein linear_extrude() angewendet.

linear_extrude(24)
import("G:/3d/OpenSCAD/Verschiedenes/Schach/affinity_1.svg");
Wir können aber auch difference(), resize(), translate(), rotate() oder was auch immer damit anstellen.
16.2.3 PS: vieles ist machbar mit Affinity
Mit Affinity kann jede noch so komplexe 2D-Form erstellt werden. Hier werden zum Beispiel die Geraden zwischen den Punkten mit dem „Bearbeitungspfeil" angepasst.

Auch kann mit dem gleichen Pfeil eine gerade Linie "verbogen" werden.

Auch kann mit dem gleichen Pfeil eine gerade Linie „verbogen" werden.Die Ankerpunkte, die dabei entstehen, können wiederum beliebig verschoben werden.

Nun gleich wieder in den Selektionsmodus (1), unter Farbfelder (2) für die Fläche eine andere Farbe wählen (3).

Dann noch einen Kreis auf die Fläche setzen...

... im Selektionsmodus zuerst das Polygon, dann den Kreis selektieren (das ist etwas schwierig, da mein Kreis eine Kontur von 0.2 mm hat und darum kaum sichtbar ist) und mit der rechten Maustaste Geometrie/Subtrahieren wählen.

Funktioniert gleich wie wenn wir mit OpenSCAD ein difference() gemacht hätten … hätten wir aber auch dort machen können.

Das selektierte Objekt exportieren wir dann wieder in eine SVG-Datei und laden sie mit OpenSCAD...

OK, das ging nun etwas schnell, aber es zeigt die Möglichkeiten, wie externe SVG-Dateien erstellt und eingebunden werden können. Im nächsten Kapitel werden wir eine weitere Grafik mit Affinity erstellen.
Auf YouTube gibt es unzählige Videos darüber, wie mit Affinity gearbeitet werden kann. Schaut doch mal, was da so alles geht.