pycadkit 0.5.0__tar.gz → 0.5.2__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.
- {pycadkit-0.5.0 → pycadkit-0.5.2}/Cargo.lock +13 -13
- {pycadkit-0.5.0 → pycadkit-0.5.2}/Cargo.toml +10 -10
- {pycadkit-0.5.0 → pycadkit-0.5.2}/PKG-INFO +17 -6
- pycadkit-0.5.2/README.md +41 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit/Cargo.toml +1 -1
- pycadkit-0.5.2/crates/cadkit/README.md +47 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit/src/lib.rs +14 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/Cargo.toml +1 -1
- pycadkit-0.5.2/crates/cadkit-core/README.md +29 -0
- pycadkit-0.5.2/crates/cadkit-core/src/svg/bounded_tests.rs +219 -0
- pycadkit-0.5.2/crates/cadkit-core/src/svg/buffer.rs +143 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/svg.rs +412 -96
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/README.md +13 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/Cargo.toml +1 -1
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/README.md +2 -1
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/lib.rs +3 -2
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-py/Cargo.toml +1 -1
- pycadkit-0.5.2/crates/cadkit-py/README.md +41 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/pyproject.toml +1 -1
- pycadkit-0.5.0/README.md +0 -30
- pycadkit-0.5.0/crates/cadkit/README.md +0 -29
- pycadkit-0.5.0/crates/cadkit-core/README.md +0 -16
- pycadkit-0.5.0/crates/cadkit-py/README.md +0 -30
- {pycadkit-0.5.0 → pycadkit-0.5.2}/LICENSE-APACHE +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/LICENSE-MIT +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/NOTICE +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit/LICENSE-APACHE +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit/LICENSE-MIT +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit/NOTICE +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit/examples/interchange.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit/src/prelude.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/LICENSE-APACHE +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/LICENSE-MIT +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/NOTICE +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/aci.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/bytes.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/doc_ops.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/error.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/export.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/geom.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/geom_ops.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/lib.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/model.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/model_builders.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/ops.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/options.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/polygon.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/text.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/units.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/tests/schema.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/Cargo.toml +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/LICENSE-APACHE +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/LICENSE-MIT +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/NOTICE +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/examples/dgn_summary.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/examples/raster_structure.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/budget.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/cfb.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/fuzz_tests.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/le.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/level_names.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/lib.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/map/mod.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/map/v7.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/map/v8.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/native/decode_v8.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/native/element.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/native/linkage.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/native/mod.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/native/v7.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/native/v8.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/palette.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/symbology.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/text.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/container.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/encode.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/mod.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/named.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/polyline.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/raster.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/raster_builtin.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/raster_template.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/seed_prepare.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/tables.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/tests/application.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/tests/dictionary.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/tests/microstation.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/tests/raster.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/tests/raster_template.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/tests/regressions.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/tests/text.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/tests.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/text.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/zlib.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/tests/common/mod.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/tests/private_corpus.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/tests/private_dictionary.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/tests/robustness.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/tests/v7_corpus.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/tests/v8_oracle.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/tests/v8_public.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/tests/v8_range.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/LICENSE-APACHE +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/LICENSE-MIT +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/NOTICE +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/examples/docsummary.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/examples/dwgdump.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/bits.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/classes.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/codepage.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/container/lz77_r2004.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/container/lz77_r2007.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/container/mod.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/container/r13.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/container/r2004.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/container/r2007.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/container/reed_solomon.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/crc.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/handles.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/header.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/mapping/entity.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/mapping/mod.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/native/entities.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/native/mod.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/object/annotation.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/object/curves.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/object/entities.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/object/hatch.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/object/misc.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/object/mod.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/object/registry.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/object/tables.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/reader.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/version.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/tests/corpus.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/tests/oracle.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/tests/robustness.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/Cargo.toml +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/LICENSE-APACHE +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/LICENSE-MIT +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/NOTICE +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/README.md +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/examples/dump.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/lib.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/native/mod.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/native/text.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/ocs.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/reader/common.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/reader/entities.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/reader/hatch.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/reader/mod.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/reader/records.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/reader/tables.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/writer/curves.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/writer/entities.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/writer/mod.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/writer/out.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/tests/ascii_vs_binary.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/tests/common/mod.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/tests/compare_reader_with_ezdxf.py +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/tests/review_fixes.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/tests/robustness.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/tests/roundtrip.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/tests/synthetic_read.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/tests/synthetic_write.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/tests/validate_with_ezdxf.py +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/Cargo.toml +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/LICENSE-APACHE +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/LICENSE-MIT +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/NOTICE +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/README.md +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/src/curves.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/src/export.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/src/geometry.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/src/lib.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/src/mapping.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/src/native.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/src/tkgm.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/src/validate.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/src/xml.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/tests/roundtrip.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/tests/support/export_cases.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/tests/support/tkgm_cases.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-py/LICENSE-APACHE +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-py/LICENSE-MIT +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-py/NOTICE +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-py/src/lib.rs +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-py/tests/conftest.py +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-py/tests/test_cadkit.py +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-py/tests/test_citygml.py +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/python/cadkit/__init__.py +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/python/cadkit/__init__.pyi +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/python/cadkit/_cadkit.pyi +0 -0
- {pycadkit-0.5.0 → pycadkit-0.5.2}/python/cadkit/py.typed +0 -0
|
@@ -152,7 +152,7 @@ dependencies = [
|
|
|
152
152
|
|
|
153
153
|
[[package]]
|
|
154
154
|
name = "cadkit"
|
|
155
|
-
version = "0.5.
|
|
155
|
+
version = "0.5.2"
|
|
156
156
|
dependencies = [
|
|
157
157
|
"cadkit-core",
|
|
158
158
|
"cadkit-dgn",
|
|
@@ -164,7 +164,7 @@ dependencies = [
|
|
|
164
164
|
|
|
165
165
|
[[package]]
|
|
166
166
|
name = "cadkit-capi"
|
|
167
|
-
version = "0.5.
|
|
167
|
+
version = "0.5.2"
|
|
168
168
|
dependencies = [
|
|
169
169
|
"cadkit",
|
|
170
170
|
"serde",
|
|
@@ -173,7 +173,7 @@ dependencies = [
|
|
|
173
173
|
|
|
174
174
|
[[package]]
|
|
175
175
|
name = "cadkit-cli"
|
|
176
|
-
version = "0.5.
|
|
176
|
+
version = "0.5.2"
|
|
177
177
|
dependencies = [
|
|
178
178
|
"cadkit",
|
|
179
179
|
"clap",
|
|
@@ -182,7 +182,7 @@ dependencies = [
|
|
|
182
182
|
|
|
183
183
|
[[package]]
|
|
184
184
|
name = "cadkit-core"
|
|
185
|
-
version = "0.5.
|
|
185
|
+
version = "0.5.2"
|
|
186
186
|
dependencies = [
|
|
187
187
|
"schemars",
|
|
188
188
|
"serde",
|
|
@@ -192,7 +192,7 @@ dependencies = [
|
|
|
192
192
|
|
|
193
193
|
[[package]]
|
|
194
194
|
name = "cadkit-dgn"
|
|
195
|
-
version = "0.5.
|
|
195
|
+
version = "0.5.2"
|
|
196
196
|
dependencies = [
|
|
197
197
|
"cadkit-core",
|
|
198
198
|
"cfb",
|
|
@@ -203,7 +203,7 @@ dependencies = [
|
|
|
203
203
|
|
|
204
204
|
[[package]]
|
|
205
205
|
name = "cadkit-dwg"
|
|
206
|
-
version = "0.5.
|
|
206
|
+
version = "0.5.2"
|
|
207
207
|
dependencies = [
|
|
208
208
|
"cadkit-core",
|
|
209
209
|
"cadkit-dxf",
|
|
@@ -213,7 +213,7 @@ dependencies = [
|
|
|
213
213
|
|
|
214
214
|
[[package]]
|
|
215
215
|
name = "cadkit-dxf"
|
|
216
|
-
version = "0.5.
|
|
216
|
+
version = "0.5.2"
|
|
217
217
|
dependencies = [
|
|
218
218
|
"cadkit-core",
|
|
219
219
|
"encoding_rs",
|
|
@@ -222,7 +222,7 @@ dependencies = [
|
|
|
222
222
|
|
|
223
223
|
[[package]]
|
|
224
224
|
name = "cadkit-geom"
|
|
225
|
-
version = "0.5.
|
|
225
|
+
version = "0.5.2"
|
|
226
226
|
dependencies = [
|
|
227
227
|
"i_overlay",
|
|
228
228
|
"robust",
|
|
@@ -234,7 +234,7 @@ dependencies = [
|
|
|
234
234
|
|
|
235
235
|
[[package]]
|
|
236
236
|
name = "cadkit-gml"
|
|
237
|
-
version = "0.5.
|
|
237
|
+
version = "0.5.2"
|
|
238
238
|
dependencies = [
|
|
239
239
|
"cadkit-core",
|
|
240
240
|
"quick-xml",
|
|
@@ -244,7 +244,7 @@ dependencies = [
|
|
|
244
244
|
|
|
245
245
|
[[package]]
|
|
246
246
|
name = "cadkit-gpu"
|
|
247
|
-
version = "0.5.
|
|
247
|
+
version = "0.5.2"
|
|
248
248
|
dependencies = [
|
|
249
249
|
"cadkit",
|
|
250
250
|
"cadkit-geom",
|
|
@@ -257,7 +257,7 @@ dependencies = [
|
|
|
257
257
|
|
|
258
258
|
[[package]]
|
|
259
259
|
name = "cadkit-py"
|
|
260
|
-
version = "0.5.
|
|
260
|
+
version = "0.5.2"
|
|
261
261
|
dependencies = [
|
|
262
262
|
"cadkit",
|
|
263
263
|
"pyo3",
|
|
@@ -267,7 +267,7 @@ dependencies = [
|
|
|
267
267
|
|
|
268
268
|
[[package]]
|
|
269
269
|
name = "cadkit-scene"
|
|
270
|
-
version = "0.5.
|
|
270
|
+
version = "0.5.2"
|
|
271
271
|
dependencies = [
|
|
272
272
|
"cadkit-core",
|
|
273
273
|
"cadkit-geom",
|
|
@@ -276,7 +276,7 @@ dependencies = [
|
|
|
276
276
|
|
|
277
277
|
[[package]]
|
|
278
278
|
name = "cadkit-wasm"
|
|
279
|
-
version = "0.5.
|
|
279
|
+
version = "0.5.2"
|
|
280
280
|
dependencies = [
|
|
281
281
|
"cadkit",
|
|
282
282
|
"js-sys",
|
|
@@ -4,7 +4,7 @@ members = ["crates/*"]
|
|
|
4
4
|
exclude = ["fuzz"]
|
|
5
5
|
|
|
6
6
|
[workspace.package]
|
|
7
|
-
version = "0.5.
|
|
7
|
+
version = "0.5.2"
|
|
8
8
|
edition = "2024"
|
|
9
9
|
rust-version = "1.88"
|
|
10
10
|
license = "MIT OR Apache-2.0"
|
|
@@ -14,18 +14,18 @@ keywords = ["cad", "dwg", "dgn", "dxf", "citygml"]
|
|
|
14
14
|
categories = ["parser-implementations", "graphics", "encoding", "science::geo"]
|
|
15
15
|
|
|
16
16
|
[workspace.dependencies]
|
|
17
|
-
cadkit-geom = { path = "crates/cadkit-geom", version = "0.5.
|
|
18
|
-
cadkit-scene = { path = "crates/cadkit-scene", version = "0.5.
|
|
19
|
-
cadkit-gpu = { path = "crates/cadkit-gpu", version = "0.5.
|
|
17
|
+
cadkit-geom = { path = "crates/cadkit-geom", version = "0.5.2" }
|
|
18
|
+
cadkit-scene = { path = "crates/cadkit-scene", version = "0.5.2" }
|
|
19
|
+
cadkit-gpu = { path = "crates/cadkit-gpu", version = "0.5.2" }
|
|
20
20
|
i_overlay = "=9.0.0"
|
|
21
21
|
robust = "=1.2.0"
|
|
22
22
|
schemars = "1.2.2"
|
|
23
|
-
cadkit-core = { path = "crates/cadkit-core", version = "0.5.
|
|
24
|
-
cadkit-dgn = { path = "crates/cadkit-dgn", version = "0.5.
|
|
25
|
-
cadkit-dwg = { path = "crates/cadkit-dwg", version = "0.5.
|
|
26
|
-
cadkit-dxf = { path = "crates/cadkit-dxf", version = "0.5.
|
|
27
|
-
cadkit-gml = { path = "crates/cadkit-gml", version = "0.5.
|
|
28
|
-
cadkit = { path = "crates/cadkit", version = "0.5.
|
|
23
|
+
cadkit-core = { path = "crates/cadkit-core", version = "0.5.2" }
|
|
24
|
+
cadkit-dgn = { path = "crates/cadkit-dgn", version = "0.5.2", default-features = false }
|
|
25
|
+
cadkit-dwg = { path = "crates/cadkit-dwg", version = "0.5.2" }
|
|
26
|
+
cadkit-dxf = { path = "crates/cadkit-dxf", version = "0.5.2" }
|
|
27
|
+
cadkit-gml = { path = "crates/cadkit-gml", version = "0.5.2" }
|
|
28
|
+
cadkit = { path = "crates/cadkit", version = "0.5.2" }
|
|
29
29
|
serde = { version = "1", features = ["derive"] }
|
|
30
30
|
serde_json = "1"
|
|
31
31
|
thiserror = "2"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pycadkit
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.2
|
|
4
4
|
Classifier: Development Status :: 3 - Alpha
|
|
5
5
|
Classifier: Intended Audience :: Developers
|
|
6
6
|
Classifier: Intended Audience :: Science/Research
|
|
@@ -21,7 +21,7 @@ Provides-Extra: test
|
|
|
21
21
|
License-File: LICENSE-MIT
|
|
22
22
|
License-File: LICENSE-APACHE
|
|
23
23
|
License-File: NOTICE
|
|
24
|
-
Summary:
|
|
24
|
+
Summary: Python CAD file I/O and document operations: read DWG/DGN/DXF/CityGML; write DXF, seed-based DGN V8, CityGML, SVG and JSON.
|
|
25
25
|
Keywords: cad,dwg,dgn,dxf,citygml
|
|
26
26
|
Author: TNYCL
|
|
27
27
|
License-Expression: MIT OR Apache-2.0
|
|
@@ -35,10 +35,12 @@ Project-URL: Issues, https://github.com/TNYCL/cadkit/issues
|
|
|
35
35
|
|
|
36
36
|
# pycadkit
|
|
37
37
|
|
|
38
|
-
Python
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
Python file I/O and document operations for [cadkit](https://github.com/TNYCL/cadkit),
|
|
39
|
+
an open-source CAD engine for building CAD applications. Read DWG, DGN (V7 and V8), DXF
|
|
40
|
+
and CityGML 2.0 into one format-neutral model; write SVG, JSON, DXF, seed-based DGN V8 and
|
|
41
|
+
CityGML 2.0. DWG is read-only; DGN output requires a compatible seed and covers a V8 subset.
|
|
42
|
+
The parsers are written in Rust; there is no vendor SDK, and one wheel per platform serves
|
|
43
|
+
Python 3.9 and newer.
|
|
42
44
|
|
|
43
45
|
```sh
|
|
44
46
|
pip install pycadkit
|
|
@@ -54,6 +56,15 @@ print(doc) # <cadkit.Document format=dxf version="AC1032"
|
|
|
54
56
|
open("plan.svg", "w").write(doc.to_svg())
|
|
55
57
|
```
|
|
56
58
|
|
|
59
|
+
Use `inspect` for header-only metadata, `Document.convert_units` and `explode_inserts`
|
|
60
|
+
for new documents without changing the source, and `V8Seed` for reusable DGN output seeds.
|
|
61
|
+
Native CityGML read/write and explicit generic export are also available. CityGML generic
|
|
62
|
+
export requires a CRS; DGN and CityGML export limits are linked from the
|
|
63
|
+
[format matrix](https://github.com/TNYCL/cadkit#format-support).
|
|
64
|
+
|
|
65
|
+
This package exposes the file/document APIs in the Python guide. The standalone Rust
|
|
66
|
+
geometry, scene and GPU rendering crates are separate modules, without Python bindings.
|
|
67
|
+
|
|
57
68
|
The API reference is [docs/python.md](https://github.com/TNYCL/cadkit/blob/main/docs/python.md).
|
|
58
69
|
|
|
59
70
|
"DWG", "DGN" and "DXF" name file formats only; cadkit is not affiliated with or certified by
|
pycadkit-0.5.2/README.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# pycadkit
|
|
2
|
+
|
|
3
|
+
Python file I/O and document operations for [cadkit](https://github.com/TNYCL/cadkit),
|
|
4
|
+
an open-source CAD engine for building CAD applications. Read DWG, DGN (V7 and V8), DXF
|
|
5
|
+
and CityGML 2.0 into one format-neutral model; write SVG, JSON, DXF, seed-based DGN V8 and
|
|
6
|
+
CityGML 2.0. DWG is read-only; DGN output requires a compatible seed and covers a V8 subset.
|
|
7
|
+
The parsers are written in Rust; there is no vendor SDK, and one wheel per platform serves
|
|
8
|
+
Python 3.9 and newer.
|
|
9
|
+
|
|
10
|
+
```sh
|
|
11
|
+
pip install pycadkit
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The package installs as `pycadkit` and imports as `cadkit`:
|
|
15
|
+
|
|
16
|
+
```python
|
|
17
|
+
import cadkit
|
|
18
|
+
|
|
19
|
+
doc = cadkit.read("plan.dxf") # path, os.PathLike or bytes
|
|
20
|
+
print(doc) # <cadkit.Document format=dxf version="AC1032" ...>
|
|
21
|
+
open("plan.svg", "w").write(doc.to_svg())
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Use `inspect` for header-only metadata, `Document.convert_units` and `explode_inserts`
|
|
25
|
+
for new documents without changing the source, and `V8Seed` for reusable DGN output seeds.
|
|
26
|
+
Native CityGML read/write and explicit generic export are also available. CityGML generic
|
|
27
|
+
export requires a CRS; DGN and CityGML export limits are linked from the
|
|
28
|
+
[format matrix](https://github.com/TNYCL/cadkit#format-support).
|
|
29
|
+
|
|
30
|
+
This package exposes the file/document APIs in the Python guide. The standalone Rust
|
|
31
|
+
geometry, scene and GPU rendering crates are separate modules, without Python bindings.
|
|
32
|
+
|
|
33
|
+
The API reference is [docs/python.md](https://github.com/TNYCL/cadkit/blob/main/docs/python.md).
|
|
34
|
+
|
|
35
|
+
"DWG", "DGN" and "DXF" name file formats only; cadkit is not affiliated with or certified by
|
|
36
|
+
any CAD vendor.
|
|
37
|
+
|
|
38
|
+
## License
|
|
39
|
+
|
|
40
|
+
Copyright 2026 TNYCL ([tnycl.com](https://tnycl.com)). Licensed under either of the Apache
|
|
41
|
+
License, Version 2.0 or the MIT license at your option (`LICENSE-APACHE`, `LICENSE-MIT`).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "cadkit"
|
|
3
|
-
description = "
|
|
3
|
+
description = "CAD file I/O and document operations for cadkit: read DWG/DGN/DXF/CityGML; write DXF, seed-based DGN V8 and CityGML."
|
|
4
4
|
version.workspace = true
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
edition.workspace = true
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# cadkit
|
|
2
|
+
|
|
3
|
+
The file I/O and document facade of [cadkit](https://github.com/TNYCL/cadkit), an open-source
|
|
4
|
+
CAD engine for building CAD applications. Read DWG, DGN (V7 and V8), DXF and CityGML 2.0
|
|
5
|
+
into one format-neutral model; write DXF, seed-based DGN V8, CityGML 2.0, SVG and JSON.
|
|
6
|
+
DWG is read-only; DGN writing covers a documented V8 subset and requires a compatible seed.
|
|
7
|
+
The parsers are pure Rust and use no vendor SDK.
|
|
8
|
+
|
|
9
|
+
Use header-only inspection, bounded stream I/O and Cargo features to select the file
|
|
10
|
+
handling your application needs. Documents support transforms, unit conversion, block
|
|
11
|
+
expansion, layer filtering and unused-definition purging through `cadkit-core`, re-exported
|
|
12
|
+
by this facade. Recoverable reader problems become document warnings; configurable limits
|
|
13
|
+
bound input handling.
|
|
14
|
+
|
|
15
|
+
```rust
|
|
16
|
+
let doc = cadkit::open("plan.dxf")?;
|
|
17
|
+
for model in &doc.models {
|
|
18
|
+
println!("{}: {} entities", model.name, model.entities.len());
|
|
19
|
+
}
|
|
20
|
+
std::fs::write("plan.svg", cadkit::to_svg(&doc, &cadkit::SvgOptions::default()))?;
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Format support, limits and test evidence are in the [repository README](https://github.com/TNYCL/cadkit#format-support).
|
|
24
|
+
The same core is available as a CLI ([`cadkit-cli`](https://crates.io/crates/cadkit-cli)),
|
|
25
|
+
for Python ([`pycadkit`](https://pypi.org/project/pycadkit/)), for JavaScript
|
|
26
|
+
([`cadkit-wasm`](https://www.npmjs.com/package/cadkit-wasm)) and as a C/C++ library
|
|
27
|
+
([GitHub Releases](https://github.com/TNYCL/cadkit/releases)).
|
|
28
|
+
|
|
29
|
+
## Modules and API migration
|
|
30
|
+
|
|
31
|
+
Adopt [`cadkit-geom`](https://crates.io/crates/cadkit-geom) for standalone analytic geometry,
|
|
32
|
+
[`cadkit-scene`](https://crates.io/crates/cadkit-scene) for GPU-independent plan/mesh data,
|
|
33
|
+
and [`cadkit-gpu`](https://crates.io/crates/cadkit-gpu) for `wgpu` rendering separately.
|
|
34
|
+
Reading a file through this facade does not bring in a GPU runtime.
|
|
35
|
+
|
|
36
|
+
Version 0.5 introduces model/option constructors, non-exhaustive types, typed limit errors
|
|
37
|
+
and versioned document JSON. See the
|
|
38
|
+
[0.4 to 0.5 migration guide](https://github.com/TNYCL/cadkit/blob/main/CHANGELOG.md#migrating-from-04).
|
|
39
|
+
|
|
40
|
+
"DWG", "DGN" and "DXF" name file formats only; cadkit is not affiliated with or certified by
|
|
41
|
+
any CAD vendor. Sources of format knowledge are listed in
|
|
42
|
+
[docs/PROVENANCE.md](https://github.com/TNYCL/cadkit/blob/main/docs/PROVENANCE.md).
|
|
43
|
+
|
|
44
|
+
## License
|
|
45
|
+
|
|
46
|
+
Copyright 2026 TNYCL ([tnycl.com](https://tnycl.com)). Licensed under either of
|
|
47
|
+
[Apache License, Version 2.0](LICENSE-APACHE) or [MIT license](LICENSE-MIT) at your option.
|
|
@@ -333,6 +333,20 @@ pub fn to_svg_all_layers(doc: &Document, options: &SvgOptions) -> String {
|
|
|
333
333
|
cadkit_core::svg::render_all_layers(doc, options)
|
|
334
334
|
}
|
|
335
335
|
|
|
336
|
+
/// Renders a complete SVG within the output byte and work budgets in `options`.
|
|
337
|
+
/// `include_hidden_layers` includes hidden and frozen layers when true.
|
|
338
|
+
/// Returns [`Error::LimitExceeded`] rather than a truncated drawing. The byte
|
|
339
|
+
/// cap includes all markup and bounds temporary SVG strings during generation;
|
|
340
|
+
/// it does not bound the memory already owned by the parsed document.
|
|
341
|
+
#[cfg(feature = "svg")]
|
|
342
|
+
pub fn to_svg_bounded(
|
|
343
|
+
doc: &Document,
|
|
344
|
+
options: &SvgOptions,
|
|
345
|
+
include_hidden_layers: bool,
|
|
346
|
+
) -> Result<String> {
|
|
347
|
+
cadkit_core::svg::render_bounded(doc, options, include_hidden_layers)
|
|
348
|
+
}
|
|
349
|
+
|
|
336
350
|
/// Writes an SVG rendering of `doc` into `writer`.
|
|
337
351
|
#[cfg(feature = "svg")]
|
|
338
352
|
pub fn write_svg_to(doc: &Document, options: &SvgOptions, mut writer: impl Write) -> Result<()> {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "cadkit-core"
|
|
3
|
-
description = "
|
|
3
|
+
description = "CAD document model and operations, bounded byte readers, versioned JSON and SVG export for cadkit."
|
|
4
4
|
version.workspace = true
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
edition.workspace = true
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# cadkit-core
|
|
2
|
+
|
|
3
|
+
The format-neutral drawing model shared by the [cadkit](https://github.com/TNYCL/cadkit) readers and writers:
|
|
4
|
+
documents, models, layers, blocks and entities, bounded byte readers, read limits, errors
|
|
5
|
+
and warnings, polygon validation and SVG export. This is the document layer of the
|
|
6
|
+
cadkit CAD engine; it has no GPU dependency.
|
|
7
|
+
|
|
8
|
+
`Document` operations include affine transforms, unit conversion, block expansion, group
|
|
9
|
+
flattening, layer filtering and unused-definition purging. Coordinates use drawing units;
|
|
10
|
+
angles are radians. Version 0.5 adds constructors and setters for non-exhaustive model and
|
|
11
|
+
option types, `LimitKind` on limit errors and `Document::schema_version` (currently 1).
|
|
12
|
+
Enable `schemars` for JSON Schema; the repository also includes the
|
|
13
|
+
[document schema](https://github.com/TNYCL/cadkit/blob/main/docs/schema/document-v1.schema.json).
|
|
14
|
+
See the [migration guide](https://github.com/TNYCL/cadkit/blob/main/CHANGELOG.md#migrating-from-04)
|
|
15
|
+
for source and JSON compatibility.
|
|
16
|
+
|
|
17
|
+
Standalone analytic geometry lives in [`cadkit-geom`](https://crates.io/crates/cadkit-geom);
|
|
18
|
+
scene preparation and GPU rendering live in separate crates.
|
|
19
|
+
|
|
20
|
+
Most applications should depend on the [`cadkit`](https://crates.io/crates/cadkit) facade crate, which detects the format and re-exports this crate.
|
|
21
|
+
|
|
22
|
+
"DWG", "DGN" and "DXF" name file formats only; cadkit is not affiliated with or certified by
|
|
23
|
+
any CAD vendor. Sources of format knowledge are listed in
|
|
24
|
+
[docs/PROVENANCE.md](https://github.com/TNYCL/cadkit/blob/main/docs/PROVENANCE.md).
|
|
25
|
+
|
|
26
|
+
## License
|
|
27
|
+
|
|
28
|
+
Copyright 2026 TNYCL ([tnycl.com](https://tnycl.com)). Licensed under either of
|
|
29
|
+
[Apache License, Version 2.0](LICENSE-APACHE) or [MIT license](LICENSE-MIT) at your option.
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
use super::*;
|
|
2
|
+
use crate::model::{Block, Layer, Model};
|
|
3
|
+
|
|
4
|
+
fn line() -> Entity {
|
|
5
|
+
Entity::new(EntityKind::Line {
|
|
6
|
+
start: Point3::xy(0.0, 0.0),
|
|
7
|
+
end: Point3::xy(10.0, 5.0),
|
|
8
|
+
})
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
fn document(entities: Vec<Entity>) -> Document {
|
|
12
|
+
Document {
|
|
13
|
+
models: vec![Model {
|
|
14
|
+
entities,
|
|
15
|
+
..Model::default()
|
|
16
|
+
}],
|
|
17
|
+
..Document::default()
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
fn text(value: String) -> Entity {
|
|
22
|
+
Entity::new(EntityKind::Text {
|
|
23
|
+
position: Point3::default(),
|
|
24
|
+
end_point: None,
|
|
25
|
+
height: 1.0,
|
|
26
|
+
rotation: 0.0,
|
|
27
|
+
width_factor: 1.0,
|
|
28
|
+
oblique: 0.0,
|
|
29
|
+
value,
|
|
30
|
+
style: None,
|
|
31
|
+
halign: HAlign::Left,
|
|
32
|
+
valign: VAlign::Baseline,
|
|
33
|
+
normal: Vec3::Z,
|
|
34
|
+
})
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
fn assert_output_limit(result: crate::Result<String>) {
|
|
38
|
+
assert!(matches!(
|
|
39
|
+
result,
|
|
40
|
+
Err(crate::Error::LimitExceeded {
|
|
41
|
+
limit: crate::LimitKind::Output,
|
|
42
|
+
..
|
|
43
|
+
})
|
|
44
|
+
));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
#[test]
|
|
48
|
+
fn exact_utf8_budget_includes_markup_and_hidden_layer_names() {
|
|
49
|
+
let mut entity = text("測定<&>🙂".into());
|
|
50
|
+
entity.layer = Some("隠れた<&>🙂".into());
|
|
51
|
+
let mut doc = document(vec![entity]);
|
|
52
|
+
doc.layers.push(Layer {
|
|
53
|
+
name: "隠れた<&>🙂".into(),
|
|
54
|
+
visible: false,
|
|
55
|
+
..Layer::default()
|
|
56
|
+
});
|
|
57
|
+
let options = SvgOptions::default();
|
|
58
|
+
for hidden in [false, true] {
|
|
59
|
+
let expected = if hidden {
|
|
60
|
+
render_all_layers(&doc, &options)
|
|
61
|
+
} else {
|
|
62
|
+
render(&doc, &options)
|
|
63
|
+
};
|
|
64
|
+
let exact = options.clone().with_max_output_bytes(expected.len());
|
|
65
|
+
assert_eq!(
|
|
66
|
+
render_bounded(&doc, &exact, hidden).expect("exact budget"),
|
|
67
|
+
expected
|
|
68
|
+
);
|
|
69
|
+
assert_output_limit(render_bounded(
|
|
70
|
+
&doc,
|
|
71
|
+
&exact.with_max_output_bytes(expected.len() - 1),
|
|
72
|
+
hidden,
|
|
73
|
+
));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
#[test]
|
|
78
|
+
fn a_single_path_is_stopped_before_the_next_entity() {
|
|
79
|
+
let polyline = Entity::new(EntityKind::Polyline {
|
|
80
|
+
vertices: (0..20_000)
|
|
81
|
+
.map(|i| Vertex {
|
|
82
|
+
position: Point3::xy(f64::from(i), f64::from(i % 2)),
|
|
83
|
+
..Vertex::default()
|
|
84
|
+
})
|
|
85
|
+
.collect(),
|
|
86
|
+
closed: false,
|
|
87
|
+
normal: Vec3::Z,
|
|
88
|
+
});
|
|
89
|
+
let options = SvgOptions::default().with_max_output_bytes(1024);
|
|
90
|
+
assert_output_limit(render_bounded(&document(vec![polyline]), &options, true));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
#[test]
|
|
94
|
+
fn escaping_and_background_do_not_allocate_an_oversized_result() {
|
|
95
|
+
let options = SvgOptions::default().with_max_output_bytes(1024);
|
|
96
|
+
// Input fits but XML escaping expands it beyond the cap within one entity.
|
|
97
|
+
assert_output_limit(render_bounded(
|
|
98
|
+
&document(vec![text("&".repeat(600))]),
|
|
99
|
+
&options,
|
|
100
|
+
true,
|
|
101
|
+
));
|
|
102
|
+
let options = options.with_background(Some("&".repeat(600)));
|
|
103
|
+
assert_output_limit(render_bounded(&Document::default(), &options, true));
|
|
104
|
+
assert_output_limit(render_bounded(
|
|
105
|
+
&Document::default(),
|
|
106
|
+
&SvgOptions::default().with_max_output_bytes(1),
|
|
107
|
+
true,
|
|
108
|
+
));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
#[test]
|
|
112
|
+
fn many_layers_and_entities_cannot_accumulate_unbounded_output() {
|
|
113
|
+
let doc = document(
|
|
114
|
+
(0..10_000)
|
|
115
|
+
.map(|i| {
|
|
116
|
+
let mut entity = line();
|
|
117
|
+
entity.layer = Some(format!("layer-{i}-{}", "&".repeat(32)));
|
|
118
|
+
entity
|
|
119
|
+
})
|
|
120
|
+
.collect(),
|
|
121
|
+
);
|
|
122
|
+
assert_output_limit(render_bounded(
|
|
123
|
+
&doc,
|
|
124
|
+
&SvgOptions::default().with_max_output_bytes(16_384),
|
|
125
|
+
true,
|
|
126
|
+
));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
#[test]
|
|
130
|
+
fn work_exhaustion_is_an_error_instead_of_an_empty_or_partial_success() {
|
|
131
|
+
let doc = document(vec![line(); 100]);
|
|
132
|
+
for work in [0, 10] {
|
|
133
|
+
assert!(matches!(
|
|
134
|
+
render_bounded(&doc, &SvgOptions::default().with_max_work(work), true),
|
|
135
|
+
Err(crate::Error::LimitExceeded {
|
|
136
|
+
limit: crate::LimitKind::Work,
|
|
137
|
+
..
|
|
138
|
+
})
|
|
139
|
+
));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
#[test]
|
|
144
|
+
fn block_array_expansion_obeys_output_and_work_limits() {
|
|
145
|
+
let insert = Entity::new(EntityKind::Insert {
|
|
146
|
+
block: "lines".into(),
|
|
147
|
+
position: Point3::default(),
|
|
148
|
+
scale: Vec3::new(1.0, 1.0, 1.0),
|
|
149
|
+
rotation: 0.0,
|
|
150
|
+
normal: Vec3::Z,
|
|
151
|
+
columns: 100,
|
|
152
|
+
rows: 100,
|
|
153
|
+
column_spacing: 20.0,
|
|
154
|
+
row_spacing: 20.0,
|
|
155
|
+
});
|
|
156
|
+
let mut doc = document(vec![insert]);
|
|
157
|
+
doc.blocks.push(Block {
|
|
158
|
+
name: "lines".into(),
|
|
159
|
+
entities: vec![line()],
|
|
160
|
+
..Block::default()
|
|
161
|
+
});
|
|
162
|
+
assert_output_limit(render_bounded(
|
|
163
|
+
&doc,
|
|
164
|
+
&SvgOptions::default().with_max_output_bytes(4096),
|
|
165
|
+
true,
|
|
166
|
+
));
|
|
167
|
+
assert!(matches!(
|
|
168
|
+
render_bounded(&doc, &SvgOptions::default().with_max_work(10), true),
|
|
169
|
+
Err(crate::Error::LimitExceeded {
|
|
170
|
+
limit: crate::LimitKind::Work,
|
|
171
|
+
..
|
|
172
|
+
})
|
|
173
|
+
));
|
|
174
|
+
let small = document(vec![line()]);
|
|
175
|
+
assert_eq!(
|
|
176
|
+
render_bounded(&small, &SvgOptions::default(), true).expect("next document"),
|
|
177
|
+
render_all_layers(&small, &SvgOptions::default())
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
#[test]
|
|
182
|
+
fn hatch_definitions_are_part_of_the_exact_output_budget() {
|
|
183
|
+
let hatch = Entity::new(EntityKind::Hatch {
|
|
184
|
+
loops: vec![crate::model::HatchLoop {
|
|
185
|
+
edges: vec![HatchEdge::Polyline {
|
|
186
|
+
vertices: vec![
|
|
187
|
+
Vertex {
|
|
188
|
+
position: Point3::xy(0.0, 0.0),
|
|
189
|
+
..Vertex::default()
|
|
190
|
+
},
|
|
191
|
+
Vertex {
|
|
192
|
+
position: Point3::xy(5.0, 5.0),
|
|
193
|
+
..Vertex::default()
|
|
194
|
+
},
|
|
195
|
+
],
|
|
196
|
+
closed: true,
|
|
197
|
+
}],
|
|
198
|
+
external: true,
|
|
199
|
+
}],
|
|
200
|
+
solid: false,
|
|
201
|
+
pattern: Some("ANSI37".into()),
|
|
202
|
+
pattern_scale: 1.0,
|
|
203
|
+
pattern_angle: 0.0,
|
|
204
|
+
normal: Vec3::Z,
|
|
205
|
+
});
|
|
206
|
+
let doc = document(vec![hatch]);
|
|
207
|
+
let expected = render_all_layers(&doc, &SvgOptions::default());
|
|
208
|
+
assert!(expected.contains("<defs>"));
|
|
209
|
+
let options = SvgOptions::default().with_max_output_bytes(expected.len());
|
|
210
|
+
assert_eq!(
|
|
211
|
+
render_bounded(&doc, &options, true).expect("exact hatch budget"),
|
|
212
|
+
expected
|
|
213
|
+
);
|
|
214
|
+
assert_output_limit(render_bounded(
|
|
215
|
+
&doc,
|
|
216
|
+
&options.with_max_output_bytes(expected.len() - 1),
|
|
217
|
+
true,
|
|
218
|
+
));
|
|
219
|
+
}
|