simplecadapi 2.0.7__tar.gz → 2.0.9__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 (268) hide show
  1. simplecadapi-2.0.9/.paper_section.tex.swp +0 -0
  2. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/PKG-INFO +3 -3
  3. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/README.md +2 -2
  4. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/union_rsolidlist.md +26 -4
  5. simplecadapi-2.0.9/paper_section.tex +92 -0
  6. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/pyproject.toml +1 -1
  7. simplecadapi-2.0.9/rebuttal.md +57 -0
  8. simplecadapi-2.0.9/refactor-plan/topology-ql.md +351 -0
  9. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/SKILL.md +3 -3
  10. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/PROJECT_OVERVIEW.md +2 -2
  11. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/PROJECT_README.md +2 -2
  12. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/RUNTIME_INSTALL.md +1 -1
  13. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/union_rsolidlist.md +26 -4
  14. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/scripts/install.sh +2 -2
  15. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/scripts/repl_bootstrap.py +1 -1
  16. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/__init__.py +12 -18
  17. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/auto_tools/skill_pack.py +6 -3
  18. simplecadapi-2.0.9/src/simplecadapi/autotag.py +165 -0
  19. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/core.py +15 -0
  20. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/evolve.py +9 -5
  21. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/field.py +62 -0
  22. simplecadapi-2.0.9/src/simplecadapi/graph.py +336 -0
  23. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/operations.py +1079 -133
  24. simplecadapi-2.0.9/src/simplecadapi/ql.py +831 -0
  25. simplecadapi-2.0.9/src/simplecadapi/serializer.py +866 -0
  26. simplecadapi-2.0.9/src/simplecadapi/topology.py +501 -0
  27. simplecadapi-2.0.9/src/simplecadapi/tracking.py +676 -0
  28. simplecadapi-2.0.9/table.step +1898 -0
  29. simplecadapi-2.0.9/table.stl +0 -0
  30. simplecadapi-2.0.9/table_grounding_example.py +192 -0
  31. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/test/test_all_features.py +41 -2
  32. simplecadapi-2.0.9/test/test_graph_ql.py +139 -0
  33. simplecadapi-2.0.9/test/test_original_api_integration.py +188 -0
  34. simplecadapi-2.0.9/test/test_public_api_surface.py +56 -0
  35. simplecadapi-2.0.9/test/test_ql.py +228 -0
  36. simplecadapi-2.0.9/test/test_serialization.py +580 -0
  37. simplecadapi-2.0.9/test/test_tracking_boolean.py +183 -0
  38. simplecadapi-2.0.9/test/test_tracking_data_models.py +270 -0
  39. simplecadapi-2.0.9/test/test_tracking_features.py +144 -0
  40. simplecadapi-2.0.9/test/test_tracking_tags.py +126 -0
  41. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/uv.lock +1 -1
  42. simplecadapi-2.0.7/src/simplecadapi/ql.py +0 -363
  43. simplecadapi-2.0.7/test/test_ql.py +0 -74
  44. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/.gitignore +0 -0
  45. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/.python-version +0 -0
  46. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/LICENSE +0 -0
  47. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/MANIFEST.in +0 -0
  48. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/README.md +0 -0
  49. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/add_part_rassembly.md +0 -0
  50. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/and_.md +0 -0
  51. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/bounds_rbbox.md +0 -0
  52. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/chamfer_rsolid.md +0 -0
  53. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/clear_constraints_rassembly.md +0 -0
  54. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/clone_assembly_rassembly.md +0 -0
  55. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/constrain_coincident_rassembly.md +0 -0
  56. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/constrain_concentric_rassembly.md +0 -0
  57. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/constrain_distance_rassembly.md +0 -0
  58. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/constrain_offset_rassembly.md +0 -0
  59. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/cut_rsolidlist.md +0 -0
  60. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/eval_rarray.md +0 -0
  61. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/eval_rscalar.md +0 -0
  62. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/export_step.md +0 -0
  63. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/export_stl.md +0 -0
  64. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/extrude_rsolid.md +0 -0
  65. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/fillet_rsolid.md +0 -0
  66. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/geo.md +0 -0
  67. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/helical_sweep_rsolid.md +0 -0
  68. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/intersect_rscalarfield.md +0 -0
  69. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/intersect_rsolidlist.md +0 -0
  70. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/linear_pattern_rsolidlist.md +0 -0
  71. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/loft_rsolid.md +0 -0
  72. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_angle_arc_redge.md +0 -0
  73. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_angle_arc_rwire.md +0 -0
  74. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_assembly_rassembly.md +0 -0
  75. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_box_rscalarfield.md +0 -0
  76. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_box_rsolid.md +0 -0
  77. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_capsule_rscalarfield.md +0 -0
  78. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_circle_redge.md +0 -0
  79. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_circle_rface.md +0 -0
  80. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_circle_rwire.md +0 -0
  81. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_cone_rsolid.md +0 -0
  82. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_cylinder_rsolid.md +0 -0
  83. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_ellipsoid_rscalarfield.md +0 -0
  84. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_face_from_wire_rface.md +0 -0
  85. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_field_surface_rsolid.md +0 -0
  86. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_helix_redge.md +0 -0
  87. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_helix_rwire.md +0 -0
  88. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_line_redge.md +0 -0
  89. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_n_hole_flange_rsolid.md +0 -0
  90. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_naca_propeller_blade_rsolid.md +0 -0
  91. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_point_rvertex.md +0 -0
  92. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_polyline_rwire.md +0 -0
  93. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_rectangle_rface.md +0 -0
  94. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_rectangle_rwire.md +0 -0
  95. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_segment_redge.md +0 -0
  96. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_segment_rwire.md +0 -0
  97. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_sphere_rscalarfield.md +0 -0
  98. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_sphere_rsolid.md +0 -0
  99. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_spline_redge.md +0 -0
  100. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_spline_rwire.md +0 -0
  101. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_threaded_rod_rsolid.md +0 -0
  102. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_three_point_arc_redge.md +0 -0
  103. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_three_point_arc_rwire.md +0 -0
  104. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_wire_from_edges_rwire.md +0 -0
  105. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/meta.md +0 -0
  106. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/mirror_shape.md +0 -0
  107. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/not_.md +0 -0
  108. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/or_.md +0 -0
  109. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/radial_pattern_rsolidlist.md +0 -0
  110. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/render_screenshot_rpath.md +0 -0
  111. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/revolve_rsolid.md +0 -0
  112. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/rotate_part_rassembly.md +0 -0
  113. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/rotate_rscalarfield.md +0 -0
  114. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/rotate_shape.md +0 -0
  115. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/scale_rscalarfield.md +0 -0
  116. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/select.md +0 -0
  117. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/select_edges_by_tag.md +0 -0
  118. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/select_faces_by_tag.md +0 -0
  119. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/set_tag.md +0 -0
  120. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/shell_rsolid.md +0 -0
  121. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/smooth_subtract_rscalarfield.md +0 -0
  122. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/smooth_union_rscalarfield.md +0 -0
  123. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/solve_assembly_rresult.md +0 -0
  124. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/stack.md +0 -0
  125. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/stack_rassembly.md +0 -0
  126. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/subtract_rscalarfield.md +0 -0
  127. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/sweep_rsolid.md +0 -0
  128. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/tag.md +0 -0
  129. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/translate_part_rassembly.md +0 -0
  130. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/translate_rscalarfield.md +0 -0
  131. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/translate_shape.md +0 -0
  132. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/union_rscalarfield.md +0 -0
  133. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/value.md +0 -0
  134. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/README.md +0 -0
  135. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/compound.md +0 -0
  136. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/coordinate_system.md +0 -0
  137. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/declarative_constraints.md +0 -0
  138. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/edge.md +0 -0
  139. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/face.md +0 -0
  140. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/shell.md +0 -0
  141. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/simple_workplane.md +0 -0
  142. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/solid.md +0 -0
  143. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/tagged_mixin.md +0 -0
  144. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/vertex.md +0 -0
  145. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/wire.md +0 -0
  146. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/examples.py +0 -0
  147. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/refactor-plan/tagging.md +0 -0
  148. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/scripts/publish.sh +0 -0
  149. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/scripts/sync_ragflow_docs.py +0 -0
  150. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/cases/simplecad_self_evolve_cases/__init__.py +0 -0
  151. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/cases/simplecad_self_evolve_cases/evolve.py +0 -0
  152. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/EVOLVE_WORKFLOW.md +0 -0
  153. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/LICENSE.txt +0 -0
  154. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/README.md +0 -0
  155. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/add_part_rassembly.md +0 -0
  156. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/and_.md +0 -0
  157. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/bounds_rbbox.md +0 -0
  158. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/chamfer_rsolid.md +0 -0
  159. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/clear_constraints_rassembly.md +0 -0
  160. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/clone_assembly_rassembly.md +0 -0
  161. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/constrain_coincident_rassembly.md +0 -0
  162. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/constrain_concentric_rassembly.md +0 -0
  163. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/constrain_distance_rassembly.md +0 -0
  164. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/constrain_offset_rassembly.md +0 -0
  165. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/cut_rsolidlist.md +0 -0
  166. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/eval_rarray.md +0 -0
  167. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/eval_rscalar.md +0 -0
  168. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/export_step.md +0 -0
  169. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/export_stl.md +0 -0
  170. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/extrude_rsolid.md +0 -0
  171. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/fillet_rsolid.md +0 -0
  172. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/geo.md +0 -0
  173. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/helical_sweep_rsolid.md +0 -0
  174. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/intersect_rscalarfield.md +0 -0
  175. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/intersect_rsolidlist.md +0 -0
  176. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/linear_pattern_rsolidlist.md +0 -0
  177. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/loft_rsolid.md +0 -0
  178. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_angle_arc_redge.md +0 -0
  179. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_angle_arc_rwire.md +0 -0
  180. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_assembly_rassembly.md +0 -0
  181. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_box_rscalarfield.md +0 -0
  182. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_box_rsolid.md +0 -0
  183. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_capsule_rscalarfield.md +0 -0
  184. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_circle_redge.md +0 -0
  185. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_circle_rface.md +0 -0
  186. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_circle_rwire.md +0 -0
  187. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_cone_rsolid.md +0 -0
  188. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_cylinder_rsolid.md +0 -0
  189. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_ellipsoid_rscalarfield.md +0 -0
  190. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_face_from_wire_rface.md +0 -0
  191. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_field_surface_rsolid.md +0 -0
  192. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_helix_redge.md +0 -0
  193. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_helix_rwire.md +0 -0
  194. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_line_redge.md +0 -0
  195. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_n_hole_flange_rsolid.md +0 -0
  196. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_naca_propeller_blade_rsolid.md +0 -0
  197. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_point_rvertex.md +0 -0
  198. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_polyline_rwire.md +0 -0
  199. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_rectangle_rface.md +0 -0
  200. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_rectangle_rwire.md +0 -0
  201. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_segment_redge.md +0 -0
  202. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_segment_rwire.md +0 -0
  203. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_sphere_rscalarfield.md +0 -0
  204. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_sphere_rsolid.md +0 -0
  205. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_spline_redge.md +0 -0
  206. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_spline_rwire.md +0 -0
  207. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_threaded_rod_rsolid.md +0 -0
  208. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_three_point_arc_redge.md +0 -0
  209. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_three_point_arc_rwire.md +0 -0
  210. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_wire_from_edges_rwire.md +0 -0
  211. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/meta.md +0 -0
  212. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/mirror_shape.md +0 -0
  213. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/not_.md +0 -0
  214. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/or_.md +0 -0
  215. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/radial_pattern_rsolidlist.md +0 -0
  216. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/render_screenshot_rpath.md +0 -0
  217. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/revolve_rsolid.md +0 -0
  218. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/rotate_part_rassembly.md +0 -0
  219. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/rotate_rscalarfield.md +0 -0
  220. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/rotate_shape.md +0 -0
  221. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/scale_rscalarfield.md +0 -0
  222. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/select.md +0 -0
  223. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/select_edges_by_tag.md +0 -0
  224. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/select_faces_by_tag.md +0 -0
  225. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/set_tag.md +0 -0
  226. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/shell_rsolid.md +0 -0
  227. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/smooth_subtract_rscalarfield.md +0 -0
  228. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/smooth_union_rscalarfield.md +0 -0
  229. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/solve_assembly_rresult.md +0 -0
  230. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/stack.md +0 -0
  231. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/stack_rassembly.md +0 -0
  232. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/subtract_rscalarfield.md +0 -0
  233. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/sweep_rsolid.md +0 -0
  234. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/tag.md +0 -0
  235. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/translate_part_rassembly.md +0 -0
  236. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/translate_rscalarfield.md +0 -0
  237. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/translate_shape.md +0 -0
  238. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/union_rscalarfield.md +0 -0
  239. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/value.md +0 -0
  240. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/README.md +0 -0
  241. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/compound.md +0 -0
  242. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/coordinate_system.md +0 -0
  243. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/declarative_constraints.md +0 -0
  244. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/edge.md +0 -0
  245. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/face.md +0 -0
  246. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/shell.md +0 -0
  247. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/simple_workplane.md +0 -0
  248. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/solid.md +0 -0
  249. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/tagged_mixin.md +0 -0
  250. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/vertex.md +0 -0
  251. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/wire.md +0 -0
  252. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/scripts/add_new_case.sh +0 -0
  253. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/scripts/evolve_case.py +0 -0
  254. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/scripts/jupyter_with_skill.sh +0 -0
  255. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/scripts/validate_skill.sh +0 -0
  256. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/scripts/with_skill.sh +0 -0
  257. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/auto_tools/__init__.py +0 -0
  258. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/auto_tools/auto_docs_gen.py +0 -0
  259. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/auto_tools/evolution.py +0 -0
  260. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/auto_tools/make_export.py +0 -0
  261. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/constraints.py +0 -0
  262. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/py.typed +0 -0
  263. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/tagging.py +0 -0
  264. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/test/test_auto_docs_gen.py +0 -0
  265. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/test/test_field_surface.py +0 -0
  266. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/test/test_make_export.py +0 -0
  267. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/test/test_skill_pack.py +0 -0
  268. {simplecadapi-2.0.7 → simplecadapi-2.0.9}/test/test_tagging_refactor.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: simplecadapi
