Elke mogelijkheid is een endpoint voordat ze een knop is

Een CAD-modeler die je programma's net zo goed kunnen aansturen als je handen.

Er is in Lola3d geen bewerking die alleen in de interface bestaat. De gereedschapsbalk, de REST API, de MCP-tools en de ingebouwde assistent roepen allemaal dezelfde 228 acties aan, gevalideerd door dezelfde JSON-schema's, doorgevoerd via dezelfde revisies en stappen ongedaan maken.

Eén catalogus, vier aanroepers

Dezelfde actie, wie er ook om vraagt.

GET /api/studio/actions is het gezaghebbende runtimeschema — geen document dat van de code wegdrijft, maar de catalogus waarop de applicatie zelf is gebouwd. Alles daarin kan worden aangeroepen met een sessietoken of een API-token.

Mutaties dragen expected_revision. Een verouderde wordt met 409 geweigerd in plaats van op goed geluk samengevoegd, en een kernelfout laat het document byte voor byte ongewijzigd.

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 …
Generatief ontwerp

Python, binnen de kernel.

Een batch opdrachten kan het model niet lezen tussen zijn eigen opdrachten. Die ene beperking is wat het automatiseren van een klik scheidt van het genereren van een ontwerp — en die heft de Python-console op.

Wat cad je geeft

  • cad.create_box(width=100, …) — elke catalogusactie, op naam, gevalideerd door haar eigen schema
  • cad.actions() / cad.help(name) — de catalogus, vanuit het script
  • cad.document, cad.features, cad.find(name) — het model zoals het er nu voor staat
  • cad.objects(), cad.bounds() — de zichtbare lichamen, hun volume, oppervlakte en afmetingen
  • params — de variabelen die je meegaf; print(…) opgevangen; result teruggegeven

Wat het doorvoert

  • Eén script is één bewerking en één stap ongedaan maken.
  • Een script dat een fout opwerpt, voert niets door — en zegt welke regel mislukte.
  • Een script dat niets verandert, is geen revisie: meten is gratis.
  • dry_run voert alles uit en bewaart niets.

Wat de sandbox waard is — eerlijk gezegd

De beperkte namespace — geen open, geen eval, geen exec, geen dunder-attributen, en alleen de numerieke en structurele modules — is een vangrail, geen beveiligingsgrens. CPython heeft nooit een echte sandbox binnen het proces geboden en we gaan niet doen alsof.

Wat echt standhoudt: het script draait in een geometrieworkerproces met eigen geheugen- en CPU-plafonds, onder een deadline die de worker zelf handhaaft (een drukke lus stopt zichzelf in plaats van een worker te kosten), en achter een bevoegdheid — standaard admin, want een script uitvoeren is code uitvoeren op de geometriehost. Eén instelling verruimt dat tot elke bewerker; een andere haalt de actie helemaal uit de catalogus.

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}
De Python-console in de werkruimte, met een script, de uitvoer en de toegepaste acties.
Inspector → ⋯ → Python-console. Tab laat inspringen, Ctrl+Enter voert uit, Proefrun bewaart niets.
Agentisch modelleren

Een agent krijgt dezelfde modeler als jij — en dezelfde remmen.

Het MCP-endpoint stelt de catalogus beschikbaar als tools, gebonden aan dezelfde lees- en schrijfbevoegdheden als elke andere aanroeper. Een agent met een leestoken kan meten, inspecteren en exporteren; een agent met een schrijftoken kan modelleren.

Hij kan ook werken zoals een collega: een wijziging vooraf bekijken zonder iets te schrijven, of er een voorstellen. Een voorstel tekent een schim van zichzelf in je viewport, met de twee knoppen die erop antwoorden, en een goedkeuring past elke opdracht toe als één bewerking met één tijdlijngroep over wat ze heeft gemaakt — of een afwijzing laat niets achter.

  • Leestools zijn vrij; schrijftools vereisen goedkeuring in de app.
  • Een eis in woorden wordt een gecontroleerde annotatie, bij elke heropbouw opnieuw gecontroleerd.
  • Lange aanroepen dragen je afbreeksignaal mee: een client die weggaat, maakt de worker vrij.
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}}
     ]
   }}}
Uitwisseling

Je geometrie vertrekt zoals ze binnenkwam.

FormaatImporterenExporterenOpmerkingen
STEP (.step)JaJaExacte B-rep. Samenstellingen komen binnen als componenten.
IGES (.iges)JaJaOppervlakken genaaid waar ze waterdicht zijn.
BREP (.brep)JaJaDe eigen exacte vorm van de kernel, met namen en kleuren.
STL (.stl)JaJaTot een solid genaaid als het waterdicht is, als vlakken behouden als dat niet zo is.
OBJ (.obj)JaJaGeëxporteerd met de MTL, in een zip.
3MF (.3mf)JaJaKleuren behouden.
glTF / GLBJaJaVoor het web en voor renderers.
Collada (.dae)JaJaDe weg in en uit SketchUp, dat geen open .skp-formaat heeft.
IFC (.ifc)JaJaIFC4; lichamen als proxy's, componenten als samenstellingen.
DXF / SVGJaJaBinnen als schetsentiteiten; eruit vanuit een schets, een doorsnede of een tekening.
PDFJaTekenbladen.
JSONJaJaHet bewerkbare document zelf, inclusief bevroren geometrie.
G-codeJaGRBL, LinuxCNC, Fanuc of een postprocessor die je zelf beschrijft.

Haal een token en maak iets.

Log in, maak een API-token aan in Instellingen, en de hele modeler luistert naar curl. Schrijf dan het script waarvoor je anders een middag had moeten klikken.