pycadkit 0.2.0__tar.gz → 0.2.1__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 (175) hide show
  1. {pycadkit-0.2.0 → pycadkit-0.2.1}/Cargo.lock +10 -10
  2. {pycadkit-0.2.0 → pycadkit-0.2.1}/Cargo.toml +7 -7
  3. {pycadkit-0.2.0 → pycadkit-0.2.1}/PKG-INFO +1 -1
  4. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/writer/encode.rs +26 -12
  5. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/writer/mod.rs +84 -35
  6. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/writer/tables.rs +73 -2
  7. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/writer/tests/application.rs +43 -0
  8. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/writer/tests/raster.rs +1 -1
  9. pycadkit-0.2.1/crates/cadkit-dgn/src/writer/tests/text.rs +358 -0
  10. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/writer/text.rs +34 -1
  11. pycadkit-0.2.0/crates/cadkit-dgn/src/writer/tests/text.rs +0 -113
  12. {pycadkit-0.2.0 → pycadkit-0.2.1}/LICENSE-APACHE +0 -0
  13. {pycadkit-0.2.0 → pycadkit-0.2.1}/LICENSE-MIT +0 -0
  14. {pycadkit-0.2.0 → pycadkit-0.2.1}/NOTICE +0 -0
  15. {pycadkit-0.2.0 → pycadkit-0.2.1}/README.md +0 -0
  16. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit/Cargo.toml +0 -0
  17. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit/LICENSE-APACHE +0 -0
  18. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit/LICENSE-MIT +0 -0
  19. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit/NOTICE +0 -0
  20. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit/README.md +0 -0
  21. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit/examples/interchange.rs +0 -0
  22. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit/src/lib.rs +0 -0
  23. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-core/Cargo.toml +0 -0
  24. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-core/LICENSE-APACHE +0 -0
  25. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-core/LICENSE-MIT +0 -0
  26. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-core/NOTICE +0 -0
  27. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-core/README.md +0 -0
  28. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-core/src/aci.rs +0 -0
  29. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-core/src/bytes.rs +0 -0
  30. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-core/src/error.rs +0 -0
  31. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-core/src/export.rs +0 -0
  32. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-core/src/geom.rs +0 -0
  33. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-core/src/geom_ops.rs +0 -0
  34. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-core/src/lib.rs +0 -0
  35. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-core/src/model.rs +0 -0
  36. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-core/src/ops.rs +0 -0
  37. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-core/src/options.rs +0 -0
  38. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-core/src/polygon.rs +0 -0
  39. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-core/src/svg.rs +0 -0
  40. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-core/src/text.rs +0 -0
  41. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-core/src/units.rs +0 -0
  42. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/Cargo.toml +0 -0
  43. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/LICENSE-APACHE +0 -0
  44. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/LICENSE-MIT +0 -0
  45. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/NOTICE +0 -0
  46. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/README.md +0 -0
  47. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/examples/dgn_summary.rs +0 -0
  48. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/examples/raster_structure.rs +0 -0
  49. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/budget.rs +0 -0
  50. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/cfb.rs +0 -0
  51. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/fuzz_tests.rs +0 -0
  52. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/le.rs +0 -0
  53. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/level_names.rs +0 -0
  54. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/lib.rs +0 -0
  55. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/map/mod.rs +0 -0
  56. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/map/v7.rs +0 -0
  57. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/map/v8.rs +0 -0
  58. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/native/decode_v8.rs +0 -0
  59. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/native/element.rs +0 -0
  60. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/native/linkage.rs +0 -0
  61. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/native/mod.rs +0 -0
  62. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/native/v7.rs +0 -0
  63. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/native/v8.rs +0 -0
  64. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/palette.rs +0 -0
  65. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/text.rs +0 -0
  66. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/writer/container.rs +0 -0
  67. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/writer/polyline.rs +0 -0
  68. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/writer/raster.rs +0 -0
  69. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/writer/tests/regressions.rs +0 -0
  70. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/writer/tests.rs +0 -0
  71. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/src/zlib.rs +0 -0
  72. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/tests/common/mod.rs +0 -0
  73. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/tests/private_corpus.rs +0 -0
  74. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/tests/robustness.rs +0 -0
  75. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/tests/v7_corpus.rs +0 -0
  76. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/tests/v8_oracle.rs +0 -0
  77. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dgn/tests/v8_public.rs +0 -0
  78. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/Cargo.toml +0 -0
  79. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/LICENSE-APACHE +0 -0
  80. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/LICENSE-MIT +0 -0
  81. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/NOTICE +0 -0
  82. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/README.md +0 -0
  83. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/examples/docsummary.rs +0 -0
  84. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/examples/dwgdump.rs +0 -0
  85. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/bits.rs +0 -0
  86. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/classes.rs +0 -0
  87. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/codepage.rs +0 -0
  88. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/container/lz77_r2004.rs +0 -0
  89. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/container/lz77_r2007.rs +0 -0
  90. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/container/mod.rs +0 -0
  91. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/container/r13.rs +0 -0
  92. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/container/r2004.rs +0 -0
  93. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/container/r2007.rs +0 -0
  94. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/container/reed_solomon.rs +0 -0
  95. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/crc.rs +0 -0
  96. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/handles.rs +0 -0
  97. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/header.rs +0 -0
  98. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/lib.rs +0 -0
  99. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/mapping/entity.rs +0 -0
  100. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/mapping/mod.rs +0 -0
  101. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/native/entities.rs +0 -0
  102. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/native/mod.rs +0 -0
  103. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/object/annotation.rs +0 -0
  104. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/object/curves.rs +0 -0
  105. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/object/entities.rs +0 -0
  106. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/object/hatch.rs +0 -0
  107. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/object/misc.rs +0 -0
  108. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/object/mod.rs +0 -0
  109. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/object/registry.rs +0 -0
  110. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/object/tables.rs +0 -0
  111. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/reader.rs +0 -0
  112. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/src/version.rs +0 -0
  113. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/tests/corpus.rs +0 -0
  114. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/tests/oracle.rs +0 -0
  115. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dwg/tests/robustness.rs +0 -0
  116. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/Cargo.toml +0 -0
  117. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/LICENSE-APACHE +0 -0
  118. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/LICENSE-MIT +0 -0
  119. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/NOTICE +0 -0
  120. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/README.md +0 -0
  121. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/examples/dump.rs +0 -0
  122. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/src/lib.rs +0 -0
  123. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/src/native/mod.rs +0 -0
  124. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/src/native/text.rs +0 -0
  125. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/src/ocs.rs +0 -0
  126. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/src/reader/common.rs +0 -0
  127. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/src/reader/entities.rs +0 -0
  128. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/src/reader/hatch.rs +0 -0
  129. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/src/reader/mod.rs +0 -0
  130. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/src/reader/records.rs +0 -0
  131. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/src/reader/tables.rs +0 -0
  132. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/src/writer/curves.rs +0 -0
  133. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/src/writer/entities.rs +0 -0
  134. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/src/writer/mod.rs +0 -0
  135. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/src/writer/out.rs +0 -0
  136. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/tests/ascii_vs_binary.rs +0 -0
  137. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/tests/common/mod.rs +0 -0
  138. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/tests/compare_reader_with_ezdxf.py +0 -0
  139. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/tests/review_fixes.rs +0 -0
  140. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/tests/robustness.rs +0 -0
  141. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/tests/roundtrip.rs +0 -0
  142. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/tests/synthetic_read.rs +0 -0
  143. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/tests/synthetic_write.rs +0 -0
  144. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-dxf/tests/validate_with_ezdxf.py +0 -0
  145. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-gml/Cargo.toml +0 -0
  146. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-gml/LICENSE-APACHE +0 -0
  147. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-gml/LICENSE-MIT +0 -0
  148. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-gml/NOTICE +0 -0
  149. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-gml/README.md +0 -0
  150. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-gml/src/curves.rs +0 -0
  151. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-gml/src/export.rs +0 -0
  152. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-gml/src/geometry.rs +0 -0
  153. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-gml/src/lib.rs +0 -0
  154. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-gml/src/mapping.rs +0 -0
  155. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-gml/src/native.rs +0 -0
  156. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-gml/src/tkgm.rs +0 -0
  157. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-gml/src/validate.rs +0 -0
  158. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-gml/src/xml.rs +0 -0
  159. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-gml/tests/roundtrip.rs +0 -0
  160. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-gml/tests/support/export_cases.rs +0 -0
  161. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-gml/tests/support/tkgm_cases.rs +0 -0
  162. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-py/Cargo.toml +0 -0
  163. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-py/LICENSE-APACHE +0 -0
  164. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-py/LICENSE-MIT +0 -0
  165. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-py/NOTICE +0 -0
  166. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-py/README.md +0 -0
  167. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-py/src/lib.rs +0 -0
  168. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-py/tests/conftest.py +0 -0
  169. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-py/tests/test_cadkit.py +0 -0
  170. {pycadkit-0.2.0 → pycadkit-0.2.1}/crates/cadkit-py/tests/test_citygml.py +0 -0
  171. {pycadkit-0.2.0 → pycadkit-0.2.1}/pyproject.toml +0 -0
  172. {pycadkit-0.2.0 → pycadkit-0.2.1}/python/cadkit/__init__.py +0 -0
  173. {pycadkit-0.2.0 → pycadkit-0.2.1}/python/cadkit/__init__.pyi +0 -0
  174. {pycadkit-0.2.0 → pycadkit-0.2.1}/python/cadkit/_cadkit.pyi +0 -0
  175. {pycadkit-0.2.0 → pycadkit-0.2.1}/python/cadkit/py.typed +0 -0
