Ogni funzionalità è un endpoint prima di essere un pulsante

Un modellatore CAD che i tuoi programmi possono pilotare come le tue mani.

In Lola3d non esiste un’operazione che viva solo nell’interfaccia. La barra degli strumenti, l’API REST, gli strumenti MCP e l’assistente integrato chiamano tutti le stesse 228 azioni, validate dagli stessi schemi JSON, registrate attraverso le stesse revisioni e gli stessi passi di annullamento.

Un catalogo, quattro chiamanti

La stessa azione, chiunque la chieda.

GET /api/studio/actions è lo schema di runtime di riferimento — non un documento che si allontana dal codice, ma il catalogo su cui è costruita l’applicazione stessa. Tutto ciò che contiene si può chiamare con un token di sessione o un token API.

Le modifiche portano expected_revision. Una revisione obsoleta viene rifiutata con 409 invece di essere unita per fortuna, e un errore del kernel lascia il documento identico byte per byte.

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 …
Progettazione generativa

Python, dentro il kernel.

Un blocco di comandi non può leggere il modello tra un comando e l’altro. Quell’unico limite è ciò che separa l’automazione di un clic dalla generazione di un progetto — ed è ciò che la console Python elimina.

Cosa ti dà cad

  • cad.create_box(width=100, …) — qualsiasi azione del catalogo, per nome, validata dal suo schema
  • cad.actions() / cad.help(name) — il catalogo, dall’interno dello script
  • cad.document, cad.features, cad.find(name) — il modello così com’è
  • cad.objects(), cad.bounds() — i corpi visibili, il loro volume, area ed estensione
  • params — le variabili che hai passato; print(…) catturato; result restituito

Cosa registra

  • Uno script è una modifica e un passo di annullamento.
  • Uno script che solleva un’eccezione non registra nulla — e dice quale riga è fallita.
  • Uno script che non cambia nulla non è una revisione: misurare è gratis.
  • dry_run esegue tutto e non conserva nulla.

Quanto vale la sandbox — onestamente

Lo spazio dei nomi ristretto — niente open, niente eval, niente exec, niente attributi dunder, e solo i moduli numerici e strutturali — è un guardrail, non un confine di sicurezza. CPython non ha mai offerto una vera sandbox interna al processo e non faremo finta del contrario.

Ciò che regge davvero: lo script gira in un processo worker geometrico con i propri limiti di memoria e CPU, sotto una scadenza che il worker fa rispettare a sé stesso (un ciclo infinito si ferma da solo invece di costare un worker), e dietro un ambitoadmin per impostazione predefinita, perché eseguire uno script significa eseguire codice sull’host geometrico. Un’impostazione lo estende a ogni editor; un’altra toglie del tutto l’azione dal catalogo.

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}
La console Python nell’area di lavoro, con uno script, il suo output e le azioni che ha applicato.
Ispettore → ⋯ → Console Python. Tab indenta, Ctrl+Enter esegue, Prova non conserva nulla.
Modellazione agentica

Un agente riceve lo stesso modellatore che hai tu — e gli stessi freni.

L’endpoint MCP espone il catalogo come strumenti, vincolati agli stessi ambiti di lettura e scrittura di qualsiasi altro chiamante. Un agente con un token di lettura può misurare, ispezionare ed esportare; uno con un token di scrittura può modellare.

Può anche lavorare come farebbe un collega: fare l’anteprima di una modifica senza scrivere nulla, oppure proporne una. Una proposta disegna un fantasma di sé nella tua vista con i due pulsanti che le rispondono, e un’approvazione applica ogni comando come una sola modifica con un solo gruppo nella cronologia su ciò che ha creato — oppure la rifiuta senza lasciare traccia.

  • Gli strumenti di lettura sono liberi; quelli di scrittura richiedono approvazione nell’app.
  • Un requisito espresso a parole diventa un’annotazione verificata, ricontrollata a ogni ricostruzione.
  • Le chiamate lunghe portano il tuo segnale di interruzione: un client che se ne va libera il worker.
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}}
     ]
   }}}
Interscambio

La tua geometria esce come è entrata.

FormatoImportazioneEsportazioneNote
STEP (.step)B-rep esatto. Gli assiemi arrivano come componenti.
IGES (.iges)Superfici cucite dove sono stagne.
BREP (.brep)La forma esatta propria del kernel, con nomi e colori.
STL (.stl)Cucito in un solido quando è stagno, mantenuto come facce quando non lo è.
OBJ (.obj)Esportato con il suo MTL, in uno zip.
3MF (.3mf)Colori conservati.
glTF / GLBPer il web e per i motori di rendering.
Collada (.dae)La via d’ingresso e d’uscita da SketchUp, che non ha un formato .skp aperto.
IFC (.ifc)IFC4; corpi come proxy, componenti come assiemi.
DXF / SVGIn ingresso come entità di schizzo; in uscita da uno schizzo, un taglio di sezione o un disegno.
PDFFogli di disegno.
JSONIl documento modificabile stesso, geometria congelata inclusa.
G-codeGRBL, LinuxCNC, Fanuc o un post-processore che descrivi tu.

Prendi un token e crea qualcosa.

Accedi, crea un token API nelle Impostazioni, e l’intero modellatore risponde a curl. Poi scrivi lo script che ti sarebbe costato un pomeriggio di clic.