Physpace is live on @RobinhoodApp
SimpleCADAPI lets coding agents write real, editable CAD as plain Python: one feature per cell, every dimension a named parameter, every step verified.
CA: 0x014ca55ebac6549441b98feed7176e50c0d2ac15
Install SimpleCADAPI by hand:
pip install simplecadapi
uv add simplecadapi
pipx install "simplecadapi[editor]"
The [editor] extra adds sca edit, the code-first editor. Then sca example u_link copies a bundled example workspace out to open in it.
Ribbed L-bracket: 2 user turns, 49 tool calls. A legacy script rebuilt as feature blocks with a volume delta under 0.1%, keeping the interface.* tags the Gmsh/CalculiX pipeline selects faces by.
Parametric flange plate: 2 user turns, 66 tool calls. Every dimension a named parameter, edge-selection cards printed before each fillet, and feasibility guards on the bolt pattern.
Robotic-arm U-link + motor mount: 15 user turns, 601 tool calls. A circular profile swept into a U, motor sockets cut with spheres, and a mounting face with a deterministic name the query language can index.
Simulation survives the next revision.
One package exports AP242 STEP, editable FreeCAD and MJCF. Boundary faces keep their interface.* tags through Gmsh into CalculiX, so the load case finds its faces again after every change.
Change the intent, not the geometry.
Every dimension in a SimpleCADAPI notebook is a parameter and every assumption is a guard. Change BOLT_COUNT and the notebook rebuilds; push the bolt circle past the rim and the guard refuses first ↓
On the site's flange_plate.py: 4 × ⌀11 holes on a PCD of 84.5 mm. The guard checks the web left at the rim, OD/2 − PCD/2 − d/2 = 2.250 mm, against a 2.0 mm minimum. Result: 13 faces, 100,856.7 mm³.
Change the intent, not the geometry.
Every dimension in a SimpleCADAPI notebook is a parameter and every assumption is a guard. Change BOLT_COUNT and the notebook rebuilds; push the bolt circle past the rim and the guard refuses first ↓
Agents cannot click. So QL selects edges by what they are, asserts exactly(2), and tags the faces a fillet makes: fillet.flange_edge, not face number 14.
A SimpleCAD model is a marimo notebook: a plain .py file and the only source of truth.
Each feature is one cell, each dimension a scad.var. An agent edits text, the BRep follows cell by cell, with a fact card after every step.