@@ -66,7 +66,7 @@ checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
66
66
 
67
67
  [[package]]
68
68
  name = "cadkit"
69
- version = "0.2.0"
69
+ version = "0.2.1"
70
70
  dependencies = [
71
71
  "cadkit-core",
72
72
  "cadkit-dgn",
@@ -78,7 +78,7 @@ dependencies = [
78
78
 
79
79
  [[package]]
80
80
  name = "cadkit-capi"
81
- version = "0.2.0"
81
+ version = "0.2.1"
82
82
  dependencies = [
83
83
  "cadkit",
84
84
  "serde",
@@ -87,7 +87,7 @@ dependencies = [
87
87
 
88
88
  [[package]]
89
89
  name = "cadkit-cli"
90
- version = "0.2.0"
90
+ version = "0.2.1"
91
91
  dependencies = [
92
92
  "cadkit",
93
93
  "clap",
@@ -96,7 +96,7 @@ dependencies = [
96
96
 
97
97
  [[package]]
98
98
  name = "cadkit-core"
99
- version = "0.2.0"
99
+ version = "0.2.1"
100
100
  dependencies = [
101
101
  "serde",
102
102
  "serde_json",
@@ -105,7 +105,7 @@ dependencies = [
105
105
 
106
106
  [[package]]
107
107
  name = "cadkit-dgn"
108
- version = "0.2.0"
108
+ version = "0.2.1"
109
109
  dependencies = [
110
110
  "cadkit-core",
111
111
  "cfb",
@@ -116,7 +116,7 @@ dependencies = [
116
116
 
117
117
  [[package]]
118
118
  name = "cadkit-dwg"
119
- version = "0.2.0"
119
+ version = "0.2.1"
120
120
  dependencies = [
121
121
  "cadkit-core",
122
122
  "cadkit-dxf",
@@ -126,7 +126,7 @@ dependencies = [
126
126
 
127
127
  [[package]]
128
128
  name = "cadkit-dxf"
129
- version = "0.2.0"
129
+ version = "0.2.1"
130
130
  dependencies = [
131
131
  "cadkit-core",
132
132
  "encoding_rs",
@@ -135,7 +135,7 @@ dependencies = [
135
135
 
136
136
  [[package]]
137
137
  name = "cadkit-gml"
138
- version = "0.2.0"
138
+ version = "0.2.1"
139
139
  dependencies = [
140
140
  "cadkit-core",
141
141
  "quick-xml",
@@ -145,7 +145,7 @@ dependencies = [
145
145
 
146
146
  [[package]]
147
147
  name = "cadkit-py"
148
- version = "0.2.0"
148
+ version = "0.2.1"
149
149
  dependencies = [
150
150
  "cadkit",
151
151
  "pyo3",
@@ -155,7 +155,7 @@ dependencies = [
155
155
 
156
156
  [[package]]
157
157
  name = "cadkit-wasm"
158
- version = "0.2.0"
158
+ version = "0.2.1"
159
159
  dependencies = [
160
160
  "cadkit",
161
161
  "js-sys",
@@ -4,7 +4,7 @@ members = ["crates/*"]
4
4
  exclude = ["fuzz"]
5
5
 
6
6
  [workspace.package]
7
- version = "0.2.0"
7
+ version = "0.2.1"
8
8
  edition = "2024"
9
9
  rust-version = "1.85"
10
10
  license = "MIT OR Apache-2.0"
@@ -14,12 +14,12 @@ keywords = ["cad", "dwg", "dgn", "dxf", "citygml"]
14
14
  categories = ["parser-implementations", "graphics", "encoding", "science::geo"]
15
15
 
16
16
  [workspace.dependencies]
17
- cadkit-core = { path = "crates/cadkit-core", version = "0.2.0" }
18
- cadkit-dgn = { path = "crates/cadkit-dgn", version = "0.2.0" }
19
- cadkit-dwg = { path = "crates/cadkit-dwg", version = "0.2.0" }
20
- cadkit-dxf = { path = "crates/cadkit-dxf", version = "0.2.0" }
21
- cadkit-gml = { path = "crates/cadkit-gml", version = "0.2.0" }
22
- cadkit = { path = "crates/cadkit", version = "0.2.0" }
17
+ cadkit-core = { path = "crates/cadkit-core", version = "0.2.1" }
18
+ cadkit-dgn = { path = "crates/cadkit-dgn", version = "0.2.1" }
19
+ cadkit-dwg = { path = "crates/cadkit-dwg", version = "0.2.1" }
20
+ cadkit-dxf = { path = "crates/cadkit-dxf", version = "0.2.1" }
21
+ cadkit-gml = { path = "crates/cadkit-gml", version = "0.2.1" }
22
+ cadkit = { path = "crates/cadkit", version = "0.2.1" }
23
23
  serde = { version = "1", features = ["derive"] }
24
24
  serde_json = "1"
25
25
  thiserror = "2"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pycadkit
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Intended Audience :: Science/Research
@@ -1,7 +1,7 @@
1
1
  //! Belgelenmiş V8 öğe alanlarının sınır denetimli kodlayıcısı.
2
2
 
3
3
  use crate::native::v8::ModelHeader;
4
- use cadkit_core::{Entity, Error, Lineweight, Point3, Result, Value, Vec3};
4
+ use cadkit_core::{Entity, Error, Point3, Result, Value, Vec3};
5
5
 
6
6
  pub(super) fn put(b: &mut [u8], offset: usize, value: &[u8]) -> Result<()> {
7
7
  let end = offset
@@ -62,6 +62,7 @@ pub(super) fn prefix(kind: u32, size: usize, id: u64, level: u32, time: f64) ->
62
62
  Ok(b)
63
63
  }
64
64
 
65
+ #[allow(clippy::too_many_arguments)]
65
66
  pub(super) fn header(
66
67
  kind: u32,
67
68
  size: usize,
@@ -70,6 +71,7 @@ pub(super) fn header(
70
71
  time: f64,
71
72
  entity: &Entity,
72
73
  three: bool,
74
+ weight: u32,
73
75
  ) -> Result<Vec<u8>> {
74
76
  let mut b = prefix(kind | 0x1000_0000, size, id, level, time)?;
75
77
  let hole = matches!(entity.props.get("dgn.hole"), Some(Value::Bool(true)));
@@ -99,17 +101,6 @@ pub(super) fn header(
99
101
  u32::try_from(*n).map_err(|_| Error::invalid(0, "DGN style"))?,
100
102
  )?;
101
103
  }
102
- let weight = match entity.props.get("dgn.weight") {
103
- Some(Value::Int(n)) => u32::try_from(*n).map_err(|_| Error::invalid(0, "DGN weight"))?,
104
- _ => match entity.lineweight {
105
- Lineweight::Millimeters(_) => {
106
- return Err(Error::Unsupported(
107
- "DGN lineweight requires dgn.weight index".into(),
108
- ));
109
- }
110
- _ => 0,
111
- },
112
- };
113
104
  u32_at(&mut b, 0x30, weight)?;
114
105
  Ok(b)
115
106
  }
@@ -160,6 +151,29 @@ pub(super) fn range(b: &mut [u8], points: &[[f64; 3]]) -> Result<()> {
160
151
  Ok(())
161
152
  }
162
153
 
154
+ /// Absolute bounds for generated records; type-17 stores a relative high span.
155
+ pub(super) fn absolute_range(b: &[u8]) -> Result<[[i64; 3]; 2]> {
156
+ let text = crate::le::u32_at(b, 0).is_some_and(|kind| kind & 0xffff == 17);
157
+ let mut low = [0; 3];
158
+ let mut high = [0; 3];
159
+ for (axis, (lo, hi)) in low.iter_mut().zip(high.iter_mut()).enumerate() {
160
+ *lo = crate::le::i64_at(b, 0x38 + axis * 8)
161
+ .ok_or_else(|| Error::invalid(0, "short DGN record range"))?;
162
+ let stored_high = crate::le::i64_at(b, 0x50 + axis * 8)
163
+ .ok_or_else(|| Error::invalid(0, "short DGN record range"))?;
164
+ *hi = if text {
165
+ if stored_high < 0 {
166
+ return Err(Error::invalid(0, "negative DGN text range span"));
167
+ }
168
+ lo.checked_add(stored_high)
169
+ .ok_or_else(|| Error::invalid(0, "DGN text range high overflow"))?
170
+ } else {
171
+ stored_high
172
+ };
173
+ }
174
+ Ok([low, high])
175
+ }
176
+
163
177
  pub(super) fn utf16(value: &str) -> Result<Vec<u8>> {
164
178
  if value.contains('\0') {
165
179
  return Err(Error::invalid(0, "embedded NUL in DGN string"));
@@ -203,15 +203,24 @@ pub fn write_v8(doc: &Document, seed: &[u8], options: &WriteOptions) -> Result<V
203
203
  }
204
204
  let max_id = max_id.max(le::u64_at(&seed_header.data, 0x128).unwrap_or(0));
205
205
  let rasters = raster::Preserved::prepare(doc, seed, model, &read, options)?;
206
+ let mut tables = Tables::new(
207
+ native
208
+ .named_pages
209
+ .iter()
210
+ .flat_map(|p| p.elements.iter().cloned()),
211
+ max_id,
212
+ &read,
213
+ )?;
214
+ tables.observe_model_fonts(
215
+ model
216
+ .graphic_pages
217
+ .iter()
218
+ .chain(&model.control_pages)
219
+ .flat_map(|p| &p.elements),
220
+ &read,
221
+ );
206
222
  let mut state = State {
207
- tables: Tables::new(
208
- native
209
- .named_pages
210
- .iter()
211
- .flat_map(|p| p.elements.iter().cloned()),
212
- max_id,
213
- &read,
214
- )?,
223
+ tables,
215
224
  model: header,
216
225
  options,
217
226
  wide_tags: wide_integer_tags(&source.entities),
@@ -315,9 +324,14 @@ pub fn write_v8(doc: &Document, seed: &[u8], options: &WriteOptions) -> Result<V
315
324
  let mut low = [i64::MAX; 3];
316
325
  let mut high = [i64::MIN; 3];
317
326
  for b in &records {
318
- for (i, (lo, hi)) in low.iter_mut().zip(high.iter_mut()).enumerate() {
319
- *lo = (*lo).min(le::i64_at(b, 0x38 + i * 8).unwrap_or(0));
320
- *hi = (*hi).max(le::i64_at(b, 0x50 + i * 8).unwrap_or(0));
327
+ let [record_low, record_high] = absolute_range(b)?;
328
+ for ((lo, hi), (record_lo, record_hi)) in low
329
+ .iter_mut()
330
+ .zip(high.iter_mut())
331
+ .zip(record_low.into_iter().zip(record_high))
332
+ {
333
+ *lo = (*lo).min(record_lo);
334
+ *hi = (*hi).max(record_hi);
321
335
  }
322
336
  }
323
337
  if records.is_empty() {
@@ -470,7 +484,8 @@ impl State<'_> {
470
484
  entity: &Entity,
471
485
  three: bool,
472
486
  ) -> Result<Vec<u8>> {
473
- let mut b = encode::header(kind, size, id, level, time, entity, three)?;
487
+ let weight = self.lineweight(entity)?;
488
+ let mut b = encode::header(kind, size, id, level, time, entity, three, weight)?;
474
489
  if !entity.props.contains_key("dgn.color_index") {
475
490
  use cadkit_core::Color;
476
491
  let color = if entity.color == Color::ByLayer {
@@ -513,6 +528,52 @@ impl State<'_> {
513
528
  Ok(b)
514
529
  }
515
530
 
531
+ fn lineweight(&self, entity: &Entity) -> Result<u32> {
532
+ fn native(props: &cadkit_core::Props) -> Result<Option<u32>> {
533
+ match props.get("dgn.weight") {
534
+ Some(Value::Int(n)) => {
535
+ let weight = u32::try_from(*n)
536
+ .map_err(|_| Error::invalid(0, "DGN weight must be a nonnegative index"))?;
537
+ if weight > 31 {
538
+ return Err(Error::Unsupported("DGN lineweight indexes above 31".into()));
539
+ }
540
+ Ok(Some(weight))
541
+ }
542
+ Some(_) => Err(Error::invalid(0, "DGN weight must be an integer index")),
543
+ None => Ok(None),
544
+ }
545
+ }
546
+ if let Some(weight) = native(&entity.props)? {
547
+ return Ok(weight);
548
+ }
549
+ let weight = if entity.lineweight == cadkit_core::Lineweight::ByLayer {
550
+ match self
551
+ .layers
552
+ .iter()
553
+ .find(|layer| Some(layer.name.as_str()) == entity.layer.as_deref())
554
+ {
555
+ Some(layer) => {
556
+ if let Some(weight) = native(&layer.props)? {
557
+ return Ok(weight);
558
+ }
559
+ layer.lineweight
560
+ }
561
+ None => cadkit_core::Lineweight::Default,
562
+ }
563
+ } else {
564
+ entity.lineweight
565
+ };
566
+ match weight {
567
+ cadkit_core::Lineweight::Millimeters(_) => Err(Error::Unsupported(
568
+ "DGN lineweight needs an explicit entity/layer dgn.weight index; millimeter mapping is display-dependent".into(),
569
+ )),
570
+ cadkit_core::Lineweight::ByBlock => Err(Error::Unsupported(
571
+ "resolve ByBlock lineweight before DGN export".into(),
572
+ )),
573
+ cadkit_core::Lineweight::Default | cadkit_core::Lineweight::ByLayer => Ok(0),
574
+ }
575
+ }
576
+
516
577
  fn add(&mut self, b: Vec<u8>, tag: bool) -> Result<()> {
517
578
  self.bytes = self.bytes.saturating_add(b.len() as u64);
518
579
  if self.bytes > self.options.limits.max_decompressed_bytes
@@ -820,17 +881,7 @@ impl State<'_> {
820
881
  {
821
882
  return Err(Error::invalid(0, "invalid text dimensions or normal"));
822
883
  }
823
- let font = match e.props.get("dgn.font_number") {
824
- Some(Value::Int(n)) => {
825
- u32::try_from(*n).map_err(|_| Error::invalid(0, "invalid DGN font"))?
826
- }
827
- _ => match style {
828
- Some(name) => *self.tables.fonts.get(name).ok_or_else(|| {
829
- Error::Unsupported("text font is absent from seed".into())
830
- })?,
831
- None => self.tables.fonts.values().next().copied().unwrap_or(0),
832
- },
833
- };
884
+ let font = self.tables.font(e, style.as_deref())?;
834
885
  let (justification, fx, fy) = text::justification(e, *halign, *valign)?;
835
886
  let length = text::length(e, value, *height * *width_factor, fx)?;
836
887
  let (x, y, n) = cadkit_core::geom_ops::arbitrary_axes(*normal);
@@ -879,7 +930,14 @@ impl State<'_> {
879
930
  rotation(&mut b, 0x90, a, c, n, three)?;
880
931
  point(&mut b, if three { 0xb0 } else { 0x98 }, origin, three)?;
881
932
  put(&mut b, offset, &value)?;
882
- range(&mut b, &[origin])?;
933
+ text::range(
934
+ &mut b,
935
+ origin,
936
+ a,
937
+ c,
938
+ length * self.model.uor_per_master,
939
+ height * self.model.uor_per_master,
940
+ )?;
883
941
  links.extend(self.codepage_link()?);
884
942
  b
885
943
  }
@@ -1074,17 +1132,8 @@ impl State<'_> {
1074
1132
  }
1075
1133
  let mut corners = vec![];
1076
1134
  for child in self.records.get(first..).unwrap_or(&[]) {
1077
- let p = [
1078
- le::i64_at(child, 0x38).unwrap_or(0) as f64,
1079
- le::i64_at(child, 0x40).unwrap_or(0) as f64,
1080
- le::i64_at(child, 0x48).unwrap_or(0) as f64,
1081
- ];
1082
- let q = [
1083
- le::i64_at(child, 0x50).unwrap_or(0) as f64,
1084
- le::i64_at(child, 0x58).unwrap_or(0) as f64,
1085
- le::i64_at(child, 0x60).unwrap_or(0) as f64,
1086
- ];
1087
- corners.extend([p, q]);
1135
+ let [low, high] = absolute_range(child)?;
1136
+ corners.extend([low.map(|v| v as f64), high.map(|v| v as f64)]);
1088
1137
  }
1089
1138
  if let Some(parent) = self.records.get_mut(index) {
1090
1139
  range(parent, &corners)?;
@@ -6,8 +6,8 @@ use crate::native::{
6
6
  element::{ElementData, TagDef, TagSetData, TagValue},
7
7
  v8::RawElement,
8
8
  };
9
- use cadkit_core::{Attribute, Error, Result, Value};
10
- use std::collections::{BTreeMap, HashSet};
9
+ use cadkit_core::{Attribute, Entity, Error, Result, Value};
10
+ use std::collections::{BTreeMap, BTreeSet, HashSet};
11
11
 
12
12
  pub(super) struct Tables {
13
13
  pub records: Vec<Vec<u8>>,
@@ -16,6 +16,7 @@ pub(super) struct Tables {
16
16
  pub levels: BTreeMap<String, u32>,
17
17
  pub sets: BTreeMap<Option<String>, (u64, TagSetData)>,
18
18
  pub last_id: u64,
19
+ referenced_fonts: BTreeSet<u32>,
19
20
  max_level: u32,
20
21
  level_template: Option<Vec<u8>>,
21
22
  tag_set_template: Option<Vec<u8>>,
@@ -34,6 +35,7 @@ impl Tables {
34
35
  levels: BTreeMap::new(),
35
36
  sets: BTreeMap::new(),
36
37
  last_id,
38
+ referenced_fonts: BTreeSet::new(),
37
39
  max_level: 0,
38
40
  level_template: None,
39
41
  tag_set_template: None,
@@ -79,6 +81,28 @@ impl Tables {
79
81
  }
80
82
  Ok(out)
81
83
  }
84
+ pub fn observe_model_fonts<'a>(
85
+ &mut self,
86
+ records: impl Iterator<Item = &'a RawElement>,
87
+ read: &cadkit_core::ReadOptions,
88
+ ) {
89
+ for raw in records {
90
+ let font = match decode_v8::decode(
91
+ raw,
92
+ crate::text::encoding_for(read.fallback_codepage.as_deref()),
93
+ &read.limits,
94
+ )
95
+ .data
96
+ {
97
+ ElementData::Text(text) => Some(text.font),
98
+ ElementData::TextNode(text) => Some(text.font),
99
+ _ => None,
100
+ };
101
+ if let Some(font) = font {
102
+ self.referenced_fonts.insert(font);
103
+ }
104
+ }
105
+ }
82
106
  pub fn id(&mut self) -> Result<u64> {
83
107
  self.last_id = self
84
108
  .last_id
@@ -113,6 +137,53 @@ impl Tables {
113
137
  self.levels.insert(name.into(), level);
114
138
  Ok(level)
115
139
  }
140
+
141
+ pub fn font(&self, entity: &Entity, style: Option<&str>) -> Result<u32> {
142
+ let explicit = match entity.props.get("dgn.font_number") {
143
+ Some(Value::Int(n)) => {
144
+ Some(u32::try_from(*n).map_err(|_| Error::invalid(0, "invalid DGN font number"))?)
145
+ }
146
+ Some(_) => return Err(Error::invalid(0, "DGN font number must be an integer")),
147
+ None => None,
148
+ };
149
+ let known = |number| {
150
+ number == 0
151
+ || self.fonts.values().any(|n| *n == number)
152
+ || self.referenced_fonts.contains(&number)
153
+ };
154
+ let named = match style {
155
+ Some(name) => Some(
156
+ self.fonts
157
+ .get(name)
158
+ .copied()
159
+ .or_else(|| {
160
+ name.strip_prefix("DGN_FONT_")?
161
+ .parse()
162
+ .ok()
163
+ .filter(|n| known(*n))
164
+ })
165
+ .ok_or_else(|| {
166
+ Error::Unsupported("text font style is absent from seed".into())
167
+ })?,
168
+ ),
169
+ None => None,
170
+ };
171
+ if let Some(number) = explicit {
172
+ // Font zero is the existing implicit fallback. A seed can also reference
173
+ // an external RSC font in its graphics without a named table definition.
174
+ // Do not accept unreferenced foreign indexes merely because they are small.
175
+ if !known(number) {
176
+ return Err(Error::Unsupported(
177
+ "text font number is absent from seed".into(),
178
+ ));
179
+ }
180
+ if named.is_some_and(|n| n != number) {
181
+ return Err(Error::invalid(0, "DGN font number and style name disagree"));
182
+ }
183
+ return Ok(number);
184
+ }
185
+ Ok(named.unwrap_or_else(|| self.fonts.values().next().copied().unwrap_or(0)))
186
+ }
116
187
  pub fn tag(&mut self, attribute: &Attribute) -> Result<(u64, u16, u16)> {
117
188
  let name = &attribute.set;
118
189
  let value_type = match attribute.value {
@@ -106,3 +106,46 @@ fn new_then_edited_geometry_unicode_labels_and_identifier_types() {
106
106
  assert!((position.y - 4.).abs() < 1e-8);
107
107
  }
108
108
  }
109
+
110
+ #[test]
111
+ fn bylayer_lineweight_resolves_explicit_native_layer_index() {
112
+ let mut entity = line();
113
+ entity.layer = Some("Synthetic layer".into());
114
+ let mut source = document(false, vec![entity]);
115
+ let mut layer = cadkit_core::Layer {
116
+ name: "Synthetic layer".into(),
117
+ lineweight: cadkit_core::Lineweight::Millimeters(0.25),
118
+ ..Default::default()
119
+ };
120
+ layer.props.insert("dgn.weight".into(), Value::Int(3));
121
+ source.layers.push(layer);
122
+ let blank = seed(false);
123
+ let weight = |source: &Document| {
124
+ let bytes = write_v8(source, &blank, &WriteOptions::default()).unwrap();
125
+ let parsed = crate::read(&bytes, &ReadOptions::default()).unwrap();
126
+ parsed.models[0].entities[0].props["dgn.weight"].clone()
127
+ };
128
+ assert_eq!(weight(&source), Value::Int(3));
129
+ source.models[0].entities[0]
130
+ .props
131
+ .insert("dgn.weight".into(), Value::Int(7));
132
+ assert_eq!(weight(&source), Value::Int(7));
133
+ source.models[0].entities[0].props.remove("dgn.weight");
134
+ source.models[0].entities[0].lineweight = cadkit_core::Lineweight::Default;
135
+ assert_eq!(weight(&source), Value::Int(0));
136
+ source.models[0].entities[0].lineweight = cadkit_core::Lineweight::ByBlock;
137
+ assert!(write_v8(&source, &blank, &WriteOptions::default()).is_err());
138
+ source.models[0].entities[0].lineweight = cadkit_core::Lineweight::ByLayer;
139
+ source.layers[0].props.remove("dgn.weight");
140
+ assert!(write_v8(&source, &blank, &WriteOptions::default()).is_err());
141
+ for invalid in [
142
+ Value::Int(-1),
143
+ Value::Int(32),
144
+ Value::Int(i64::from(u32::MAX)),
145
+ Value::Float(3.),
146
+ Value::Text("3".into()),
147
+ ] {
148
+ source.layers[0].props.insert("dgn.weight".into(), invalid);
149
+ assert!(write_v8(&source, &blank, &WriteOptions::default()).is_err());
150
+ }
151
+ }
@@ -3,7 +3,7 @@
3
3
  use super::*;
4
4
 
5
5
  fn raster_seed() -> Vec<u8> {
6
- let mut frame = header(94, 0x400, 100, 0, 0., &line(), false).unwrap();
6
+ let mut frame = header(94, 0x400, 100, 0, 0., &line(), false, 0).unwrap();
7
7
  let matrix = [
8
8
  1., 0., 0., 1000., 0., 1., 0., 2000., 0., 0., 1., 0., 0., 0., 0., 1.,
9
9
  ];