Parametric 3D CAD via build123d. This skill provides Python scripts for generating and measuring 3D solids. Run them with the exec tool.
cd {baseDir}
uv venv --python 3.12
uv pip install build123d
All scripts use the venv Python at {baseDir}/.venv/bin/python. All output JSON to stdout.
{baseDir}/.venv/bin/python {baseDir}/scripts/cad_generate.py \
--script 'from build123d import *
with BuildPart() as result:
Box(100, 60, 40)' \
--format step \
--filename my_box
Output: { "success": true, "artifact_path": "...", "format": "step", "file_size_bytes": N, "bounding_box_mm": {...} }
{baseDir}/.venv/bin/python {baseDir}/scripts/cad_measure.py \
--script 'from build123d import *
with BuildPart() as result:
Cylinder(10, 50)'
Output: { "success": true, "bounding_box_mm": {...}, "volume_mm3": N, "surface_area_mm2": N, "center_of_mass_mm": {...}, "face_count": N, "edge_count": N }
{baseDir}/.venv/bin/python {baseDir}/scripts/cad_section.py \
--script '...' \
--plane XY \
--offset 5.0
Output: { "success": true, "artifact_path": "...", "plane": "XY", "offset_mm": 5.0 }
{baseDir}/.venv/bin/python {baseDir}/scripts/cad_api.py
Output: JSON with primitives, operations, selectors, export functions. Call this first if you need to learn what's available.
Check an assembly of multiple parts for interference, minimum clearance, and moving-part collisions.
{baseDir}/.venv/bin/python {baseDir}/scripts/cad_validate.py \
--script '...' \
--mode full \
--min-clearance 1.0
Modes: static (Boolean intersection between all pairs), clearance (bounding box gap), sweep (rotate moving parts through angular range, check collisions), full (all three, default).
The script must define parts = {"name": solid, ...} dict. Optionally define sweeps list for moving parts:
from build123d import *
with BuildPart() as enclosure:
Box(100, 80, 50)
offset(amount=-3, openings=enclosure.faces().sort_by(Axis.Z)[-1:])
with BuildPart() as pcb:
with Locations((0, 0, 5)):
Box(60, 40, 2)
with BuildPart() as servo_arm:
with Locations((30, 0, 25)):
Box(5, 20, 3)
parts = {
"enclosure": enclosure.part,
"pcb": pcb.part,
"servo_arm": servo_arm.part,
}
sweeps = [
{
"name": "servo_arm",
"axis_origin": (30, 0, 25),
"axis_direction": (0, 1, 0),
"angle_start": -45,
"angle_end": 45,
"angle_step": 5,
},
]
Output: { "verdict": "PASS|WARN|FAIL", "static_interference": {...}, "clearance": {...}, "swept_volume": {...} }
Swept volumes are exported to ~/.openclaw/workspace/cad-output/swept_ for visualization.
All single-part scripts must assign the final solid to result via a BuildPart context:
from build123d import *
with BuildPart() as result:
Box(100, 60, 40)
fillet(result.edges().filter_by(Axis.Z), radius=5)
with Locations((0, 0, 40)):
CounterBoreHole(radius=5, counter_bore_radius=8, counter_bore_depth=3, depth=40)
For validation scripts, define parts dict (and optionally sweeps list) instead of result.
All dimensions in millimeters. Exported files go to ~/.openclaw/workspace/cad-output/.
cad_api.py first for the cheatsheet.cad_measure.py to verify dimensions before exporting.cad_validate.py --mode full before exporting. Fix any FAIL/WARN before proceeding.cad_generate.py with the desired format (step for CAD, stl for 3D printing).cad_section.py at relevant planes.共 1 个版本