10. Konturen

10.1 Platte mit gerundeten Ecken

Holen wir das Brett mit den Löchern aus Kapitel 4.7.1. Es wäre schön, wenn es abgerundete Ecken hätte.

druckansicht

Auf der Skizze ist bereits angedeutet, wie die ‚runden Ecken‘ hergestellt werden. An jeder Ecke setzen wir eine Scheibe an, die anschliessend zu einer Fläche verschmolzen wird.

druckansicht

10.1.1 Gerundete Ecken

Gehen wir das Ganze Schritt für Schritt an. Das Brett mit den Löchern soll über Konstanten definiert werden. Wir benötigen Länge, Breite, Dicke sowie die Rundung der Ecken. Ihr habt sicher schon bemerkt, dass die Konstanten in den Beispielen immer klein geschrieben sind. Sie könnten auch groß oder gemischt geschrieben werden, müssen aber innerhalb des Codes stets einheitlich verwendet werden. Rundung ist nicht dasselbe wie rundung!

Die Scheiben sind 2D-Objekte, die mit circle() erstellt werden. Ohne linear_extrude() entsteht nur ein dünnes Objekt. Zunächst erstellen wir zunächst nur eine Scheibe bei 0,0.

$fn=60; // Auflösung von Kreisen
lang=80;
breit=40;
dick=5;

rundung=3;

translate([0,0,0])
  circle(rundung);

Das Resultat ist eine Scheibe, die zwar zentral bei 0,0 liegt, aber um den Radius 3 in x- und y-Richtung verschoben wird.

druckansicht

Das wollen wir nicht – das Brett soll genau bei 0,0 liegen. Deshalb benötigen wir ein translate(), um die rundung auszugleichen.

translate([rundung,rundung,0])
  circle(rundung);

Schon besser! Nun kann die rundung beliebig verändert werden, die Scheibe liegt bei 0,0.

druckansicht

Die erste Scheibe bildet unsere erste gerundete Ecke. Als Nächstes kommt die zweite Scheibe, die die Breite des Brettes markieren soll. Mit translate([breite - rundung, rundung, 0]) wird die zweite Scheibe genau die Breite ‚berühren‘.

translate([breit-rundung,rundung,0])
  circle(rundung);

Damit wir etwas sehen, muss aus der Ansicht gezoomt werden (Mausrad).

druckansicht

Ändern wir rundung = 5 auf den Wert 5. Ergebnis: Die Breite des Brettes wird dadurch nicht größer.

Die beiden Scheiben am Ende des Brettes fehlen noch. Wie bei der Breite muss translate() in y auf lang - rundung gesetzt werden. Andernfalls würde das Brett je nach Rundung länger werden

translate([breit-rundung,lang-rundung,0])
  circle(rundung);
translate([rundung,lang-rundung,0])
  circle(rundung);

Auch hier muss nochmals heraus gezoomt werden damit wir die hinteren Scheiben sehen können.

druckansicht

Breite, Länge und Rundung können nun beliebig geändert werden.

10.1.2 Hülle

Nun brauchen wir nur noch eine Hülle, um die Scheiben herum zu legen. Die Punkte deuten den bereits geschriebenen Code mit den vier Scheiben an.

hull() {
  ...
  ...
}

Schön einfach nicht?

druckansicht

Was noch fehlt, ist die Dicke. Dazu legen wir um hull() { ... } die bereits bekannte Funktion linear_extrude(...) mit der Dicke dick.

  linear_extrude(dick) {
    hull() {
     ...
     ...
   }
  }

Nun hat unser Brett auch eine richtige Dicke.

druckansicht

10.1.3 Löcher

Die Funktion difference() ist ja bereits bekannt. Wir legen um linear_extrude() und hull() ein difference() { ... }. Wichtig dabei ist: Zu jeder öffnenden Klammer muss eine schließende Klammer gehören.

difference() {
  linear_extrude(dick) {
    hull() {
     ...
     ...
   }
  }
  // hier folgen die Löcher
  ...
}

