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.
- simplecadapi-2.0.9/.paper_section.tex.swp +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/PKG-INFO +3 -3
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/README.md +2 -2
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/union_rsolidlist.md +26 -4
- simplecadapi-2.0.9/paper_section.tex +92 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/pyproject.toml +1 -1
- simplecadapi-2.0.9/rebuttal.md +57 -0
- simplecadapi-2.0.9/refactor-plan/topology-ql.md +351 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/SKILL.md +3 -3
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/PROJECT_OVERVIEW.md +2 -2
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/PROJECT_README.md +2 -2
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/RUNTIME_INSTALL.md +1 -1
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/union_rsolidlist.md +26 -4
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/scripts/install.sh +2 -2
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/scripts/repl_bootstrap.py +1 -1
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/__init__.py +12 -18
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/auto_tools/skill_pack.py +6 -3
- simplecadapi-2.0.9/src/simplecadapi/autotag.py +165 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/core.py +15 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/evolve.py +9 -5
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/field.py +62 -0
- simplecadapi-2.0.9/src/simplecadapi/graph.py +336 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/operations.py +1079 -133
- simplecadapi-2.0.9/src/simplecadapi/ql.py +831 -0
- simplecadapi-2.0.9/src/simplecadapi/serializer.py +866 -0
- simplecadapi-2.0.9/src/simplecadapi/topology.py +501 -0
- simplecadapi-2.0.9/src/simplecadapi/tracking.py +676 -0
- simplecadapi-2.0.9/table.step +1898 -0
- simplecadapi-2.0.9/table.stl +0 -0
- simplecadapi-2.0.9/table_grounding_example.py +192 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/test/test_all_features.py +41 -2
- simplecadapi-2.0.9/test/test_graph_ql.py +139 -0
- simplecadapi-2.0.9/test/test_original_api_integration.py +188 -0
- simplecadapi-2.0.9/test/test_public_api_surface.py +56 -0
- simplecadapi-2.0.9/test/test_ql.py +228 -0
- simplecadapi-2.0.9/test/test_serialization.py +580 -0
- simplecadapi-2.0.9/test/test_tracking_boolean.py +183 -0
- simplecadapi-2.0.9/test/test_tracking_data_models.py +270 -0
- simplecadapi-2.0.9/test/test_tracking_features.py +144 -0
- simplecadapi-2.0.9/test/test_tracking_tags.py +126 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/uv.lock +1 -1
- simplecadapi-2.0.7/src/simplecadapi/ql.py +0 -363
- simplecadapi-2.0.7/test/test_ql.py +0 -74
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/.gitignore +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/.python-version +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/LICENSE +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/MANIFEST.in +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/README.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/add_part_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/and_.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/bounds_rbbox.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/chamfer_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/clear_constraints_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/clone_assembly_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/constrain_coincident_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/constrain_concentric_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/constrain_distance_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/constrain_offset_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/cut_rsolidlist.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/eval_rarray.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/eval_rscalar.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/export_step.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/export_stl.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/extrude_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/fillet_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/geo.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/helical_sweep_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/intersect_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/intersect_rsolidlist.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/linear_pattern_rsolidlist.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/loft_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_angle_arc_redge.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_angle_arc_rwire.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_assembly_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_box_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_box_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_capsule_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_circle_redge.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_circle_rface.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_circle_rwire.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_cone_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_cylinder_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_ellipsoid_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_face_from_wire_rface.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_field_surface_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_helix_redge.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_helix_rwire.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_line_redge.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_n_hole_flange_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_naca_propeller_blade_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_point_rvertex.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_polyline_rwire.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_rectangle_rface.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_rectangle_rwire.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_segment_redge.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_segment_rwire.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_sphere_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_sphere_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_spline_redge.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_spline_rwire.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_threaded_rod_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_three_point_arc_redge.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_three_point_arc_rwire.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/make_wire_from_edges_rwire.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/meta.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/mirror_shape.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/not_.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/or_.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/radial_pattern_rsolidlist.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/render_screenshot_rpath.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/revolve_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/rotate_part_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/rotate_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/rotate_shape.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/scale_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/select.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/select_edges_by_tag.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/select_faces_by_tag.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/set_tag.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/shell_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/smooth_subtract_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/smooth_union_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/solve_assembly_rresult.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/stack.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/stack_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/subtract_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/sweep_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/tag.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/translate_part_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/translate_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/translate_shape.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/union_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/api/value.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/README.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/compound.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/coordinate_system.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/declarative_constraints.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/edge.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/face.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/shell.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/simple_workplane.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/solid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/tagged_mixin.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/vertex.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/docs/core/wire.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/examples.py +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/refactor-plan/tagging.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/scripts/publish.sh +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/scripts/sync_ragflow_docs.py +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/cases/simplecad_self_evolve_cases/__init__.py +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/cases/simplecad_self_evolve_cases/evolve.py +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/EVOLVE_WORKFLOW.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/LICENSE.txt +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/README.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/add_part_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/and_.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/bounds_rbbox.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/chamfer_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/clear_constraints_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/clone_assembly_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/constrain_coincident_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/constrain_concentric_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/constrain_distance_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/constrain_offset_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/cut_rsolidlist.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/eval_rarray.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/eval_rscalar.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/export_step.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/export_stl.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/extrude_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/fillet_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/geo.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/helical_sweep_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/intersect_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/intersect_rsolidlist.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/linear_pattern_rsolidlist.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/loft_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_angle_arc_redge.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_angle_arc_rwire.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_assembly_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_box_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_box_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_capsule_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_circle_redge.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_circle_rface.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_circle_rwire.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_cone_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_cylinder_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_ellipsoid_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_face_from_wire_rface.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_field_surface_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_helix_redge.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_helix_rwire.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_line_redge.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_n_hole_flange_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_naca_propeller_blade_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_point_rvertex.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_polyline_rwire.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_rectangle_rface.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_rectangle_rwire.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_segment_redge.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_segment_rwire.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_sphere_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_sphere_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_spline_redge.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_spline_rwire.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_threaded_rod_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_three_point_arc_redge.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_three_point_arc_rwire.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/make_wire_from_edges_rwire.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/meta.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/mirror_shape.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/not_.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/or_.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/radial_pattern_rsolidlist.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/render_screenshot_rpath.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/revolve_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/rotate_part_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/rotate_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/rotate_shape.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/scale_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/select.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/select_edges_by_tag.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/select_faces_by_tag.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/set_tag.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/shell_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/smooth_subtract_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/smooth_union_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/solve_assembly_rresult.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/stack.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/stack_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/subtract_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/sweep_rsolid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/tag.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/translate_part_rassembly.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/translate_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/translate_shape.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/union_rscalarfield.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/api/value.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/README.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/compound.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/coordinate_system.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/declarative_constraints.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/edge.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/face.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/shell.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/simple_workplane.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/solid.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/tagged_mixin.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/vertex.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/docs/core/wire.md +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/scripts/add_new_case.sh +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/scripts/evolve_case.py +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/scripts/jupyter_with_skill.sh +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/scripts/validate_skill.sh +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/scripts/with_skill.sh +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/auto_tools/__init__.py +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/auto_tools/auto_docs_gen.py +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/auto_tools/evolution.py +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/auto_tools/make_export.py +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/constraints.py +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/py.typed +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/src/simplecadapi/tagging.py +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/test/test_auto_docs_gen.py +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/test/test_field_surface.py +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/test/test_make_export.py +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/test/test_skill_pack.py +0 -0
- {simplecadapi-2.0.7 → simplecadapi-2.0.9}/test/test_tagging_refactor.py +0 -0
|
Binary file
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: simplecadapi
|
|
3
|
-
Version: 2.0.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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(
|
|
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]`.
|
|
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}
|
|
@@ -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.
|
|
8
|
+
version: 2.0.9
|
|
9
9
|
runtime-package: simplecadapi
|
|
10
|
-
runtime-spec: simplecadapi==2.0.
|
|
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.
|
|
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
|
{simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/PROJECT_README.md
RENAMED
|
@@ -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.
|
|
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.
|
|
45
|
+
pip install dist/simplecadapi-2.0.9-py3-none-any.whl
|
|
46
46
|
```
|
|
47
47
|
|
|
48
48
|
If you need to rebuild:
|
{simplecadapi-2.0.7 → simplecadapi-2.0.9}/skills/simplecad-self-evolve/references/RUNTIME_INSTALL.md
RENAMED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
PYTHON_BIN=.venv/bin/python scripts/install.sh
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
This installs `simplecadapi==2.0.
|
|
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
|
|