openscad-cpp-evaluator 0.45.1__tar.gz → 0.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-0.45.1 → openscad_cpp_evaluator-0.46.0}/CLAUDE.md +11 -2
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/PKG-INFO +1 -1
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/bindings/module.cpp +4 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/export.hpp +7 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/pyproject.toml +1 -1
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/python/openscad_cpp_evaluator/__init__.py +8 -2
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/export.cpp +89 -2
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_export.cpp +85 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/.github/workflows/ci.yml +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/.github/workflows/wheels.yml +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/.gitignore +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/.gitmodules +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/LICENSE +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/README.md +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/bindings/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/bindings/ast_to_py.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/cmake/embed_font.cmake +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/examples/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/examples/eval_perf_benchmark.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/examples/manifold_cache_reuse.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/examples/minimal_debugger.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/.gitignore +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/CLAUDE.md +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/README.md +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/api.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/comments.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/position.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/scope.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/test_render_expression.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/evaluator.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/font_match.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/freetype_font_provider.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/mesh_check.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/profile.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/segments.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/value.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/resources/fonts/LICENSE +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/resources/fonts/LiberationSans-Regular.ttf +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/booleans.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/builtins.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/call_args.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/color.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/control.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/dxf_dim.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/extrude.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/function_builtins.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/import.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/modifiers.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/primitives_2d.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/primitives_3d.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/registry.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/roof.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/segments.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/surface.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/text.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/topology.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/transforms.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/bytecode_compiler.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/bytecode_vm.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/colored_body.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/csg_generate.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/csg_resolve.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/css_colors.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/debug/debug_repl.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/debug_profile.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/eval_context.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/eval_error.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/eval_use.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/expr_eval.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/import/dxf_import.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/import/mesh_import.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/import/surface_load.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/import/svg_import.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/manifold_cache.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/measure_geometry.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/mesh_check.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/stmt_eval.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/text/font_match.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/text/freetype_font_provider.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/text/text_metrics.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/user_calls.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/value.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/zip_stored.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_booleans.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_bytecode_compiler.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_children_separate.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_cli.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_control_flow.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_csg_tree.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_debug_hooks.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_dxf_svg_import.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_eval_context.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_expr_eval.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_extrude_roof.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_feature_detection.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_function_builtins.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_helpers.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_import_export.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_manifold_cache.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_mesh_check.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_multi_color_merge.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_primitives.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_profiling.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_python_bindings.py +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_render_expr.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_scope_trail.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_scoping.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_surface.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_tail_calls.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_text.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_transforms.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_unexpected_args.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_use.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_value.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_viewport_params.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_zip_stored.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tools/cli/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tools/cli/cli_lib.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tools/cli/cli_lib.hpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tools/cli/main.cpp +0 -0
- {openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/uv.lock +0 -0
|
@@ -711,8 +711,17 @@ grep for `ponytail:`.
|
|
|
711
711
|
— skip it and the mesh comes out non-manifold at the seam). Self-contained 2D geometry math here
|
|
712
712
|
(`dot2`/`len2`/`norm2`, the parabola-canonical-frame rotation in `discretizeArc`) exists nowhere
|
|
713
713
|
else in this codebase.
|
|
714
|
-
- `include/openscad_cpp_evaluator/export.hpp`, `src/export.cpp` —
|
|
715
|
-
|
|
714
|
+
- `include/openscad_cpp_evaluator/export.hpp`, `src/export.cpp` — the writers for all eight
|
|
715
|
+
formats `exportExtensions()` lists: 3MF, AMF, STL, OBJ, OFF, PLY, VRML, X3D (3MF via
|
|
716
|
+
`zip_stored.hpp`'s `writeDeflateZip`). **`exportExtensions()` is the one source of truth for
|
|
717
|
+
which formats exist** — the Python facade and BelfrySCAD's dialog/CLI all ask it rather than
|
|
718
|
+
restating the list, because three hand-written copies had already drifted far enough that `.off`
|
|
719
|
+
could be written by neither the GUI nor the CLI while every test passed.
|
|
720
|
+
Colour is carried by 3MF, AMF, OBJ (companion `.mtl`), PLY, VRML and X3D; STL and OFF compose
|
|
721
|
+
every body into one solid and store geometry only. **AMF** puts colour on the `<volume>` rather
|
|
722
|
+
than the face, so an object whose triangles are not all one colour is written as one volume per
|
|
723
|
+
colour — per-triangle `<color>` is legal in the spec but poorly supported by the slicers that are
|
|
724
|
+
the audience for it.
|
|
716
725
|
`colored_body.hpp`/`.cpp`'s `toRenderableBodies()` (thin-extrudes any top-level 2D-only result to
|
|
717
726
|
a 1e-3-unit-tall `flatPreview` Manifold) must run on a body list before handing it to any of these
|
|
718
727
|
writers — none of them look at `ColoredBody::section` at all, only `.body`. `tools/cli/cli_lib.cpp`
|
|
@@ -786,6 +786,10 @@ NB_MODULE(_openscad_cpp_evaluator, m) {
|
|
|
786
786
|
"logging them. Raises RuntimeError when there is no geometry, the format is unknown, or the "
|
|
787
787
|
"file cannot be opened.");
|
|
788
788
|
|
|
789
|
+
m.def("export_extensions", []() { return oscadeval::exportExtensions(); },
|
|
790
|
+
"The file extensions export_model understands, dot-prefixed. Read from the C++ writer table "
|
|
791
|
+
"rather than restated here, so the Python side cannot drift from what can actually be written.");
|
|
792
|
+
|
|
789
793
|
m.def("evaluate", &evaluate, nb::arg("path"), nb::arg("viewport_params"), nb::arg("manifold_cache") = nullptr,
|
|
790
794
|
nb::arg("profile") = false,
|
|
791
795
|
"Evaluate a .scad file; return (bodies, echoes, id_to_node, csg_tree, profile_result, dyn, dyn_explicit).");
|
|
@@ -97,6 +97,13 @@ void writeVrml(const std::string& path, const std::vector<ExportObject>& objects
|
|
|
97
97
|
// Color) and Shape level 1 (Appearance, Material), exactly the nodes used.
|
|
98
98
|
void writeX3d(const std::string& path, const std::vector<ExportObject>& objects);
|
|
99
99
|
|
|
100
|
+
// AMF 1.1. XML like X3D, but its colour lives on the <volume>, not the
|
|
101
|
+
// face: a mesh holds one vertex list and one <volume> per material. An
|
|
102
|
+
// object whose triangles are not all one colour therefore becomes several
|
|
103
|
+
// volumes -- which is what a multimaterial slicer reads as separate
|
|
104
|
+
// materials to assign to tools.
|
|
105
|
+
void writeAmf(const std::string& path, const std::vector<ExportObject>& objects);
|
|
106
|
+
|
|
100
107
|
// OFF (Object File Format): header "OFF", "$verts $tris 0", vertex lines,
|
|
101
108
|
// then "3 i j k" per triangle (0-indexed, count-prefixed). Mirrors
|
|
102
109
|
// export.py's write_off.
|
|
@@ -315,8 +315,14 @@ def export_model(path: str, geometry, format: str = "", ascii_stl: bool = False,
|
|
|
315
315
|
|
|
316
316
|
|
|
317
317
|
def export_extensions() -> list:
|
|
318
|
-
"""The file extensions export_model understands, dot-prefixed.
|
|
319
|
-
|
|
318
|
+
"""The file extensions export_model understands, dot-prefixed.
|
|
319
|
+
|
|
320
|
+
Asked of the extension rather than restated here. The hardcoded copy
|
|
321
|
+
this replaces had already drifted: it was missing formats the C++
|
|
322
|
+
writer table had gained, and nothing failed -- callers simply could
|
|
323
|
+
not reach them.
|
|
324
|
+
"""
|
|
325
|
+
return list(_ext.export_extensions())
|
|
320
326
|
|
|
321
327
|
|
|
322
328
|
def check_mesh(verts, tris) -> dict:
|
|
@@ -764,6 +764,91 @@ void writeX3d(const std::string& path, const std::vector<ExportObject>& objects)
|
|
|
764
764
|
out << " </Scene>\n</X3D>\n";
|
|
765
765
|
}
|
|
766
766
|
|
|
767
|
+
// AMF is XML like X3D, but its colour model is per-VOLUME rather than
|
|
768
|
+
// per-face: a mesh carries one <vertices> list and any number of <volume>
|
|
769
|
+
// blocks, each naming a material. So an object whose triangles are not all
|
|
770
|
+
// one colour is written as one volume per distinct colour -- <color> on an
|
|
771
|
+
// individual <triangle> is legal but far less widely read, and slicers are
|
|
772
|
+
// the audience here.
|
|
773
|
+
//
|
|
774
|
+
// Material and object ids start at 1; id 0 is reserved by the spec.
|
|
775
|
+
// The material table is global, so two objects sharing a colour share one
|
|
776
|
+
// material entry rather than each declaring its own.
|
|
777
|
+
void writeAmf(const std::string& path, const std::vector<ExportObject>& objects) {
|
|
778
|
+
std::ofstream out(path);
|
|
779
|
+
if (!out) throw std::runtime_error("Could not open '" + path + "' for writing");
|
|
780
|
+
|
|
781
|
+
std::vector<std::array<float, 4>> materials;
|
|
782
|
+
const auto materialFor = [&](const std::array<float, 4>& c) -> size_t {
|
|
783
|
+
for (size_t i = 0; i < materials.size(); ++i) {
|
|
784
|
+
if (materials[i] == c) return i + 1;
|
|
785
|
+
}
|
|
786
|
+
materials.push_back(c);
|
|
787
|
+
return materials.size();
|
|
788
|
+
};
|
|
789
|
+
|
|
790
|
+
struct Volume {
|
|
791
|
+
size_t material = 1;
|
|
792
|
+
std::vector<uint32_t> tris;
|
|
793
|
+
};
|
|
794
|
+
std::vector<std::vector<Volume>> perObject;
|
|
795
|
+
perObject.reserve(objects.size());
|
|
796
|
+
for (const ExportObject& o : objects) {
|
|
797
|
+
const FaceColors fc = faceColors(o);
|
|
798
|
+
std::vector<Volume> vols;
|
|
799
|
+
if (fc.palette.empty()) {
|
|
800
|
+
Volume v;
|
|
801
|
+
v.material = materialFor(o.color);
|
|
802
|
+
v.tris = o.tris;
|
|
803
|
+
vols.push_back(std::move(v));
|
|
804
|
+
} else {
|
|
805
|
+
vols.resize(fc.palette.size());
|
|
806
|
+
for (size_t i = 0; i < fc.palette.size(); ++i) vols[i].material = materialFor(fc.palette[i]);
|
|
807
|
+
for (size_t t = 0; t < o.tris.size() / 3; ++t) {
|
|
808
|
+
std::vector<uint32_t>& dst = vols[fc.index[t]].tris;
|
|
809
|
+
dst.push_back(o.tris[t * 3]);
|
|
810
|
+
dst.push_back(o.tris[t * 3 + 1]);
|
|
811
|
+
dst.push_back(o.tris[t * 3 + 2]);
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
perObject.push_back(std::move(vols));
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
out << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
|
|
818
|
+
out << "<amf unit=\"millimeter\" version=\"1.1\">\n";
|
|
819
|
+
out << " <metadata type=\"cad\">BelfrySCAD</metadata>\n";
|
|
820
|
+
for (size_t i = 0; i < materials.size(); ++i) {
|
|
821
|
+
const std::array<float, 4>& c = materials[i];
|
|
822
|
+
out << " <material id=\"" << (i + 1) << "\">\n";
|
|
823
|
+
out << " <color><r>" << formatG6(c[0]) << "</r><g>" << formatG6(c[1]) << "</g><b>"
|
|
824
|
+
<< formatG6(c[2]) << "</b>";
|
|
825
|
+
if (c[3] < 1.0f) out << "<a>" << formatG6(c[3]) << "</a>";
|
|
826
|
+
out << "</color>\n";
|
|
827
|
+
out << " </material>\n";
|
|
828
|
+
}
|
|
829
|
+
for (size_t oi = 0; oi < objects.size(); ++oi) {
|
|
830
|
+
const ExportObject& o = objects[oi];
|
|
831
|
+
out << " <object id=\"" << (oi + 1) << "\">\n <mesh>\n <vertices>\n";
|
|
832
|
+
for (size_t v = 0; v < o.verts.size() / 3; ++v) {
|
|
833
|
+
out << " <vertex><coordinates><x>" << formatG6(o.verts[v * 3]) << "</x><y>"
|
|
834
|
+
<< formatG6(o.verts[v * 3 + 1]) << "</y><z>" << formatG6(o.verts[v * 3 + 2])
|
|
835
|
+
<< "</z></coordinates></vertex>\n";
|
|
836
|
+
}
|
|
837
|
+
out << " </vertices>\n";
|
|
838
|
+
for (const Volume& vol : perObject[oi]) {
|
|
839
|
+
if (vol.tris.empty()) continue;
|
|
840
|
+
out << " <volume materialid=\"" << vol.material << "\">\n";
|
|
841
|
+
for (size_t t = 0; t < vol.tris.size() / 3; ++t) {
|
|
842
|
+
out << " <triangle><v1>" << vol.tris[t * 3] << "</v1><v2>" << vol.tris[t * 3 + 1]
|
|
843
|
+
<< "</v2><v3>" << vol.tris[t * 3 + 2] << "</v3></triangle>\n";
|
|
844
|
+
}
|
|
845
|
+
out << " </volume>\n";
|
|
846
|
+
}
|
|
847
|
+
out << " </mesh>\n </object>\n";
|
|
848
|
+
}
|
|
849
|
+
out << "</amf>\n";
|
|
850
|
+
}
|
|
851
|
+
|
|
767
852
|
|
|
768
853
|
// -- one entry point ------------------------------------------------------
|
|
769
854
|
|
|
@@ -779,7 +864,7 @@ std::string lowerExtension(const std::string& path) {
|
|
|
779
864
|
}
|
|
780
865
|
|
|
781
866
|
bool isMultiObject(const std::string& ext) {
|
|
782
|
-
return ext == ".3mf" || ext == ".obj" || ext == ".ply" || ext == ".wrl" || ext == ".x3d";
|
|
867
|
+
return ext == ".3mf" || ext == ".amf" || ext == ".obj" || ext == ".ply" || ext == ".wrl" || ext == ".x3d";
|
|
783
868
|
}
|
|
784
869
|
|
|
785
870
|
// The merged single mesh STL/OFF write, with the open shells kept.
|
|
@@ -898,7 +983,7 @@ void writeOffMesh(const std::string& path, const manifold::MeshGL& mesh) {
|
|
|
898
983
|
} // namespace
|
|
899
984
|
|
|
900
985
|
const std::vector<std::string>& exportExtensions() {
|
|
901
|
-
static const std::vector<std::string> exts = {".3mf", ".stl", ".obj", ".off", ".ply", ".wrl", ".x3d"};
|
|
986
|
+
static const std::vector<std::string> exts = {".3mf", ".amf", ".stl", ".obj", ".off", ".ply", ".wrl", ".x3d"};
|
|
902
987
|
return exts;
|
|
903
988
|
}
|
|
904
989
|
|
|
@@ -929,6 +1014,8 @@ std::vector<std::string> exportModel(const std::string& path, const std::vector<
|
|
|
929
1014
|
if (objects.empty()) throw std::runtime_error("No geometry to export");
|
|
930
1015
|
if (ext == ".3mf") {
|
|
931
1016
|
writeThreeMf(path, objects);
|
|
1017
|
+
} else if (ext == ".amf") {
|
|
1018
|
+
writeAmf(path, objects);
|
|
932
1019
|
} else if (ext == ".obj") {
|
|
933
1020
|
writeObj(path, objects);
|
|
934
1021
|
} else if (ext == ".ply") {
|
|
@@ -121,3 +121,88 @@ TEST(ToRenderableBodies, A3dBodyPassesThroughUnchanged) {
|
|
|
121
121
|
EXPECT_FALSE(renderable[0].flatPreview);
|
|
122
122
|
EXPECT_NEAR(renderable[0].body->Volume(), 8.0, 1e-9);
|
|
123
123
|
}
|
|
124
|
+
|
|
125
|
+
// -- AMF -------------------------------------------------------------------
|
|
126
|
+
|
|
127
|
+
namespace {
|
|
128
|
+
|
|
129
|
+
std::string readFile(const std::string& path) {
|
|
130
|
+
std::ifstream in(path);
|
|
131
|
+
return std::string((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>());
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
size_t countOf(const std::string& hay, const std::string& needle) {
|
|
135
|
+
size_t n = 0, at = 0;
|
|
136
|
+
while ((at = hay.find(needle, at)) != std::string::npos) { ++n; at += needle.size(); }
|
|
137
|
+
return n;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
} // namespace
|
|
141
|
+
|
|
142
|
+
TEST(ExportAmf, IsAnOfferedFormat) {
|
|
143
|
+
const std::vector<std::string>& exts = exportExtensions();
|
|
144
|
+
EXPECT_NE(std::find(exts.begin(), exts.end(), ".amf"), exts.end());
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
TEST(ExportAmf, WritesOneObjectAndOneMaterialPerColour) {
|
|
148
|
+
// Two separated cubes, different colours: two objects, two materials.
|
|
149
|
+
std::vector<ColoredBody> bodies =
|
|
150
|
+
evalToBodies("color(\"red\") cube(2); translate([10,0,0]) color(\"blue\") cube(2);");
|
|
151
|
+
const std::string path = tempPath("two.amf").string();
|
|
152
|
+
exportModel(path, bodies, ExportOptions{});
|
|
153
|
+
|
|
154
|
+
const std::string xml = readFile(path);
|
|
155
|
+
EXPECT_EQ(countOf(xml, "<object id="), 2u);
|
|
156
|
+
EXPECT_EQ(countOf(xml, "<material id="), 2u);
|
|
157
|
+
// 12 triangles per cube, and every one lands in some volume.
|
|
158
|
+
EXPECT_EQ(countOf(xml, "<triangle>"), 24u);
|
|
159
|
+
EXPECT_NE(xml.find("<amf unit=\"millimeter\""), std::string::npos);
|
|
160
|
+
std::remove(path.c_str());
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
TEST(ExportAmf, TwoObjectsSharingAColourShareOneMaterial) {
|
|
164
|
+
std::vector<ColoredBody> bodies =
|
|
165
|
+
evalToBodies("color(\"red\") cube(2); translate([10,0,0]) color(\"red\") cube(2);");
|
|
166
|
+
const std::string path = tempPath("shared.amf").string();
|
|
167
|
+
exportModel(path, bodies, ExportOptions{});
|
|
168
|
+
|
|
169
|
+
const std::string xml = readFile(path);
|
|
170
|
+
EXPECT_EQ(countOf(xml, "<object id="), 2u);
|
|
171
|
+
EXPECT_EQ(countOf(xml, "<material id="), 1u);
|
|
172
|
+
std::remove(path.c_str());
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
TEST(ExportAmf, MaterialAndObjectIdsStartAtOne) {
|
|
176
|
+
// id 0 is reserved by the spec; a reader may drop anything using it.
|
|
177
|
+
std::vector<ColoredBody> bodies = evalToBodies("cube(2);");
|
|
178
|
+
const std::string path = tempPath("ids.amf").string();
|
|
179
|
+
exportModel(path, bodies, ExportOptions{});
|
|
180
|
+
|
|
181
|
+
const std::string xml = readFile(path);
|
|
182
|
+
EXPECT_NE(xml.find("<material id=\"1\">"), std::string::npos);
|
|
183
|
+
EXPECT_NE(xml.find("<object id=\"1\">"), std::string::npos);
|
|
184
|
+
EXPECT_EQ(xml.find("id=\"0\""), std::string::npos);
|
|
185
|
+
std::remove(path.c_str());
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
TEST(ExportAmf, NoGeometryThrows) {
|
|
189
|
+
std::vector<ColoredBody> empty;
|
|
190
|
+
EXPECT_THROW(exportModel(tempPath("empty.amf").string(), empty, ExportOptions{}), std::runtime_error);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
TEST(ExportAmf, AMultiColouredObjectBecomesOneVolumePerColour) {
|
|
194
|
+
// A union welds these into ONE solid whose surface carries two colours.
|
|
195
|
+
// AMF has no per-face colour that slicers read reliably, so the object
|
|
196
|
+
// is written as one <volume> per colour -- which is exactly what a
|
|
197
|
+
// multimaterial slicer assigns to separate tools.
|
|
198
|
+
std::vector<ColoredBody> bodies = evalToBodies(
|
|
199
|
+
"union() { color(\"red\") cube(20); color(\"blue\") translate([10,5,5]) cube(20); }");
|
|
200
|
+
const std::string path = tempPath("multi.amf").string();
|
|
201
|
+
exportModel(path, bodies, ExportOptions{});
|
|
202
|
+
|
|
203
|
+
const std::string xml = readFile(path);
|
|
204
|
+
EXPECT_EQ(countOf(xml, "<object id="), 1u);
|
|
205
|
+
EXPECT_EQ(countOf(xml, "<volume materialid="), 2u);
|
|
206
|
+
EXPECT_EQ(countOf(xml, "<material id="), 2u);
|
|
207
|
+
std::remove(path.c_str());
|
|
208
|
+
}
|
|
File without changes
|
{openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.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
|
{openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/examples/eval_perf_benchmark.cpp
RENAMED
|
File without changes
|
{openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/examples/manifold_cache_reuse.cpp
RENAMED
|
File without changes
|
{openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/examples/minimal_debugger.cpp
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/function_builtins.cpp
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/primitives_2d.cpp
RENAMED
|
File without changes
|
{openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/builtins/primitives_3d.cpp
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
|
{openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/src/text/freetype_font_provider.cpp
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_bytecode_compiler.cpp
RENAMED
|
File without changes
|
{openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_children_separate.cpp
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_dxf_svg_import.cpp
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_feature_detection.cpp
RENAMED
|
File without changes
|
{openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_function_builtins.cpp
RENAMED
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_import_export.cpp
RENAMED
|
File without changes
|
{openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_manifold_cache.cpp
RENAMED
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_multi_color_merge.cpp
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_python_bindings.py
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
|
{openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_unexpected_args.cpp
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-0.45.1 → openscad_cpp_evaluator-0.46.0}/tests/test_viewport_params.cpp
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|