Uns fehlen noch die Konstanten loch und delta. Bisher haben wir die Konstanten am Anfang des Codes definiert, aber wir können sie auch mitten im Code festlegen

   ...
  // hier folgen die Löcher
  loch=3;
  delta=2;
  ...
}

Definieren wir das erste Loch direkt nach den Konstanten. Dabei verschieben wir das Loch um den Radius des Loches und zusätzlich um den delta-Wert. So können wir sowohl die Größe als auch die Position des Loches über Konstanten verändern

   ...
  // hier folgen die Löcher
  loch=3;
  delta=2;
  // erstes Loch
  translate([delta+loch,delta+loch,-0.1])
    linear_extrude(dick+0.2)
        circle(loch);

}

Das erste Loch sitzt perfekt. Ändern wir nun die Werte und sehen, was passiert.

druckansicht

Die restlichen drei Löcher sind dann reine Formsache, aber man muss stets delta und loch richtig zusammenrechnen, denn hinten wird nicht addiert, sondern subtrahiert.

  // hier folgen die Löcher
  loch=3;
  delta=2;
  // erstes Loch
  translate([delta+loch,delta+loch,-0.1])
    linear_extrude(dick+0.2)
        circle(loch);
  translate([breit-delta-loch,delta+loch,-0.1])
    linear_extrude(dick+0.2)
        circle(loch);
  translate([breit-delta-loch,lang-delta-loch,-0.1])
    linear_extrude(dick+0.2)
        circle(loch);
  translate([delta+loch,lang-delta-loch,-0.1])
    linear_extrude(dick+0.2)
        circle(loch);

Spielt mit den verschiedenen Werten und beobachtet das Ergebnis.

druckansicht

10.2 Würfel mit gerundeten Ecken

Im Kapitel 6 haben wir uns einen Würfel zusammengestellt. Würfel haben jedoch meist gerundete Ecken – auch das ist mit hull() möglich. Statt Scheiben werden Kugeln verwendet. Ich nehme den Code von oben und lösche die Löcher, linear_extrude(), hull() und difference().

Die circle(loch)-Befehle ersetze ich durch sphere(loch), und bei den translate()-Befehlen wird zusätzlich z um die Rundung angehoben. Damit entsteht bereits der untere Teil des Würfels.

$fn=60; // Auflösung von Kreisen
lang=50;
breit=50;
dick=5;

rundung=3;

  translate([rundung,rundung,rundung])
    sphere(rundung);
  translate([breit-rundung,rundung,rundung])
    sphere(rundung);
  translate([breit-rundung,lang-rundung,rundung])
    sphere(rundung);
  translate([rundung,lang-rundung,rundung])
    sphere(rundung);

Die vier Eckkugeln sind gesetzt.

druckansicht

Wir können bereits ein hull() um diesen Teil legen, erhalten damit aber nicht die gewünschte Höhe. Die Höhe entspricht der Kugel oder dem doppelten Wert von rundung = 3 (PS: rundung ist der Radius, nicht der Durchmesser).

druckansicht

Es müssen noch weitere Kugeln hinzugefügt werden, nämlich vier Kugeln für die anderen Ecken des Würfels. Unterhalb der bereits bestehenden Kugeln, aber vor der geschweiften Klammer, fügen wir den Code für die zusätzlichen Kugeln ein. Diese werden in z um die Dicke nach oben verschoben.

  translate([rundung,rundung,dick-rundung])
    sphere(rundung);
  translate([breit-rundung,rundung,dick-rundung])
    sphere(rundung);
  translate([breit-rundung,lang-rundung,dick-rundung])
    sphere(rundung);
  translate([rundung,lang-rundung,dick-rundung])
    sphere(rundung);

Was ist hier los? Obwohl nun acht Kugeln im Code stehen, sieht das Ergebnis genau gleich aus!

druckansicht

Uhhh, die Konstante dick = 5; ist noch falsch. Hier müsste 50 stehen...

...solche Probleme können immer wieder auftreten. Einfach die Nerven bewahren und alles noch einmal durchdenken.

druckansicht

Mit hull() können ganz unterschiedliche geometrische Formen umhüllt werden. Einfach ausprobieren – es geht ja nichts kaputt.