simplecadapi 2.0.0b2__tar.gz → 2.0.0b4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/PKG-INFO +115 -158
- simplecadapi-2.0.0b4/README.md +169 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/README.md +8 -3
- simplecadapi-2.0.0b2/docs/api/cut_rsolidlist.md → simplecadapi-2.0.0b4/docs/api/cut_rsolid.md +3 -3
- simplecadapi-2.0.0b2/docs/api/intersect_rsolidlist.md → simplecadapi-2.0.0b4/docs/api/intersect_rsolid.md +3 -3
- simplecadapi-2.0.0b4/docs/api/translate_model_json_to_fcstd.md +17 -0
- simplecadapi-2.0.0b4/docs/api/translate_model_json_to_freecad_script.md +17 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/architecture/sdk-architecture-review.md +2 -2
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/README.md +5 -7
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/declarative_constraints.md +1 -1
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/operation_graph_json_spec.md +25 -26
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/rearchitecture_2_0_requirements.md +2 -2
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/serialization/README.md +2 -3
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/serialization/expressions-and-replay.md +1 -2
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/serialization/features-booleans-transforms.md +9 -12
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/solid.md +40 -6
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/wire.md +1 -1
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/pyproject.toml +4 -3
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/__init__.py +6 -6
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/auto_tools/auto_docs_gen.py +8 -2
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/auto_tools/make_export.py +2 -2
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/auto_tools/skill_pack.py +7 -4
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/core.py +96 -17
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/evolve.py +4 -4
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/freecad_translator.py +15 -14
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/graph.py +1 -1
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/operations.py +113 -82
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/serializer.py +10 -19
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/topology.py +3 -3
- simplecadapi-2.0.0b2/README.md +0 -213
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/.gitignore +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/LICENSE +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/MANIFEST.in +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/Const.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/Expr.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/ExpressionGraph.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/GraphSession.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/SemanticDelta.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/SemanticRef.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/SimpleCADError.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/Sketch.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/Var.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/and_.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/apply_tag.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/chamfer_rsolid.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/const_function.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/export_graph_json.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/export_model_json.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/export_session_json.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/export_step.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/export_stl.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/extrude_rsolid.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/fillet_rsolid.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/geo.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/helical_sweep_rsolid.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/import_graph_json.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/import_model_json.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/import_session_json.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/linear_pattern_rsolidlist.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/list_tags.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/loft_rsolid.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_angle_arc_redge.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_angle_arc_rwire.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_box_rsolid.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_circle_redge.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_circle_rface.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_circle_rwire.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_cone_rsolid.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_cylinder_rsolid.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_face_from_wire_rface.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_helix_redge.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_helix_rwire.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_line_redge.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_n_hole_flange_rsolid.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_naca_propeller_blade_rsolid.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_point_rvertex.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_polyline_rwire.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_rectangle_rface.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_rectangle_rwire.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_segment_redge.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_segment_rwire.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_sphere_rsolid.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_spline_redge.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_spline_rwire.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_threaded_rod_rsolid.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_three_point_arc_redge.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_three_point_arc_rwire.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_wire_from_edges_rwire.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/meta.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/mirror_shape.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/not_.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/or_.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/radial_pattern_rsolidlist.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/render_screenshot_rpath.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/replay_graph.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/replay_model_json.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/revolve_rsolid.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/rotate_shape.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/select.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/select_edges_by_tag.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/select_faces_by_tag.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/shell_rsolid.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/suspend_graph_recording.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/sweep_rsolid.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/tag.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/translate_shape.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/union_rsolid.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/value.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/var_function.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/compound.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/coordinate_system.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/edge.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/face.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/rearchitecture_2_0.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/serialization/primitives-and-profiles.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/serialization/scalar-fields.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/shell.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/simple_workplane.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/tagged_mixin.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/vertex.md +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/_vendor_warning_filters.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/auto_tools/__init__.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/auto_tools/evolution.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/autotag.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/errors.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/expr.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/frame.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/__init__.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/ocp_booleans.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/ocp_builders.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/ocp_cast.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/ocp_curves.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/ocp_export.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/ocp_features.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/ocp_mesh.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/ocp_properties.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/ocp_topology.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/ocp_transforms.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/spline_fit.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/py.typed +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/ql.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/sketch.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/tagging.py +0 -0
- {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/tracking.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: simplecadapi
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.0b4
|
|
4
4
|
Summary: A simplified OCP-native CAD modeling Python API
|
|
5
5
|
Project-URL: Homepage, https://github.com/NiJingzhe/SimpleCADAPI
|
|
6
6
|
Project-URL: Repository, https://github.com/NiJingzhe/SimpleCADAPI
|
|
@@ -358,10 +358,11 @@ Classifier: Programming Language :: Python :: 3
|
|
|
358
358
|
Classifier: Programming Language :: Python :: 3.10
|
|
359
359
|
Classifier: Programming Language :: Python :: 3.11
|
|
360
360
|
Classifier: Programming Language :: Python :: 3.12
|
|
361
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
361
362
|
Classifier: Topic :: Scientific/Engineering
|
|
362
363
|
Classifier: Topic :: Scientific/Engineering :: Visualization
|
|
363
|
-
Requires-Python:
|
|
364
|
-
Requires-Dist: cadquery-ocp>=7.
|
|
364
|
+
Requires-Python: <3.14,>=3.10
|
|
365
|
+
Requires-Dist: cadquery-ocp>=7.9.3.1
|
|
365
366
|
Requires-Dist: numpy>=1.21.0
|
|
366
367
|
Requires-Dist: rich>=14.0.0
|
|
367
368
|
Provides-Extra: dev
|
|
@@ -375,192 +376,143 @@ Description-Content-Type: text/markdown
|
|
|
375
376
|
|
|
376
377
|
# SimpleCADAPI
|
|
377
378
|
|
|
378
|
-
SimpleCADAPI is an OCP-native
|
|
379
|
+
SimpleCADAPI is an OCP-native Python SDK for building CAD models with clear,
|
|
380
|
+
functional operations and replayable model graphs. It wraps OpenCascade geometry
|
|
381
|
+
in a compact public API for creating solids, applying features, tagging semantic
|
|
382
|
+
intent, querying topology, exporting manufacturing files, and translating recorded
|
|
383
|
+
models into FreeCAD workflows.
|
|
379
384
|
|
|
380
|
-
|
|
385
|
+
Current beta: `simplecadapi==2.0.0b4`.
|
|
381
386
|
|
|
382
|
-
|
|
383
|
-
Experimental scripts and temporary modeling examples are not included as formal documentation.
|
|
387
|
+
## What It Provides
|
|
384
388
|
|
|
385
|
-
|
|
389
|
+
- OCP-native shape types: `Vertex`, `Edge`, `Wire`, `Face`, and `Solid`.
|
|
390
|
+
- Functional modeling operations for primitives, profiles, extrude, revolve,
|
|
391
|
+
loft, sweep, booleans, transforms, patterns, fillets, chamfers, and shells.
|
|
392
|
+
- Replayable modeling with `GraphSession`, `export_model_json(...)`,
|
|
393
|
+
`import_model_json(...)`, and `replay_model_json(...)`.
|
|
394
|
+
- Expression parameters with `var(...)`, arithmetic expressions, and serialized
|
|
395
|
+
expression graphs.
|
|
396
|
+
- QL selectors for geometry grounding, topology queries, and stable feature
|
|
397
|
+
selections.
|
|
398
|
+
- Semantic tags through `apply_tag(shape, tag)` and `list_tags(shape)`.
|
|
399
|
+
- STEP/STL export and FreeCAD translation helpers for script or `.FCStd` output.
|
|
386
400
|
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
### Method A: Install from package repository with pip
|
|
401
|
+
## Install
|
|
390
402
|
|
|
391
403
|
```bash
|
|
392
404
|
pip install simplecadapi
|
|
393
405
|
```
|
|
394
406
|
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
```bash
|
|
398
|
-
pip install "simplecadapi[dev]"
|
|
399
|
-
```
|
|
400
|
-
|
|
401
|
-
### Method B: Install with uv
|
|
402
|
-
|
|
403
|
-
Install in the current virtual environment:
|
|
404
|
-
|
|
405
|
-
```bash
|
|
406
|
-
uv pip install simplecadapi
|
|
407
|
-
```
|
|
408
|
-
|
|
409
|
-
Add as a project dependency in `pyproject.toml`:
|
|
407
|
+
With `uv`:
|
|
410
408
|
|
|
411
409
|
```bash
|
|
412
410
|
uv add simplecadapi
|
|
413
411
|
```
|
|
414
412
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
Build a local wheel/sdist first if you want to install from local artifacts:
|
|
413
|
+
For local development from this repository:
|
|
418
414
|
|
|
419
415
|
```bash
|
|
420
|
-
uv
|
|
416
|
+
uv sync --group dev
|
|
421
417
|
```
|
|
422
418
|
|
|
423
|
-
## Quick
|
|
419
|
+
## Quick Start
|
|
424
420
|
|
|
425
421
|
```python
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
box = scad.make_box_rsolid(10.0, 20.0, 30.0)
|
|
429
|
-
scad.export_stl(box, "example_box.stl")
|
|
430
|
-
scad.export_step(box, "example_box.step")
|
|
431
|
-
```
|
|
432
|
-
|
|
433
|
-
## How to Package SDK Skills
|
|
422
|
+
from pathlib import Path
|
|
434
423
|
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
### 1) Packaging Command
|
|
438
|
-
|
|
439
|
-
Execute in the repository root directory:
|
|
440
|
-
|
|
441
|
-
```bash
|
|
442
|
-
uv run skill-pack --refresh-docs --archive --skill-name simplecadapi
|
|
443
|
-
```
|
|
444
|
-
|
|
445
|
-
Common parameters:
|
|
446
|
-
|
|
447
|
-
- `--output-root <dir>`: Output directory (default `./skills`)
|
|
448
|
-
- `--package-name <pkg>`: Runtime installation package name (default reads from `project.name`)
|
|
449
|
-
- `--package-version <ver>`: Runtime installation version (default reads from `project.version`)
|
|
450
|
-
- `--no-clean`: Do not clean existing output directory
|
|
451
|
-
- `--archive`: Additionally generate `<skill-name>.tar.gz`
|
|
424
|
+
import simplecadapi as scad
|
|
452
425
|
|
|
453
|
-
|
|
426
|
+
out = Path("out")
|
|
427
|
+
out.mkdir(exist_ok=True)
|
|
454
428
|
|
|
455
|
-
|
|
429
|
+
base = scad.make_box_rsolid(60.0, 36.0, 8.0, bottom_face_center=(0.0, 0.0, 0.0))
|
|
430
|
+
hole = scad.make_cylinder_rsolid(5.0, 14.0, bottom_face_center=(0.0, 0.0, -3.0))
|
|
431
|
+
slot = scad.make_box_rsolid(18.0, 8.0, 14.0, bottom_face_center=(14.0, 0.0, -3.0))
|
|
456
432
|
|
|
457
|
-
|
|
458
|
-
-
|
|
459
|
-
|
|
460
|
-
|
|
433
|
+
part = scad.cut_rsolid(base, hole, slot)
|
|
434
|
+
boss = scad.make_cylinder_rsolid(8.0, 7.0, bottom_face_center=(-18.0, 0.0, 8.0))
|
|
435
|
+
part = scad.union_rsolid(part, boss)
|
|
436
|
+
part = scad.apply_tag(part, "role.demo.bracket")
|
|
461
437
|
|
|
462
|
-
|
|
438
|
+
print("volume", round(part.get_volume(), 3))
|
|
439
|
+
print("faces", len(part.get_faces()))
|
|
440
|
+
print("tags", scad.list_tags(part))
|
|
463
441
|
|
|
464
|
-
|
|
465
|
-
|
|
442
|
+
scad.export_step(part, str(out / "bracket.step"))
|
|
443
|
+
scad.export_stl(part, str(out / "bracket.stl"))
|
|
466
444
|
```
|
|
467
445
|
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
- `skills/simplecadapi/SKILL.md`
|
|
471
|
-
- `skills/simplecadapi/references/SDK_OVERVIEW.md`
|
|
472
|
-
- `skills/simplecadapi/references/SDK_SURFACES.md`
|
|
473
|
-
- `skills/simplecadapi/references/V2_MODELING_WORKFLOWS.md`
|
|
474
|
-
- `skills/simplecadapi/references/SDK_PACKAGE_SUMMARY.md`
|
|
475
|
-
- `skills/simplecadapi/references/docs/api/README.md`
|
|
476
|
-
- `skills/simplecadapi/references/docs/core/README.md`
|
|
446
|
+
## Replayable Modeling
|
|
477
447
|
|
|
478
|
-
|
|
448
|
+
Use `GraphSession` when a model should be inspectable, serializable, replayable,
|
|
449
|
+
or translated into another CAD environment.
|
|
479
450
|
|
|
480
451
|
```python
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
- `auto-docs-gen`: Generate `docs/api/` documentation from the public API source surface
|
|
504
|
-
- `make-export`: Update imports/exports in `src/simplecadapi/__init__.py`
|
|
505
|
-
- `evolve`: Extract functions from scripts for repository-managed evolve modules
|
|
506
|
-
- `skill-pack`: Package thin SDK skill (documentation only)
|
|
507
|
-
|
|
508
|
-
Examples:
|
|
509
|
-
|
|
510
|
-
```bash
|
|
511
|
-
uv run make-export --dry-run
|
|
512
|
-
uv run auto-docs-gen
|
|
513
|
-
uv run evolve path/to/your_case.py
|
|
514
|
-
uv run skill-pack --refresh-docs --archive
|
|
515
|
-
```
|
|
516
|
-
|
|
517
|
-
## RAGFlow Documentation Sync
|
|
518
|
-
|
|
519
|
-
`scripts/sync_ragflow_docs.py` is used to incrementally sync Markdown files under `docs/` to the specified RAGFlow dataset, chunked by H2 headings; the document's `chunk_method` is set to `manual`.
|
|
520
|
-
|
|
521
|
-
Prepare the environment:
|
|
522
|
-
|
|
523
|
-
```bash
|
|
524
|
-
.venv/bin/python -m pip install ragflow-sdk
|
|
525
|
-
```
|
|
526
|
-
|
|
527
|
-
It is recommended to use `.env` (already added to `.gitignore`):
|
|
528
|
-
|
|
529
|
-
```bash
|
|
530
|
-
RAGFLOW_API_KEY=your_key_here
|
|
531
|
-
RAGFLOW_BASE_URL=http://localhost
|
|
532
|
-
RAGFLOW_DATASET_NAME=SimpleCADAPI
|
|
452
|
+
import simplecadapi as scad
|
|
453
|
+
from simplecadapi import ql as Q
|
|
454
|
+
|
|
455
|
+
with scad.GraphSession() as session:
|
|
456
|
+
body = scad.make_box_rsolid(40.0, 24.0, 10.0, bottom_face_center=(0.0, 0.0, 0.0))
|
|
457
|
+
cutter = scad.make_cylinder_rsolid(4.0, 16.0, bottom_face_center=(0.0, 0.0, -3.0))
|
|
458
|
+
drilled = scad.cut_rsolid(body, cutter)
|
|
459
|
+
|
|
460
|
+
bottom_circle = (
|
|
461
|
+
Q.edges()
|
|
462
|
+
.where(Q.curve_type("circle"))
|
|
463
|
+
.order_by(Q.center_axis("z"))
|
|
464
|
+
.take(1)
|
|
465
|
+
.exactly(1)
|
|
466
|
+
)
|
|
467
|
+
final = scad.chamfer_rsolid(drilled, bottom_circle, 0.6)
|
|
468
|
+
|
|
469
|
+
model_json = scad.export_model_json(session)
|
|
470
|
+
rebuilt = scad.replay_model_json(model_json)
|
|
471
|
+
|
|
472
|
+
print("recorded_nodes", session.graph.node_count)
|
|
473
|
+
print("replayed_outputs", len(rebuilt))
|
|
533
474
|
```
|
|
534
475
|
|
|
535
|
-
|
|
476
|
+
## Modeling Mental Model
|
|
477
|
+
|
|
478
|
+
- Start from design intent: reference axes, critical profiles, and the features
|
|
479
|
+
that produce the final solid.
|
|
480
|
+
- Build from lower-dimensional geometry to higher-dimensional geometry: profile
|
|
481
|
+
wires/faces first, then solid features such as extrude, revolve, loft, and
|
|
482
|
+
sweep.
|
|
483
|
+
- Keep operations functional. Create new values with public functions such as
|
|
484
|
+
`make_rectangle_rface(...)`, `extrude_rsolid(...)`, `cut_rsolid(...)`, and
|
|
485
|
+
`fillet_rsolid(...)`.
|
|
486
|
+
- Use tags for semantic intent and selection anchors, for example
|
|
487
|
+
`role.mounting.surface`, `anchor.datum.primary`, or `group.fasteners`.
|
|
488
|
+
- Store numeric and geometric facts in metadata or graph payloads, not in tags.
|
|
489
|
+
- Use QL to ground selections by geometry facts rather than relying on topology
|
|
490
|
+
iteration order.
|
|
491
|
+
- When an indexed topology pick is intentional, pass the index to the plural
|
|
492
|
+
child-geometry getter, such as `get_edges(index)`, `get_faces(index)`,
|
|
493
|
+
`get_wires(index)`, or `get_vertices(index)`, so replayable graph workflows
|
|
494
|
+
preserve the pick as a geo select node.
|
|
495
|
+
- Use model JSON as the interchange boundary for replay, tests, and FreeCAD
|
|
496
|
+
translation.
|
|
497
|
+
|
|
498
|
+
## FreeCAD Translation
|
|
499
|
+
|
|
500
|
+
Recorded model JSON can be translated into a FreeCAD Python script:
|
|
536
501
|
|
|
537
|
-
```
|
|
538
|
-
|
|
539
|
-
.venv/bin/python scripts/sync_ragflow_docs.py --create-dataset
|
|
502
|
+
```python
|
|
503
|
+
script = scad.translate_model_json_to_freecad_script(model_json)
|
|
540
504
|
```
|
|
541
505
|
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
- `--dataset-id` / `RAGFLOW_DATASET_ID`: Directly specify the dataset ID (avoid name conflicts)
|
|
545
|
-
- `--delete-removed`: Delete documents that have been removed locally
|
|
546
|
-
- `--dry-run`: Only preview changes without executing writes
|
|
547
|
-
- `--progress-interval N`: Print progress every N documents
|
|
548
|
-
|
|
549
|
-
## Development and Testing
|
|
550
|
-
|
|
551
|
-
Local development installation (editable):
|
|
506
|
+
If FreeCAD or FreeCADCmd is available, the same model JSON can be written as an
|
|
507
|
+
`.FCStd` file:
|
|
552
508
|
|
|
553
|
-
```
|
|
554
|
-
|
|
509
|
+
```python
|
|
510
|
+
scad.translate_model_json_to_fcstd(model_json, "bracket.FCStd")
|
|
555
511
|
```
|
|
556
512
|
|
|
557
|
-
|
|
513
|
+
## Examples
|
|
558
514
|
|
|
559
|
-
|
|
560
|
-
uv run python -m unittest test/test_all_features.py
|
|
561
|
-
```
|
|
562
|
-
|
|
563
|
-
Run examples:
|
|
515
|
+
Run examples from the source checkout:
|
|
564
516
|
|
|
565
517
|
```bash
|
|
566
518
|
uv run python examples/01_basic_modeling.py
|
|
@@ -571,18 +523,23 @@ uv run python examples/06_parametric_gear_model.py
|
|
|
571
523
|
uv run python examples/07_serialization_operation_tree.py
|
|
572
524
|
```
|
|
573
525
|
|
|
574
|
-
##
|
|
526
|
+
## Documentation
|
|
575
527
|
|
|
576
|
-
- API
|
|
577
|
-
- Core
|
|
578
|
-
-
|
|
579
|
-
|
|
528
|
+
- Public API reference: [`docs/api/`](docs/api/)
|
|
529
|
+
- Core type and modeling notes: [`docs/core/`](docs/core/)
|
|
530
|
+
- Serialization and replay details:
|
|
531
|
+
[`docs/core/serialization/README.md`](docs/core/serialization/README.md)
|
|
532
|
+
- Operation graph JSON spec:
|
|
533
|
+
[`docs/core/operation_graph_json_spec.md`](docs/core/operation_graph_json_spec.md)
|
|
580
534
|
|
|
581
|
-
##
|
|
535
|
+
## Development
|
|
582
536
|
|
|
583
|
-
|
|
584
|
-
|
|
537
|
+
```bash
|
|
538
|
+
uv sync --group dev
|
|
539
|
+
uv run python -m pytest test tests
|
|
540
|
+
python3 -m compileall src/simplecadapi
|
|
541
|
+
```
|
|
585
542
|
|
|
586
543
|
## License
|
|
587
544
|
|
|
588
|
-
MIT, see `LICENSE
|
|
545
|
+
MIT, see [`LICENSE`](LICENSE).
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# SimpleCADAPI
|
|
2
|
+
|
|
3
|
+
SimpleCADAPI is an OCP-native Python SDK for building CAD models with clear,
|
|
4
|
+
functional operations and replayable model graphs. It wraps OpenCascade geometry
|
|
5
|
+
in a compact public API for creating solids, applying features, tagging semantic
|
|
6
|
+
intent, querying topology, exporting manufacturing files, and translating recorded
|
|
7
|
+
models into FreeCAD workflows.
|
|
8
|
+
|
|
9
|
+
Current beta: `simplecadapi==2.0.0b4`.
|
|
10
|
+
|
|
11
|
+
## What It Provides
|
|
12
|
+
|
|
13
|
+
- OCP-native shape types: `Vertex`, `Edge`, `Wire`, `Face`, and `Solid`.
|
|
14
|
+
- Functional modeling operations for primitives, profiles, extrude, revolve,
|
|
15
|
+
loft, sweep, booleans, transforms, patterns, fillets, chamfers, and shells.
|
|
16
|
+
- Replayable modeling with `GraphSession`, `export_model_json(...)`,
|
|
17
|
+
`import_model_json(...)`, and `replay_model_json(...)`.
|
|
18
|
+
- Expression parameters with `var(...)`, arithmetic expressions, and serialized
|
|
19
|
+
expression graphs.
|
|
20
|
+
- QL selectors for geometry grounding, topology queries, and stable feature
|
|
21
|
+
selections.
|
|
22
|
+
- Semantic tags through `apply_tag(shape, tag)` and `list_tags(shape)`.
|
|
23
|
+
- STEP/STL export and FreeCAD translation helpers for script or `.FCStd` output.
|
|
24
|
+
|
|
25
|
+
## Install
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
pip install simplecadapi
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
With `uv`:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
uv add simplecadapi
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
For local development from this repository:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
uv sync --group dev
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Quick Start
|
|
44
|
+
|
|
45
|
+
```python
|
|
46
|
+
from pathlib import Path
|
|
47
|
+
|
|
48
|
+
import simplecadapi as scad
|
|
49
|
+
|
|
50
|
+
out = Path("out")
|
|
51
|
+
out.mkdir(exist_ok=True)
|
|
52
|
+
|
|
53
|
+
base = scad.make_box_rsolid(60.0, 36.0, 8.0, bottom_face_center=(0.0, 0.0, 0.0))
|
|
54
|
+
hole = scad.make_cylinder_rsolid(5.0, 14.0, bottom_face_center=(0.0, 0.0, -3.0))
|
|
55
|
+
slot = scad.make_box_rsolid(18.0, 8.0, 14.0, bottom_face_center=(14.0, 0.0, -3.0))
|
|
56
|
+
|
|
57
|
+
part = scad.cut_rsolid(base, hole, slot)
|
|
58
|
+
boss = scad.make_cylinder_rsolid(8.0, 7.0, bottom_face_center=(-18.0, 0.0, 8.0))
|
|
59
|
+
part = scad.union_rsolid(part, boss)
|
|
60
|
+
part = scad.apply_tag(part, "role.demo.bracket")
|
|
61
|
+
|
|
62
|
+
print("volume", round(part.get_volume(), 3))
|
|
63
|
+
print("faces", len(part.get_faces()))
|
|
64
|
+
print("tags", scad.list_tags(part))
|
|
65
|
+
|
|
66
|
+
scad.export_step(part, str(out / "bracket.step"))
|
|
67
|
+
scad.export_stl(part, str(out / "bracket.stl"))
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Replayable Modeling
|
|
71
|
+
|
|
72
|
+
Use `GraphSession` when a model should be inspectable, serializable, replayable,
|
|
73
|
+
or translated into another CAD environment.
|
|
74
|
+
|
|
75
|
+
```python
|
|
76
|
+
import simplecadapi as scad
|
|
77
|
+
from simplecadapi import ql as Q
|
|
78
|
+
|
|
79
|
+
with scad.GraphSession() as session:
|
|
80
|
+
body = scad.make_box_rsolid(40.0, 24.0, 10.0, bottom_face_center=(0.0, 0.0, 0.0))
|
|
81
|
+
cutter = scad.make_cylinder_rsolid(4.0, 16.0, bottom_face_center=(0.0, 0.0, -3.0))
|
|
82
|
+
drilled = scad.cut_rsolid(body, cutter)
|
|
83
|
+
|
|
84
|
+
bottom_circle = (
|
|
85
|
+
Q.edges()
|
|
86
|
+
.where(Q.curve_type("circle"))
|
|
87
|
+
.order_by(Q.center_axis("z"))
|
|
88
|
+
.take(1)
|
|
89
|
+
.exactly(1)
|
|
90
|
+
)
|
|
91
|
+
final = scad.chamfer_rsolid(drilled, bottom_circle, 0.6)
|
|
92
|
+
|
|
93
|
+
model_json = scad.export_model_json(session)
|
|
94
|
+
rebuilt = scad.replay_model_json(model_json)
|
|
95
|
+
|
|
96
|
+
print("recorded_nodes", session.graph.node_count)
|
|
97
|
+
print("replayed_outputs", len(rebuilt))
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Modeling Mental Model
|
|
101
|
+
|
|
102
|
+
- Start from design intent: reference axes, critical profiles, and the features
|
|
103
|
+
that produce the final solid.
|
|
104
|
+
- Build from lower-dimensional geometry to higher-dimensional geometry: profile
|
|
105
|
+
wires/faces first, then solid features such as extrude, revolve, loft, and
|
|
106
|
+
sweep.
|
|
107
|
+
- Keep operations functional. Create new values with public functions such as
|
|
108
|
+
`make_rectangle_rface(...)`, `extrude_rsolid(...)`, `cut_rsolid(...)`, and
|
|
109
|
+
`fillet_rsolid(...)`.
|
|
110
|
+
- Use tags for semantic intent and selection anchors, for example
|
|
111
|
+
`role.mounting.surface`, `anchor.datum.primary`, or `group.fasteners`.
|
|
112
|
+
- Store numeric and geometric facts in metadata or graph payloads, not in tags.
|
|
113
|
+
- Use QL to ground selections by geometry facts rather than relying on topology
|
|
114
|
+
iteration order.
|
|
115
|
+
- When an indexed topology pick is intentional, pass the index to the plural
|
|
116
|
+
child-geometry getter, such as `get_edges(index)`, `get_faces(index)`,
|
|
117
|
+
`get_wires(index)`, or `get_vertices(index)`, so replayable graph workflows
|
|
118
|
+
preserve the pick as a geo select node.
|
|
119
|
+
- Use model JSON as the interchange boundary for replay, tests, and FreeCAD
|
|
120
|
+
translation.
|
|
121
|
+
|
|
122
|
+
## FreeCAD Translation
|
|
123
|
+
|
|
124
|
+
Recorded model JSON can be translated into a FreeCAD Python script:
|
|
125
|
+
|
|
126
|
+
```python
|
|
127
|
+
script = scad.translate_model_json_to_freecad_script(model_json)
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
If FreeCAD or FreeCADCmd is available, the same model JSON can be written as an
|
|
131
|
+
`.FCStd` file:
|
|
132
|
+
|
|
133
|
+
```python
|
|
134
|
+
scad.translate_model_json_to_fcstd(model_json, "bracket.FCStd")
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Examples
|
|
138
|
+
|
|
139
|
+
Run examples from the source checkout:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
uv run python examples/01_basic_modeling.py
|
|
143
|
+
uv run python examples/02_graph_replay.py
|
|
144
|
+
uv run python examples/03_expressions.py
|
|
145
|
+
uv run python examples/05_loft_sweep_revolve.py
|
|
146
|
+
uv run python examples/06_parametric_gear_model.py
|
|
147
|
+
uv run python examples/07_serialization_operation_tree.py
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Documentation
|
|
151
|
+
|
|
152
|
+
- Public API reference: [`docs/api/`](docs/api/)
|
|
153
|
+
- Core type and modeling notes: [`docs/core/`](docs/core/)
|
|
154
|
+
- Serialization and replay details:
|
|
155
|
+
[`docs/core/serialization/README.md`](docs/core/serialization/README.md)
|
|
156
|
+
- Operation graph JSON spec:
|
|
157
|
+
[`docs/core/operation_graph_json_spec.md`](docs/core/operation_graph_json_spec.md)
|
|
158
|
+
|
|
159
|
+
## Development
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
uv sync --group dev
|
|
163
|
+
uv run python -m pytest test tests
|
|
164
|
+
python3 -m compileall src/simplecadapi
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## License
|
|
168
|
+
|
|
169
|
+
MIT, see [`LICENSE`](LICENSE).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# SimpleCAD API Index
|
|
2
2
|
|
|
3
|
-
This index includes generated docs for the public SimpleCAD API surface, including
|
|
3
|
+
This index includes generated docs for the public SimpleCAD API surface, including geometry operations, graph/model JSON workflows, expressions, QL, and export helpers.
|
|
4
4
|
|
|
5
5
|
## Import Surfaces
|
|
6
6
|
|
|
@@ -56,8 +56,8 @@ This index includes generated docs for the public SimpleCAD API surface, includi
|
|
|
56
56
|
|
|
57
57
|
## Boolean Operations
|
|
58
58
|
|
|
59
|
-
- [
|
|
60
|
-
- [
|
|
59
|
+
- [cut_rsolid](cut_rsolid.md) *(from operations.py)* `top-level`
|
|
60
|
+
- [intersect_rsolid](intersect_rsolid.md) *(from operations.py)* `top-level`
|
|
61
61
|
- [union_rsolid](union_rsolid.md) *(from operations.py)* `top-level`
|
|
62
62
|
|
|
63
63
|
## Export
|
|
@@ -65,6 +65,11 @@ This index includes generated docs for the public SimpleCAD API surface, includi
|
|
|
65
65
|
- [export_step](export_step.md) *(from operations.py)* `top-level`
|
|
66
66
|
- [export_stl](export_stl.md) *(from operations.py)* `top-level`
|
|
67
67
|
|
|
68
|
+
## FreeCAD Translation
|
|
69
|
+
|
|
70
|
+
- [translate_model_json_to_fcstd](translate_model_json_to_fcstd.md) *(from freecad_translator.py)* `top-level`
|
|
71
|
+
- [translate_model_json_to_freecad_script](translate_model_json_to_freecad_script.md) *(from freecad_translator.py)* `top-level`
|
|
72
|
+
|
|
68
73
|
## Modeling Graph and Replay
|
|
69
74
|
|
|
70
75
|
- [GraphSession](GraphSession.md) *(from graph.py)* `top-level`
|
simplecadapi-2.0.0b2/docs/api/cut_rsolidlist.md → simplecadapi-2.0.0b4/docs/api/cut_rsolid.md
RENAMED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
#
|
|
1
|
+
# cut_rsolid
|
|
2
2
|
|
|
3
3
|
## API Definition
|
|
4
4
|
|
|
5
5
|
```python
|
|
6
|
-
def
|
|
6
|
+
def cut_rsolid(*solids: Union[Solid, Sequence[Solid]], skip_non_intersecting: bool = True) -> Solid
|
|
7
7
|
```
|
|
8
8
|
|
|
9
9
|
*Source: operations.py*
|
|
10
10
|
|
|
11
11
|
## Import Surface
|
|
12
12
|
|
|
13
|
-
- top-level: `from simplecadapi import
|
|
13
|
+
- top-level: `from simplecadapi import cut_rsolid`
|
|
14
14
|
|
|
15
15
|
## Description
|
|
16
16
|
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
#
|
|
1
|
+
# intersect_rsolid
|
|
2
2
|
|
|
3
3
|
## API Definition
|
|
4
4
|
|
|
5
5
|
```python
|
|
6
|
-
def
|
|
6
|
+
def intersect_rsolid(*solids: Union[Solid, Sequence[Solid]]) -> Solid
|
|
7
7
|
```
|
|
8
8
|
|
|
9
9
|
*Source: operations.py*
|
|
10
10
|
|
|
11
11
|
## Import Surface
|
|
12
12
|
|
|
13
|
-
- top-level: `from simplecadapi import
|
|
13
|
+
- top-level: `from simplecadapi import intersect_rsolid`
|
|
14
14
|
|
|
15
15
|
## Description
|
|
16
16
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# translate_model_json_to_fcstd
|
|
2
|
+
|
|
3
|
+
## API Definition
|
|
4
|
+
|
|
5
|
+
```python
|
|
6
|
+
def translate_model_json_to_fcstd(json_str: str, output_path: str, *, document_name: str = 'SimpleCADModel', freecad_cmd: Optional[str] = None) -> str
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
*Source: freecad_translator.py*
|
|
10
|
+
|
|
11
|
+
## Import Surface
|
|
12
|
+
|
|
13
|
+
- top-level: `from simplecadapi import translate_model_json_to_fcstd`
|
|
14
|
+
|
|
15
|
+
## Description
|
|
16
|
+
|
|
17
|
+
Translate canonical model JSON to `.FCStd` via FreeCADCmd/FreeCAD.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# translate_model_json_to_freecad_script
|
|
2
|
+
|
|
3
|
+
## API Definition
|
|
4
|
+
|
|
5
|
+
```python
|
|
6
|
+
def translate_model_json_to_freecad_script(json_str: str, document_name: str = 'SimpleCADModel') -> str
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
*Source: freecad_translator.py*
|
|
10
|
+
|
|
11
|
+
## Import Surface
|
|
12
|
+
|
|
13
|
+
- top-level: `from simplecadapi import translate_model_json_to_freecad_script`
|
|
14
|
+
|
|
15
|
+
## Description
|
|
16
|
+
|
|
17
|
+
Translate exported model JSON into a FreeCAD Python script.
|
|
@@ -57,7 +57,7 @@ SimpleCADAPI 的顶层 API 选择是正确的:它没有把用户拖进传统 C
|
|
|
57
57
|
|
|
58
58
|
- 顶层 API 被 aliases 稀释了。`create_box`、`create_line`、`extrude`、`union`、`to_step` 等别名降低了 canonical API 的唯一性。对用户友好,但对文档、LLM、图记录和长期兼容不友好。参考:`src/simplecadapi/__init__.py:145`、`src/simplecadapi/__init__.py:318`。
|
|
59
59
|
- README 说 API 函数统一用 return type 反映命名,但公开面包含 `translate_shape`、`rotate_shape`、`export_step`、`export_stl` 和大量 aliases。这个声明过强。参考:`README.md:200`、`src/simplecadapi/__init__.py:47`、`src/simplecadapi/__init__.py:187`。
|
|
60
|
-
- `rsolidlist` 命名混杂了“参数类型”和“返回类型”:`
|
|
60
|
+
- `rsolidlist` 命名混杂了“参数类型”和“返回类型”:`cut_rsolid`、`intersect_rsolid` 实际返回 `Solid`,而 `linear_pattern_rsolidlist` 返回 `List[Solid]`。这会伤害 API 语义一致性。参考:`src/simplecadapi/operations.py:2994`、`src/simplecadapi/operations.py:3102`、`src/simplecadapi/operations.py:4121`。
|
|
61
61
|
- public op 名和 graph op 名不完全一致:`translate_shape` 记录为 `make_translate_rshape`,`extrude_rsolid` 记录为 `make_extrude_rsolid`。这种分层可以接受,但必须正式化为“source API”和“canonical IR”的稳定映射表。参考:`src/simplecadapi/operations.py:117`、`src/simplecadapi/serializer.py:116`。
|
|
62
62
|
- 一些非 session 分支仍记录 legacy op 名,如 `make_box`、`make_cylinder`、`make_segment_wire`,和 canonical `make_*_r*` 命名不一致。参考:`src/simplecadapi/operations.py:785`、`src/simplecadapi/operations.py:1534`、`src/simplecadapi/operations.py:1638`。
|
|
63
63
|
|
|
@@ -186,7 +186,7 @@ QL 是架构上最应该继续投资的部分。
|
|
|
186
186
|
|
|
187
187
|
- `tracked_union` 接收 `glue` 和 `tol`,但没有把它们设置到 `BRepAlgoAPI_Fuse`。也就是说用于结果的 union 和用于 tracking 的 union 参数可能不一致。参考:`src/simplecadapi/tracking.py:338`、`src/simplecadapi/tracking.py:352`。
|
|
188
188
|
- `union_rsolid` replay 忽略记录过的 `clean`、`glue`、`tol`,只调用 `ops.union_rsolid(all_solids)`。参数不 faithful。参考:`src/simplecadapi/operations.py:2946`、`src/simplecadapi/serializer.py:1029`。
|
|
189
|
-
- `
|
|
189
|
+
- `cut_rsolid` 对无交集 tool 直接跳过,这对 modeling convenience 可能友好,但对 replay/diagnostic 来说可能隐藏错误。参考:`src/simplecadapi/operations.py:3033`。
|
|
190
190
|
- 多 tool cut/intersect 只保留最后一次 delta,前面 tool 的 lineage 丢失。参考:`src/simplecadapi/operations.py:3020`、`src/simplecadapi/operations.py:3127`。
|
|
191
191
|
- extrude face classification 使用 center 精确相等、normal dot 精确等于 0、angle 精确等于 pi,这在 CAD 数值几何里非常脆弱。参考:`src/simplecadapi/operations.py:2631`、`src/simplecadapi/operations.py:2646`、`src/simplecadapi/operations.py:2653`。
|
|
192
192
|
|