openscad-cpp-evaluator 0.55.2__tar.gz → 0.55.3__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 (208) hide show
  1. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/CLAUDE.md +9 -0
  2. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/PKG-INFO +1 -1
  3. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/colored_body.hpp +16 -1
  4. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/pyproject.toml +1 -1
  5. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/builtins/transforms.cpp +4 -0
  6. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/colored_body.cpp +11 -1
  7. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/export.cpp +1 -1
  8. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_booleans.cpp +40 -2
  9. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_export.cpp +4 -2
  10. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/.github/workflows/ci.yml +0 -0
  11. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/.github/workflows/wheels.yml +0 -0
  12. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/.gitignore +0 -0
  13. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/.gitmodules +0 -0
  14. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/CMakeLists.txt +0 -0
  15. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/LICENSE +0 -0
  16. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/README.md +0 -0
  17. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/bindings/CMakeLists.txt +0 -0
  18. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/bindings/ast_to_py.cpp +0 -0
  19. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/bindings/module.cpp +0 -0
  20. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/cmake/embed_font.cmake +0 -0
  21. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/examples/CMakeLists.txt +0 -0
  22. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/examples/eval_perf_benchmark.cpp +0 -0
  23. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/examples/manifold_cache_reuse.cpp +0 -0
  24. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/examples/minimal_debugger.cpp +0 -0
  25. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
  26. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/.gitignore +0 -0
  27. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/CLAUDE.md +0 -0
  28. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
  29. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/README.md +0 -0
  30. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
  31. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
  32. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
  33. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
  34. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
  35. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
  36. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
  37. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
  38. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
  39. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
  40. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
  41. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
  42. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
  43. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
  44. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
  45. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
  46. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/api.cpp +0 -0
  47. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
  48. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
  49. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
  50. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
  51. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
  52. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
  53. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
  54. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
  55. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/comments.cpp +0 -0
  56. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
  57. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
  58. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
  59. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
  60. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
  61. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
  62. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
  63. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/position.cpp +0 -0
  64. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
  65. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/scope.cpp +0 -0
  66. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
  67. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
  68. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
  69. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
  70. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
  71. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
  72. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
  73. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
  74. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
  75. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
  76. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
  77. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
  78. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
  79. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
  80. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
  81. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
  82. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
  83. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/test_render_expression.cpp +0 -0
  84. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
  85. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
  86. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
  87. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
  88. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
  89. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
  90. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
  91. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
  92. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
  93. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
  94. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
  95. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
  96. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
  97. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
  98. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
  99. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
  100. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
  101. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
  102. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
  103. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
  104. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
  105. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
  106. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/evaluator.hpp +0 -0
  107. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/export.hpp +0 -0
  108. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/font_match.hpp +0 -0
  109. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
  110. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/freetype_font_provider.hpp +0 -0
  111. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
  112. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
  113. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
  114. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/mesh_check.hpp +0 -0
  115. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
  116. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
  117. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/profile.hpp +0 -0
  118. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
  119. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/segments.hpp +0 -0
  120. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
  121. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
  122. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/value.hpp +0 -0
  123. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
  124. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/python/openscad_cpp_evaluator/__init__.py +0 -0
  125. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/resources/fonts/LICENSE +0 -0
  126. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/resources/fonts/LiberationSans-Regular.ttf +0 -0
  127. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/CMakeLists.txt +0 -0
  128. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/builtins/booleans.cpp +0 -0
  129. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/builtins/builtins.hpp +0 -0
  130. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/builtins/call_args.cpp +0 -0
  131. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/builtins/color.cpp +0 -0
  132. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/builtins/control.cpp +0 -0
  133. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/builtins/dxf_dim.cpp +0 -0
  134. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/builtins/extrude.cpp +0 -0
  135. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/builtins/function_builtins.cpp +0 -0
  136. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/builtins/import.cpp +0 -0
  137. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/builtins/modifiers.cpp +0 -0
  138. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/builtins/primitives_2d.cpp +0 -0
  139. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/builtins/primitives_3d.cpp +0 -0
  140. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/builtins/registry.cpp +0 -0
  141. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/builtins/roof.cpp +0 -0
  142. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/builtins/segments.cpp +0 -0
  143. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/builtins/surface.cpp +0 -0
  144. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/builtins/text.cpp +0 -0
  145. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/builtins/topology.cpp +0 -0
  146. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/bytecode_compiler.cpp +0 -0
  147. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/bytecode_vm.cpp +0 -0
  148. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/csg_generate.cpp +0 -0
  149. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/csg_resolve.cpp +0 -0
  150. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/css_colors.cpp +0 -0
  151. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/debug/debug_repl.cpp +0 -0
  152. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/debug_profile.cpp +0 -0
  153. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/eval_context.cpp +0 -0
  154. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/eval_error.cpp +0 -0
  155. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/eval_use.cpp +0 -0
  156. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/expr_eval.cpp +0 -0
  157. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/import/dxf_import.cpp +0 -0
  158. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/import/mesh_import.cpp +0 -0
  159. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/import/surface_load.cpp +0 -0
  160. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/import/svg_import.cpp +0 -0
  161. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/manifold_cache.cpp +0 -0
  162. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/measure_geometry.cpp +0 -0
  163. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/mesh_check.cpp +0 -0
  164. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/stmt_eval.cpp +0 -0
  165. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/text/font_match.cpp +0 -0
  166. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/text/freetype_font_provider.cpp +0 -0
  167. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/text/text_metrics.cpp +0 -0
  168. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/user_calls.cpp +0 -0
  169. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/value.cpp +0 -0
  170. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/src/zip_stored.cpp +0 -0
  171. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/CMakeLists.txt +0 -0
  172. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_bytecode_compiler.cpp +0 -0
  173. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_children_separate.cpp +0 -0
  174. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_cli.cpp +0 -0
  175. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_control_flow.cpp +0 -0
  176. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_csg_tree.cpp +0 -0
  177. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_debug_hooks.cpp +0 -0
  178. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_dxf_svg_import.cpp +0 -0
  179. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_eval_context.cpp +0 -0
  180. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_expr_eval.cpp +0 -0
  181. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_extrude_roof.cpp +0 -0
  182. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_feature_detection.cpp +0 -0
  183. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_function_builtins.cpp +0 -0
  184. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_helpers.hpp +0 -0
  185. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_import_export.cpp +0 -0
  186. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_manifold_cache.cpp +0 -0
  187. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_mesh_check.cpp +0 -0
  188. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_multi_color_merge.cpp +0 -0
  189. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_primitives.cpp +0 -0
  190. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_profiling.cpp +0 -0
  191. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_python_bindings.py +0 -0
  192. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_render_expr.cpp +0 -0
  193. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_scope_trail.cpp +0 -0
  194. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_scoping.cpp +0 -0
  195. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_surface.cpp +0 -0
  196. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_tail_calls.cpp +0 -0
  197. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_text.cpp +0 -0
  198. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_transforms.cpp +0 -0
  199. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_unexpected_args.cpp +0 -0
  200. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_use.cpp +0 -0
  201. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_value.cpp +0 -0
  202. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_viewport_params.cpp +0 -0
  203. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tests/test_zip_stored.cpp +0 -0
  204. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tools/cli/CMakeLists.txt +0 -0
  205. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tools/cli/cli_lib.cpp +0 -0
  206. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tools/cli/cli_lib.hpp +0 -0
  207. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/tools/cli/main.cpp +0 -0
  208. {openscad_cpp_evaluator-0.55.2 → openscad_cpp_evaluator-0.55.3}/uv.lock +0 -0