3
- Version: 2.0.7
3
+ Version: 2.0.9
4
4
  Summary: A simplified CAD modeling Python API based on CADQuery
5
5
  Project-URL: Homepage, https://github.com/NiJingzhe/SimpleCADAPI
6
6
  Project-URL: Repository, https://github.com/NiJingzhe/SimpleCADAPI
@@ -385,7 +385,7 @@ Experimental scripts and temporary modeling examples are not included as formal
385
385
 
386
386
  ## Package Installation (Python Package Managers)
387
387
 
388
- Current package name: `simplecadapi`, version: `2.0.7` (see `pyproject.toml`).
388
+ Current package name: `simplecadapi`, version: `2.0.9` (see `pyproject.toml`).
389
389
 
390
390
  ### Method A: Install from package repository with pip
391
391
 
@@ -418,7 +418,7 @@ uv add simplecadapi
418
418
  The repository already contains example build artifacts (`dist/`):
419
419
 
420
420
  ```bash
421
- pip install dist/simplecadapi-2.0.7-py3-none-any.whl
421
+ pip install dist/simplecadapi-2.0.9-py3-none-any.whl
422
422
  ```
423
423
 
424
424
  If you need to rebuild:
@@ -9,7 +9,7 @@ Experimental scripts and temporary modeling examples are not included as formal
9
9
 
