Dienstag, 27. September 2011

Ein kleines OpenSCAD Tutorial

OpenSCAD ist eine Programmiersprache um parametrische 3D Objekte zu modellieren. Parametrische Objekte sind wie ein Computerprogramm. Man kann die Werte und Eigenschaften festlegen und das Programm errechnet das dementsprechende Modell. Im letzten Beispiel, einem Lagerschild, kann man sehen wie so etwas funktioniert. Werte und Eigenschaften wie Groesse, Bohrungsdurchmesser, Lagerdurchmesser und Lagertiefe koennen eingegeben werden. Die Vorteile an einem gescripteten parametrischen Objekt sind die leichte Veraenderbarkeit und Weitergabe des Codes von/an Dritte. Deshalb gewinnt OpenSCAD immer mehr Fans in der OpenSource-Szene. Vorkenntnisse im Programmieren sind nicht notwendig, OpenSCAD ist sehr einfach zu verstehen.

Das Programm laesst sich ueber die Website (openscad.org) fuer Windows und Linux herunterladen. Fuer Ubuntu Linux gibt es openscad auch in den offiziellen Repositorys.

Zu Beginn sollte man sich unbedingt die Option 'Show Axes' im Menuepunkt 'View" aktivieren. (Strg+2) Dadurch werden in der Grafikausgabe die drei Achsen x, y, z angezeigt.

Danach koennen wir auch gleich anfangen und unser erstes Objekt beschreiben.
cube([10, 10, 10]);
Nach dem druecken von F6 oder auswaehlen des Menuepunktes 'Design->Compile&Render' wird das Script kompiliert und das 3D-Modell errechnet und angezeigt.
Der Befehl cube([x, y, z]) erzeugt einen Wuerfel mit gegebenen Massen. Weitere einfache Objekte sind cylinder, welches im naechsten Beispiel vorkommt, sphere und polyhedron. Siehe dazu auch http://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Primitive_Solids

Jeder Befehl muss mit einem ; Semikolon enden, ansonsten versucht Openscad die Befehle miteinander zu verknuepfen. Wie wir gleich sehen werden ist diese Verknuepfung gewollt um Objekte zu manipulieren.

Das zweite Beispiel soll eine Bohrung in unserem cube aus dem ersten Beispiel sein. Dafuer gibt es die Funktion difference() die mehrere Objekte von einem subtrahieren kann. Das Script sieht so aus.
difference() {
    cube([10, 10, 10]);
    cylinder(h=100, r=3);
    // alle weiteren Objekte die hier stehen werden von dem ersten abgezogen
    }
// Die beiden Schraegstriche bedeuten das diese Zeile ein Kommentar ist
/* So kann
man mehrzeilige
Kommentare machen */



Wie man schon sehen kann haben wir jetzt nur eine Ecke vom Quader abgeschnitten weil der Zylinder mit dem Mittelpunkt auf der z-Achse generiert wird. Jetzt gibt es zwei Moeglichkeiten. Die erste ist den Zylinder an die gewuenschte Position zu verschieben. Mit dem Befehl translate([x, y, z]) koennen wir Objekte an eine beliebige Position verschieben. Translate aus dem Englischen bedeutet hier nicht uebersetzen sondern vielmehr versetzen.
difference() { 
    cube([10, 10, 10]); 
    translate([5, 5, 0]) { 
        cylinder(h=100, r=3); 
    } 
}
Bei diesem Beispiel koennen wir die Verknuepfung von OpenSCAD nutzen um den Code leserlicher zu gestalten.
difference() { 
    cube([10, 10, 10]); 
    translate([5, 5, 0]) cylinder(h=100, r=3); 
}
Die zweite Moeglichkeit ist den Quader und den Zylinder zusammen im Mittelpunkt des Koordinatensystems zu zentrieren. Dazu wird zu den Objekten einfach das Attribut center=true angehaengt. So ist egal wie gross der Quader wird, die Bohrung immer in der Mitte. In diesem Beispiel zeige ich noch eine weitere Transformation. Mittels rotate([x, y, z]) kann man Objekte um die drei Achsen drehen. Die Rotation wird in Grad angegeben.
difference() {
    cube([10, 10, 10], center=true);
    rotate([0, 90, 0]) cylinder(h=100, r=3, center=true);
}

