2013-12-28

BlenderSCAD - Blender im OpenSCAD-Modus

Irgendwie bin ich immer noch auf der Suche nach dem idealen CAD Tool für meine Zwecke.
Bislang habe ich Tinkercad, OpenSCAD, Blender, Sketchup und auch DesignSpark bemüht.
Einige andere auch nur kurz ausprobiert und gleich wieder verworfen.

Am liebsten sollte das ideale Design-Werkzeug überall lokal laufen (auch auf mobilen Geräten), OpenSource und möglichst keine Bloat-Ware sein.
Die Designs sollten wiederverwendbar sein, nicht nur auf der Ebene der STL-Files, sondern semantisch reicher, inklusive Hierarchien und Gruppierungen (Beispielsweise lässt Tinkercad zwar ein Ungroup zu, aber man kann Entwürfe nachträglich nicht zusammenführen oder exportieren).
OpenSCAD ist in vielen Punkten momentan mein Favorit. Insbesondere, weil ich meine Berechnungen später noch nachvollziehen und anpassen kann. Alleine mit Quadern und Zylindern kommt man schon relativ weit. Einzig bei abgerundeten Kanten und speziellen Profilen wünschte man sich, dass es eine eifache, deklarative Lösung gäbe.
Potentiell kann man seine Designs sogar im Thingiverse Customizer anbieten.
Grösste Schwäche ist das oft sehr langsame Compilieren [Vorsicht mit $fn=50 und minkowski()  :-) ] und manche Darstellungsprobleme in der OpenCSG Ansicht.

Auf der anderen Seite gibt es eben Blender, das vom Funktionsumfang her kaum zu schlagen ist. Insbesondere die Modifier, wie Decimate und Bevel (Kanten abrunden) sind doch recht nützlich. Die Bedienung ist gewöhnungsbedürftig, wie man überall lesen kann.
Mehr noch, ich fand die extrem düstere Farbgebung des UIs bei der ersten Begegnung alles andere als einladend (verglichen mit dem verspielten, farbenfrohen Tinkercad).
Gruppieren geht verglichen mit Tinkercad "nur" via Join oder über eine Parent-Objekt Beziehung. Boolsche Operationen führen ab und an aus unerklärlichen Gründen zu Fehlermeldungen. Grund genug, sich anfangs erstmal mit Tinkercad und OpenSCAD zu beschäftigen.

Nun habe ich mich Blender in einem zweiten Anlauf genähert, mit dem Gedanken, ob es nicht doch das Beste aus beiden Welten in einer Lösung gibt. Für Blender gibt es jede Menge Add-Ons, die in Python geschrieben werden und das Blender-UI weist auch durch Mouse-Over Infos immer wieder auf Python API Bezeichnungen hin. Daher schien es leicht, erst mal mit einer Art Macro der Objekterzeugung zu nähern.

Um es vorweg zu nehmen. Hier ist mein momentanter Stand eines OpenSCAD-ähnlichen IDEs - letztlich verdammt nah am frisch installierten Blender, was ich bei der Erstinstallation nicht im Entferntesten geahnt hätte :-)


Wer es selbst ausprobieren mag, findet das Script und weitere Informationen unter:
https://github.com/miguelitoelgrande/BlenderSCAD
 
Der Funktionsumfang ist momentan noch nicht vollständig, aber er reicht bereits aus, um aufzuzeigen, was möglich sein könnte:

Dies ist ein Schnipsel Beispielcode:
# OpenJSCAD.org Logo :-)     
def logodemo(): 
    scale([10,10,10],
       translate([0,0,1.5]
         , group(  
             color(purple, difference(
                 cube([3,3,3], center=true)
               , sphere(r=2, center=true)
             ))
           , color(yellow, intersection(
                 sphere(r=1.3, center=true)
               , cube([2.1,2.1,2.1], center=true)
           ))    
         )
     )
    )

logodemo()
Im Blender ausgeführt, erzeugt er annähernd das OpenJSCAD-Logo:


Im nativen Blender-Python-API wären dazu doch einige zusätzliche Aufrufe nötig, die sich nun in den def's für scale, translate, cube, etc. verbergen.
Aber immerhin ist der oben angegebene Code verdammt nahe an dem was man in OpenSCAD schreiben müsste:

module logodemo() {
  translate([0,0,1.5]) { 
    scale([10,10,10]) {
     union() {
       difference() {
         cube(size=3, center=true);
         sphere(r=2, center=true);
      }
      intersection() {
          sphere(r=1.3, center=true);
          cube(size=2.1, center=true);
      }
     }
   }
 }
}

logodemo();


Ich  brauche sogar ein paar Klammern weniger :-)
Wie allgemein bekannt, verzichtet Python auf die geschweiften Klammern und vertraut stattdessen auf Whitespaces. Nun, dies gilt nicht für Funktionen und Listen. Daher hätte ich den ganzen Code ab "scale(... " oben ebenfalls beliebig einrücken können oder eben so, dass die Ähnlichkeit zu OpenSCAD besser erkennbar ist.


Dies ist nur ein erster Wurf, der eher zur Inspiration gedacht ist.- Vielleicht greift sie ja jemand im Blender-Umfeld auf.- Würde mich freuen.

Längerfristig wäre es natürlich toll, wenn Blender zusätzlich ein anfängergerechtes UI erhalten würde. Vielleicht nahe an dem, was Tinkercad bietet - Auf das Wesentliche reduziert.
... und mit einem "echten" Group/Ungroup Konzept, ebenfalls wie bei Tinkercad.

Ach ja, ich suche noch nach einem Weg, die sehr beliebte "minkowski()" Funktion aus OpenSCAD im Blender zu emulieren. Vermutlich nicht trivial und ebenso wenig performant, was in der Natur der Sache liegt. Vielleicht will sich ja jemand daran versuchen und einen Beitrag zum Code oben liefern?

Keine Kommentare:

Kommentar veröffentlichen