@@ -231,6 +231,15 @@ top-level 2D primitive/projection() script had been silently unexportable via th
231
231
  Fixed by porting `toRenderableBodies()` (`colored_body.hpp`/`.cpp`) and calling it from the CLI right
232
232
  before export, matching the reference's own call site exactly.
233
233
 
234
+ `ColoredBody::sectionZ` rides alongside for the same reason. A `manifold::CrossSection` is purely
235
+ 2D, so `down(1) square(10)` had nowhere to put the `-1` and silently dropped it — and that is not
236
+ cosmetic: BOSL2 layers 2D overlays by pushing one down (isosurface's `contour()` Example 1 puts a
237
+ blue backdrop below a green contour), and with the offset lost the two slabs became exactly
238
+ coplanar, z-fought, and whichever drew last covered the other completely. `generateTransform`
239
+ accumulates the z of any `translate` applied to a section, and `toRenderableBodies()` translates the
240
+ extruded slab by it. Only translation is carried — a 2D shape under a 3D *rotation* still loses it,
241
+ which would need a full matrix per section and nothing has asked for that yet.
242
+
234
243
  **Font support**: a `FontProvider` abstract interface (`font_provider.hpp`: `resolveFont`/
235
244
  `metrics`/`shapeText`/`glyphInkBounds`/`glyphOutline`) with `FreetypeFontProvider` as the built-in
