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.
Files changed (194) hide show
  1. {pycadkit-0.5.0 → pycadkit-0.5.2}/Cargo.lock +13 -13
  2. {pycadkit-0.5.0 → pycadkit-0.5.2}/Cargo.toml +10 -10
  3. {pycadkit-0.5.0 → pycadkit-0.5.2}/PKG-INFO +17 -6
  4. pycadkit-0.5.2/README.md +41 -0
  5. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit/Cargo.toml +1 -1
  6. pycadkit-0.5.2/crates/cadkit/README.md +47 -0
  7. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit/src/lib.rs +14 -0
  8. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/Cargo.toml +1 -1
  9. pycadkit-0.5.2/crates/cadkit-core/README.md +29 -0
  10. pycadkit-0.5.2/crates/cadkit-core/src/svg/bounded_tests.rs +219 -0
  11. pycadkit-0.5.2/crates/cadkit-core/src/svg/buffer.rs +143 -0
  12. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/svg.rs +412 -96
  13. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/README.md +13 -0
  14. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/Cargo.toml +1 -1
  15. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/README.md +2 -1
  16. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/lib.rs +3 -2
  17. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-py/Cargo.toml +1 -1
  18. pycadkit-0.5.2/crates/cadkit-py/README.md +41 -0
  19. {pycadkit-0.5.0 → pycadkit-0.5.2}/pyproject.toml +1 -1
  20. pycadkit-0.5.0/README.md +0 -30
  21. pycadkit-0.5.0/crates/cadkit/README.md +0 -29
  22. pycadkit-0.5.0/crates/cadkit-core/README.md +0 -16
  23. pycadkit-0.5.0/crates/cadkit-py/README.md +0 -30
  24. {pycadkit-0.5.0 → pycadkit-0.5.2}/LICENSE-APACHE +0 -0
  25. {pycadkit-0.5.0 → pycadkit-0.5.2}/LICENSE-MIT +0 -0
  26. {pycadkit-0.5.0 → pycadkit-0.5.2}/NOTICE +0 -0
  27. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit/LICENSE-APACHE +0 -0
  28. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit/LICENSE-MIT +0 -0
  29. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit/NOTICE +0 -0
  30. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit/examples/interchange.rs +0 -0
  31. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit/src/prelude.rs +0 -0
  32. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/LICENSE-APACHE +0 -0
  33. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/LICENSE-MIT +0 -0
  34. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/NOTICE +0 -0
  35. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/aci.rs +0 -0
  36. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/bytes.rs +0 -0
  37. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/doc_ops.rs +0 -0
  38. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/error.rs +0 -0
  39. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/export.rs +0 -0
  40. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/geom.rs +0 -0
  41. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/geom_ops.rs +0 -0
  42. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/lib.rs +0 -0
  43. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/model.rs +0 -0
  44. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/model_builders.rs +0 -0
  45. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/ops.rs +0 -0
  46. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/options.rs +0 -0
  47. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/polygon.rs +0 -0
  48. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/text.rs +0 -0
  49. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/src/units.rs +0 -0
  50. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-core/tests/schema.rs +0 -0
  51. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/Cargo.toml +0 -0
  52. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/LICENSE-APACHE +0 -0
  53. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/LICENSE-MIT +0 -0
  54. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/NOTICE +0 -0
  55. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/examples/dgn_summary.rs +0 -0
  56. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/examples/raster_structure.rs +0 -0
  57. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/budget.rs +0 -0
  58. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/cfb.rs +0 -0
  59. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/fuzz_tests.rs +0 -0
  60. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/le.rs +0 -0
  61. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/level_names.rs +0 -0
  62. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/lib.rs +0 -0
  63. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/map/mod.rs +0 -0
  64. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/map/v7.rs +0 -0
  65. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/map/v8.rs +0 -0
  66. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/native/decode_v8.rs +0 -0
  67. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/native/element.rs +0 -0
  68. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/native/linkage.rs +0 -0
  69. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/native/mod.rs +0 -0
  70. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/native/v7.rs +0 -0
  71. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/native/v8.rs +0 -0
  72. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/palette.rs +0 -0
  73. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/symbology.rs +0 -0
  74. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/text.rs +0 -0
  75. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/container.rs +0 -0
  76. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/encode.rs +0 -0
  77. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/mod.rs +0 -0
  78. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/named.rs +0 -0
  79. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/polyline.rs +0 -0
  80. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/raster.rs +0 -0
  81. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/raster_builtin.rs +0 -0
  82. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/raster_template.rs +0 -0
  83. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/seed_prepare.rs +0 -0
  84. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/tables.rs +0 -0
  85. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/tests/application.rs +0 -0
  86. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/tests/dictionary.rs +0 -0
  87. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/tests/microstation.rs +0 -0
  88. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/tests/raster.rs +0 -0
  89. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/tests/raster_template.rs +0 -0
  90. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/tests/regressions.rs +0 -0
  91. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/tests/text.rs +0 -0
  92. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/tests.rs +0 -0
  93. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/writer/text.rs +0 -0
  94. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/src/zlib.rs +0 -0
  95. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/tests/common/mod.rs +0 -0
  96. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/tests/private_corpus.rs +0 -0
  97. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/tests/private_dictionary.rs +0 -0
  98. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/tests/robustness.rs +0 -0
  99. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/tests/v7_corpus.rs +0 -0
  100. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/tests/v8_oracle.rs +0 -0
  101. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/tests/v8_public.rs +0 -0
  102. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dgn/tests/v8_range.rs +0 -0
  103. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/LICENSE-APACHE +0 -0
  104. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/LICENSE-MIT +0 -0
  105. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/NOTICE +0 -0
  106. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/examples/docsummary.rs +0 -0
  107. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/examples/dwgdump.rs +0 -0
  108. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/bits.rs +0 -0
  109. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/classes.rs +0 -0
  110. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/codepage.rs +0 -0
  111. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/container/lz77_r2004.rs +0 -0
  112. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/container/lz77_r2007.rs +0 -0
  113. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/container/mod.rs +0 -0
  114. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/container/r13.rs +0 -0
  115. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/container/r2004.rs +0 -0
  116. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/container/r2007.rs +0 -0
  117. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/container/reed_solomon.rs +0 -0
  118. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/crc.rs +0 -0
  119. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/handles.rs +0 -0
  120. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/header.rs +0 -0
  121. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/mapping/entity.rs +0 -0
  122. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/mapping/mod.rs +0 -0
  123. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/native/entities.rs +0 -0
  124. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/native/mod.rs +0 -0
  125. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/object/annotation.rs +0 -0
  126. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/object/curves.rs +0 -0
  127. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/object/entities.rs +0 -0
  128. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/object/hatch.rs +0 -0
  129. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/object/misc.rs +0 -0
  130. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/object/mod.rs +0 -0
  131. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/object/registry.rs +0 -0
  132. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/object/tables.rs +0 -0
  133. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/reader.rs +0 -0
  134. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/src/version.rs +0 -0
  135. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/tests/corpus.rs +0 -0
  136. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/tests/oracle.rs +0 -0
  137. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dwg/tests/robustness.rs +0 -0
  138. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/Cargo.toml +0 -0
  139. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/LICENSE-APACHE +0 -0
  140. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/LICENSE-MIT +0 -0
  141. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/NOTICE +0 -0
  142. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/README.md +0 -0
  143. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/examples/dump.rs +0 -0
  144. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/lib.rs +0 -0
  145. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/native/mod.rs +0 -0
  146. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/native/text.rs +0 -0
  147. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/ocs.rs +0 -0
  148. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/reader/common.rs +0 -0
  149. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/reader/entities.rs +0 -0
  150. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/reader/hatch.rs +0 -0
  151. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/reader/mod.rs +0 -0
  152. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/reader/records.rs +0 -0
  153. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/reader/tables.rs +0 -0
  154. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/writer/curves.rs +0 -0
  155. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/writer/entities.rs +0 -0
  156. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/writer/mod.rs +0 -0
  157. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/src/writer/out.rs +0 -0
  158. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/tests/ascii_vs_binary.rs +0 -0
  159. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/tests/common/mod.rs +0 -0
  160. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/tests/compare_reader_with_ezdxf.py +0 -0
  161. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/tests/review_fixes.rs +0 -0
  162. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/tests/robustness.rs +0 -0
  163. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/tests/roundtrip.rs +0 -0
  164. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/tests/synthetic_read.rs +0 -0
  165. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/tests/synthetic_write.rs +0 -0
  166. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-dxf/tests/validate_with_ezdxf.py +0 -0
  167. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/Cargo.toml +0 -0
  168. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/LICENSE-APACHE +0 -0
  169. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/LICENSE-MIT +0 -0
  170. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/NOTICE +0 -0
  171. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/README.md +0 -0
  172. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/src/curves.rs +0 -0
  173. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/src/export.rs +0 -0
  174. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/src/geometry.rs +0 -0
  175. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/src/lib.rs +0 -0
  176. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/src/mapping.rs +0 -0
  177. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/src/native.rs +0 -0
  178. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/src/tkgm.rs +0 -0
  179. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/src/validate.rs +0 -0
  180. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/src/xml.rs +0 -0
  181. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/tests/roundtrip.rs +0 -0
  182. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/tests/support/export_cases.rs +0 -0
  183. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-gml/tests/support/tkgm_cases.rs +0 -0
  184. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-py/LICENSE-APACHE +0 -0
  185. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-py/LICENSE-MIT +0 -0
  186. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-py/NOTICE +0 -0
  187. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-py/src/lib.rs +0 -0
  188. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-py/tests/conftest.py +0 -0
  189. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-py/tests/test_cadkit.py +0 -0
  190. {pycadkit-0.5.0 → pycadkit-0.5.2}/crates/cadkit-py/tests/test_citygml.py +0 -0
  191. {pycadkit-0.5.0 → pycadkit-0.5.2}/python/cadkit/__init__.py +0 -0
  192. {pycadkit-0.5.0 → pycadkit-0.5.2}/python/cadkit/__init__.pyi +0 -0
  193. {pycadkit-0.5.0 → pycadkit-0.5.2}/python/cadkit/_cadkit.pyi +0 -0
  194. {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.0"
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.0"
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.0"
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.0"
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.0"
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.0"
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.0"
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.0"
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.0"
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.0"
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.0"
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.0"
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.0"
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.0"
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.0" }
18
- cadkit-scene = { path = "crates/cadkit-scene", version = "0.5.0" }
19
- cadkit-gpu = { path = "crates/cadkit-gpu", version = "0.5.0" }
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.0" }
24
- cadkit-dgn = { path = "crates/cadkit-dgn", version = "0.5.0", default-features = false }
25
- cadkit-dwg = { path = "crates/cadkit-dwg", version = "0.5.0" }
26
- cadkit-dxf = { path = "crates/cadkit-dxf", version = "0.5.0" }
27
- cadkit-gml = { path = "crates/cadkit-gml", version = "0.5.0" }
28
- cadkit = { path = "crates/cadkit", version = "0.5.0" }
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.0
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: Read DWG, DGN, DXF and CityGML into one format-neutral model; write DXF, DGN V8 and CityGML (pure Rust, no vendor SDK).
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 bindings for [cadkit](https://github.com/TNYCL/cadkit): read DWG, DGN (V7 and V8),
39
- DXF and CityGML 2.0 into one format-neutral model, and write SVG, JSON, DXF, seed-based
40
- DGN V8 and CityGML 2.0. The parsers are written in Rust; there is no vendor SDK, and one
41
- wheel per platform serves Python 3.9 and newer.
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
@@ -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 = "Read DWG, DGN, DXF and CityGML into one format-neutral model; write DXF, DGN V8 and CityGML. Pure Rust, no vendor SDK."
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 = "Format-neutral CAD drawing model, bounded binary readers and SVG export for cadkit."
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
+ }