openscad-cpp-evaluator 1.45.3__tar.gz → 1.46.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.
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/CLAUDE.md +5 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/PKG-INFO +1 -1
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/pyproject.toml +1 -1
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/function_builtins.cpp +3 -4
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/topology.cpp +49 -10
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_booleans.cpp +77 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_feature_detection.cpp +3 -3
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/uv.lock +1 -1
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/.github/workflows/ci.yml +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/.github/workflows/wheels.yml +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/.gitignore +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/.gitmodules +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/LICENSE +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/README.md +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/bindings/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/bindings/ast_to_py.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/bindings/module.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/cmake/embed_font.cmake +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/cmake/patch_manifold.cmake +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/examples/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/examples/eval_perf_benchmark.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/examples/manifold_cache_reuse.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/examples/minimal_debugger.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/.gitignore +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/CLAUDE.md +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/LICENSE +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/README.md +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope_table.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/.DS_Store +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/api.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/comments.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/position.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/scope.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_concurrent_parse.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_profile_time.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_render_expression.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_strict_commas.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/coverage.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/evaluator.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/export.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/font_match.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/format_closure.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/freetype_font_provider.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/mesh_check.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/profile.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/segments.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/utf8.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/value.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/python/openscad_cpp_evaluator/__init__.py +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/resources/fonts/LICENSE +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/resources/fonts/LiberationSans-Bold.ttf +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/resources/fonts/LiberationSans-BoldItalic.ttf +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/resources/fonts/LiberationSans-Italic.ttf +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/resources/fonts/LiberationSans-Regular.ttf +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/booleans.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/builtins.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/call_args.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/color.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/control.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/dxf_dim.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/extrude.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/import.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/modifiers.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/primitives_2d.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/primitives_3d.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/profile_time.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/registry.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/roof.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/segments.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/surface.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/text.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/transforms.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/bytecode_compiler.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/bytecode_vm.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/colored_body.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/coverage.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/csg_generate.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/csg_resolve.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/css_colors.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/debug/debug_repl.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/debug_profile.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/eval_context.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/eval_error.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/eval_use.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/export.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/expr_eval.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/format_closure.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/import/dxf_import.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/import/mesh_import.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/import/scene_import.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/import/surface_load.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/import/svg_import.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/manifold_cache.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/measure_geometry.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/mesh_check.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/stmt_eval.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/text/font_match.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/text/freetype_font_provider.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/text/text_metrics.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/user_calls.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/utf8.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/value.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/xkcd_colors.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/xkcd_colors.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/zip_stored.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_bytecode_compiler.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_children_separate.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_cli.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_control_flow.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_coverage.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_csg_tree.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_debug_hooks.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_discretizer.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_dxf_svg_import.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_eval_context.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_export.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_expr_eval.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_extrude_roof.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_function_builtins.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_helpers.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_import_export.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_include_cache.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_manifold_cache.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_mesh_check.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_multi_color_merge.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_openscad_parity.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_primitives.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_profile_time.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_profiling.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_python_bindings.py +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_render_expr.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_scope_trail.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_scoping.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_surface.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_tail_calls.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_text.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_transforms.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_undef_args.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_unexpected_args.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_use.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_value.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_viewport_params.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_zip_stored.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tools/cli/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tools/cli/cli_lib.cpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tools/cli/cli_lib.hpp +0 -0
- {openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tools/cli/main.cpp +0 -0
|
@@ -601,6 +601,11 @@ grep for `ponytail:`.
|
|
|
601
601
|
One `LevelSet` pass either way; a bounded range *could* be
|
|
602
602
|
`difference(levelset(hi), levelset(lo))` but that meshes twice and then booleans.
|
|
603
603
|
3D wraps `Manifold::LevelSet` with a C++ sampling lambda; no new Manifold API.
|
|
604
|
+
**`edge` may be a vector**, one spacing per axis (`[ex,ey,ez]`, or `[ex,ey]` in 2D), as BOSL2's
|
|
605
|
+
`isosurface()` takes `voxel_size`. `LevelSet` takes one edge length, so the 3D path meshes the
|
|
606
|
+
field squashed to unit spacing and `Scale`s the result back -- exact, since with tolerance -1 a
|
|
607
|
+
vertex is a linear interpolation along a lattice edge, which commutes with an axis scale. A plain
|
|
608
|
+
number takes the old path unchanged. `supported_feature("levelset")` is **2** from this change.
|
|
604
609
|
**The field is a grid OR a `function(x,y,z)`, and the two trade off against each other** —
|
|
605
610
|
neither is simply better:
|
|
606
611
|
|
{openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/src/builtins/function_builtins.cpp
RENAMED
|
@@ -976,9 +976,8 @@ namespace {
|
|
|
976
976
|
// is supposed to be safe).
|
|
977
977
|
//
|
|
978
978
|
// A LEVEL rather than a boolean so a feature whose semantics change later
|
|
979
|
-
// can be told apart from its earlier self.
|
|
980
|
-
//
|
|
981
|
-
// observe what a build without supported_feature() did anyway.
|
|
979
|
+
// can be told apart from its earlier self. A script cannot observe what a
|
|
980
|
+
// build without supported_feature() did, so every feature starts at 1.
|
|
982
981
|
//
|
|
983
982
|
// This is the answer to a real hazard: OpenSCAD does not reject arguments or
|
|
984
983
|
// names it doesn't know -- children(separate=true) is silently ignored there
|
|
@@ -988,7 +987,7 @@ const std::unordered_map<std::string, double>& featureLevels() {
|
|
|
988
987
|
static const std::unordered_map<std::string, double> levels = {
|
|
989
988
|
{"render-expr", 1.0}, // render() in expression position
|
|
990
989
|
{"linear-solve", 1.0}, // linear_solve(A, b) -> {x, det, singular}
|
|
991
|
-
{"levelset",
|
|
990
|
+
{"levelset", 2.0}, // levelset(field, bounds, isovalue); 2: edge may be a vector
|
|
992
991
|
{"polyhedron-vnf", 1.0}, // polyhedron(vnf) / polyhedron(object)
|
|
993
992
|
{"separate-children", 1.0}, // children(..., separate=true)
|
|
994
993
|
{"minkowski-diff", 1.0}, // minkowski_difference()
|
|
@@ -991,11 +991,31 @@ std::vector<ColoredBody> generateLevelSet(Evaluator& ev, const CSGParams& params
|
|
|
991
991
|
const std::array<double, 3> origin = *lo;
|
|
992
992
|
std::array<double, 3> spacing{1.0, 1.0, 1.0};
|
|
993
993
|
double edge = 0.0;
|
|
994
|
+
// edge may also be one spacing per axis, as BOSL2's isosurface() takes
|
|
995
|
+
// voxel_size -- a thin plate wants fine sampling across it and coarse
|
|
996
|
+
// along it (#729 on BelfrySCAD). edgeV is then the vector and `edge`
|
|
997
|
+
// its smallest component; for a plain number edgeV is unused.
|
|
998
|
+
std::array<double, 3> edgeV{0.0, 0.0, 0.0};
|
|
999
|
+
bool edgeVec = false;
|
|
994
1000
|
// Grid spacing is filled in below, once the array has been read at the
|
|
995
1001
|
// right dimensionality. Finer than the grid buys nothing.
|
|
996
|
-
|
|
1002
|
+
const Value& edgeArg = params.at("edge");
|
|
1003
|
+
if (const double* e = std::get_if<double>(&edgeArg)) {
|
|
997
1004
|
if (*e > 0.0) edge = *e;
|
|
998
1005
|
else ev.warn("levelset(): edge must be positive", &node.position());
|
|
1006
|
+
} else if (!std::holds_alternative<std::monostate>(edgeArg)) {
|
|
1007
|
+
const std::optional<std::vector<double>> ev3 = numbersOrInf(edgeArg);
|
|
1008
|
+
bool ok = ev3 && ev3->size() == bLo->size();
|
|
1009
|
+
for (size_t a = 0; ok && a < ev3->size(); ++a) ok = std::isfinite((*ev3)[a]) && (*ev3)[a] > 0.0;
|
|
1010
|
+
if (ok) {
|
|
1011
|
+
edgeVec = true;
|
|
1012
|
+
for (size_t a = 0; a < ev3->size(); ++a) edgeV[a] = (*ev3)[a];
|
|
1013
|
+
edge = *std::min_element(ev3->begin(), ev3->end());
|
|
1014
|
+
} else {
|
|
1015
|
+
ev.warn(is2d ? "levelset(): edge must be a positive number or [ex, ey]"
|
|
1016
|
+
: "levelset(): edge must be a positive number or [ex, ey, ez]",
|
|
1017
|
+
&node.position());
|
|
1018
|
+
}
|
|
999
1019
|
}
|
|
1000
1020
|
if (edge <= 0.0 && fieldFn) {
|
|
1001
1021
|
// No grid to infer it from. Guessing would silently pick either a
|
|
@@ -1060,8 +1080,9 @@ std::vector<ColoredBody> generateLevelSet(Evaluator& ev, const CSGParams& params
|
|
|
1060
1080
|
return out;
|
|
1061
1081
|
}
|
|
1062
1082
|
// function(x,y): edge= gives the spacing, as in 3D
|
|
1063
|
-
|
|
1064
|
-
|
|
1083
|
+
const double ex = edgeVec ? edgeV[0] : edge, ey = edgeVec ? edgeV[1] : edge;
|
|
1084
|
+
nx = static_cast<size_t>(std::floor(((*bHi)[0] - (*bLo)[0]) / ex)) + 1;
|
|
1085
|
+
ny = static_cast<size_t>(std::floor(((*bHi)[1] - (*bLo)[1]) / ey)) + 1;
|
|
1065
1086
|
if (nx < 2 || ny < 2) {
|
|
1066
1087
|
ev.warn("levelset(): edge is larger than the bounds", &node.position());
|
|
1067
1088
|
return {};
|
|
@@ -1114,7 +1135,9 @@ std::vector<ColoredBody> generateLevelSet(Evaluator& ev, const CSGParams& params
|
|
|
1114
1135
|
spacing = {((*bHi)[0] - (*bLo)[0]) / static_cast<double>(field->nx - 1),
|
|
1115
1136
|
((*bHi)[1] - (*bLo)[1]) / static_cast<double>(field->ny - 1),
|
|
1116
1137
|
((*bHi)[2] - (*bLo)[2]) / static_cast<double>(field->nz - 1)};
|
|
1117
|
-
|
|
1138
|
+
// Also when edge= was given but unusable (warned above): edge 0
|
|
1139
|
+
// would ask Manifold for an infinitely fine lattice.
|
|
1140
|
+
if (edge <= 0.0) edge = std::min({spacing[0], spacing[1], spacing[2]});
|
|
1118
1141
|
}
|
|
1119
1142
|
|
|
1120
1143
|
if (fieldFn && fnParams2.size() < 3) {
|
|
@@ -1187,9 +1210,10 @@ std::vector<ColoredBody> generateLevelSet(Evaluator& ev, const CSGParams& params
|
|
|
1187
1210
|
//
|
|
1188
1211
|
// Exactly the fix already applied to the 2D path (clipToBounds); it was
|
|
1189
1212
|
// not applied here at the time because the 2D error was the one measured.
|
|
1190
|
-
const
|
|
1191
|
-
|
|
1192
|
-
|
|
1213
|
+
const manifold::vec3 E = edgeVec ? manifold::vec3(edgeV[0], edgeV[1], edgeV[2]) : manifold::vec3(edge);
|
|
1214
|
+
const manifold::vec3 pad = 2.0 * E;
|
|
1215
|
+
manifold::Box bounds(manifold::vec3(origin[0], origin[1], origin[2]) - pad,
|
|
1216
|
+
manifold::vec3((*hi)[0], (*hi)[1], (*hi)[2]) + pad);
|
|
1193
1217
|
// tolerance -1: a positive value makes Manifold do EXTRA evaluations per
|
|
1194
1218
|
// output vertex to snap nearer the true surface. Against a fixed grid
|
|
1195
1219
|
// those only re-interpolate data already used -- cost, no information.
|
|
@@ -1199,9 +1223,24 @@ std::vector<ColoredBody> generateLevelSet(Evaluator& ev, const CSGParams& params
|
|
|
1199
1223
|
// C++, and NOT safe for a function, which re-enters the evaluator.
|
|
1200
1224
|
// Manifold: parallel policies "will crash language runtimes with runtime
|
|
1201
1225
|
// locks that expect to not be called back by unregistered threads".
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1226
|
+
//
|
|
1227
|
+
// LevelSet takes a single edge length, so a per-axis edge meshes a field
|
|
1228
|
+
// squashed to unit spacing on every axis and stretches the result back.
|
|
1229
|
+
// Exact, not an approximation: with tolerance -1 a vertex is a linear
|
|
1230
|
+
// interpolation along a lattice edge, and a linear interpolation commutes
|
|
1231
|
+
// with an axis scale.
|
|
1232
|
+
manifold::Manifold solid;
|
|
1233
|
+
if (!edgeVec) {
|
|
1234
|
+
solid = fieldFn ? manifold::Manifold::LevelSet(sampleFn, bounds, edge, 0.0, -1.0, /*canParallel=*/false)
|
|
1235
|
+
: manifold::Manifold::LevelSet(sampleGrid, bounds, edge, 0.0, -1.0, /*canParallel=*/true);
|
|
1236
|
+
} else {
|
|
1237
|
+
const manifold::Box unit(bounds.min / E, bounds.max / E);
|
|
1238
|
+
solid = fieldFn ? manifold::Manifold::LevelSet([&](manifold::vec3 q) { return sampleFn(q * E); },
|
|
1239
|
+
unit, 1.0, 0.0, -1.0, /*canParallel=*/false)
|
|
1240
|
+
: manifold::Manifold::LevelSet([&](manifold::vec3 q) { return sampleGrid(q * E); },
|
|
1241
|
+
unit, 1.0, 0.0, -1.0, /*canParallel=*/true);
|
|
1242
|
+
solid = solid.Scale(E);
|
|
1243
|
+
}
|
|
1205
1244
|
|
|
1206
1245
|
if (solid.IsEmpty()) return {};
|
|
1207
1246
|
solid = solid ^ manifold::Manifold::Cube(
|
|
@@ -1248,6 +1248,83 @@ TEST(LevelSetFn, AFunctionFieldRequiresEdge) {
|
|
|
1248
1248
|
EXPECT_NE(w[0].find("edge="), std::string::npos) << w[0];
|
|
1249
1249
|
}
|
|
1250
1250
|
|
|
1251
|
+
// edge= as one spacing per axis (#729 on BelfrySCAD), as BOSL2's
|
|
1252
|
+
// isosurface() takes voxel_size. LevelSet itself takes one edge length, so
|
|
1253
|
+
// the field is squashed to unit spacing and the mesh stretched back.
|
|
1254
|
+
|
|
1255
|
+
TEST(LevelSetFn, AnEqualVectorEdgeMatchesTheNumber) {
|
|
1256
|
+
const std::string f = "levelset(function(x,y,z) sqrt(x*x+y*y+z*z), "
|
|
1257
|
+
"bounds=[[-30,-30,-30],[30,30,30]], isovalue=20, edge=";
|
|
1258
|
+
Evaluated num = evalSrc(f + "1.5);");
|
|
1259
|
+
Evaluated vec = evalSrc(f + "[1.5,1.5,1.5]);");
|
|
1260
|
+
ASSERT_EQ(num.bodies.size(), 1u);
|
|
1261
|
+
ASSERT_EQ(vec.bodies.size(), 1u);
|
|
1262
|
+
EXPECT_EQ(soleBody(vec).NumTri(), soleBody(num).NumTri());
|
|
1263
|
+
EXPECT_NEAR(soleBody(vec).Volume(), soleBody(num).Volume(), 1e-9 * soleBody(num).Volume());
|
|
1264
|
+
}
|
|
1265
|
+
|
|
1266
|
+
TEST(LevelSetFn, AVectorEdgeIsExactlyAStretchedLattice) {
|
|
1267
|
+
// A sphere stretched 4x in z, sampled 4x coarser in z, is the sphere's
|
|
1268
|
+
// own mesh stretched: a vertex is a linear interpolation along a lattice
|
|
1269
|
+
// edge, and that commutes with an axis scale. So the volume is exactly
|
|
1270
|
+
// 4x, not merely close -- anything else means the lattice is not the
|
|
1271
|
+
// one asked for.
|
|
1272
|
+
Evaluated sphere = evalSrc(
|
|
1273
|
+
"levelset(function(x,y,z) sqrt(x*x+y*y+z*z), "
|
|
1274
|
+
"bounds=[[-30,-30,-30],[30,30,30]], isovalue=20, edge=1.5);");
|
|
1275
|
+
Evaluated tall = evalSrc(
|
|
1276
|
+
"levelset(function(x,y,z) sqrt(x*x+y*y+z*z/16), "
|
|
1277
|
+
"bounds=[[-30,-30,-120],[30,30,120]], isovalue=20, edge=[1.5,1.5,6]);");
|
|
1278
|
+
ASSERT_EQ(sphere.bodies.size(), 1u);
|
|
1279
|
+
ASSERT_EQ(tall.bodies.size(), 1u);
|
|
1280
|
+
EXPECT_EQ(soleBody(tall).NumTri(), soleBody(sphere).NumTri());
|
|
1281
|
+
EXPECT_NEAR(soleBody(tall).Volume(), 4.0 * soleBody(sphere).Volume(), 1e-6 * soleBody(tall).Volume());
|
|
1282
|
+
EXPECT_EQ(soleBody(tall).Genus(), 0);
|
|
1283
|
+
}
|
|
1284
|
+
|
|
1285
|
+
TEST(LevelSetFn, AVectorEdgeAlsoAppliesToAGrid) {
|
|
1286
|
+
Evaluated fine = evalSrc(sphereFieldSrc(50, 30) +
|
|
1287
|
+
"levelset(f, bounds=[[-30,-30,-30],[30,30,30]], isovalue=20);");
|
|
1288
|
+
Evaluated coarseZ = evalSrc(sphereFieldSrc(50, 30) +
|
|
1289
|
+
"levelset(f, bounds=[[-30,-30,-30],[30,30,30]], isovalue=20, edge=[1.2,1.2,4]);");
|
|
1290
|
+
ASSERT_EQ(coarseZ.bodies.size(), 1u);
|
|
1291
|
+
EXPECT_LT(soleBody(coarseZ).NumTri(), soleBody(fine).NumTri() * 3 / 4); // measured 56%
|
|
1292
|
+
EXPECT_NEAR(soleBody(coarseZ).Volume(), soleBody(fine).Volume(), 0.03 * soleBody(fine).Volume());
|
|
1293
|
+
}
|
|
1294
|
+
|
|
1295
|
+
TEST(LevelSetFn, AVectorEdgeIn2DSetsEachAxis) {
|
|
1296
|
+
// A circle sampled finely in x and coarsely in y has fewer contour
|
|
1297
|
+
// points than one sampled finely in both, and still the circle's area.
|
|
1298
|
+
const std::string f = "levelset(function(x,y) sqrt(x*x+y*y), "
|
|
1299
|
+
"bounds=[[-30,-30],[30,30]], isovalue=20, edge=";
|
|
1300
|
+
Evaluated fine = evalSrc(f + "0.5);");
|
|
1301
|
+
Evaluated mixed = evalSrc(f + "[0.5,3]);");
|
|
1302
|
+
ASSERT_EQ(mixed.bodies.size(), 1u);
|
|
1303
|
+
ASSERT_TRUE(mixed.bodies[0].section);
|
|
1304
|
+
EXPECT_LT(mixed.bodies[0].section->NumVert(), fine.bodies[0].section->NumVert());
|
|
1305
|
+
const double circle = 3.14159265358979 * 400;
|
|
1306
|
+
EXPECT_NEAR(mixed.bodies[0].section->Area(), circle, 0.02 * circle);
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
TEST(LevelSetFn, AVectorEdgeOfTheWrongSizeWarns) {
|
|
1310
|
+
for (const char* bad : {"[1,1]", "[1,1,0]", "[1,1,-2]", "[1,\"a\",1]"}) {
|
|
1311
|
+
const std::vector<std::string> w = levelsetWarnings(
|
|
1312
|
+
std::string("levelset(function(x,y,z) sqrt(x*x+y*y+z*z), "
|
|
1313
|
+
"bounds=[[-3,-3,-3],[3,3,3]], isovalue=2, edge=") + bad + ");");
|
|
1314
|
+
ASSERT_GE(w.size(), 1u) << bad;
|
|
1315
|
+
EXPECT_NE(w[0].find("[ex, ey, ez]"), std::string::npos) << bad << ": " << w[0];
|
|
1316
|
+
}
|
|
1317
|
+
}
|
|
1318
|
+
|
|
1319
|
+
TEST(LevelSetFn, SupportedFeatureSaysAVectorEdgeWorks) {
|
|
1320
|
+
// Level 2 is how a library such as BOSL2 tells a build with per-axis
|
|
1321
|
+
// edge= from one that would reject it.
|
|
1322
|
+
std::vector<std::string> out;
|
|
1323
|
+
evalSrc("echo(supported_feature(\"levelset\"));", [&](const std::string& m) { out.push_back(m); });
|
|
1324
|
+
ASSERT_EQ(out.size(), 1u);
|
|
1325
|
+
EXPECT_NE(out[0].find("2"), std::string::npos) << out[0];
|
|
1326
|
+
}
|
|
1327
|
+
|
|
1251
1328
|
TEST(LevelSetFn, AFunctionOfTheWrongArityWarns) {
|
|
1252
1329
|
// One parameter is wrong for either dimension, so the message names both.
|
|
1253
1330
|
const std::vector<std::string> one = levelsetWarnings(
|
{openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/tests/test_feature_detection.cpp
RENAMED
|
@@ -68,10 +68,10 @@ TEST(FeatureDetection, EveryDocumentedFeatureReportsALevel) {
|
|
|
68
68
|
ScopedVm guard(vm);
|
|
69
69
|
for (const char* f : kFeatures) {
|
|
70
70
|
const std::vector<std::string> e =
|
|
71
|
-
echoesFrom(std::string("echo(supported_feature(\"") + f + "\"));");
|
|
71
|
+
echoesFrom(std::string("echo(supported_feature(\"") + f + "\") >= 1);");
|
|
72
72
|
ASSERT_EQ(e.size(), 1u) << f << ", vm=" << vm;
|
|
73
|
-
EXPECT_NE(e[0].find("
|
|
74
|
-
|
|
73
|
+
EXPECT_NE(e[0].find("true"), std::string::npos) << f << " reported unsupported, vm=" << vm
|
|
74
|
+
<< ", got " << e[0];
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
}
|
|
File without changes
|
{openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/.github/workflows/wheels.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/examples/eval_perf_benchmark.cpp
RENAMED
|
File without changes
|
{openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/examples/manifold_cache_reuse.cpp
RENAMED
|
File without changes
|
{openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/examples/minimal_debugger.cpp
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-1.45.3 → openscad_cpp_evaluator-1.46.0}/external/openscad_cpp_parser/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|