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.
Files changed (144) hide show
  1. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/PKG-INFO +115 -158
  2. simplecadapi-2.0.0b4/README.md +169 -0
  3. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/README.md +8 -3
  4. simplecadapi-2.0.0b2/docs/api/cut_rsolidlist.md → simplecadapi-2.0.0b4/docs/api/cut_rsolid.md +3 -3
  5. simplecadapi-2.0.0b2/docs/api/intersect_rsolidlist.md → simplecadapi-2.0.0b4/docs/api/intersect_rsolid.md +3 -3
  6. simplecadapi-2.0.0b4/docs/api/translate_model_json_to_fcstd.md +17 -0
  7. simplecadapi-2.0.0b4/docs/api/translate_model_json_to_freecad_script.md +17 -0
  8. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/architecture/sdk-architecture-review.md +2 -2
  9. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/README.md +5 -7
  10. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/declarative_constraints.md +1 -1
  11. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/operation_graph_json_spec.md +25 -26
  12. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/rearchitecture_2_0_requirements.md +2 -2
  13. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/serialization/README.md +2 -3
  14. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/serialization/expressions-and-replay.md +1 -2
  15. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/serialization/features-booleans-transforms.md +9 -12
  16. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/solid.md +40 -6
  17. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/wire.md +1 -1
  18. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/pyproject.toml +4 -3
  19. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/__init__.py +6 -6
  20. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/auto_tools/auto_docs_gen.py +8 -2
  21. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/auto_tools/make_export.py +2 -2
  22. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/auto_tools/skill_pack.py +7 -4
  23. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/core.py +96 -17
  24. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/evolve.py +4 -4
  25. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/freecad_translator.py +15 -14
  26. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/graph.py +1 -1
  27. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/operations.py +113 -82
  28. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/serializer.py +10 -19
  29. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/topology.py +3 -3
  30. simplecadapi-2.0.0b2/README.md +0 -213
  31. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/.gitignore +0 -0
  32. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/LICENSE +0 -0
  33. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/MANIFEST.in +0 -0
  34. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/Const.md +0 -0
  35. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/Expr.md +0 -0
  36. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/ExpressionGraph.md +0 -0
  37. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/GraphSession.md +0 -0
  38. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/SemanticDelta.md +0 -0
  39. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/SemanticRef.md +0 -0
  40. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/SimpleCADError.md +0 -0
  41. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/Sketch.md +0 -0
  42. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/Var.md +0 -0
  43. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/and_.md +0 -0
  44. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/apply_tag.md +0 -0
  45. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/chamfer_rsolid.md +0 -0
  46. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/const_function.md +0 -0
  47. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/export_graph_json.md +0 -0
  48. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/export_model_json.md +0 -0
  49. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/export_session_json.md +0 -0
  50. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/export_step.md +0 -0
  51. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/export_stl.md +0 -0
  52. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/extrude_rsolid.md +0 -0
  53. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/fillet_rsolid.md +0 -0
  54. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/geo.md +0 -0
  55. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/helical_sweep_rsolid.md +0 -0
  56. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/import_graph_json.md +0 -0
  57. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/import_model_json.md +0 -0
  58. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/import_session_json.md +0 -0
  59. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/linear_pattern_rsolidlist.md +0 -0
  60. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/list_tags.md +0 -0
  61. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/loft_rsolid.md +0 -0
  62. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_angle_arc_redge.md +0 -0
  63. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_angle_arc_rwire.md +0 -0
  64. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_box_rsolid.md +0 -0
  65. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_circle_redge.md +0 -0
  66. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_circle_rface.md +0 -0
  67. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_circle_rwire.md +0 -0
  68. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_cone_rsolid.md +0 -0
  69. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_cylinder_rsolid.md +0 -0
  70. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_face_from_wire_rface.md +0 -0
  71. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_helix_redge.md +0 -0
  72. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_helix_rwire.md +0 -0
  73. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_line_redge.md +0 -0
  74. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_n_hole_flange_rsolid.md +0 -0
  75. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_naca_propeller_blade_rsolid.md +0 -0
  76. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_point_rvertex.md +0 -0
  77. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_polyline_rwire.md +0 -0
  78. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_rectangle_rface.md +0 -0
  79. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_rectangle_rwire.md +0 -0
  80. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_segment_redge.md +0 -0
  81. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_segment_rwire.md +0 -0
  82. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_sphere_rsolid.md +0 -0
  83. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_spline_redge.md +0 -0
  84. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_spline_rwire.md +0 -0
  85. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_threaded_rod_rsolid.md +0 -0
  86. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_three_point_arc_redge.md +0 -0
  87. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_three_point_arc_rwire.md +0 -0
  88. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/make_wire_from_edges_rwire.md +0 -0
  89. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/meta.md +0 -0
  90. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/mirror_shape.md +0 -0
  91. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/not_.md +0 -0
  92. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/or_.md +0 -0
  93. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/radial_pattern_rsolidlist.md +0 -0
  94. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/render_screenshot_rpath.md +0 -0
  95. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/replay_graph.md +0 -0
  96. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/replay_model_json.md +0 -0
  97. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/revolve_rsolid.md +0 -0
  98. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/rotate_shape.md +0 -0
  99. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/select.md +0 -0
  100. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/select_edges_by_tag.md +0 -0
  101. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/select_faces_by_tag.md +0 -0
  102. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/shell_rsolid.md +0 -0
  103. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/suspend_graph_recording.md +0 -0
  104. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/sweep_rsolid.md +0 -0
  105. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/tag.md +0 -0
  106. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/translate_shape.md +0 -0
  107. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/union_rsolid.md +0 -0
  108. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/value.md +0 -0
  109. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/api/var_function.md +0 -0
  110. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/compound.md +0 -0
  111. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/coordinate_system.md +0 -0
  112. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/edge.md +0 -0
  113. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/face.md +0 -0
  114. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/rearchitecture_2_0.md +0 -0
  115. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/serialization/primitives-and-profiles.md +0 -0
  116. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/serialization/scalar-fields.md +0 -0
  117. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/shell.md +0 -0
  118. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/simple_workplane.md +0 -0
  119. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/tagged_mixin.md +0 -0
  120. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/docs/core/vertex.md +0 -0
  121. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/_vendor_warning_filters.py +0 -0
  122. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/auto_tools/__init__.py +0 -0
  123. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/auto_tools/evolution.py +0 -0
  124. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/autotag.py +0 -0
  125. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/errors.py +0 -0
  126. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/expr.py +0 -0
  127. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/frame.py +0 -0
  128. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/__init__.py +0 -0
  129. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/ocp_booleans.py +0 -0
  130. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/ocp_builders.py +0 -0
  131. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/ocp_cast.py +0 -0
  132. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/ocp_curves.py +0 -0
  133. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/ocp_export.py +0 -0
  134. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/ocp_features.py +0 -0
  135. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/ocp_mesh.py +0 -0
  136. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/ocp_properties.py +0 -0
  137. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/ocp_topology.py +0 -0
  138. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/ocp_transforms.py +0 -0
  139. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/kernel/spline_fit.py +0 -0
  140. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/py.typed +0 -0
  141. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/ql.py +0 -0
  142. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/sketch.py +0 -0
  143. {simplecadapi-2.0.0b2 → simplecadapi-2.0.0b4}/src/simplecadapi/tagging.py +0 -0
  144. {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.0b2
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: >=3.10
364
- Requires-Dist: cadquery-ocp>=7.8.1
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 imperative CAD modeling Python package. It keeps the 1.x-style functional API while adding v2 graph recording, expression parameters, and replayable model JSON workflows.
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
- ## README Scope
385
+ Current beta: `simplecadapi==2.0.0b4`.
381
386
 
382
- This README only covers package-level capabilities, installation methods, publishing/packaging workflows, and Skills usage instructions.
383
- Experimental scripts and temporary modeling examples are not included as formal documentation.
387
+ ## What It Provides
384
388
 
385
- ## Package Installation (Python Package Managers)
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
- Current package name: `simplecadapi` (see `pyproject.toml` for the version).
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
- Optional development dependencies:
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
- ### Method C: Install from local build artifacts
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 build
416
+ uv sync --group dev
421
417
  ```
422
418
 
423
- ## Quick Verification of Installation
419
+ ## Quick Start
424
420
 
425
421
  ```python
426
- import simplecadapi as scad
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
- This project provides the `skill-pack` CLI for generating lightweight SDK reference skills: **No built-in SDK source code**, focused on API and architecture descriptions.
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
- ### 2) Packaging Result Structure
426
+ out = Path("out")
427
+ out.mkdir(exist_ok=True)
454
428
 
455
- After packaging, you will get a directory similar to:
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
- - `skills/simplecadapi/SKILL.md`
458
- - `skills/simplecadapi/references/`
459
- - `skills/simplecadapi/references/docs/api/`
460
- - `skills/simplecadapi/references/docs/core/`
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
- ### 3) Read the SDK skill
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
- ```bash
465
- cd skills/simplecadapi
442
+ scad.export_step(part, str(out / "bracket.step"))
443
+ scad.export_stl(part, str(out / "bracket.stl"))
466
444
  ```
467
445
 
468
- Key entry points:
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
- ### 4) Preferred v2 replay workflow
448
+ Use `GraphSession` when a model should be inspectable, serializable, replayable,
449
+ or translated into another CAD environment.
479
450
 
480
451
  ```python
481
- from simplecadapi import GraphSession, export_model_json, replay_model_json
482
-
483
- with GraphSession() as session:
484
- ...
485
-
486
- model_json = export_model_json(session)
487
- rebuilt = replay_model_json(model_json)
488
- print(len(rebuilt))
489
- ```
490
-
491
- ## Serialization and Replay Docs
492
-
493
- For detailed operation-by-operation JSON formats and replay behavior, see:
494
-
495
- - [`docs/core/serialization/README.md`](docs/core/serialization/README.md)
496
- - [`docs/core/operation_graph_json_spec.md`](docs/core/operation_graph_json_spec.md)
497
- - [`examples/07_serialization_operation_tree.py`](examples/07_serialization_operation_tree.py)
498
-
499
- ## Auto Tools
500
-
501
- The project includes 4 main CLIs:
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
- Run the sync:
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
- ```bash
538
- set -a && source .env && set +a
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
- Common parameters:
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
- ```bash
554
- uv pip install -e ".[dev]"
509
+ ```python
510
+ scad.translate_model_json_to_fcstd(model_json, "bracket.FCStd")
555
511
  ```
556
512
 
557
- Run unit tests:
513
+ ## Examples
558
514
 
559
- ```bash
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
- ## Core Design Constraints (Brief)
526
+ ## Documentation
575
527
 
576
- - API functions uniformly use `snake_case` and reflect return types in function names (e.g., `*_rsolid`, `*_rwire`).
577
- - Core types are OCP-native wrappers and are kept as stable as possible; functionality is extended by adding new functions (Open-Closed Principle).
578
- - Support `SimpleWorkplane` context for local coordinate modeling.
579
- - Export interfaces support single entities, multiple entities, and nested list inputs.
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
- ## Documentation Entry Points
535
+ ## Development
582
536
 
583
- - API documentation: `docs/api/`
584
- - Core documentation: `docs/core/`
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 v2 graph, expression, and model JSON workflows.
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
- - [cut_rsolidlist](cut_rsolidlist.md) *(from operations.py)* `top-level`
60
- - [intersect_rsolidlist](intersect_rsolidlist.md) *(from operations.py)* `top-level`
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`
@@ -1,16 +1,16 @@
1
- # cut_rsolidlist
1
+ # cut_rsolid
2
2
 
3
3
  ## API Definition
4
4
 
5
5
  ```python
6
- def cut_rsolidlist(*solids: Union[Solid, Sequence[Solid]], skip_non_intersecting: bool = True) -> Solid
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 cut_rsolidlist`
13
+ - top-level: `from simplecadapi import cut_rsolid`
14
14
 
15
15
  ## Description
16
16
 
@@ -1,16 +1,16 @@
1
- # intersect_rsolidlist
1
+ # intersect_rsolid
2
2
 
3
3
  ## API Definition
4
4
 
5
5
  ```python
6
- def intersect_rsolidlist(*solids: Union[Solid, Sequence[Solid]]) -> Solid
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 intersect_rsolidlist`
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` 命名混杂了“参数类型”和“返回类型”:`cut_rsolidlist`、`intersect_rsolidlist` 实际返回 `Solid`,而 `linear_pattern_rsolidlist` 返回 `List[Solid]`。这会伤害 API 语义一致性。参考:`src/simplecadapi/operations.py:2994`、`src/simplecadapi/operations.py:3102`、`src/simplecadapi/operations.py:4121`。
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
- - `cut_rsolidlist` 对无交集 tool 直接跳过,这对 modeling convenience 可能友好,但对 replay/diagnostic 来说可能隐藏错误。参考:`src/simplecadapi/operations.py:3033`。
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