openscad-cpp-evaluator 1.1.0__tar.gz → 1.2.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 (208) hide show
  1. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/PKG-INFO +1 -1
  2. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/pyproject.toml +1 -1
  3. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/builtins/booleans.cpp +30 -16
  4. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/csg_generate.cpp +25 -2
  5. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_booleans.cpp +48 -35
  6. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/uv.lock +1 -1
  7. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/.github/workflows/ci.yml +0 -0
  8. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/.github/workflows/wheels.yml +0 -0
  9. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/.gitignore +0 -0
  10. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/.gitmodules +0 -0
  11. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/CLAUDE.md +0 -0
  12. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/CMakeLists.txt +0 -0
  13. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/LICENSE +0 -0
  14. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/README.md +0 -0
  15. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/bindings/CMakeLists.txt +0 -0
  16. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/bindings/ast_to_py.cpp +0 -0
  17. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/bindings/module.cpp +0 -0
  18. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/cmake/embed_font.cmake +0 -0
  19. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/examples/CMakeLists.txt +0 -0
  20. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/examples/eval_perf_benchmark.cpp +0 -0
  21. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/examples/manifold_cache_reuse.cpp +0 -0
  22. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/examples/minimal_debugger.cpp +0 -0
  23. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
  24. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/.gitignore +0 -0
  25. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/CLAUDE.md +0 -0
  26. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
  27. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/README.md +0 -0
  28. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
  29. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
  30. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
  31. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
  32. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
  33. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
  34. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
  35. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
  36. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
  37. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
  38. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
  39. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
  40. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
  41. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
  42. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
  43. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
  44. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/api.cpp +0 -0
  45. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
  46. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
  47. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
  48. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
  49. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
  50. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
  51. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
  52. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
  53. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/comments.cpp +0 -0
  54. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
  55. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
  56. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
  57. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
  58. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
  59. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
  60. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
  61. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/position.cpp +0 -0
  62. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
  63. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/scope.cpp +0 -0
  64. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
  65. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
  66. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
  67. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
  68. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
  69. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
  70. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
  71. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
  72. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
  73. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
  74. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
  75. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
  76. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
  77. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
  78. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
  79. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
  80. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
  81. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/test_render_expression.cpp +0 -0
  82. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
  83. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
  84. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
  85. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
  86. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
  87. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
  88. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
  89. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
  90. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
  91. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
  92. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
  93. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
  94. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
  95. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
  96. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
  97. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
  98. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
  99. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
  100. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
  101. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
  102. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
  103. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
  104. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
  105. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/evaluator.hpp +0 -0
  106. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/export.hpp +0 -0
  107. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/font_match.hpp +0 -0
  108. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
  109. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/freetype_font_provider.hpp +0 -0
  110. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
  111. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
  112. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
  113. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/mesh_check.hpp +0 -0
  114. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
  115. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
  116. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/profile.hpp +0 -0
  117. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
  118. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/segments.hpp +0 -0
  119. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
  120. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
  121. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/value.hpp +0 -0
  122. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
  123. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/python/openscad_cpp_evaluator/__init__.py +0 -0
  124. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/resources/fonts/LICENSE +0 -0
  125. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/resources/fonts/LiberationSans-Regular.ttf +0 -0
  126. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/CMakeLists.txt +0 -0
  127. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/builtins/builtins.hpp +0 -0
  128. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/builtins/call_args.cpp +0 -0
  129. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/builtins/color.cpp +0 -0
  130. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/builtins/control.cpp +0 -0
  131. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/builtins/dxf_dim.cpp +0 -0
  132. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/builtins/extrude.cpp +0 -0
  133. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/builtins/function_builtins.cpp +0 -0
  134. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/builtins/import.cpp +0 -0
  135. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/builtins/modifiers.cpp +0 -0
  136. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/builtins/primitives_2d.cpp +0 -0
  137. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/builtins/primitives_3d.cpp +0 -0
  138. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/builtins/registry.cpp +0 -0
  139. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/builtins/roof.cpp +0 -0
  140. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/builtins/segments.cpp +0 -0
  141. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/builtins/surface.cpp +0 -0
  142. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/builtins/text.cpp +0 -0
  143. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/builtins/topology.cpp +0 -0
  144. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/builtins/transforms.cpp +0 -0
  145. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/bytecode_compiler.cpp +0 -0
  146. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/bytecode_vm.cpp +0 -0
  147. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/colored_body.cpp +0 -0
  148. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/csg_resolve.cpp +0 -0
  149. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/css_colors.cpp +0 -0
  150. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/debug/debug_repl.cpp +0 -0
  151. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/debug_profile.cpp +0 -0
  152. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/eval_context.cpp +0 -0
  153. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/eval_error.cpp +0 -0
  154. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/eval_use.cpp +0 -0
  155. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/export.cpp +0 -0
  156. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/expr_eval.cpp +0 -0
  157. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/import/dxf_import.cpp +0 -0
  158. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/import/mesh_import.cpp +0 -0
  159. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/import/surface_load.cpp +0 -0
  160. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/import/svg_import.cpp +0 -0
  161. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/manifold_cache.cpp +0 -0
  162. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/measure_geometry.cpp +0 -0
  163. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/mesh_check.cpp +0 -0
  164. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/stmt_eval.cpp +0 -0
  165. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/text/font_match.cpp +0 -0
  166. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/text/freetype_font_provider.cpp +0 -0
  167. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/text/text_metrics.cpp +0 -0
  168. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/user_calls.cpp +0 -0
  169. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/value.cpp +0 -0
  170. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/src/zip_stored.cpp +0 -0
  171. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/CMakeLists.txt +0 -0
  172. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_bytecode_compiler.cpp +0 -0
  173. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_children_separate.cpp +0 -0
  174. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_cli.cpp +0 -0
  175. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_control_flow.cpp +0 -0
  176. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_csg_tree.cpp +0 -0
  177. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_debug_hooks.cpp +0 -0
  178. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_dxf_svg_import.cpp +0 -0
  179. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_eval_context.cpp +0 -0
  180. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_export.cpp +0 -0
  181. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_expr_eval.cpp +0 -0
  182. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_extrude_roof.cpp +0 -0
  183. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_feature_detection.cpp +0 -0
  184. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_function_builtins.cpp +0 -0
  185. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_helpers.hpp +0 -0
  186. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_import_export.cpp +0 -0
  187. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_manifold_cache.cpp +0 -0
  188. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_mesh_check.cpp +0 -0
  189. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_multi_color_merge.cpp +0 -0
  190. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_primitives.cpp +0 -0
  191. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_profiling.cpp +0 -0
  192. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_python_bindings.py +0 -0
  193. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_render_expr.cpp +0 -0
  194. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_scope_trail.cpp +0 -0
  195. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_scoping.cpp +0 -0
  196. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_surface.cpp +0 -0
  197. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_tail_calls.cpp +0 -0
  198. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_text.cpp +0 -0
  199. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_transforms.cpp +0 -0
  200. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_unexpected_args.cpp +0 -0
  201. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_use.cpp +0 -0
  202. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_value.cpp +0 -0
  203. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_viewport_params.cpp +0 -0
  204. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tests/test_zip_stored.cpp +0 -0
  205. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tools/cli/CMakeLists.txt +0 -0
  206. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tools/cli/cli_lib.cpp +0 -0
  207. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tools/cli/cli_lib.hpp +0 -0
  208. {openscad_cpp_evaluator-1.1.0 → openscad_cpp_evaluator-1.2.0}/tools/cli/main.cpp +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscad_cpp_evaluator
