openscad-cpp-evaluator 0.34.0__tar.gz → 0.35.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 (203) hide show
  1. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/CLAUDE.md +14 -1
  2. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/PKG-INFO +1 -1
  3. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/pyproject.toml +1 -1
  4. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/builtins/builtins.hpp +5 -0
  5. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/builtins/registry.cpp +3 -0
  6. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/builtins/topology.cpp +62 -0
  7. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_booleans.cpp +79 -0
  8. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/uv.lock +1 -1
  9. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/.github/workflows/ci.yml +0 -0
  10. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/.github/workflows/wheels.yml +0 -0
  11. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/.gitignore +0 -0
  12. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/.gitmodules +0 -0
  13. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/CMakeLists.txt +0 -0
  14. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/LICENSE +0 -0
  15. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/README.md +0 -0
  16. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/bindings/CMakeLists.txt +0 -0
  17. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/bindings/ast_to_py.cpp +0 -0
  18. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/bindings/module.cpp +0 -0
  19. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/cmake/embed_font.cmake +0 -0
  20. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/examples/CMakeLists.txt +0 -0
  21. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/examples/eval_perf_benchmark.cpp +0 -0
  22. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/examples/manifold_cache_reuse.cpp +0 -0
  23. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/examples/minimal_debugger.cpp +0 -0
  24. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
  25. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/.gitignore +0 -0
  26. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/CLAUDE.md +0 -0
  27. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
  28. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/README.md +0 -0
  29. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
  30. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
  31. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
  32. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
  33. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
  34. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
  35. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
  36. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
  37. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
  38. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
  39. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
  40. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
  41. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
  42. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
  43. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
  44. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
  45. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/api.cpp +0 -0
  46. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
  47. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
  48. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
  49. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
  50. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
  51. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
  52. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
  53. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
  54. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/comments.cpp +0 -0
  55. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
  56. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
  57. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
  58. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
  59. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
  60. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
  61. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
  62. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/position.cpp +0 -0
  63. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
  64. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/scope.cpp +0 -0
  65. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
  66. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
  67. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
  68. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
  69. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
  70. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
  71. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
  72. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
  73. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
  74. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
  75. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
  76. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
  77. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
  78. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
  79. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
  80. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
  81. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
  82. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
  83. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
  84. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
  85. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
  86. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
  87. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
  88. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
  89. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
  90. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
  91. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
  92. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
  93. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
  94. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
  95. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
  96. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
  97. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
  98. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
  99. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
  100. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
  101. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
  102. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
  103. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
  104. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
  105. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/evaluator.hpp +0 -0
  106. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/export.hpp +0 -0
  107. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/font_match.hpp +0 -0
  108. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
  109. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/freetype_font_provider.hpp +0 -0
  110. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
  111. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
  112. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
  113. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/mesh_check.hpp +0 -0
  114. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
  115. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
  116. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/profile.hpp +0 -0
  117. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
  118. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/segments.hpp +0 -0
  119. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
  120. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
  121. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/value.hpp +0 -0
  122. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
  123. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/python/openscad_cpp_evaluator/__init__.py +0 -0
  124. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/resources/fonts/LICENSE +0 -0
  125. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/resources/fonts/LiberationSans-Regular.ttf +0 -0
  126. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/CMakeLists.txt +0 -0
  127. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/builtins/booleans.cpp +0 -0
  128. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/builtins/call_args.cpp +0 -0
  129. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/builtins/color.cpp +0 -0
  130. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/builtins/control.cpp +0 -0
  131. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/builtins/dxf_dim.cpp +0 -0
  132. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/builtins/extrude.cpp +0 -0
  133. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/builtins/function_builtins.cpp +0 -0
  134. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/builtins/import.cpp +0 -0
  135. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/builtins/modifiers.cpp +0 -0
  136. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/builtins/primitives_2d.cpp +0 -0
  137. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/builtins/primitives_3d.cpp +0 -0
  138. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/builtins/roof.cpp +0 -0
  139. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/builtins/segments.cpp +0 -0
  140. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/builtins/surface.cpp +0 -0
  141. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/builtins/text.cpp +0 -0
  142. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/builtins/transforms.cpp +0 -0
  143. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/bytecode_compiler.cpp +0 -0
  144. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/bytecode_vm.cpp +0 -0
  145. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/colored_body.cpp +0 -0
  146. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/csg_generate.cpp +0 -0
  147. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/csg_resolve.cpp +0 -0
  148. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/css_colors.cpp +0 -0
  149. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/debug/debug_repl.cpp +0 -0
  150. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/debug_profile.cpp +0 -0
  151. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/eval_context.cpp +0 -0
  152. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/eval_error.cpp +0 -0
  153. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/eval_use.cpp +0 -0
  154. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/export.cpp +0 -0
  155. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/expr_eval.cpp +0 -0
  156. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/import/dxf_import.cpp +0 -0
  157. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/import/mesh_import.cpp +0 -0
  158. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/import/surface_load.cpp +0 -0
  159. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/import/svg_import.cpp +0 -0
  160. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/manifold_cache.cpp +0 -0
  161. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/mesh_check.cpp +0 -0
  162. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/stmt_eval.cpp +0 -0
  163. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/text/font_match.cpp +0 -0
  164. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/text/freetype_font_provider.cpp +0 -0
  165. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/text/text_metrics.cpp +0 -0
  166. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/user_calls.cpp +0 -0
  167. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/value.cpp +0 -0
  168. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/src/zip_stored.cpp +0 -0
  169. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/CMakeLists.txt +0 -0
  170. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_bytecode_compiler.cpp +0 -0
  171. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_cli.cpp +0 -0
  172. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_control_flow.cpp +0 -0
  173. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_csg_tree.cpp +0 -0
  174. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_debug_hooks.cpp +0 -0
  175. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_dxf_svg_import.cpp +0 -0
  176. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_eval_context.cpp +0 -0
  177. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_export.cpp +0 -0
  178. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_expr_eval.cpp +0 -0
  179. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_extrude_roof.cpp +0 -0
  180. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_function_builtins.cpp +0 -0
  181. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_helpers.hpp +0 -0
  182. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_import_export.cpp +0 -0
  183. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_manifold_cache.cpp +0 -0
  184. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_mesh_check.cpp +0 -0
  185. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_multi_color_merge.cpp +0 -0
  186. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_primitives.cpp +0 -0
  187. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_profiling.cpp +0 -0
  188. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_python_bindings.py +0 -0
  189. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_scope_trail.cpp +0 -0
  190. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_scoping.cpp +0 -0
  191. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_surface.cpp +0 -0
  192. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_tail_calls.cpp +0 -0
  193. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_text.cpp +0 -0
  194. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_transforms.cpp +0 -0
  195. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_unexpected_args.cpp +0 -0
  196. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_use.cpp +0 -0
  197. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_value.cpp +0 -0
  198. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_viewport_params.cpp +0 -0
  199. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tests/test_zip_stored.cpp +0 -0
  200. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tools/cli/CMakeLists.txt +0 -0
  201. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tools/cli/cli_lib.cpp +0 -0
  202. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tools/cli/cli_lib.hpp +0 -0
  203. {openscad_cpp_evaluator-0.34.0 → openscad_cpp_evaluator-0.35.0}/tools/cli/main.cpp +0 -0