10
10
  ## Package Installation (Python Package Managers)
11
11
 
12
- Current package name: `simplecadapi`, version: `2.0.7` (see `pyproject.toml`).
12
+ Current package name: `simplecadapi`, version: `2.0.9` (see `pyproject.toml`).
13
13
 
14
14
  ### Method A: Install from package repository with pip
15
15
 
@@ -42,7 +42,7 @@ uv add simplecadapi
42
42
  The repository already contains example build artifacts (`dist/`):
43
43
 
44
44
  ```bash
45
- pip install dist/simplecadapi-2.0.7-py3-none-any.whl
45
+ pip install dist/simplecadapi-2.0.9-py3-none-any.whl
46
46
  ```
47
47
 
48
48
  If you need to rebuild:
@@ -3,7 +3,12 @@
3
3
  ## API Definition
4
4
 
5
5
  ```python
6
- def union_rsolidlist(*solids: Union[Solid, Sequence[Solid]]) -> List[Solid]
6
+ def union_rsolidlist(
7
+ *solids: Union[Solid, Sequence[Solid]],
8
+ clean: bool = True,
9
+ glue: bool = True,
10
+ tol: Optional[float] = None,
11
+ ) -> List[Solid]
7
12
  ```
8
13
 
9
14
  *Source: operations.py*
@@ -15,13 +20,18 @@ Compute the boolean union of one or more solids.
15
20
  All boolean operations (union/cut/intersect) accept a mix of Solid and
16
21
  sequences; results are always returned as a list of Solid.
17
22
  Keep the list result unless you have explicitly verified `len(result) == 1`.
23
+ SimpleCAD enables glue mode by default and applies a conservative internal fuzzy
24
+ tolerance, so normal modeling code does not need to tune boolean parameters.
25
+ By default this follows CadQuery's union flow: perform one OCC fuse across the
26
+ input solids, then call `clean()` to unify same-domain faces when possible.
18
27
  Touching-but-not-intersecting inputs can legitimately return multiple solids.
19
28
  If that happens, keep using the list: pass it directly into later union calls,
20
29
  or iterate over the solids for later cut/intersect steps.
30
+ When the returned solids are still separated by more than the active tolerance,
31
+ SimpleCAD prints a stdout warning explaining that the objects do not touch and
32
+ that their gap exceeds `tol`.
21
33
  If you truly need exactly one merged solid, you must check the list length
