openscad-cpp-evaluator 1.25.0__tar.gz → 1.26.0__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 (221) hide show
  1. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/CLAUDE.md +15 -1
  2. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/PKG-INFO +1 -1
  3. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/colored_body.hpp +9 -0
  4. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/evaluator.hpp +3 -0
  5. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/pyproject.toml +1 -1
  6. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/colored_body.cpp +12 -0
  7. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/csg_generate.cpp +24 -0
  8. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_python_bindings.py +50 -0
  9. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/.github/workflows/ci.yml +0 -0
  10. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/.github/workflows/wheels.yml +0 -0
  11. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/.gitignore +0 -0
  12. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/.gitmodules +0 -0
  13. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/CMakeLists.txt +0 -0
  14. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/LICENSE +0 -0
  15. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/README.md +0 -0
  16. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/bindings/CMakeLists.txt +0 -0
  17. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/bindings/ast_to_py.cpp +0 -0
  18. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/bindings/module.cpp +0 -0
  19. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/cmake/embed_font.cmake +0 -0
  20. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/examples/CMakeLists.txt +0 -0
  21. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/examples/eval_perf_benchmark.cpp +0 -0
  22. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/examples/manifold_cache_reuse.cpp +0 -0
  23. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/examples/minimal_debugger.cpp +0 -0
  24. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
  25. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/.gitignore +0 -0
  26. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/CLAUDE.md +0 -0
  27. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
  28. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/README.md +0 -0
  29. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
  30. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
  31. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
  32. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
  33. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
  34. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
  35. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
  36. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
  37. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
  38. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
  39. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
  40. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
  41. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
  42. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope_table.hpp +0 -0
  43. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
  44. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
  45. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
  46. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/api.cpp +0 -0
  47. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
  48. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
  49. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
  50. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
  51. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
  52. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
  53. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
  54. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
  55. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/comments.cpp +0 -0
  56. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
  57. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
  58. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
  59. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
  60. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
  61. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
  62. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
  63. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/position.cpp +0 -0
  64. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
  65. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/scope.cpp +0 -0
  66. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
  67. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
  68. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
  69. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
  70. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
  71. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
  72. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
  73. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
  74. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
  75. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
  76. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
  77. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
  78. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
  79. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
  80. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
  81. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
  82. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
  83. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_render_expression.cpp +0 -0
  84. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
  85. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
  86. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
  87. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
  88. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_strict_commas.cpp +0 -0
  89. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
  90. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
  91. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
  92. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
  93. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
  94. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
  95. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
  96. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
  97. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
  98. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/coverage.hpp +0 -0
  99. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
  100. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
  101. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
  102. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
  103. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
  104. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
  105. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
  106. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
  107. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
  108. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/export.hpp +0 -0
  109. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/font_match.hpp +0 -0
  110. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
  111. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/format_closure.hpp +0 -0
  112. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/freetype_font_provider.hpp +0 -0
  113. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
  114. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
  115. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
  116. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/mesh_check.hpp +0 -0
  117. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
  118. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
  119. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/profile.hpp +0 -0
  120. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
  121. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/segments.hpp +0 -0
  122. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
  123. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
  124. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/utf8.hpp +0 -0
  125. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/value.hpp +0 -0
  126. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
  127. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/python/openscad_cpp_evaluator/__init__.py +0 -0
  128. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/resources/fonts/LICENSE +0 -0
  129. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/resources/fonts/LiberationSans-Bold.ttf +0 -0
  130. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/resources/fonts/LiberationSans-BoldItalic.ttf +0 -0
  131. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/resources/fonts/LiberationSans-Italic.ttf +0 -0
  132. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/resources/fonts/LiberationSans-Regular.ttf +0 -0
  133. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/CMakeLists.txt +0 -0
  134. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/builtins/booleans.cpp +0 -0
  135. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/builtins/builtins.hpp +0 -0
  136. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/builtins/call_args.cpp +0 -0
  137. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/builtins/color.cpp +0 -0
  138. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/builtins/control.cpp +0 -0
  139. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/builtins/dxf_dim.cpp +0 -0
  140. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/builtins/extrude.cpp +0 -0
  141. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/builtins/function_builtins.cpp +0 -0
  142. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/builtins/import.cpp +0 -0
  143. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/builtins/modifiers.cpp +0 -0
  144. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/builtins/primitives_2d.cpp +0 -0
  145. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/builtins/primitives_3d.cpp +0 -0
  146. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/builtins/registry.cpp +0 -0
  147. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/builtins/roof.cpp +0 -0
  148. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/builtins/segments.cpp +0 -0
  149. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/builtins/surface.cpp +0 -0
  150. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/builtins/text.cpp +0 -0
  151. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/builtins/topology.cpp +0 -0
  152. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/builtins/transforms.cpp +0 -0
  153. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/bytecode_compiler.cpp +0 -0
  154. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/bytecode_vm.cpp +0 -0
  155. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/coverage.cpp +0 -0
  156. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/csg_resolve.cpp +0 -0
  157. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/css_colors.cpp +0 -0
  158. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/debug/debug_repl.cpp +0 -0
  159. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/debug_profile.cpp +0 -0
  160. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/eval_context.cpp +0 -0
  161. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/eval_error.cpp +0 -0
  162. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/eval_use.cpp +0 -0
  163. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/export.cpp +0 -0
  164. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/expr_eval.cpp +0 -0
  165. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/format_closure.cpp +0 -0
  166. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/import/dxf_import.cpp +0 -0
  167. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/import/mesh_import.cpp +0 -0
  168. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/import/surface_load.cpp +0 -0
  169. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/import/svg_import.cpp +0 -0
  170. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/manifold_cache.cpp +0 -0
  171. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/measure_geometry.cpp +0 -0
  172. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/mesh_check.cpp +0 -0
  173. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/stmt_eval.cpp +0 -0
  174. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/text/font_match.cpp +0 -0
  175. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/text/freetype_font_provider.cpp +0 -0
  176. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/text/text_metrics.cpp +0 -0
  177. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/user_calls.cpp +0 -0
  178. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/utf8.cpp +0 -0
  179. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/value.cpp +0 -0
  180. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/src/zip_stored.cpp +0 -0
  181. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/CMakeLists.txt +0 -0
  182. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_booleans.cpp +0 -0
  183. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_bytecode_compiler.cpp +0 -0
  184. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_children_separate.cpp +0 -0
  185. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_cli.cpp +0 -0
  186. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_control_flow.cpp +0 -0
  187. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_coverage.cpp +0 -0
  188. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_csg_tree.cpp +0 -0
  189. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_debug_hooks.cpp +0 -0
  190. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_dxf_svg_import.cpp +0 -0
  191. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_eval_context.cpp +0 -0
  192. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_export.cpp +0 -0
  193. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_expr_eval.cpp +0 -0
  194. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_extrude_roof.cpp +0 -0
  195. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_feature_detection.cpp +0 -0
  196. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_function_builtins.cpp +0 -0
  197. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_helpers.hpp +0 -0
  198. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_import_export.cpp +0 -0
  199. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_include_cache.cpp +0 -0
  200. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_manifold_cache.cpp +0 -0
  201. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_mesh_check.cpp +0 -0
  202. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_multi_color_merge.cpp +0 -0
  203. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_primitives.cpp +0 -0
  204. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_profiling.cpp +0 -0
  205. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_render_expr.cpp +0 -0
  206. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_scope_trail.cpp +0 -0
  207. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_scoping.cpp +0 -0
  208. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_surface.cpp +0 -0
  209. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_tail_calls.cpp +0 -0
  210. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_text.cpp +0 -0
  211. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_transforms.cpp +0 -0
  212. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_unexpected_args.cpp +0 -0
  213. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_use.cpp +0 -0
  214. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_value.cpp +0 -0
  215. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_viewport_params.cpp +0 -0
  216. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tests/test_zip_stored.cpp +0 -0
  217. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tools/cli/CMakeLists.txt +0 -0
  218. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tools/cli/cli_lib.cpp +0 -0
  219. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tools/cli/cli_lib.hpp +0 -0
  220. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/tools/cli/main.cpp +0 -0
  221. {openscad_cpp_evaluator-1.25.0 → openscad_cpp_evaluator-1.26.0}/uv.lock +0 -0