3
- Version: 1.1.0
3
+ Version: 1.2.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 = "1.1.0"
7
+ version = "1.2.0"
8
8
  description = "C++ OpenSCAD evaluator with Python bindings"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -214,7 +214,15 @@ std::vector<ColoredBody> generateCsg(Evaluator& ev, const CSGParams& params, con
214
214
  : &std::get<ListPtr>(emptyIsAGroupIt->second)->items;
215
215
 
216
216
  std::vector<ColoredBody> allBg, allHi, allSo, allDo;
217
- std::optional<ColoredBody> csgResult;
217
+ // Two accumulators, one per dimension. union() may legitimately carry
218
+ // both -- `translate(...) { part(); text("label"); }` is how a docs
219
+ // figure annotates a 3D part, and the reference draws both -- and a
220
+ // single optional that switched between body and section is exactly
221
+ // what used to be dereferenced empty when a group changed dimension
222
+ // part-way. difference and intersection still see one dimension only:
223
+ // applyDimensionRules drops the mismatch before it gets here, so for
224
+ // them just one of these is ever populated.
225
+ std::optional<ColoredBody> res3d, res2d;
218
226
  size_t idx = 0;
219
227
 
220
228
  size_t stmtIndex = 0;
@@ -273,50 +281,56 @@ std::vector<ColoredBody> generateCsg(Evaluator& ev, const CSGParams& params, con
273
281
  // discards while no positive operand has been established yet;
274
282
  // union just skips the empty contributor and keeps going.
275
283
  if (op == "intersection") {
276
- csgResult.reset();
284
+ res3d.reset();
285
+ res2d.reset();
277
286
  break;
278
287
  }
279
- if (op == "difference" && !csgResult) break;
288
+ if (op == "difference" && !res3d && !res2d) break;
280
289
  continue;
281
290
  }
282
291
 
292
+ // Each dimension accumulates on its own, so a statement holding
293
+ // both contributes to both rather than the 2D half falling off the
294
+ // end of an if/else.
283
295
  if (!bodies3d.empty()) {
284
296
  manifold::Manifold grp = *bodies3d.front().body;
285
297
  for (size_t i = 1; i < bodies3d.size(); ++i) grp = grp + *bodies3d[i].body;
286
- if (!csgResult) {
298
+ if (!res3d) {
287
299
  ColoredBody cb;
288
300
  cb.body = std::move(grp);
289
301
  cb.color = bodies3d.front().color;
290
- csgResult = std::move(cb);
302
+ res3d = std::move(cb);
291
303
  } else if (op == "union") {
292
- csgResult->body = *csgResult->body + grp;
304
+ res3d->body = *res3d->body + grp;
293
305
  } else if (op == "difference") {
294
- csgResult->body = *csgResult->body - grp;
306
+ res3d->body = *res3d->body - grp;
295
307
  } else if (op == "intersection") {
296
- csgResult->body = *csgResult->body ^ grp;
308
+ res3d->body = *res3d->body ^ grp;
297
309
  }
298
- } else {
310
+ }
311
+ if (!sections2d.empty()) {
299
312
  manifold::CrossSection grp = *sections2d.front().section;
300
313
  for (size_t i = 1; i < sections2d.size(); ++i) grp = grp + *sections2d[i].section;
301
- if (!csgResult) {
314
+ if (!res2d) {
302
315
  ColoredBody cb;
303
316
  cb.section = std::move(grp);
304
317
  cb.color = sections2d.front().color;
305
- csgResult = std::move(cb);
318
+ res2d = std::move(cb);
306
319
  } else if (op == "union") {
307
- csgResult->section = *csgResult->section + grp;
320
+ res2d->section = *res2d->section + grp;
308
321
  } else if (op == "difference") {
309
- csgResult->section = *csgResult->section - grp;
322
+ res2d->section = *res2d->section - grp;
310
323
  } else if (op == "intersection") {
311
- csgResult->section = *csgResult->section ^ grp;
324
+ res2d->section = *res2d->section ^ grp;
312
325
  }
313
326
  }
314
327
  }
315
328
 
316
- if (csgResult && csgResult->body) attachTriColors(ev, *csgResult);
329
+ if (res3d && res3d->body) attachTriColors(ev, *res3d);
317
330
 
318
331
  std::vector<ColoredBody> result;
319
- if (csgResult) result.push_back(std::move(*csgResult));
332
+ if (res3d) result.push_back(std::move(*res3d));
333
+ if (res2d) result.push_back(std::move(*res2d));
320
334
  result.insert(result.end(), allBg.begin(), allBg.end());
321
335
  result.insert(result.end(), allHi.begin(), allHi.end());
322
336
  result.insert(result.end(), allSo.begin(), allSo.end());
@@ -129,6 +129,20 @@ enum class DimRule {
129
129
  None, // no dimension diagnostics at all
130
130
  };
131
131
 
132
+ // Nodes that hand their children on as a list instead of combining them
133
+ // into one result, so a mixed 2D/3D list reaches nothing that has to pick a
134
+ // single dimension. generateTransform and generateColor map over the
135
+ // bodies; generateCsg's union keeps a 3D and a 2D accumulator side by side.
136
+ //
137
+ // difference and intersection are deliberately absent: subtracting or
138
+ // intersecting across dimensions has no meaning, and they still collapse to
139
+ // one result. hull and minkowski likewise build a single hull.
140
+ bool keepsMixedDimensions(const std::string& kind) {
141
+ return kind == "union" || kind == "color" || kind == "translate" ||
142
+ kind == "rotate" || kind == "scale" || kind == "mirror" ||
143
+ kind == "multmatrix" || kind == "resize";
144
+ }
145
+
132
146
  DimRule dimRuleFor(const std::string& kind) {
133
147
  if (kind == "linear_extrude" || kind == "rotate_extrude" || kind == "offset") return DimRule::Only2D;
134
148
  if (kind == "projection") return DimRule::Only3D;
@@ -168,7 +182,11 @@ void Evaluator::applyDimensionRules(CSGNode& node) {
168
182
  std::vector<CSGNode*> kids;
169
183
  kids.reserve(node.children.size());
170
184
  for (const std::unique_ptr<CSGNode>& c : node.children) kids.push_back(c.get());
171
- applyDimensionRulesTo(kids, static_cast<int>(rule));
185
+ // Only a Group-rule node can keep a mix. linear_extrude and friends take
186
+ // one dimension by definition, so a wrong-dimension child there is still
187
+ // dropped with its warning.
188
+ const bool keepMixed = rule == DimRule::Group && keepsMixedDimensions(node.kind);
189
+ applyDimensionRulesTo(kids, static_cast<int>(rule), keepMixed);
172
190
  }
173
191
 
174
192
  // `keepMixed` warns about a mixed group but drops nothing -- the top level's
@@ -199,7 +217,12 @@ void Evaluator::applyDimensionRulesTo(const std::vector<CSGNode*>& children, int
199
217
  continue;
200
218
  }
201
219
  const oscad::Position* pos = child->node ? &child->node->position() : nullptr;
202
- if (rule == DimRule::Group && !warnedMixing) {
220
+ // Silent when both are kept: the reference says nothing for
221
+ // `cube(1); square(4);`, `translate(...) { ... }` or `union()
222
+ // { ... }` -- checked by running it -- and a warning here would
223
+ // fail any docs example that legitimately draws a 2D annotation
224
+ // beside a 3D part.
225
+ if (rule == DimRule::Group && !keepMixed && !warnedMixing) {
203
226
  warn("Mixing 2D and 3D objects is not supported", pos);
204
227
  warnedMixing = true;
205
228
  }
@@ -618,41 +618,53 @@ std::vector<std::string> dimWarnings(const std::string& code) {
618
618
  }
619
619
  } // namespace
620
620
 
621
- TEST(MixedDimensions, ThreeDeeFirstUnionDoesNotCrash) {
622
- // The regression that started this: a body-then-section group.
623
- Evaluated e = evalSrc("union() { cube(1); square(4); }");
624
- ASSERT_EQ(e.bodies.size(), 1u);
625
- ASSERT_TRUE(e.bodies[0].body.has_value());
626
- EXPECT_NEAR(e.bodies[0].body->Volume(), 1.0, 1e-9);
621
+ // Both dimensions survive a union or a transform, in either order, because
622
+ // the reference keeps both -- `translate([9,3]) { cube(10); text("hi"); }`
623
+ // renders the cube AND the flat text there, which is how BOSL2's joiners
624
+ // figure annotates a part. Checked by running the reference, not assumed.
625
+ TEST(MixedDimensions, UnionKeepsBothDimensions) {
626
+ for (const char* src : {"union() { cube(1); square(4); }",
627
+ "union() { square(4); cube(1); }"}) {
628
+ Evaluated e = evalSrc(src);
629
+ ASSERT_EQ(e.bodies.size(), 2u) << src;
630
+ const ColoredBody* solid = nullptr;
631
+ const ColoredBody* flat = nullptr;
632
+ for (const ColoredBody& b : e.bodies) {
633
+ if (b.body) solid = &b;
634
+ if (b.section) flat = &b;
635
+ }
636
+ ASSERT_TRUE(solid) << src;
637
+ ASSERT_TRUE(flat) << src;
638
+ EXPECT_NEAR(solid->body->Volume(), 1.0, 1e-9) << src;
639
+ EXPECT_NEAR(flat->section->Area(), 16.0, 1e-9) << src;
640
+ }
627
641
  }
628
642
 
629
- TEST(MixedDimensions, TwoDeeFirstKeepsTheTwoDeeChild) {
630
- Evaluated e = evalSrc("union() { square(4); cube(1); }");
631
- ASSERT_EQ(e.bodies.size(), 1u);
632
- ASSERT_TRUE(e.bodies[0].section.has_value());
633
- EXPECT_NEAR(e.bodies[0].section->Area(), 16.0, 1e-9);
643
+ TEST(MixedDimensions, TransformKeepsBothDimensions) {
644
+ // The transform maps over its bodies rather than combining them, so the
645
+ // mix reaches nothing that has to choose.
646
+ Evaluated e = evalSrc("translate([0,0,0]) { square(4); cube(1); }");
647
+ ASSERT_EQ(e.bodies.size(), 2u);
634
648
  }
635
649
 
636
- TEST(MixedDimensions, GroupWarnsTwice) {
637
- EXPECT_EQ(dimWarnings("union() { square(4); cube(1); }"),
638
- (std::vector<std::string>{"WARNING: Ignoring 3D child object for 2D operation",
639
- "WARNING: Mixing 2D and 3D objects is not supported"}));
640
- EXPECT_EQ(dimWarnings("union() { cube(1); square(4); }"),
641
- (std::vector<std::string>{"WARNING: Ignoring 2D child object for 3D operation",
642
- "WARNING: Mixing 2D and 3D objects is not supported"}));
650
+ TEST(MixedDimensions, KeepingBothIsSilent) {
651
+ // The reference warns for none of these -- verified by running it.
652
+ EXPECT_TRUE(dimWarnings("union() { square(4); cube(1); }").empty());
653
+ EXPECT_TRUE(dimWarnings("union() { cube(1); square(4); }").empty());
654
+ EXPECT_TRUE(dimWarnings("translate([0,0,0]) { square(4); cube(1); }").empty());
655
+ EXPECT_TRUE(dimWarnings("scale(2) { square(4); cube(1); }").empty());
656
+ EXPECT_TRUE(dimWarnings("color(\"red\") { square(4); cube(1); }").empty());
657
+ EXPECT_TRUE(dimWarnings("for (i = [0:0]) { square(4); cube(1); }").empty());
658
+ EXPECT_TRUE(dimWarnings("if (true) { square(4); cube(1); }").empty());
643
659
  }
644
660
 
645
- TEST(MixedDimensions, TransformsAndControlFlowAreGroupsToo) {
661
+ TEST(MixedDimensions, CombiningOperationsStillPickOne) {
662
+ // These collapse to a single result, so a mix has no meaning and the
663
+ // odd child is still dropped, with both warnings.
646
664
  const std::vector<std::string> expected{"WARNING: Ignoring 3D child object for 2D operation",
647
665
  "WARNING: Mixing 2D and 3D objects is not supported"};
648
- EXPECT_EQ(dimWarnings("translate([0,0,0]) { square(4); cube(1); }"), expected);
649
- EXPECT_EQ(dimWarnings("scale(2) { square(4); cube(1); }"), expected);
650
- EXPECT_EQ(dimWarnings("color(\"red\") { square(4); cube(1); }"), expected);
651
- // for/if are transparent -- their children land at the top level, so
652
- // they get the top level's keep-both treatment rather than a group's.
653
- const std::vector<std::string> topLevel{"WARNING: Mixing 2D and 3D objects is not supported"};
654
- EXPECT_EQ(dimWarnings("for (i = [0:0]) { square(4); cube(1); }"), topLevel);
655
- EXPECT_EQ(dimWarnings("if (true) { square(4); cube(1); }"), topLevel);
666
+ EXPECT_EQ(dimWarnings("difference() { square(4); cube(1); }"), expected);
667
+ EXPECT_EQ(dimWarnings("intersection() { square(4); cube(1); }"), expected);
656
668
  EXPECT_EQ(dimWarnings("hull() { square(4); cube(1); }"), expected);
657
669
  }
658
670
 
@@ -678,15 +690,16 @@ TEST(MixedDimensions, RoofWarnsForNeither) {
678
690
  EXPECT_TRUE(dimWarnings("roof() { square(4); cube(1); }").empty());
679
691
  }
680
692
 
681
- TEST(MixedDimensions, TopLevelWarnsButKeepsBothDimensions) {
682
- // The top level warns like any other group, but drops NOTHING. A real
683
- // group has to pick one dimension because generateCsg builds a single
684
- // result from it; the top level just hands back a list, and the
685
- // reference's own preview draws 2D and 3D side by side. Dropping here
693
+ TEST(MixedDimensions, TopLevelKeepsBothDimensionsSilently) {
694
+ // The top level drops NOTHING, and says nothing either: the reference
695
+ // is silent for `square(4); cube(1);` -- verified by running it -- and
696
+ // it draws 2D and 3D side by side in its own preview. Dropping here
686
697
  // silently lost the whole of a BOSL2 debug overlay (debug_bezier() of a
687
- // 2D bezier is entirely 2D) whenever a 3D shape shared the script.
688
- EXPECT_EQ(dimWarnings("square(4); cube(1);"),
689
- (std::vector<std::string>{"WARNING: Mixing 2D and 3D objects is not supported"}));
698
+ // 2D bezier is entirely 2D) whenever a 3D shape shared the script; the
699
+ // warning went when union and the transforms learned to keep both, so
700
+ // that a docs figure annotating a 3D part with 2D text is not reported
701
+ // as a mistake.
702
+ EXPECT_TRUE(dimWarnings("square(4); cube(1);").empty());
690
703
  Evaluated e = evalSrc("square(4); cube(1);");
691
704
  ASSERT_EQ(e.bodies.size(), 2u);
692
705
  EXPECT_TRUE(e.bodies[0].section.has_value()) << "the 2D shape survived";
@@ -55,7 +55,7 @@ wheels = [
55
55
 
56
56
  [[package]]
57
57
  name = "openscad-cpp-evaluator"
58
- version = "1.1.0"
58
+ version = "1.2.0"
59
59
  source = { editable = "." }
60
60
  dependencies = [
61
61
  { name = "numpy" },