Fuer parametrische Objekte brauchen wir Variablen denn wir muessen bestimmte Werte relativ zueinander berechnen damit in unterschiedlich grossen Objekten auch alles immer am richtigen Platz ist. Variablen sind einfache Ausdruecke denen ein Wert zugewiesen werden kann. Variablennamen sollten immer moeglichst passend gewaehlt werden um die Code Lesbarkeit sicherzustellen. Eine Variablenzuweisung und die Nutzung der Variable sieht wie folgt aus:
a = 10;
cube([a, a, a]);
Zu beachten ist auch hier immer das Semikolon am Ende.
So richtigen Nutzen als parametrisches Objekt hat unser Beispielcode jetzt nicht, wir werden es trotzdem machen um zu sehen wie das ganze aussehen wuerde. Die Bohrung wird mit ihrem Durchmesser angegeben und in Zeile 7 der Radius fuer die cylinder Funktion berechnet. Der Ausdruck bohrung / 2 kann auch beim cylinder hinter r= angegeben werden um sich den zwischenschritt mit der neuen variable bohrung_r zu sparen. Wenn ein berechneter Wert aber oefter gebraucht wird ist es sinnvoll ihn vorher zu berechnen und in eine neue Variable zu schreiben.
x = 10;
y = 10; 
z = 10; 
bohrung = 6; 
bohrung_ausrichtung = 90;
bohrung_r = bohrung / 2;
difference() { 
    cube([x, y, z], center=true); 
    rotate([0, bohrung_ausrichtung, 0]) 
    cylinder(h=100, r=bohrung_r, center=true); 
}
Ein parametrisches Objekt koennte man als Modul bauen welches dann mit einer einzigen Zeile immer und immer wieder erzeugt werden kann. Dem Modul muessen die Werte natuerlich mitgeteilt werden und welche das sind wird vorher in die Modul Definition geschrieben. Ausserdem werden die Variablen dafuer gebraucht um sie im Modul Code einzusetzen. Im Beispiel werden wir das Modul beispiel mit unseren Variablen definieren.

beispiel(x=10, y=10, z=10, bohrung=6, bohrung_ausrichtung=90);

translate([0, 15, 0]) beispiel(10, 10, 10, 6, 90);


module beispiel(x, y, z, bohrung, bohrung_ausrichtung) {
    bohrung_r = bohrung / 2;

    difference() {
        cube([x, y, z], center=true);
        rotate([0, bohrung_ausrichtung, 0])
            cylinder(h=100, r=bohrung_r, center=true);
    }
}

Hier einmal ein sinnvolles Beispiel fuer ein parametrisches Objekt. Mit diesem Script kann man ein Lagerschild machen welches voll auf die eigenen Beduerfnisse zugeschnitten ist. So kann man die Teile verbauen die man grad da hat. Einfach nur Schrauben und Lager vermessen, ins Script eintragen und rendern lassen.
lagerschild(100, 10, 8, 60, 20, 8, 10);

module lagerschild(laenge, dicke, bohrung, bohrabstand, lagerdurchmesser, lagerdicke, wellendurchmesser) {
    difference() {
        scale([1, 0.5, 1]) cylinder(h=dicke, r=laenge/2);        // ovale Grundform
        translate([bohrabstand/2, 0, 0]) cylinder(h=dicke, r=bohrung/2);    // 1. Bohrung
        translate([-bohrabstand/2, 0, 0]) cylinder(h=dicke, r=bohrung/2);    // 2. Bohrung
        translate([0, 0, dicke-lagerdicke]) cylinder(h=lagerdicke, r=lagerdurchmesser/2);    // Lagersitz
        cylinder(h=dicke, r=wellendurchmesser/2);        // Bohrung fuer Welle
    }
}


Dieses Tutorial umfasst bei weitem noch nicht den gesamten Funktionsumfang von OpenSCAD bietet dennoch eine kleine Einfuehrung fuer Neulinge. Ich werde demnaechst vllt noch ein Tutorial zu for und while Schleifen schreiben. Ein Blick in das OpenSCAD Wikibook ist auf jedenfall empfehlenswert.

Sonntag, 25. September 2011

Gegenstände aus dem 3D Drucker

Ich habe seit einigen Monaten einen Prusa Mendel 3D Drucker. Hier will ich mal zeigen was man damit alles schönes machen kann.