@@ -591,7 +591,7 @@ grep for `ponytail:`.
591
591
  All 25 module/shape combinations were diffed against OpenSCAD 2026.02.01 warning for warning, with
592
592
  the surviving geometry compared by STL volume.
593
593
 
594
- - `src/builtins/topology.cpp` — `hull()`/`minkowski()`/`fill()`. All three splice their children transparently in
594
+ - `src/builtins/topology.cpp` — `hull()`/`minkowski()`/`minkowski_difference()`/`fill()`. All four splice their children transparently in
595
595
  the CSG tree exactly like union/difference/intersection (resolve just evaluates them for the
596
596
  side effect); `hull()` picks an all-3D (`Manifold::Hull`) or all-2D (`CrossSection::Hull`) hull of
597
597
  the *foreground* (role-split) children, falling back to sections only when no child has a body;
@@ -604,6 +604,19 @@ grep for `ponytail:`.
604
604
  which matters because two outers can overlap once the holes between them are gone. Ported from
605
605
  the reference's `applyFill2D`, and checked shape-for-shape against OpenSCAD 2026.02.01 by
606
606
  extruding and comparing STL volumes.
607
+
608
+ `minkowski_difference()` is erosion, and a deliberate BelfrySCAD extension: OpenSCAD has no such
609
+ module and no way to spell the operation in the language, since `minkowski()` only ever sums.
610
+ Reads the same way — first child is the body, every child after it is a tool eroded away in turn
611
+ (`Manifold::MinkowskiDifference`). 3D only, matching `minkowski()`'s own 3D-wins dispatch, since
612
+ Manifold has no CrossSection erosion and 2D already has one in `offset(r=-N)`.
613
+
614
+ Worth knowing why this is a module rather than an extension of `offset()`: a *positive* 3D offset
615
+ is already expressible as `minkowski() { X; sphere(r); }`, so `offset(r=N)` on a solid would have
616
+ been pure sugar. Erosion is the half that is genuinely unavailable, and naming it after the
617
+ operation beats borrowing a 2D name for it. Eroding a cube by a cube is exact (no curved tool to
618
+ tessellate), which is what the tests assert on; a sphere tool lands a little large, and that gap
619
+ is the sphere's tessellation rather than an error in the erosion.
607
620
  - `src/builtins/extrude.cpp` — `linear_extrude()`/`rotate_extrude()`/`projection(cut=)`. All three