22
- before using `result[0]`. When the length is not 1, do not pick an element
23
- arbitrarily; instead, adjust part placement so the solids overlap slightly,
24
- then run the union again.
34
+ before using `result[0]`.
25
35
 
26
36
  ## Parameters
27
37
 
@@ -29,6 +39,18 @@ then run the union again.
29
39
 
30
40
  - **Description**: One or more Solid objects or sequences of Solid. Nested sequences are flattened before processing.
31
41
 
42
+ ### clean
43
+
44
+ - **Description**: Call CadQuery's `clean()` after the union to remove splitter edges and unify same-domain faces when possible.
45
+
46
+ ### glue
47
+
48
+ - **Description**: Enable OCC glue mode for touching or partially overlapping inputs. Defaults to `True` for SimpleCAD's standard union behavior.
49
+
50
+ ### tol
51
+
52
+ - **Description**: Optional fuzzy-boolean tolerance passed to the OCC union kernel. When omitted, SimpleCAD derives a conservative scale-aware value automatically.
53
+
32
54
  ## Returns
33
55
 
34
56
  List[Solid]: Resulting solids after union attempts. Solids that can be fused
@@ -0,0 +1,92 @@
1
+ \subsection{ECIP-Compliant CAD API Design}
2
+
3
+ \DP{ECIP (referred to as $\mathtt{SimpleCADAPI}$ in the actual project) is designed as a \JZ{command while functional programming style} Python API built on top of CadQuery's $\mathtt{occ\_impl.shapes}$ module. It serves as an LLM-friendly intermediate representation that remains semantically aligned with CadQuery. The geometric classes (e.g., \texttt{Vertex}, \texttt{Edge}, \texttt{Solid}) are implemented as lightweight wrappers over CadQuery objects, preserving full interoperability with native CadQuery operations.}
4
+
5
+ \DP{The design follows the Open-Closed Principle: core geometric types are closed for modification, while operations and extensions are introduced through additional functions. Moreover, SimpleCADAPI is fully compatible with the NumPy library, enabling efficient mathematical computation and geometric transformation directly on CAD entities. It provides explicit input-output interfaces for each operation, facilitating LLM-driven code generation, iterative correction, and modular composition, while retaining the high-level modeling capabilities of CadQuery. SimpleCADAPI is organized into two main parts: the \textbf{Core} module and the \textbf{API} module.}
6
+
7
+ \subsubsection{Core Module}
8
+ \FFX{The Core module encapsulates fundamental geometric types and primitive operations. By wrapping the underlying OpenCASCADE \(\mathtt{TopoDS\_Shape}\) classes, it establishes a clear hierarchy and semantic structure for geometric objects, while also managing coordinate systems, supporting tagging and metadata attachment, and enforcing strict type annotations and exception handling.}
9
+ \begin{table*}[t]
10
+ \centering
11
+ \caption{Summary of core CAD modeling functions by category}
12
+ \label{tab:core_functions}
13
+ \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}}lcc@{}}
14
+ \toprule
15
+ \textbf{Category} & \textbf{Examples} & \textbf{Count} \\
16
+ \midrule
17
+ Creation & \mcode{make\_box\_rsolid}, \mcode{make\_cylinder\_rsolid}, \mcode{make\_circle\_rwire} & 25 \\
18
+ Transformation & \mcode{translate\_shape}, \mcode{rotate\_shape}, \mcode{mirror\_shape} & 3 \\
19
+ 3D Operations & \mcode{extrude\_rsolid}, \mcode{revolve\_rsolid}, \mcode{loft\_rsolid}, \mcode{sweep\_rsolid} & 4 \\
20
+ Boolean & \mcode{union\_rsolidlist}, \mcode{cut\_rsolidlist}, \mcode{intersect\_rsolidlist} & 3 \\
21
+ Advanced Features & \mcode{fillet\_rsolid}, \mcode{chamfer\_rsolid}, \mcode{shell\_rsolid}, \mcode{helical\_sweep\_rsolid} & 4 \\
22
+ Pattern & \mcode{linear\_pattern\_rsolidlist}, \mcode{radial\_pattern\_rsolidlist} & 2 \\
23
+ Metadata, Tagging, \& Selection & \mcode{set\_tag}, \mcode{ql.tag}, \mcode{ql.meta}, \mcode{ql.where}, \mcode{ql.order\_by} & 14 \\
24
+ Export & \mcode{export\_step}, \mcode{export\_stl} & 2 \\
25
+ \bottomrule
26
+ \end{tabular*}
27
+ \end{table*}
28
+ \begin{itemize}
29
+ \item \textbf{\FFX{Geometric Object Hierarchy:}} \FFX{The Core module defines a layered geometric object model comprising the following primary classes, all inheriting from \(\mathtt{TaggedMixin}\) to provide unified tagging and metadata management:}
30
+ \begin{enumerate}[label=\textbf{(\arabic*)}]
31
+ \item \textbf{\FFX{Vertex}}: \FFX{0-dimensional points in 3D space.}
32
+ \item \textbf{\FFX{Edge}}: \FFX{1-dimensional curves connecting vertices.}
33
+ \item \textbf{\FFX{Wire}}: \FFX{Ordered collections of edges forming open or closed chains.}
34
+ \item \textbf{\FFX{Face}}: \FFX{2-dimensional bounded surfaces defined by wires (outer boundaries and holes).}
35
+ \item \textbf{\FFX{Shell}}: \FFX{Collections of faces forming partial or complete shells.}
36
+ \item \textbf{\FFX{Solid}}: \FFX{Closed 3-dimensional volumes with definable volumetric properties.}
37
+ \item \textbf{\FFX{Compound}}: \FFX{Arbitrary aggregates of geometric entities for grouping or assembly construction.}
38
+ \end{enumerate}
39
+
40
+ \item \textbf{\FFX{Coordinate Systems and Working Planes:}} \FFX{ECIP employs a unified coordinate system framework to ensure consistency and precision in geometric modeling and transformation. This framework includes:}
41
+ \begin{enumerate}[label=\textbf{(\arabic*)}]
42
+ \item \textbf{\FFX{CoordinateSystem}}: \FFX{Represents a 3D spatial frame with an explicit origin, X-axis direction, and normal vector, providing an abstraction for spatial transformations.}
43
+ \item \textbf{\FFX{WORLD\_CS}}: \FFX{A global singleton coordinate system instance defining the default reference frame. It follows the right-hand rule with origin at \([0,0,0]\), X-axis pointing forward, Y-axis pointing right, and Z-axis pointing upward.}
44
+ \item \textbf{\FFX{SimpleWorkplane}}: \FFX{Manages local coordinate systems via context managers, enabling nested coordinate frames with defined origins and orientations. The returned workplane object follows the \texttt{\_wp} naming convention when the variable is not directly referenced within the block, ensuring linter and LLM compatibility. This simplifies relative geometric operations and supports complex modeling workflows.}
45
+ \end{enumerate}
46
+
47
+ \item \textbf{\FFX{Geometry and Semantic Metadata:}} \FFX{ECIP unifies semantic annotation and geometric facts through a lightweight tag--metadata layer implemented in \(\mathtt{TaggedMixin}\). Each entity maintains user-visible tags and structured metadata, while runtime lineage is kept separately to avoid polluting modeling data. This design supports three complementary mechanisms. First, primitive constructors perform geometry-aware auto-tagging: for example, \(\mathtt{make\_box\_rsolid}\) and \(\mathtt{make\_cylinder\_rsolid}\) automatically assign face-level tags such as ``top'', ``bottom'', ``left/right'', and ``side'' based on face normals, edge structure, and primitive type. Second, derived operations use topology tracking to attach semantic tags after modeling edits. ECIP wraps OpenCASCADE builders directly and queries \texttt{Modified()}, \texttt{Generated()}, and \texttt{IsDeleted()} to compute a \(\mathtt{TopoDelta}\), from which result faces are automatically tagged as \texttt{op.cut.generated}, \texttt{op.union.modified}, \texttt{origin.body}, \texttt{origin.tool}, or \texttt{role.section.face}. This avoids brittle index-based bookkeeping and preserves semantic lineage across booleans and feature operations. Third, ECIP stores precise geometric metadata alongside the shape, such as primitive type, box size \((x,y,z)\), cylinder axis and height, sphere center and radius, coordinate-system snapshots, topological references (\(\mathtt{topo\_ref}\)), and compact selector hints (e.g., center, normal, area, length, volume, and bounding box). These metadata are serializable and directly consumable by QL predicates such as \texttt{ql.tag(...)} and \texttt{ql.meta(...)}.}
48
+
49
+ \item \textbf{\FFX{Query Language (QL) for Geometric Selection:}} \FFX{SimpleCADAPI provides a dedicated query language module (\texttt{ql}) for declarative geometric selection. QL selectors are fully serializable, enabling transparent logging and replay of selection operations. A selector is constructed by chaining entry-point functions (\texttt{ql.edges()}, \texttt{ql.faces()}, \texttt{ql.wires()}, \texttt{ql.vertices()}), predicates (\texttt{ql.tag()}, \texttt{ql.meta()}, \texttt{ql.curve\_type()}, \texttt{ql.surface\_type()}), ordering keys (\texttt{ql.center\_axis()}, \texttt{ql.geo()}), and cardinality constraints (\texttt{.take(n)}, \texttt{.exactly(n)}). Importantly, QL unifies two complementary selection modes: it can query semantic lineage derived from \(\mathtt{TopoDelta}\)-based tracking, and it can also perform direct geometric selection from shape properties. The integrated example below demonstrates both behaviors within a single workflow.}
50
+
51
+ \item \textbf{\DP{Example Usage:}}
52
+ \begin{lstlisting}[language=Python]
53
+ from simplecadapi import *
54
+
55
+ # Create a base solid and attach user metadata
56
+ base = make_box_rsolid(width=12, height=8, depth=4)
57
+ base.add_tag("base_frame")
58
+ base.set_metadata("material", "aluminum")
59
+
60
+ # Add a local boss in a nested workplane
61
+ with SimpleWorkplane(origin=(0, 0, 4)) as _wp:
62
+ boss = make_cylinder_rsolid(radius=2.5, height=2)
63
+
64
+ model = union_rsolidlist(base, boss)[0]
65
+
66
+ # Drill a through hole; the boolean result carries TopoDelta-based tags/metadata
67
+ tool = make_cylinder_rsolid(radius=1.0, height=6)
68
+ model = cut_rsolidlist(model, tool)[0]
69
+
70
+ # Semantic selection from topology tracking
71
+ new_cut_faces = (
72
+ ql.faces()
73
+ .where(
74
+ ql.and_(
75
+ ql.tag("origin.tool"),
76
+ ql.meta("track.event", "==", "generated"),
77
+ )
78
+ )
79
+ .resolve(model)
80
+ )
81
+
82
+ # Direct geometric selection without relying on topology order
83
+ top_hole_edge = (
84
+ ql.edges()
85
+ .where(ql.curve_type("circle"))
86
+ .order_by(ql.center_axis("z"), desc=True)
87
+ .take(1)
88
+ .exactly(1)
89
+ )
90
+ finished = chamfer_rsolid(model, top_hole_edge, distance=0.5)
91
+ \end{lstlisting}
92
+ \end{itemize}
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "simplecadapi"
3
- version = "2.0.7"
3
+ version = "2.0.9"
4
4
  description = "A simplified CAD modeling Python API based on CADQuery"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -0,0 +1,57 @@
