CoffeeSCad ist ein Open Source Projekt mit dem Ziel ein CAD-Programm der anderen Art bereitzustellen. Hat man üblicherweise die Möglichkeit auch einmal per Script etwas zu fabrizieren, geht es hier gar nicht ohne. Startet man los sieht man Folgendes:
Kaum ändert man etwas an dem Code, wird schon neu berechnet. Dieses Verhalten kann bei komplexen Objekten etwas nerven – weil Leistungshungerig – , läßt sich aber auch ausschalten. Es läuft nämlich im Browser und kann vom GitHub bezogen und selbst gehostet werden. Es soll später auch eine Desktop-Version geben. Für mich interessant ist es, weil es stl-Files exportieren kann.
Als Script-Sprache kommt überigens eine Variante von CoffeeScript zum Einsatz, das direkt in JavaScript übersetzbar. Was ist aber das Besondere an einem Script-Basierten Ansatz?
Parameterei
Ich habe gleich einmal ein CoffeeSCad-Script gebastelt, was etwa 2 Stunden gedauert hat. Es erstellt einen Drehknopf. Dabei kann man Durchmesser, Anzahl der Ausnehmungen und Farbe als Variablen fest setzen und erhält prompt das Ergebnis. Das erneute Berechnen dauert dann nur etwa 3 Sekunden.
Kleiner und mit weniger Ausnehmungen?
Größer?Oder einmal in einer anderen Farbe?
CoffeeScript gibt einem dabei die Möglichkeit mit z.B. Schleifen automatisiert Objekte zu erstellen oder neu zu Positionieren.
Man lese selbst:
# variablen
ausnehmungen= 12
durchmesser= 36
knobcolor= [0.5,0,0.1]
#
# wir bauen einmal den Basis-Knopf
knobBase= new Cylinder( { r1:durchmesser/2, r2:durchmesser/2-2, h:20, center:[0,0,10] } )
knobBase.color(knobcolor)
assembly.add(knobBase)
knobTop= new Cylinder( { r1:durchmesser/2-2, r2:durchmesser/4, h:3, center:[0,0,21.5] } )
knobTop.color(knobcolor)
knobBase.union(knobTop)
#
# wir generieren einen Cylinder den wir mehrfach ausschneiden
knobCut= new Cylinder( { r1:durchmesser*3.14/(ausnehmungen*3.5), r2:durchmesser*3.14/(ausnehmungen*2.3), h:15, center:[0,0,17] } )
knobCut.color(knobcolor)
knobCut.translate([durchmesser/2-1,0,0])
#
# wir schneiden aus
knobBase.subtract(knobCut)
knobBase.subtract(knobCut.rotate([0,0,360/ausnehmungen])) for test in [1..ausnehmungen]