608
621
  union every 2D child into one `CrossSection` via `toCrossSection` first. `rotate_extrude`'s
609
622
  segment count can't be resolved until generate time (it depends on the merged children's bounds,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscad_cpp_evaluator
3
- Version: 0.34.0
3
+ Version: 0.35.0
4
4
  Summary: C++ OpenSCAD evaluator with Python bindings
5
5
  Author: NeuSCAD Contributors
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "openscad_cpp_evaluator"
7
- version = "0.34.0"
7
+ version = "0.35.0"
8
8
  description = "C++ OpenSCAD evaluator with Python bindings"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -165,6 +165,11 @@ std::vector<ColoredBody> generateHull(Evaluator& ev, const CSGParams& params,
165
165
  Value builtinDxfDim(Evaluator& ev, const CallArgs& args, const oscad::ASTNode& node);
166
166
  Value builtinDxfCross(Evaluator& ev, const CallArgs& args, const oscad::ASTNode& node);
167
167
 
168
+ CSGParams resolveMinkowskiDifference(Evaluator& ev, const oscad::ModularCall& node, EvalContext& ctx);
169
+ std::vector<ColoredBody> generateMinkowskiDifference(Evaluator& ev, const CSGParams& params,
170
+ const std::vector<std::unique_ptr<CSGNode>>& children,
171
+ const oscad::ASTNode& node);
172
+
168
173
  CSGParams resolveFill(Evaluator& ev, const oscad::ModularCall& node, EvalContext& ctx);
169
174
  std::vector<ColoredBody> generateFill(Evaluator& ev, const CSGParams& params,
170
175
  const std::vector<std::unique_ptr<CSGNode>>& children,
@@ -35,6 +35,7 @@ const std::unordered_map<std::string_view, ResolveFn>& resolveDispatch() {
35
35
  {"projection", &resolveProjection},
36
36
  {"roof", &resolveRoof},
37
37
  {"fill", &resolveFill},
38
+ {"minkowski_difference", &resolveMinkowskiDifference},
38
39
  {"offset", &resolveOffset},
39
40
  {"surface", &resolveSurface},
40
41
  {"text", &resolveText},
@@ -74,6 +75,7 @@ const std::unordered_map<std::string_view, GenerateFn>& generateDispatch() {
74
75
  {"projection", &generateProjection},
75
76
  {"roof", &generateRoof},
76
77
  {"fill", &generateFill},
78
+ {"minkowski_difference", &generateMinkowskiDifference},
77
79
  {"offset", &generateOffset},
78
80
  {"surface", &generateSurface},
79
81
  {"text", &generateText},
@@ -119,6 +121,7 @@ const std::vector<std::string>* builtinParamNames(const std::string& name) {
119
121
  {"projection", {"cut", "convexity"}},
120
122
  {"roof", {"method", "convexity"}},
121
123
  {"fill", {}},
124
+ {"minkowski_difference", {}},
122
125
  {"offset", {"r", "delta", "chamfer"}},
123
126
  {"surface", {"file", "center", "convexity", "invert"}},
124
127
  {"text", {"text", "size", "font", "direction", "language", "script", "halign", "valign", "spacing"}},
@@ -313,4 +313,66 @@ std::vector<ColoredBody> generateMinkowski(Evaluator& ev, const CSGParams&, cons
313
313
  return out;
314
314
  }
315
315
 
316
+ // minkowski_difference() -- erosion, the operation `minkowski()` has no
317
+ // inverse for. A BelfrySCAD extension: OpenSCAD has no equivalent module and
318
+ // no way to express it in the language, since minkowski() only ever sums.
319
+ // Shrinking a part by a clearance, or hollowing one to a wall thickness,
320
+ // otherwise needs hand-built difference() scaffolding that is not the same
321
+ // operation.
322
+ //
323
+ // Reads like minkowski(): the first child is the body being eroded, and
324
+ // every child after it is a tool eroded away from it in turn. 3D only, same
325
+ // as minkowski()'s own 3D path -- Manifold has no CrossSection erosion, and
326
+ // 2D already has one in offset(r=-N).
327
+
328
+ CSGParams resolveMinkowskiDifference(Evaluator& ev, const oscad::ModularCall& node, EvalContext& ctx) {
329
+ auto [args, effCtx] = resolveCallArgs(ev, node.arguments, ctx);
330
+ (void)args;
331
+ ev.evalChildren(node.children, effCtx);
332
+ return CSGParams{};
333
+ }
334
+
335
+ std::vector<ColoredBody> generateMinkowskiDifference(Evaluator& ev, const CSGParams&,
336
+ const std::vector<std::unique_ptr<CSGNode>>& children,
337
+ const oscad::ASTNode& node) {
338
+ const std::vector<ColoredBody> bodies = flattenCsgTree(children);
339
+ const RoleSplit split = splitByRole(bodies);
340
+
341
+ std::vector<const ColoredBody*> bodies3d;
342
+ for (const ColoredBody& c : split.foreground) {
343
+ if (c.body) bodies3d.push_back(&c);
344
+ }
345
+
346
+ std::vector<ColoredBody> passthrough;
347
+ passthrough.insert(passthrough.end(), split.background.begin(), split.background.end());
348
+ passthrough.insert(passthrough.end(), split.highlight.begin(), split.highlight.end());
349
+ passthrough.insert(passthrough.end(), split.showOnly.begin(), split.showOnly.end());
350
+ passthrough.insert(passthrough.end(), split.displayOnly.begin(), split.displayOnly.end());
351
+
352
+ if (bodies3d.empty()) return passthrough;
353
+ if (bodies3d.size() == 1) {
354
+ // Nothing to erode with, so nothing happens -- the same no-op
355
+ // minkowski() gives for a single child.
356
+ std::vector<ColoredBody> result = {*bodies3d.front()};
357
+ result.insert(result.end(), passthrough.begin(), passthrough.end());
358
+ return result;
359
+ }
360
+
361
+ manifold::Manifold result = *bodies3d.front()->body;
362
+ for (size_t i = 1; i < bodies3d.size(); ++i) result = result.MinkowskiDifference(*bodies3d[i]->body);
363
+ if (result.Status() != manifold::Manifold::Error::NoError) {
364
+ ev.warn("minkowski_difference: result is not manifold", &node.position());
365
+ }
366
+
367
+ ColoredBody cb;
368
+ cb.body = std::move(result);
369
+ cb.color = bodies3d.front()->color;
370
+ // Per-triangle colour cannot survive an erosion: the surface it was
371
+ // indexed against is gone.
372
+ cb.triColors.reset();
373
+ std::vector<ColoredBody> out = {std::move(cb)};
374
+ out.insert(out.end(), passthrough.begin(), passthrough.end());
375
+ return out;
376
+ }
377
+
316
378
  } // namespace oscadeval
@@ -620,3 +620,82 @@ TEST(MixedDimensions, UniformChildrenAreUntouched) {
620
620
  ASSERT_EQ(e.bodies.size(), 1u);
621
621
  EXPECT_NEAR(e.bodies[0].body->Volume(), 2.0, 1e-9);
622
622
  }
623
+
624
+ // -- minkowski_difference() -----------------------------------------------
625
+ //
626
+ // Erosion: the operation minkowski() has no inverse for. A BelfrySCAD
627
+ // extension, because OpenSCAD has no equivalent module and no way to spell
628
+ // it in the language -- minkowski() only ever sums.
629
+ //
630
+ // Eroding a cube by a cube is exact (no curved tool to tessellate), so those
631
+ // expectations are equalities rather than tolerances.
632
+
633
+ TEST(MinkowskiDifference, ErodesACubeExactly) {
634
+ // A 10-cube eroded by a 2-cube is an 8-cube: every face moves in by the
635
+ // tool's half-width.
636
+ Evaluated e = evalSrc("minkowski_difference() { cube(10, center=true); cube(2, center=true); }");
637
+ ASSERT_EQ(e.bodies.size(), 1u);
638
+ ASSERT_TRUE(e.bodies[0].body.has_value());
639
+ EXPECT_NEAR(e.bodies[0].body->Volume(), 512.0, 1e-6);
640
+ const manifold::Box bb = e.bodies[0].body->BoundingBox();
641
+ EXPECT_NEAR(bb.min.x, -4.0, 1e-9);
642
+ EXPECT_NEAR(bb.max.x, 4.0, 1e-9);
643
+ }
644
+
645
+ TEST(MinkowskiDifference, ErodesByASphereToWithinTessellation) {
646
+ // Same 8-cube, but the tool is a polyhedral sphere whose inradius is a
647
+ // touch under 1, so the result is a touch larger. That gap IS the
648
+ // tessellation and shrinks with $fn -- it is not an error in the erosion.
649
+ Evaluated e = evalSrc("minkowski_difference() { cube(10, center=true); sphere(1, $fn=64); }");
650
+ ASSERT_EQ(e.bodies.size(), 1u);
651
+ ASSERT_TRUE(e.bodies[0].body.has_value());
652
+ EXPECT_NEAR(e.bodies[0].body->Volume(), 512.0, 1.0);
653
+ EXPECT_GT(e.bodies[0].body->Volume(), 512.0);
654
+ }
655
+
656
+ TEST(MinkowskiDifference, ShrinksANonConvexBodyOnEverySide) {
657
+ // The case that motivates the module: a plate with holes, shrunk by a
658
+ // clearance. The bounding box must come in by the tool's radius all
659
+ // round -- 20x20x4 becomes 18x18x2.
660
+ Evaluated e = evalSrc(
661
+ "minkowski_difference() {"
662
+ " difference() { cube([20,20,4], center=true);"
663
+ " for (x=[-6,0,6]) translate([x,0,0]) cylinder(h=6,r=2.5,center=true,$fn=24); }"
664
+ " sphere(1, $fn=24); }");
665
+ ASSERT_EQ(e.bodies.size(), 1u);
666
+ ASSERT_TRUE(e.bodies[0].body.has_value());
667
+ const manifold::Box bb = e.bodies[0].body->BoundingBox();
668
+ EXPECT_NEAR(bb.max.x, 9.0, 0.05);
669
+ EXPECT_NEAR(bb.max.y, 9.0, 0.05);
670
+ EXPECT_NEAR(bb.max.z, 1.0, 0.05);
671
+ }
672
+
673
+ TEST(MinkowskiDifference, SingleChildIsANoOp) {
674
+ // Nothing to erode with, so nothing happens -- the same shape
675
+ // minkowski() gives a lone child back.
676
+ Evaluated e = evalSrc("minkowski_difference() { cube(10, center=true); }");
677
+ ASSERT_EQ(e.bodies.size(), 1u);
678
+ ASSERT_TRUE(e.bodies[0].body.has_value());
679
+ EXPECT_NEAR(e.bodies[0].body->Volume(), 1000.0, 1e-9);
680
+ }
681
+
682
+ TEST(MinkowskiDifference, NoChildrenIsEmpty) {
683
+ Evaluated e = evalSrc("minkowski_difference();");
684
+ EXPECT_TRUE(e.bodies.empty());
685
+ }
686
+
687
+ TEST(MinkowskiDifference, ErodesSuccessivelyByEveryToolAfterTheFirst) {
688
+ // Two 2-cube tools take 1 off each side twice: 10 -> 8 -> 6.
689
+ Evaluated e = evalSrc(
690
+ "minkowski_difference() { cube(10, center=true); cube(2, center=true); cube(2, center=true); }");
691
+ ASSERT_EQ(e.bodies.size(), 1u);
692
+ ASSERT_TRUE(e.bodies[0].body.has_value());
693
+ EXPECT_NEAR(e.bodies[0].body->Volume(), 216.0, 1e-6);
694
+ }
695
+
696
+ TEST(MinkowskiDifference, TwoDeeChildrenAreIgnoredLikeMinkowskis) {
697
+ // 3D only, matching minkowski()'s own 3D-wins dispatch. 2D erosion
698
+ // already exists as offset(r=-N).
699
+ Evaluated e = evalSrc("minkowski_difference() { square(10); square(2); }");
700
+ EXPECT_TRUE(e.bodies.empty());
701
+ }
@@ -55,7 +55,7 @@ wheels = [
55
55
 
56
56
  [[package]]
57
57
  name = "openscad-cpp-evaluator"
58
- version = "0.34.0"
58
+ version = "0.35.0"
59
59
  source = { editable = "." }
60
60
  dependencies = [
61
61
  { name = "numpy" },