openscad-cpp-evaluator 0.26.1__tar.gz → 0.27.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 (199) hide show
  1. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/PKG-INFO +1 -1
  2. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/evaluator.hpp +4 -0
  3. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/pyproject.toml +1 -1
  4. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/csg_generate.cpp +32 -0
  5. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_manifold_cache.cpp +51 -0
  6. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/.github/workflows/ci.yml +0 -0
  7. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/.github/workflows/wheels.yml +0 -0
  8. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/.gitignore +0 -0
  9. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/.gitmodules +0 -0
  10. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/CLAUDE.md +0 -0
  11. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/CMakeLists.txt +0 -0
  12. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/LICENSE +0 -0
  13. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/README.md +0 -0
  14. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/bindings/CMakeLists.txt +0 -0
  15. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/bindings/ast_to_py.cpp +0 -0
  16. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/bindings/module.cpp +0 -0
  17. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/cmake/embed_font.cmake +0 -0
  18. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/examples/CMakeLists.txt +0 -0
  19. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/examples/eval_perf_benchmark.cpp +0 -0
  20. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/examples/manifold_cache_reuse.cpp +0 -0
  21. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/examples/minimal_debugger.cpp +0 -0
  22. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
  23. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/.gitignore +0 -0
  24. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/CLAUDE.md +0 -0
  25. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
  26. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/README.md +0 -0
  27. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
  28. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
  29. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
  30. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
  31. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
  32. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
  33. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
  34. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
  35. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
  36. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
  37. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
  38. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
  39. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
  40. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
  41. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
  42. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
  43. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/api.cpp +0 -0
  44. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
  45. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
  46. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
  47. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
  48. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
  49. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
  50. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
  51. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
  52. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/comments.cpp +0 -0
  53. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
  54. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
  55. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
  56. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
  57. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
  58. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
  59. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
  60. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/position.cpp +0 -0
  61. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
  62. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/scope.cpp +0 -0
  63. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
  64. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
  65. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
  66. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
  67. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
  68. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
  69. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
  70. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
  71. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
  72. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
  73. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
  74. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
  75. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
  76. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
  77. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
  78. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
  79. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
  80. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
  81. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
  82. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
  83. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
  84. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
  85. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
  86. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
  87. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
  88. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
  89. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
  90. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
  91. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
  92. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
  93. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
  94. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
  95. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
  96. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
  97. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
  98. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
  99. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
  100. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
  101. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
  102. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
  103. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/export.hpp +0 -0
  104. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
  105. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
  106. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
  107. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
  108. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/mesh_check.hpp +0 -0
  109. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
  110. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
  111. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/profile.hpp +0 -0
  112. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
  113. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/segments.hpp +0 -0
  114. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/stb_font_provider.hpp +0 -0
  115. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
  116. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
  117. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/value.hpp +0 -0
  118. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
  119. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/python/openscad_cpp_evaluator/__init__.py +0 -0
  120. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/resources/fonts/LICENSE +0 -0
  121. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/resources/fonts/LiberationSans-Regular.ttf +0 -0
  122. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/CMakeLists.txt +0 -0
  123. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/builtins/booleans.cpp +0 -0
  124. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/builtins/builtins.hpp +0 -0
  125. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/builtins/call_args.cpp +0 -0
  126. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/builtins/color.cpp +0 -0
  127. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/builtins/control.cpp +0 -0
  128. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/builtins/extrude.cpp +0 -0
  129. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/builtins/function_builtins.cpp +0 -0
  130. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/builtins/import.cpp +0 -0
  131. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/builtins/modifiers.cpp +0 -0
  132. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/builtins/primitives_2d.cpp +0 -0
  133. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/builtins/primitives_3d.cpp +0 -0
  134. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/builtins/registry.cpp +0 -0
  135. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/builtins/roof.cpp +0 -0
  136. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/builtins/segments.cpp +0 -0
  137. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/builtins/surface.cpp +0 -0
  138. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/builtins/text.cpp +0 -0
  139. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/builtins/topology.cpp +0 -0
  140. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/builtins/transforms.cpp +0 -0
  141. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/bytecode_compiler.cpp +0 -0
  142. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/bytecode_vm.cpp +0 -0
  143. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/colored_body.cpp +0 -0
  144. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/csg_resolve.cpp +0 -0
  145. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/css_colors.cpp +0 -0
  146. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/debug/debug_repl.cpp +0 -0
  147. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/debug_profile.cpp +0 -0
  148. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/eval_context.cpp +0 -0
  149. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/eval_error.cpp +0 -0
  150. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/eval_use.cpp +0 -0
  151. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/export.cpp +0 -0
  152. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/expr_eval.cpp +0 -0
  153. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/import/dxf_import.cpp +0 -0
  154. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/import/mesh_import.cpp +0 -0
  155. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/import/surface_load.cpp +0 -0
  156. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/import/svg_import.cpp +0 -0
  157. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/manifold_cache.cpp +0 -0
  158. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/mesh_check.cpp +0 -0
  159. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/stmt_eval.cpp +0 -0
  160. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/text/stb_font_provider.cpp +0 -0
  161. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/text/text_metrics.cpp +0 -0
  162. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/user_calls.cpp +0 -0
  163. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/value.cpp +0 -0
  164. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/src/zip_stored.cpp +0 -0
  165. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/CMakeLists.txt +0 -0
  166. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_booleans.cpp +0 -0
  167. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_bytecode_compiler.cpp +0 -0
  168. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_cli.cpp +0 -0
  169. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_control_flow.cpp +0 -0
  170. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_csg_tree.cpp +0 -0
  171. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_debug_hooks.cpp +0 -0
  172. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_dxf_svg_import.cpp +0 -0
  173. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_eval_context.cpp +0 -0
  174. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_export.cpp +0 -0
  175. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_expr_eval.cpp +0 -0
  176. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_extrude_roof.cpp +0 -0
  177. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_function_builtins.cpp +0 -0
  178. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_helpers.hpp +0 -0
  179. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_import_export.cpp +0 -0
  180. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_mesh_check.cpp +0 -0
  181. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_multi_color_merge.cpp +0 -0
  182. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_primitives.cpp +0 -0
  183. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_profiling.cpp +0 -0
  184. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_python_bindings.py +0 -0
  185. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_scope_trail.cpp +0 -0
  186. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_scoping.cpp +0 -0
  187. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_surface.cpp +0 -0
  188. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_tail_calls.cpp +0 -0
  189. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_text.cpp +0 -0
  190. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_transforms.cpp +0 -0
  191. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_use.cpp +0 -0
  192. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_value.cpp +0 -0
  193. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_viewport_params.cpp +0 -0
  194. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tests/test_zip_stored.cpp +0 -0
  195. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tools/cli/CMakeLists.txt +0 -0
  196. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tools/cli/cli_lib.cpp +0 -0
  197. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tools/cli/cli_lib.hpp +0 -0
  198. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/tools/cli/main.cpp +0 -0
  199. {openscad_cpp_evaluator-0.26.1 → openscad_cpp_evaluator-0.27.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscad_cpp_evaluator
3
- Version: 0.26.1
3
+ Version: 0.27.0
4
4
  Summary: C++ OpenSCAD evaluator with Python bindings
5
5
  Author: NeuSCAD Contributors
6
6
  License-Expression: MIT
@@ -223,6 +223,10 @@ public:
223
223
  // evaluate()/resolveTree()+generateTree() complete. Mirrors the
224
224
  // reference's Evaluator.id_to_node/id_to_color (also plain public
225
225
  // attributes there).
226
+ // Give cached bodies fresh originalIDs so a second call site reusing
227
+ // them is not confused with the first. See its definition.
228
+ void restampCachedIds(std::vector<ColoredBody>& bodies);
229
+
226
230
  std::unordered_map<uint32_t, const oscad::ASTNode*> idToNode;
227
231
  std::unordered_map<uint32_t, std::optional<std::array<float, 4>>> idToColor;
228
232
 
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "openscad_cpp_evaluator"
7
- version = "0.26.1"
7
+ version = "0.27.0"
8
8
  description = "C++ OpenSCAD evaluator with Python bindings"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -48,6 +48,7 @@ std::vector<ColoredBody> Evaluator::generateTreeImpl(const std::vector<CSGNode*>
48
48
  std::optional<std::vector<ColoredBody>> cached = key ? manifoldCache_->get(*key) : std::nullopt;
49
49
  if (cached) {
50
50
  node.bodies = std::move(*cached);
51
+ restampCachedIds(node.bodies);
51
52
  } else {
52
53
  // Recurse into children first (bottom-up) -- populates each
53
54
  // child's own .bodies in place so flattenCsgTree/a GenerateFn
@@ -104,6 +105,37 @@ std::vector<ColoredBody> Evaluator::generatePartialTree() {
104
105
  return generateTreeImpl(flat);
105
106
  }
106
107
 
108
+ void Evaluator::restampCachedIds(std::vector<ColoredBody>& bodies) {
109
+ // A cache hit hands back the geometry AND the originalIDs of whichever
110
+ // call site first produced it. Those IDs are provenance -- "which node
111
+ // made this" -- not content, so two identical shapes at two call sites
112
+ // came back sharing one identity and selecting either picked both.
113
+ //
114
+ // Each distinct run gets a fresh ID, one per run rather than one per
115
+ // body, so a cached subtree made of several parts stays selectable
116
+ // part by part. Each new ID inherits the old one's node and color, so
117
+ // the parts keep pointing at the AST nodes that really produced them.
118
+ for (ColoredBody& cb : bodies) {
119
+ if (!cb.body || cb.body->IsEmpty()) continue;
120
+ manifold::MeshGL mesh = cb.body->GetMeshGL();
121
+ if (mesh.runOriginalID.empty()) continue;
122
+ std::unordered_map<uint32_t, uint32_t> remap;
123
+ for (uint32_t& id : mesh.runOriginalID) {
124
+ auto found = remap.find(id);
125
+ if (found == remap.end()) {
126
+ const uint32_t fresh = manifold::Manifold::ReserveIDs(1);
127
+ auto node = idToNode.find(id);
128
+ if (node != idToNode.end()) idToNode[fresh] = node->second;
129
+ auto color = idToColor.find(id);
130
+ if (color != idToColor.end()) idToColor[fresh] = color->second;
131
+ found = remap.emplace(id, fresh).first;
132
+ }
133
+ id = found->second;
134
+ }
135
+ cb.body = manifold::Manifold(mesh);
136
+ }
137
+ }
138
+
107
139
  ColoredBody Evaluator::tagGenerated(manifold::Manifold body, const oscad::ASTNode& node, const Value& colorValue) {
108
140
  manifold::MeshGL mesh = body.GetMeshGL();
109
141
  std::optional<std::array<float, 4>> color = valueToColor(colorValue);
@@ -5,7 +5,10 @@
5
5
  #include "test_helpers.hpp"
6
6
 
7
7
  #include <gtest/gtest.h>
8
+ #include <algorithm>
9
+ #include <iterator>
8
10
  #include <numbers>
11
+ #include <set>
9
12
 
10
13
  using namespace oscadeval;
11
14
  using namespace oscadeval::test;
@@ -156,6 +159,54 @@ TEST(ManifoldCache, UncacheableNodeAlwaysRegeneratesNeverHitsOrPopulatesCache) {
156
159
  EXPECT_FALSE(second.ev.idToNode.empty());
157
160
  }
158
161
 
162
+ // A cache hit must not hand back the originalIDs of whichever call site
163
+ // first produced the geometry. Those IDs are provenance, and sharing them
164
+ // made two identical shapes one thing to a UI: selecting either picked
165
+ // both. Common in CAD, where arrays of identical parts are the norm.
166
+ TEST(ManifoldCache, IdenticalShapesAtDifferentCallSitesGetDistinctOriginalIds) {
167
+ auto cache = std::make_shared<ManifoldCache>();
168
+ Evaluated e = evalSrcWithCache(
169
+ "translate([0,0,0]) cylinder(h=20,r=4,$fn=32);\n"
170
+ "translate([25,0,0]) cylinder(h=20,r=4,$fn=32);\n", cache);
171
+ ASSERT_EQ(e.bodies.size(), 2u);
172
+
173
+ // Held in locals: GetMeshGL() returns by value, so taking begin() and
174
+ // end() from two separate calls walks between unrelated buffers.
175
+ const manifold::MeshGL meshA = e.bodies[0].body->GetMeshGL();
176
+ const manifold::MeshGL meshB = e.bodies[1].body->GetMeshGL();
177
+ const std::set<uint32_t> first(meshA.runOriginalID.begin(), meshA.runOriginalID.end());
178
+ const std::set<uint32_t> second(meshB.runOriginalID.begin(), meshB.runOriginalID.end());
179
+ ASSERT_FALSE(first.empty());
180
+ ASSERT_FALSE(second.empty());
181
+ std::vector<uint32_t> shared;
182
+ std::set_intersection(first.begin(), first.end(), second.begin(), second.end(),
183
+ std::back_inserter(shared));
184
+ EXPECT_TRUE(shared.empty()) << "the two cylinders share an originalID";
185
+
186
+ // Both still resolve to a node, so re-stamping does not lose the
187
+ // mapping selection needs.
188
+ for (uint32_t id : first) EXPECT_EQ(e.ev.idToNode.count(id), 1u);
189
+ for (uint32_t id : second) EXPECT_EQ(e.ev.idToNode.count(id), 1u);
190
+ }
191
+
192
+ // Re-stamping is per run, not per body, so a cached subtree made of
193
+ // several parts stays selectable part by part rather than collapsing into
194
+ // one -- which is what Manifold's own AsOriginal() would have done.
195
+ TEST(ManifoldCache, ACachedMultiPartSubtreeKeepsOneIdPerPart) {
196
+ auto cache = std::make_shared<ManifoldCache>();
197
+ Evaluated e = evalSrcWithCache(
198
+ "module pair() { cube(2); translate([5,0,0]) sphere(1,$fn=8); }\n"
199
+ "pair();\n"
200
+ "translate([0,20,0]) pair();\n", cache);
201
+ ASSERT_EQ(e.bodies.size(), 4u);
202
+ std::set<uint32_t> all;
203
+ for (const ColoredBody& b : e.bodies) {
204
+ const manifold::MeshGL mesh = b.body->GetMeshGL();
205
+ for (uint32_t id : mesh.runOriginalID) all.insert(id);
206
+ }
207
+ EXPECT_EQ(all.size(), 4u) << "parts of the reused subtree share IDs";
208
+ }
209
+
159
210
  TEST(ManifoldCache, OutputIsIdenticalCacheOnVsCacheOffAcrossBuiltinCategories) {
160
211
  const std::vector<std::string> scripts = {
161
212
  "cube(3);",