@@ -1687,6 +1687,20 @@ the former is worth dragging.
1687
1687
  A cache hit restamps to the chain reaching the geometry *now*, not the one that
1688
1688
  first produced it: a module called twice genuinely is two call chains.
1689
1689
 
1690
+ **A 2D shape is picked by `ColoredBody::sectionId`.** A `CrossSection` is contours
1691
+ with no run IDs, so a top-level 2D shape had no `idToNode` entry at all: its preview
1692
+ slab got fresh IDs from `Manifold::Extrude` in `toRenderableBodies`, after the table
1693
+ was built, and a click on it mapped to no source (it blocked BelfrySCAD's extrude
1694
+ gizmo, which exists to act on exactly those). Now the generate loop calls
1695
+ `tagSections` after every builtin's `GenerateFn`: any 2D body without an ID gets one
1696
+ reserved from Manifold's counter, attributed to that node. A transform keeps the ID
1697
+ it was given (it edits the body in place), so a 2D shape stays its primitive, as a
1698
+ solid's runs do; an op that builds a *new* section -- a 2D `union()`, `offset()`,
1699
+ `hull()` -- claims it, so the whole union is one pick. `restampCachedIds` restamps it
1700
+ by the solid rule (across renders, to the reused node), `recordRunColors` records its
1701
+ colour, and `toRenderableBodies` rebuilds the slab from a `MeshGL` whose one run
1702
+ carries it. Tested in `tests/test_python_bindings.py` (`_picked_text`).
1703
+
1690
1704
  No stored script path is needed to tell the user's file from a library:
1691
1705
  `callStack_.front()` is by construction the call made from top level.
1692
1706
 
@@ -1695,7 +1709,7 @@ Exposed to Python as `node.call_sites` (innermost-first `_CallFrame`s, each a
1695
1709
 
1696
1710
  `Evaluator::measuring_` is set for the whole generate. It suppresses the four
1697
1711
  writes that exist solely to describe *drawn* geometry — `idToNode`/`idToColor`/`idToCallChain` in
1698
- `tagGenerated` and `tagDisplayOnly`, the `restampCachedIds` call on a cache hit,
1712
+ `tagGenerated`, `tagDisplayOnly` and `tagSections`, the `restampCachedIds` call on a cache hit,
1699
1713
  and `cacheProducer_` — because those tables are cleared once per pass, so a leak
1700
1714
  is permanent and surfaces later as wrong click-to-source. It also suppresses
1701
1715
  `checkDebug`, which would otherwise inject stops at the paused statement's own
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscad_cpp_evaluator
3
- Version: 1.25.0
3
+ Version: 1.26.0
4
4
  Summary: C++ OpenSCAD evaluator with Python bindings
5
5
  Author: NeuSCAD Contributors
6
6
  License-Expression: MIT
@@ -42,6 +42,15 @@ struct ColoredBody {
42
42
  std::optional<manifold::CrossSection> section;
43
43
  bool flatPreview = false;
44
44
 
45
+ // The originalID a 2D `section` is picked by. A CrossSection is contours
46
+ // and carries no run IDs, so a 2D shape had no entry in idToNode and a
47
+ // click on its preview slab mapped to no source at all. Reserved from
48
+ // Manifold's own counter (so it cannot collide with a solid's ID) by the
49
+ // generate loop, for the node that built the section -- a primitive, or
50
+ // an op like union() that made a new one; a transform keeps the one it
51
+ // was given. toRenderableBodies() gives the slab this ID.
52
+ std::optional<uint32_t> sectionId;
53
+
45
54
  // What a 2D `section` has been transformed BY that a CrossSection
46
55
  // cannot itself hold: a translation along Z, a rotation out of the XY
47
56
  // plane, anything with a Z component. Applied when
@@ -283,6 +283,9 @@ public:
283
283
  // attributes there).
284
284
  // Give cached bodies fresh originalIDs so a second call site reusing
285
285
  // them is not confused with the first. See its definition.
286
+ // Give every 2D body in `bodies` that has no sectionId yet one of its
287
+ // own, attributed to `node`. See ColoredBody::sectionId.
288
+ void tagSections(std::vector<ColoredBody>& bodies, const oscad::ASTNode& node, uint32_t callChain);
286
289
  void restampCachedIds(std::vector<ColoredBody>& bodies, const oscad::ASTNode& node,
287
290
  const oscad::ASTNode* producer, uint32_t callChain);
288
291
 
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "openscad_cpp_evaluator"
7
- version = "1.25.0"
7
+ version = "1.26.0"
8
8
  description = "C++ OpenSCAD evaluator with Python bindings"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -37,6 +37,18 @@ std::vector<ColoredBody> toRenderableBodies(const std::vector<ColoredBody>& bodi
37
37
  if (!cb.body && cb.section) {
38
38
  ColoredBody flat;
39
39
  flat.body = manifold::Manifold::Extrude(cb.section->ToPolygons(), kTopLevel2dHeight);
40
+ if (cb.sectionId && !flat.body->IsEmpty()) {
41
+ // One run carrying the section's own ID, so a click on the
42
+ // slab finds the node that built the shape (see
43
+ // ColoredBody::sectionId). Manifold keeps a MeshGL's
44
+ // runOriginalID when it is given one.
45
+ manifold::MeshGL mesh = flat.body->GetMeshGL();
46
+ mesh.runOriginalID = {*cb.sectionId};
47
+ mesh.runIndex = {0, static_cast<uint32_t>(mesh.triVerts.size())};
48
+ mesh.runTransform.clear();
49
+ mesh.faceID.clear();
50
+ flat.body = manifold::Manifold(mesh);
51
+ }
40
52
  // Put it back where the transforms a CrossSection could not
41
53
  // hold would have placed it -- a Z offset, a rotation out of
42
54
  // the plane. See ColoredBody::sectionXform.
@@ -124,6 +124,7 @@ std::vector<ColoredBody> Evaluator::generateTreeImpl(const std::vector<CSGNode*>
124
124
  generateWarnEntry = node.warnEntry;
125
125
  generateCallChain = node.callChain;
126
126
  node.bodies = it->second(*this, node.params, node.children, *node.node);
127
+ if (!measuring_) tagSections(node.bodies, *node.node, node.callChain);
127
128
  generateWarnEntry = savedWarnEntry;
128
129
  generateCallChain = savedCallChain;
129
130
  } else {
@@ -393,6 +394,16 @@ void Evaluator::restampCachedIds(std::vector<ColoredBody>& bodies, const oscad::
393
394
  // its producer check keeps the first copy's descendants. They occupy
394
395
  // the same space, so there is nothing to select apart.
395
396
  for (ColoredBody& cb : bodies) {
397
+ // A 2D body's one ID, restamped by the same rule as a solid's runs.
398
+ if (cb.sectionId) {
399
+ const uint32_t fresh = manifold::Manifold::ReserveIDs(1);
400
+ auto old = idToNode.find(*cb.sectionId);
401
+ idToNode[fresh] =
402
+ (old != idToNode.end() && old->second != producer) ? old->second : &node;
403
+ idToCallChain[fresh] = callChain;
404
+ idToColor[fresh] = cb.color;
405
+ cb.sectionId = fresh;
406
+ }
396
407
  if (!cb.body || cb.body->IsEmpty()) continue;
397
408
  manifold::MeshGL mesh = cb.body->GetMeshGL();
398
409
  if (mesh.runOriginalID.empty()) continue;
@@ -475,6 +486,7 @@ void Evaluator::restampCachedIds(std::vector<ColoredBody>& bodies, const oscad::
475
486
 
476
487
 
477
488
  void Evaluator::recordRunColors(ColoredBody& b, const std::optional<std::array<float, 4>>& rgba) {
489
+ if (b.sectionId) idToColor[*b.sectionId] = rgba;
478
490
  if (!b.body || bodyIsEmpty(b)) return;
479
491
  // A body that is still one original knows its own ID without building
480
492
  // a mesh -- the common case, and the cheap one.
@@ -486,6 +498,18 @@ void Evaluator::recordRunColors(ColoredBody& b, const std::optional<std::array<f
486
498
  for (uint32_t id : b.body->GetMeshGL().runOriginalID) idToColor[id] = rgba;
487
499
  }
488
500
 
501
+ void Evaluator::tagSections(std::vector<ColoredBody>& bodies, const oscad::ASTNode& node,
502
+ uint32_t callChain) {
503
+ for (ColoredBody& cb : bodies) {
504
+ if (!cb.section || cb.body || cb.sectionId) continue;
505
+ const uint32_t id = manifold::Manifold::ReserveIDs(1);
506
+ idToNode[id] = &node;
507
+ idToColor[id] = cb.color;
508
+ idToCallChain[id] = callChain;
509
+ cb.sectionId = id;
510
+ }
511
+ }
512
+
489
513
  ColoredBody Evaluator::tagGenerated(manifold::Manifold body, const oscad::ASTNode& node, const Value& colorValue) {
490
514
  manifold::MeshGL mesh = body.GetMeshGL();
491
515
  std::optional<std::array<float, 4>> color = valueToColor(colorValue);
@@ -1046,3 +1046,53 @@ def test_svg_class_is_feature_detectable(tmp_path):
1046
1046
  out = []
1047
1047
  Evaluator(echo_fn=out.append).evaluate(str(scad), generate=False)
1048
1048
  assert "1" in out[0], out
1049
+
1050
+
1051
+ def _picked_text(tmp_path, src, cache=None, name="s.scad"):
1052
+ """What a click on each body would select: the source text its run IDs
1053
+ map to, per body, in body order."""
1054
+ script = tmp_path / name
1055
+ script.write_text(src)
1056
+ ev = Evaluator(manifold_cache=cache) if cache else Evaluator()
1057
+ bodies, id_to_node = ev.evaluate(str(script), {})
1058
+ out = []
1059
+ for b in bodies:
1060
+ ids = [int(i) for i in b.body.to_mesh().run_original_id]
1061
+ out.append([src[id_to_node[i].position.start_offset:id_to_node[i].position.end_offset]
1062
+ if i in id_to_node else None for i in ids])
1063
+ return out
1064
+
1065
+
1066
+ def test_a_2d_shape_can_be_picked_back_to_its_source(tmp_path):
1067
+ """A CrossSection carries no run IDs, so a 2D shape's preview slab used
1068
+ to map to no node at all and could not be selected (BelfrySCAD's
1069
+ extrude gizmo needs exactly that)."""
1070
+ picked = _picked_text(tmp_path, "square(3);\ncircle(4);\n")
1071
+ assert picked == [["square(3);"], ["circle(4);"]]
1072
+
1073
+
1074
+ def test_a_transform_keeps_the_2d_shape_it_moved(tmp_path):
1075
+ picked = _picked_text(tmp_path, "translate([10, 0]) circle(4);\n")
1076
+ assert len(picked) == 1 and picked[0][0] is not None
1077
+ assert picked[0][0].startswith("circle(4)") or picked[0][0].startswith("translate")
1078
+
1079
+
1080
+ def test_a_2d_union_is_its_own_shape(tmp_path):
1081
+ src = "union() { square(3); circle(4); }\n"
1082
+ assert _picked_text(tmp_path, src) == [[src.strip()]]
1083
+
1084
+
1085
+ def test_a_cached_2d_shape_is_picked_as_a_solid_would_be(tmp_path):
1086
+ """A cache hit restamps IDs; a 2D shape's must follow, or the second
1087
+ render of an unchanged script loses every 2D selection. It follows the
1088
+ same rule a solid's runs do: across renders the old ID is unknown, so it
1089
+ goes to the reused node -- here the whole translate() statement."""
1090
+ def two_renders(src):
1091
+ cache = ManifoldCache()
1092
+ return _picked_text(tmp_path, src, cache), _picked_text(tmp_path, src, cache)
1093
+
1094
+ flat = two_renders("square(3);\ntranslate([10, 0]) circle(4);\n")
1095
+ solid = two_renders("cube(3);\ntranslate([10, 0, 0]) sphere(4);\n")
1096
+ assert all(t is not None for render in flat for body in render for t in body)
1097
+ assert flat[1] == [["square(3);"], ["translate([10, 0]) circle(4);"]]
1098
+ assert solid[1] == [["cube(3);"], ["translate([10, 0, 0]) sphere(4);"]]