LuaCAD

LuaCAD integreert Lua 5.4 in een Rust-engine die CSG-operaties (Constructive Solid Geometry) direct evalueert via Manifold, of OpenSCAD-code genereert voor externe rendering.

Waarom Lua?

Lua heeft een vergelijkbare syntaxis als de OpenSCAD-taal, maar biedt diverse voordelen:

  • Krachtiger
  • Consistenter
  • Sneller
  • Gemakkelijker in te bedden
  • Operator-overloading voor een natuurlijke CSG-syntaxis (bijvoorbeeld: a + b, a - b, a * b)

Lua wordt reeds gebruikt in andere CAD-software, zoals LibreCAD en Autodesk Netfabb.

Voorbeeld

LuaCAD:

my_cube = cube { size = { 1, 2, 3 } }

function my_sphere(radius)
    return sphere({ r = radius }):translate(5, 0, 0)
end

model = my_cube + my_sphere(2)
render(model)

Equivalent in OpenSCAD:

module my_cube() {
    cube(size=[1,2,3]);
}

module my_sphere(radius) {
    translate([5,0,0]) sphere(r = radius);
}

union() {
    my_cube();
    my_sphere(2);
}

Aan de slag

Je kunt LuaCAD installeren via de volgende commando's:

  • CLI voor het uitvoeren en converteren van LuaCAD-scripts:

cargo install luacad

  • GUI desktop-app met live 3D-preview:

cargo install luacad-studio

Installatie vanuit broncode

Dit vereist Rust:

git clone https://github.com/ad-si/LuaCAD.git
cd LuaCAD
make install

Beide crates bevatten hun C/C++ afhankelijkheden, waardoor er geen systeembibliotheken geïnstalleerd hoeven te worden. Er moet echter wel een C++ compiler en CMake beschikbaar zijn om ze te kunnen bouwen.

luacad bouwt Manifold en Clipper2; luacad-studio bouwt daarnaast OpenCSG, waarvoor OpenGL development headers nodig zijn (op Debian/Ubuntu: libgl1-mesa-dev, libx11-dev, libxcb1-dev, libxkbcommon-dev, libxrandr-dev, libwayland-dev).

Gebruik van de CLI

De volgende commando's zijn beschikbaar:

  • luacad convert model.lua output.3mf — Converteer naar 3MF
  • luacad convert model.lua output.stl — Converteer naar STL
  • luacad convert model.lua output.scad — Exporteer als OpenSCAD
  • luacad watch model.lua output.3mf — Automatisch opnieuw bouwen bij wijzigingen in het bestand
  • luacad render model.lua preview.png — Render naar een PNG-afbeelding
  • luacad info model.lua — Print het aantal driehoeken en de bounding box
  • luacad lint model.lua — Linting met selene (ondersteunt ook directorien)
  • luacad run model.lua — Uitvoeren (alleen zij-effecten)

De functies convert en watch leiden het formaat af uit de extensie van het uitvoerbestand. Dit kan worden overschreven met --format <fmt>. Met --via-openscad wordt de export overgedragen aan een geïnstalleerd OpenSCAD-binary in plaats van het mesh te bouwen met Manifold.

BOSL2

LuaCAD biedt volledige ondersteuning voor de Belfry OpenSCAD Library v2, die is geherimplementeerd in LuaCAD zelf. Hierdoor kan het renderen, previewen en exporteren naar een mesh gebeuren zonder dat OpenSCAD of BOSL2 geïnstalleerd hoeft te zijn:

bosl.cuboid { {40, 40, 40}, rounding = 2 }
bosl.regular_prism { 5, r = 10, h = 25 }
bosl.spur_gear { circ_pitch = 5, teeth = 20, thickness = 5 }

Bij export naar .scad wordt de BOSL2-aanroep zelf geschreven, waardoor het geëxporteerde bestand net zo kort blijft als het script dat het produceerde.

Tekst en Imports

De functie text() zet een systeemlettertype om in een schets en text3d() extrudeert dit in één stap. Hierdoor wordt tekst echte geometrie in plaats van enkel SCAD-output:

render(text("LuaCAD", { size = 12, halign = "center" }):linear_extrude(2))

De functie import() leest elk mesh-formaat dat LuaCAD kan schrijven en retourneert een "solid" die getransformeerd en gecombineerd kan worden zoals elk ander primitief. SVG- en DXF-bestanden retourneren in plaats daarvan een 2D-schets die klaar is om geëxtrudeerd te worden.

Ondersteunde exportformaten

  • SCAD - OpenSCAD-formaat
  • 3MF - 3D Manufacturing Format
  • STL - Standard Triangle Language voor 3D-printen
  • OBJ - Wavefront 3D-objectformaat
  • PLY - Polygon File Format
  • OFF - Object File Format
  • AMF - Additive Manufacturing File Format

Elke waarde die je script retourneert, wordt een eigen 3MF-object, zodat slicers deze kunnen laden als individueel verplaatsbare delen. Gebruik :name(…) om te bepalen hoe deze verschijnen in de objectlijst. De overige formaten kunnen geen aparte objecten representeren en voegen daarom alles samen tot één enkele mesh.