1
+ ## Rebuttal
2
+
3
+ ### 关于 Critique 1:`SimpleWorkplane` 上下文管理器的使用方式
4
+
5
+ **我们认可审稿人提出的两点合理关切:**
6
+
7
+ 1. **关于变量命名**:审稿人指出 `as wp` 中的 `wp` 在许多示例中并未被显式使用,这确实不是一个好的示范。我们同意这一观点,并将在后续版本中对不使用返回值的场景统一改为 `as _wp`,以符合 PEP 8 约定并避免给 linter 和 LLM 传递错误信号。这是一个务实的改进,我们完全接受。
8
+
9
+ 2. **关于"上下文空洞"(contextual hole)**:审稿人指出在较大的 `with` 块或分块处理(chunking)场景中,读者/模型可能难以追踪当前工作平面的状态。这是一个有实际意义的可读性担忧,尤其在 LLM 辅助代码生成的场景下确实可能造成困惑。
10
+
11
+ **我们的设计考量:**
12
+
13
+ `SimpleWorkplane` 采用上下文管理器模式并非出于"巧妙"的炫技,而是因为它解决了嵌套坐标系管理中的一个实际问题。在 `core.py:205-212` 中:
14
+
15
+ ```python
16
+ def __enter__(self):
17
+ global _current_cs
18
+ _current_cs.append(self.cs) # 压入坐标系栈
19
+ return self
20
+
21
+ def __exit__(self, exc_type, exc_val, exc_tb):
22
+ global _current_cs
23
+ _current_cs.pop() # 弹出,无论是否抛出异常
24
+ ```
25
+
26
+ 该设计确保了嵌套坐标系的正确组合与自动清理——即使在异常情况下也能保证栈的一致性。我们评估过其他替代方案(如显式的 `push()`/`pop()` 调用),但认为在异常安全性方面上下文管理器是更稳健的选择。
27
+
28
+ **我们承诺的改进:**
29
+ - 在文档和示例中,对未使用返回值的场景统一使用 `_wp` 命名
30
+ - 在复杂嵌套示例中添加行内注释标注当前工作平面的状态
31
+ - 评估是否在文档中增加一个显式查询当前坐标系的辅助函数(如 `get_current_workplane()`),以减少对上下文作用域的依赖
32
+
33
+ ---
34
+
35
+ ### 关于 Critique 2:`width`/`height`/`depth` 命名 vs. `x`/`y`/`z`
36
+
37
+ **我们认可审稿人提出的核心关切:**
38
+
39
+ 审稿人指出 `width` 和 `depth` 在不同视角下可能产生歧义,而 `x`/`y`/`z` 是绝对无歧义的。这一点我们部分同意——在没有明确坐标系约定的情况下,"宽度"和"深度"确实可能因观察方向不同而产生混淆。
40
+
41
+ **我们选择语义化命名的考量:**
42
+
43
+ 1. **领域惯例**:`width`/`height`/`depth` 是 SolidWorks、Fusion 360、FreeCAD 等主流 CAD 软件中创建基本体的标准参数名。我们的 API 目标用户群体是 CAD 工程师,采用其熟悉的术语可以降低学习成本。
44
+
45
+ 2. **在我们的坐标系中歧义是可控的**:SimpleCAD 明确采用 Z-up 右手坐标系(`core.py:25-29`),在此约定下:
46
+ - `width` → X 方向(向前)
47
+ - `height` → Y 方向(向右)
48
+ - `depth` → Z 方向(向上)
49
+
50
+ 这个映射在 `operations.py:1016-1021` 的元数据中有显式记录。当用户在 `SimpleWorkplane` 中指定 `normal` 和 `x_dir` 后,局部轴的方向是确定的,语义对应关系也是确定的。
51
+
52
+ 3. **我们已经在 API 中提供了轴向参数**:对于需要精确控制方向的场景,`make_cylinder_rsolid`、`make_cone_rsolid` 等函数接受 `axis` 参数,`make_rectangle_rwire` 接受 `normal` 参数,这些设计已为高级用户提供了轴精确的接口。
53
+
54
+ **我们承诺的改进:**
55
+ - 在 `make_box_rsolid` 等函数的文档字符串中显式注明 `width → X, height → Y, depth → Z` 的映射关系,消除隐含歧义
56
+ - 评估为 `make_box_rsolid` 等函数增加 `x_size`/`y_size`/`z_size` 作为可选的别名参数(keyword-only),供偏好无歧义命名的用户使用
57
+ - 在文档的"坐标系约定"章节中加强对此映射关系的说明
@@ -0,0 +1,351 @@
1
+ # Topology QL Design
2
+
3
+ ## Goal
4
+
5
+ Design a query language that can serve all of the following roles at once:
6
+
7
+ 1. Select sub-topology (`Vertex`, `Edge`, `Wire`, `Face`, `Solid`) during modeling
8
+ 2. Be serialized into graph JSON and replayed in another script
9
+ 3. Remain understandable enough for GUI / low-code presentation
10
+ 4. Be strict enough to detect ambiguous or unstable selections
11
+
12
+ The key design constraint is that this is **not** just an in-memory filter API.
13
+ It must be a **canonical selection representation** for graph replay.
14
+
15
+
16
+ ## Core Principle
17
+
18
+ Runtime object references are useful, but they are not a durable source of truth.
19
+
20
+ The durable source of truth for selection must be a declarative, serializable,
21
+ graph-aware `SelectionSpec`.
22
+
23
+ The user may still pass object lists or query helpers ergonomically, but the
24
+ system should normalize all of them into the same canonical selection form.
25
+
26
+
27
+ ## What QL Must Select
28
+
29
+ QL must operate over a specific topology universe:
30
+
31
+ - `vertex`
32
+ - `edge`
33
+ - `wire`
34
+ - `face`
35
+ - `solid`
36
+
37
+ Each query is evaluated inside a **scope**, not globally. The minimum stable
38
+ scope is a graph node output:
39
+
40
+ - `source_node_id`
41
+ - `source_output_slot`
42
+
43
+ Without scope, replay is underspecified.
44
+
45
+
46
+ ## SelectionSpec
47
+
48
+ The canonical serialized form should be `SelectionSpec`.
49
+
50
+ ```json
51
+ {
52
+ "source_node_id": "node_17",
53
+ "source_output_slot": 0,
54
+ "target_kind": "edge",
55
+ "query": {
56
+ "all": [
57
+ {"curve_type": "CIRCLE"},
58
+ {"center_compare": {"axis": "z", "op": "<=", "value": 0.0}}
59
+ ]
60
+ },
61
+ "order_by": [
62
+ {"center_axis": "z", "desc": false},
63
+ {"metric": "length", "desc": true}
64
+ ],
65
+ "limit": 1,
66
+ "cardinality": {"exactly": 1},
67
+ "fallback": {
68
+ "topo_refs": [...],
69
+ "indices": [0],
70
+ "selector_hints": [...]
71
+ }
72
+ }
73
+ ```
74
+
75
+ ### Why this shape
76
+
77
+ - `query` answers: *what semantic thing are we selecting?*
78
+ - `order_by` answers: *if multiple things match, how are they ranked?*
79
+ - `limit` answers: *how many do we take?*
80
+ - `cardinality` answers: *what count is acceptable?*
81
+ - `fallback` answers: *what do we try when semantic matching is not enough?*
82
+
83
+
84
+ ## QL Has Three Layers
85
+
86
+ ### 1. Predicate layer
87
+
88
+ Boolean filters over topology objects.
89
+
90
+ Examples:
91
+
92
+ - `tag("face.top")`
93
+ - `meta("track.event", "==", "generated")`
94
+ - `curve_type("circle")`
95
+ - `surface_type("plane")`
96
+ - `metric("length", ">", 5.0)`
97
+ - `center_compare("z", "<", 0.0)`
98
+ - `normal_axis("z", ">", 0.9)`
99
+
100
+ These must be serializable into an AST.
101
+
102
+ ### 2. Selection layer
103
+
104
+ Defines target kind, filter, ordering, limit, and cardinality.
105
+
106
+ Examples:
107
+
108
+ - `Q.edges().where(...).order_by(...).take(1).exactly(1)`
109
+ - `Q.faces().where(...).take(4).exactly(4)`
110
+
111
+ This is what should become `SelectionSpec` in graph JSON.
112
+
113
+ ### 3. Graph layer
114
+
115
+ Connects selection to a specific graph output.
116
+
117
+ Examples:
118
+
119
+ - "edges on the output of the node that created the thread body"
120
+ - "faces on the result of the last cut"
121
+
122
+ The GUI must expose this layer clearly.
123
+
124
+
125
+ ## Predicate Families
126
+
127
+ ### A. Semantic predicates
128
+
129
+ These rely on tags and metadata and are the most stable across rebuilds.
130
+
131
+ - `tag(pattern)`
132
+ - `meta(path, op, value)`
133
+ - `op(name, event="*")`
134
+ - `origin(role)`
135
+ - `role(name)`
136
+
137
+ These should remain the backbone of stable replay whenever possible.
138
+
139
+ ### B. Geometric type predicates
140
+
141
+ These identify analytic geometry classes.
142
+
143
+ - `curve_type("line" | "circle" | "ellipse" | "bspline" | ...)`
144
+ - `surface_type("plane" | "cylinder" | "sphere" | "cone" | "torus" | ... )`
145
+
146
+ These are necessary for things like selecting cylindrical hole walls or circular
147
+ bottom edges.
148
+
149
+ ### C. Metric predicates
150
+
151
+ These compare numeric geometric properties.
152
+
153
+ - `metric("length", op, value)`
154
+ - `metric("area", op, value)`
155
+ - `metric("volume", op, value)`
156
+ - `metric("radius", op, value)`
157
+ - `metric("edge_count", op, value)`
158
+
159
+ These should support toleranced comparisons eventually.
160
+
161
+ ### D. Positional predicates
162
+
163
+ These use centers, coordinates, normals, or bounding boxes.
164
+
165
+ - `center_compare(axis, op, value)`
166
+ - `center_between(axis, min, max)`
167
+ - `normal_axis(axis, op, value)`
168
+ - `bbox_compare(bound, axis, op, value)`
169
+
170
+ These are essential for "top face", "bottom edge", "left-most face" style
171
+ queries.
172
+
173
+ ### E. Structural predicates
174
+
175
+ These reason about topology relationships.
176
+
177
+ - `is_outer_wire()`
178
+ - `is_inner_wire()`
179
+ - `wire_closed(True|False)`
180
+ - `child_of(tag/meta/query)`
181
+ - `parent_kind("face")`
182
+
183
+ These are important for topology-aware selections beyond raw geometry.
184
+
185
+
186
+ ## Ordering Is Not Optional
187
+
188
+ Filtering is not enough. We need deterministic ordering because replay cannot
189
+ trust OCC's iteration order.
190
+
191
+ Required ordering primitives:
192
+
193
+ - `order_by(center_axis("z"), desc=False)`
194
+ - `order_by(metric_value("length"), desc=True)`
195
+ - lexicographic multi-key ordering
196
+
197
+ Ordering is what turns:
198
+
199
+ > circular bottom edges
200
+
201
+ into:
202
+
203
+ > the lowest circular edge, then the largest one, take exactly 1
204
+
205
+
206
+ ## Cardinality Is Part of the Query
207
+
208
+ Queries must say not just what to select, but how many are acceptable.
209
+
210
+ Supported forms should include:
211
+
212
+ - `exactly(n)`
213
+ - `at_least(n)`
214
+ - `at_most(n)`
215
+
216
+ Why this matters:
217
+
218
+ - If replay matches 0 instead of 1, that is usually a hard failure.
219
+ - If replay matches 4 instead of 1, that usually indicates ambiguity.
220
+ - GUI should display cardinality expectations explicitly.
221
+
222
+
223
+ ## Fallback Strategy Chain
224
+
225
+ QL is the canonical intent, but replay still needs practical fallback.
226
+
227
+ Proposed resolution order:
228
+
229
+ 1. Evaluate `SelectionSpec.query` against the replayed scope
230
+ 2. Apply `order_by`, `limit`, `cardinality`
231
+ 3. If this fails, try stored `topo_ref`
232
+ 4. If this fails, try stored `indices`
233
+ 5. If this fails, use `selector_hints`
234
+
235
+ Important: QL should be the **first-class** path, not a late fallback.
236
+
237
+
238
+ ## What QL Should Not Try To Be
239
+
240
+ ### Not arbitrary Python
241
+
242
+ This is bad for replay:
243
+
244
+ ```python
245
+ Q.edges().where(lambda e: e.get_length() > 5)
246
+ ```
247
+
248
+ Reason: lambda is not portable or serializable.
249
+
250
+ ### Not kernel-internal topo identity
251
+
252
+ This is not stable enough to be the primary selection language:
253
+
254
+ - raw OCC face ids
255
+ - `HashCode`
256
+ - enumeration order
257
+
258
+ These are valid fallback channels, not canonical query semantics.
259
+
260
+
261
+ ## Where Current QL Sits
262
+
263
+ Current implementation already supports a first step toward this design:
264
+
265
+ - serializable predicates for tag/meta/curve_type/surface_type
266
+ - serializable ordering via `center_axis`
267
+ - serializable selectors via `ShapeSelector`
268
+ - replay path for `fillet/chamfer/shell` using `selection_query`
269
+
270
+ What is still missing:
271
+
272
+ - metric predicates
273
+ - richer positional predicates
274
+ - explicit `SelectionSpec` schema with source node scope
275
+ - multi-key ordering
276
+ - formal cardinality beyond `exactly`
277
+ - structural predicates
278
+
279
+
280
+ ## Why This Matters For Evolve
281
+
282
+ `evolve` is mostly operation composition, so it is a good fit for graph replay.
283
+
284
+ The hard part is hidden topology selection like:
285
+
286
+ ```python
287
+ edges = solid.get_edges()
288
+ bottom_edge = edges[:1]
289
+ ```
290
+
291
+ This should become:
292
+
293
+ ```python
294
+ Q.edges()
295
+ .where(Q.curve_type("circle"))
296
+ .order_by(Q.center_axis("z"))
297
+ .take(1)
298
+ .exactly(1)
299
+ ```
300
+
301
+ This is the exact reason QL should become the canonical selection path.
302
+
303
+
304
+ ## Incremental Migration Plan
305
+
306
+ ### Phase 1
307
+
308
+ Already started:
309
+
310
+ - serializable selectors
311
+ - replay for `fillet/chamfer/shell`
312
+ - first `evolve` migration (`make_threaded_rod_rsolid` bottom chamfer)
313
+
314
+ ### Phase 2
315
+
316
+ Add geometry metrics and richer positional predicates:
317
+
318
+ - `metric(name, op, value)`
319
+ - `center_compare(axis, op, value)`
320
+ - `normal_axis(axis, op, value)`
321
+
322
+ ### Phase 3
323
+
324
+ Introduce formal `SelectionSpec` in graph JSON:
325
+
326
+ - add source node/output scope
327
+ - make it the canonical serialized selection object
328
+ - keep topo refs / indices / hints as fallback section
329
+
330
+ ### Phase 4
331
+
332
+ Migrate more hidden selections in `evolve` and other APIs to QL.
333
+
334
+ ### Phase 5
335
+
336
+ Expose GUI-oriented rendering of selections:
337
+
338
+ - label
339
+ - source scope
340
+ - target kind
341
+ - cardinality
342
+ - human-readable summary
343
+
344
+
345
+ ## Practical Rule
346
+
347
+ If a selection must survive serialization and replay, it should ultimately be
348
+ expressible as QL.
349
+
350
+ Passing concrete objects should remain ergonomic at the API boundary, but the
351
+ system should normalize them into `SelectionSpec` internally whenever possible.
@@ -5,9 +5,9 @@ license: MIT
5
5
  compatibility: Requires Python 3.10+, active virtual environment, and network access for package installation.