236
245
  implementation everything here actually uses. `Evaluator`'s constructor takes an optional
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscad_cpp_evaluator
3
- Version: 0.55.2
3
+ Version: 0.55.3
4
4
  Summary: C++ OpenSCAD evaluator with Python bindings
5
5
  Author: NeuSCAD Contributors
6
6
  License-Expression: MIT
@@ -24,6 +24,21 @@ struct ColoredBody {
24
24
  std::optional<std::array<float, 4>> color; // RGBA; nullopt = "no explicit color() -- follow the live theme"
25
25
  std::optional<manifold::CrossSection> section;
26
26
  bool flatPreview = false;
27
+
28
+ // Where a 2D `section` sits along Z. Only meaningful while `section` is
29
+ // set, and applied when toRenderableBodies() extrudes it.
30
+ //
31
+ // A manifold::CrossSection is purely 2D, so `down(1) square(10)` had
32
+ // nowhere to put the -1 and silently dropped it. That is not merely
33
+ // cosmetic: BOSL2 layers 2D overlays by pushing one down (isosurface's
34
+ // contour() Example 1 puts a blue backdrop below a green contour), and
35
+ // with the offset lost the two slabs became exactly coplanar, z-fought,
36
+ // and whichever was drawn last covered the other completely.
37
+ //
38
+ // Only translation is carried. A 2D shape under a 3D ROTATION still
39
+ // loses it -- representing that needs a full matrix per section, which
40
+ // nothing has asked for yet.
41
+ double sectionZ = 0.0;
27
42
  BodyRole role = BodyRole::Normal;
28
43
  std::optional<std::vector<std::array<float, 4>>> triColors; // per-triangle RGBA, multi-color CSG merges only
29
44
 
@@ -60,7 +75,7 @@ Value colorToValue(const std::optional<std::array<double, 4>>& color);
60
75
  std::optional<std::array<float, 4>> valueToColor(const Value& v);
61
76
 
62
77
  // Converts every top-level 2D-only result (`body` unset, `section` set --
63
- // e.g. a bare `circle();`) into a thin-extruded (1e-3 units tall) Manifold
78
+ // e.g. a bare `circle();`) into a 1-unit-tall extruded Manifold
64
79
  // tagged `flatPreview = true`, so a mesh exporter/renderer that only
65
80
  // understands 3D Manifolds (writeStl/writeObj/writeOff/writeThreeMf) can
66
81
  // still show a 2D top-level result instead of silently dropping it. 3D
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "openscad_cpp_evaluator"
7
- version = "0.55.2"
7
+ version = "0.55.3"
8
8
  description = "C++ OpenSCAD evaluator with Python bindings"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -233,6 +233,10 @@ std::vector<ColoredBody> generateTransform(Evaluator&, const CSGParams& params,
233
233
  std::vector<ColoredBody> result;
234
234
  for (ColoredBody b : flattenCsgTree(children)) {
235
235
  if (b.section) {
236
+ // The CrossSection takes x/y; z has nowhere to go in it, so it
237
+ // rides along on the body until the section is extruded. See
238
+ // ColoredBody::sectionZ.
239
+ if (name == "translate") b.sectionZ += toVec3(getArg(args, 0, "v", Value{})).z;
236
240
  b.section = applyTransform2d(name, args, std::move(*b.section));
237
241
  } else if (b.body) {
238
242
  b.body = applyTransform3d(name, args, std::move(*b.body));
@@ -21,7 +21,13 @@ std::optional<std::array<float, 4>> valueToColor(const Value& v) {
21
21
  }
22
22
 
23
23
  namespace {
24
- constexpr double kTopLevel2dHeight = 1e-3;
24
+ // The reference extrudes a 2D shape to exactly 1 unit for preview -- measured
25
+ // against OpenSCAD at three camera tilts (60/70/80 degrees), which put it at
26
+ // 0.92/1.00/0.99, the 60 being pixel-rounding on the shallowest angle. Ours
27
+ // was 1e-3, which reads as a flat silhouette with no visible edge and, more
28
+ // annoyingly, gives --viewall a different bounding box to fit, so every 2D
29
+ // docs image came out at a different scale from the published one.
30
+ constexpr double kTopLevel2dHeight = 1.0;
25
31
  } // namespace
26
32
 
27
33
  std::vector<ColoredBody> toRenderableBodies(const std::vector<ColoredBody>& bodies) {
@@ -31,6 +37,10 @@ std::vector<ColoredBody> toRenderableBodies(const std::vector<ColoredBody>& bodi
31
37
  if (!cb.body && cb.section) {
32
38
  ColoredBody flat;
33
39
  flat.body = manifold::Manifold::Extrude(cb.section->ToPolygons(), kTopLevel2dHeight);
40
+ // Put it back where a 3D translate moved it -- the CrossSection
41
+ // could not hold that. See ColoredBody::sectionZ.
42
+ if (cb.sectionZ != 0.0)
43
+ flat.body = flat.body->Translate(manifold::vec3(0, 0, cb.sectionZ));
34
44
  flat.color = cb.color;
35
45
  flat.flatPreview = true;
36
46
  flat.role = cb.role;
@@ -432,7 +432,7 @@ std::vector<ExportObject> splitBodiesForExport(const std::vector<ColoredBody>& b
432
432
  // A `flatPreview` body is a top-level 2D shape thin-extruded so it can be
433
433
  // SEEN (toRenderableBodies). The top level keeps 2D and 3D side by side
434
434
  // for exactly that reason -- but a mesh export of a mixed script must
435
- // not smuggle a 1e-3-tall slab in beside the real solids, which is what
435
+ // not smuggle a 1-unit-tall slab in beside the real solids, which is what
436
436
  // the reference drops there too. A 2D-ONLY script still exports its
437
437
  // slab, unchanged: that is the only geometry there is, and dropping it
438
438
  // would leave nothing to write.
@@ -625,7 +625,7 @@ TEST(MixedDimensions, TopLevelWarnsButKeepsBothDimensions) {
625
625
 
626
626
  TEST(MixedDimensions, ExportDropsTheFlatSlabWhenRealSolidsArePresent) {
627
627
  // The top level keeps a 2D shape so it can be SEEN, thin-extruded by
628
- // toRenderableBodies. A mesh export must not smuggle that 1e-3-tall slab
628
+ // toRenderableBodies. A mesh export must not smuggle that 1-unit-tall slab
629
629
  // in beside the real solids -- the reference drops it there too.
630
630
  Evaluated e = evalSrc("square(4); cube(1);");
631
631
  const std::vector<ColoredBody> renderable = toRenderableBodies(e.bodies);
@@ -633,7 +633,7 @@ TEST(MixedDimensions, ExportDropsTheFlatSlabWhenRealSolidsArePresent) {
633
633
 
634
634
  const std::vector<ExportObject> objects = splitBodiesForExport(renderable, nullptr);
635
635
  ASSERT_EQ(objects.size(), 1u) << "but only the cube is exported";
636
- // The cube is a unit tall; the dropped slab would have been 1e-3.
636
+ // Only the cube survives, so the height is the cube's own.
637
637
  float zmin = 1e9f, zmax = -1e9f;
638
638
  for (size_t i = 2; i < objects[0].verts.size(); i += 3) {
639
639
  zmin = std::min(zmin, objects[0].verts[i]);
@@ -651,6 +651,44 @@ TEST(MixedDimensions, ExportKeepsTheFlatSlabWhenItIsTheOnlyGeometry) {
651
651
  EXPECT_EQ(objects.size(), 1u);
652
652
  }
653
653
 
654
+ TEST(MixedDimensions, ATranslatedTwoDeeShapeKeepsItsZ) {
655
+ // A CrossSection is purely 2D, so `translate([0,0,-1]) square(10)` had
656
+ // nowhere to put the -1 and dropped it. Two 2D shapes meant to be
657
+ // layered then came out exactly coplanar, z-fought, and whichever drew
658
+ // last hid the other -- BOSL2's isosurface contour() Example 1 renders a
659
+ // green contour over a blue backdrop pushed down by 1, and the backdrop
660
+ // covered the contour completely.
661
+ Evaluated e = evalSrc("translate([0,0,-1]) square(10, center=true);");
662
+ ASSERT_EQ(e.bodies.size(), 1u);
663
+ ASSERT_TRUE(e.bodies[0].section.has_value());
664
+ EXPECT_DOUBLE_EQ(e.bodies[0].sectionZ, -1.0);
665
+
666
+ const std::vector<ColoredBody> renderable = toRenderableBodies(e.bodies);
667
+ ASSERT_EQ(renderable.size(), 1u);
668
+ ASSERT_TRUE(renderable[0].body.has_value());
669
+ const manifold::Box box = renderable[0].body->BoundingBox();
670
+ EXPECT_NEAR(box.min.z, -1.0, 1e-9) << "the extruded slab sits where it was moved to";
671
+ }
672
+
673
+ TEST(MixedDimensions, TwoDeeZOffsetsAccumulateAndDefaultToZero) {
674
+ Evaluated flat = evalSrc("square(10);");
675
+ ASSERT_EQ(flat.bodies.size(), 1u);
676
+ EXPECT_DOUBLE_EQ(flat.bodies[0].sectionZ, 0.0);
677
+
678
+ Evaluated stacked = evalSrc(
679
+ "translate([0,0,2]) translate([0,0,3]) square(10);");
680
+ ASSERT_EQ(stacked.bodies.size(), 1u);
681
+ EXPECT_DOUBLE_EQ(stacked.bodies[0].sectionZ, 5.0);
682
+
683
+ // x/y still go into the CrossSection itself, not the offset.
684
+ Evaluated moved = evalSrc("translate([4,5,6]) square(10);");
685
+ ASSERT_EQ(moved.bodies.size(), 1u);
686
+ EXPECT_DOUBLE_EQ(moved.bodies[0].sectionZ, 6.0);
687
+ const manifold::Rect r = moved.bodies[0].section->Bounds();
688
+ EXPECT_NEAR(r.min.x, 4.0, 1e-9);
689
+ EXPECT_NEAR(r.min.y, 5.0, 1e-9);
690
+ }
691
+
654
692
  TEST(MixedDimensions, UniformChildrenAreUntouched) {
655
693
  EXPECT_TRUE(dimWarnings("union() { cube(1); cube(2); }").empty());
656
694
  EXPECT_TRUE(dimWarnings("union() { square(1); square(2); }").empty());
@@ -91,7 +91,7 @@ TEST(ExportStl, NoGeometryThrows) {
91
91
  TEST(ToRenderableBodies, ThinExtrudesABareTopLevel2dShapeSoItCanExportAsStl) {
92
92
  // A bare `circle();` (no `body`, only `section`) would make writeStl
93
93
  // throw "No geometry to export" -- toRenderableBodies() converts it
94
- // into a thin (1e-3 unit tall) Manifold first, mirroring the reference
94
+ // into a 1-unit-tall Manifold first, mirroring the reference
95
95
  // CLI's own to_renderable_bodies() call right before export. Without
96
96
  // this step, no top-level 2D-only script could ever export a mesh.
97
97
  std::vector<ColoredBody> bodies = evalToBodies("circle(2, $fn=32);");
@@ -104,7 +104,9 @@ TEST(ToRenderableBodies, ThinExtrudesABareTopLevel2dShapeSoItCanExportAsStl) {
104
104
  ASSERT_TRUE(renderable[0].body.has_value());
105
105
  EXPECT_TRUE(renderable[0].flatPreview);
106
106
  manifold::Box bbox = renderable[0].body->BoundingBox();
107
- EXPECT_NEAR(bbox.max.z - bbox.min.z, 1e-3, 1e-9);
107
+ // 1 unit, matching what the reference extrudes a 2D preview to --
108
+ // measured against OpenSCAD at three camera tilts.
109
+ EXPECT_NEAR(bbox.max.z - bbox.min.z, 1.0, 1e-9);
108
110
 
109
111
  const std::string path = tempPath("flat_preview.stl").string();
110
112
  writeStl(path, renderable);