40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
"""Record a replayable model graph, export model JSON, then replay it.
|
|
|
|
Run from the repository root with:
|
|
uv run python examples/02_graph_replay.py
|
|
"""
|
|
|
|
from pathlib import Path
|
|
|
|
import simplecadapi as scad
|
|
from simplecadapi import ql as Q
|
|
|
|
|
|
OUT = Path("examples/out")
|
|
OUT.mkdir(parents=True, exist_ok=True)
|
|
|
|
|
|
with scad.GraphSession() as session:
|
|
body = scad.make_box_rsolid(40.0, 24.0, 10.0, bottom_face_center=(0.0, 0.0, 0.0))
|
|
cutter = scad.make_cylinder_rsolid(4.0, 16.0, bottom_face_center=(0.0, 0.0, -3.0))
|
|
drilled = scad.cut_rsolid(body, cutter)
|
|
|
|
# Use a serializable QL selector instead of relying on OCC edge iteration order.
|
|
bottom_circle = (
|
|
Q.edges()
|
|
.where(Q.curve_type("circle"))
|
|
.order_by(Q.center_axis("z"))
|
|
.take(1)
|
|
.exactly(1)
|
|
)
|
|
final = scad.chamfer_rsolid(drilled, bottom_circle, 0.6)
|
|
|
|
model_json = scad.export_model_json(session)
|
|
(OUT / "graph_replay.model.json").write_text(model_json, encoding="utf-8")
|
|
|
|
rebuilt = scad.replay_model_json(model_json)
|
|
print("recorded_nodes", session.graph.node_count)
|
|
print("replayed_outputs", len(rebuilt))
|
|
print("replayed_type", type(rebuilt[0]).__name__ if rebuilt else "none")
|
|
print("wrote", OUT / "graph_replay.model.json")
|