Jede Fähigkeit ist ein Endpunkt, bevor sie ein Knopf ist

Ein CAD-Modellierer, den Ihre Programme ebenso steuern können wie Ihre Hände.

In Lola3d gibt es keine Operation, die nur in der Oberfläche existiert. Die Werkzeugleiste, die REST-API, die MCP-Werkzeuge und der integrierte Assistent rufen alle dieselben 228 Aktionen auf, validiert durch dieselben JSON-Schemas, übernommen über dieselben Revisionen und Rückgängig-Schritte.

Ein Katalog, vier Aufrufer

Dieselbe Aktion, egal wer fragt.

GET /api/studio/actions ist das maßgebliche Laufzeitschema — kein Dokument, das sich vom Code entfernt, sondern der Katalog, auf dem die Anwendung selbst aufbaut. Alles darin lässt sich mit einem Sitzungstoken oder einem API-Token aufrufen.

Änderungen tragen expected_revision. Eine veraltete wird mit 409 abgelehnt, statt zufällig zusammengeführt zu werden, und ein Kernelfehler lässt das Dokument Byte für Byte unverändert.

REST
# Everything the modeler can do, with its schema
curl -H "Authorization: Bearer $TOKEN" \
     https://lola3d.app/api/studio/actions

# One edit, on the revision you hold
curl -X POST https://lola3d.app/api/studio/actions/push_pull \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"model_id":"…","expected_revision":12,
       "args":{"target":"body1","face_id":"f7","distance":40}}'

# A hundred commands as one revision and one undo step
curl -X POST https://lola3d.app/api/studio/actions/batch …
Generatives Design

Python, im Kernel.

Ein Befehlsstapel kann das Modell zwischen seinen eigenen Befehlen nicht lesen. Genau diese eine Einschränkung trennt das Automatisieren eines Klicks vom Erzeugen einer Konstruktion — und genau sie hebt die Python-Konsole auf.

Was cad Ihnen gibt

  • cad.create_box(width=100, …) — jede Katalogaktion, per Name, validiert durch ihr eigenes Schema
  • cad.actions() / cad.help(name) — der Katalog, aus dem Skript heraus
  • cad.document, cad.features, cad.find(name) — das Modell im aktuellen Stand
  • cad.objects(), cad.bounds() — die sichtbaren Körper, ihr Volumen, ihre Fläche und Ausdehnung
  • params — die übergebenen Variablen; print(…) wird erfasst; result wird zurückgegeben

Was es übernimmt

  • Ein Skript ist eine Bearbeitung und ein Rückgängig-Schritt.
  • Ein Skript, das eine Ausnahme wirft, übernimmt nichts — und sagt, welche Zeile fehlgeschlagen ist.
  • Ein Skript, das nichts ändert, ist keine Revision: Messen ist kostenlos.
  • dry_run führt alles aus und behält nichts.

Was die Sandbox wert ist — ehrlich gesagt

Der eingeschränkte Namensraum — kein open, kein eval, kein exec, keine Dunder-Attribute und nur die numerischen und strukturellen Module — ist eine Leitplanke, keine Sicherheitsgrenze. CPython hat nie eine echte In-Process-Sandbox geboten, und wir werden nicht so tun, als ob.

Was tatsächlich hält: Das Skript läuft in einem Geometrie-Worker-Prozess mit eigenen Speicher- und CPU-Obergrenzen, unter einer Frist, die der Worker selbst durchsetzt (eine Endlosschleife stoppt sich selbst, statt einen Worker zu kosten), und hinter einem Scope — standardmäßig admin, denn ein Skript auszuführen heißt, Code auf dem Geometrie-Host auszuführen. Eine Einstellung erweitert ihn auf alle Bearbeiter; eine andere entfernt die Aktion ganz aus dem Katalog.

A lattice whose size follows its own arithmetic
n = params["cells"]
pitch = params["pitch"]
strut = params["strut"]

for i in range(n + 1):
    for j in range(n + 1):
        cad.create_box(width=strut, depth=strut,
                       height=n * pitch,
                       position=[i * pitch, j * pitch, 0])

