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.

druckansicht

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:

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.

druckansicht

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.

druckansicht

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.

druckansicht

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.

druckansicht

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

druckansicht

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 …

druckansicht

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.

druckansicht

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:

druckansicht

Als erstes erstellen wir ein Polygon mit mehreren Punkten.

druckansicht

Schon fertig!

Nun exportieren wir unser Polygon und achten auf folgende Einstellungen:

druckansicht

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:

druckansicht

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

druckansicht

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.

druckansicht

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

druckansicht

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

druckansicht

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

druckansicht

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

druckansicht

... 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.

druckansicht

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

druckansicht

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

druckansicht

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.