6
6
  metadata:
7
7
  project: simplecadapi
8
- version: 2.0.7
8
+ version: 2.0.9
9
9
  runtime-package: simplecadapi
10
- runtime-spec: simplecadapi==2.0.7
10
+ runtime-spec: simplecadapi==2.0.9
11
11
  cases-module: simplecad_self_evolve_cases
12
12
  ---
13
13
 
@@ -53,7 +53,7 @@ metadata:
53
53
  ## Install behavior
54
54
  - Preferred: run `scripts/install.sh` once when skill is installed/activated.
55
55
  - Runtime wrappers auto-install on demand if `simplecadapi` is missing.
56
- - Package installed by default: `simplecadapi==2.0.7`
56
+ - Package installed by default: `simplecadapi==2.0.9`
57
57
  - Wrappers install only into a virtual environment interpreter (set `PYTHON_BIN` when needed).
58
58
 
59
59
  ## Interpreter selection
@@ -1,8 +1,8 @@
1
1
  # Project Overview
2
2
 
3
3
  - Project: `simplecadapi`
4
- - Version: `2.0.7`
5
- - Runtime package: `simplecadapi==2.0.7`
4
+ - Version: `2.0.9`
5
+ - Runtime package: `simplecadapi==2.0.9`
6
6
  - Skill cases module: `simplecad_self_evolve_cases`