print("struts:", len(cad.features))
result = {"struts": len(cad.features),
          "extent_mm": n * pitch}
Read the model back, then decide
# Nothing applied — so this costs no revision at all.
total = 0.0
for o in cad.objects():
    print(f"{o['name']:<24} {o['volume']:>14,.1f} mm3")
    total += o["volume"]

box = cad.bounds()
size = [round(box["max"][i] - box["min"][i], 2) for i in range(3)]
result = {"bodies": len(cad.objects()), "bbox_mm": size}
Die Python-Konsole im Arbeitsbereich, mit einem Skript, seiner Ausgabe und den angewendeten Aktionen.
Inspektor → ⋯ → Python-Konsole. Tab rückt ein, Strg+Enter führt aus, Probelauf behält nichts.
Agentisches Modellieren

Ein Agent bekommt denselben Modellierer wie Sie — und dieselben Bremsen.

Der MCP-Endpunkt stellt den Katalog als Werkzeuge bereit, gebunden an dieselben Lese- und Schreib-Scopes wie jeder andere Aufrufer. Ein Agent mit Lese-Token kann messen, prüfen und exportieren; einer mit Schreib-Token kann modellieren.

Er kann auch arbeiten wie ein Kollege: eine Änderung vorab ansehen, ohne etwas zu schreiben, oder eine vorschlagen. Ein Vorschlag zeichnet ein Geisterbild von sich in Ihre Ansicht, mit den zwei Knöpfen, die ihn beantworten, und eine Annahme wendet jeden Befehl als eine Bearbeitung mit einer Verlaufsgruppe über das Erzeugte an — eine Ablehnung hinterlässt nichts.

  • Lesewerkzeuge sind frei; Schreibwerkzeuge brauchen in der App eine Freigabe.
  • Eine in Worten formulierte Anforderung wird zu einer geprüften Anmerkung, bei jedem Neuaufbau erneut geprüft.
  • Lange Aufrufe tragen Ihr Abbruchsignal: Ein Client, der verschwindet, gibt den Worker frei.
MCP
POST /mcp
X-API-Key: ign_…          # scope: ai

{"jsonrpc": "2.0", "id": 1,
 "method": "tools/call",
 "params": {
   "name": "propose_changes",
   "arguments": {
     "model_id": "…",
     "title": "Lighten the web by 18%",
     "commands": [
       {"action": "shell",
        "args": {"target": "web", "thickness": 2.4}}
     ]
   }}}
Datenaustausch

Ihre Geometrie geht so hinaus, wie sie hereinkam.

FormatImportExportHinweise
STEP (.step)JaJaExakte B-rep. Baugruppen kommen als Komponenten an.
IGES (.iges)JaJaFlächen vernäht, wo wasserdicht.
BREP (.brep)JaJaDie exakte Eigenform des Kernels, mit Namen und Farben.
STL (.stl)JaJaZu einem Volumenkörper vernäht, wenn wasserdicht, sonst als Flächen behalten.
OBJ (.obj)JaJaMit seiner MTL exportiert, in einem Zip.
3MF (.3mf)JaJaFarben bleiben erhalten.
glTF / GLBJaJaFür das Web und für Renderer.
Collada (.dae)JaJaDer Weg in SketchUp hinein und hinaus, das kein offenes .skp-Format hat.
IFC (.ifc)JaJaIFC4; Körper als Proxys, Komponenten als Baugruppen.
DXF / SVGJaJaHinein als Skizzenelemente; hinaus aus einer Skizze, einem Schnitt oder einer Zeichnung.
PDFJaZeichnungsblätter.
JSONJaJaDas bearbeitbare Dokument selbst, eingefrorene Geometrie inklusive.
G-codeJaGRBL, LinuxCNC, Fanuc oder ein Postprozessor, den Sie selbst beschreiben.

Holen Sie sich ein Token und bauen Sie etwas.

Melden Sie sich an, erstellen Sie in den Einstellungen ein API-Token, und der ganze Modellierer hört auf curl. Dann schreiben Sie das Skript, das Sie sonst einen Nachmittag Klicken gekostet hätte.