7
7
 
8
8
  ## What this skill bundles
@@ -9,7 +9,7 @@ Experimental scripts and temporary modeling examples are not included as formal
9
9
 
10
10
  ## Package Installation (Python Package Managers)
11
11
 
12
- Current package name: `simplecadapi`, version: `2.0.7` (see `pyproject.toml`).
12
+ Current package name: `simplecadapi`, version: `2.0.9` (see `pyproject.toml`).
13
13
 
14
14
  ### Method A: Install from package repository with pip
15
15
 
@@ -42,7 +42,7 @@ uv add simplecadapi
42
42
  The repository already contains example build artifacts (`dist/`):
43
43
 
44
44
  ```bash
45
- pip install dist/simplecadapi-2.0.7-py3-none-any.whl
45
+ pip install dist/simplecadapi-2.0.9-py3-none-any.whl
46
46
  ```
47
47
 
48
48
  If you need to rebuild:
@@ -6,7 +6,7 @@
6
6
  PYTHON_BIN=.venv/bin/python scripts/install.sh
7
7
  ```
8
8
 
9
- This installs `simplecadapi==2.0.7` to the active Python environment.
9
+ This installs `simplecadapi==2.0.9` to the active Python environment.
10
10
  If `PYTHON_BIN` is not set, wrappers default to `python3` (fallback `python`).
11
11
  Installation is intentionally blocked for non-venv/system interpreters.
12
12