pycadkit 0.3.1__tar.gz → 0.3.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 (178) hide show
  1. {pycadkit-0.3.1 → pycadkit-0.3.2}/Cargo.lock +10 -10
  2. {pycadkit-0.3.1 → pycadkit-0.3.2}/Cargo.toml +7 -7
  3. {pycadkit-0.3.1 → pycadkit-0.3.2}/PKG-INFO +1 -1
  4. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/writer/tables.rs +42 -4
  5. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/writer/tests/regressions.rs +88 -0
  6. {pycadkit-0.3.1 → pycadkit-0.3.2}/LICENSE-APACHE +0 -0
  7. {pycadkit-0.3.1 → pycadkit-0.3.2}/LICENSE-MIT +0 -0
  8. {pycadkit-0.3.1 → pycadkit-0.3.2}/NOTICE +0 -0
  9. {pycadkit-0.3.1 → pycadkit-0.3.2}/README.md +0 -0
  10. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit/Cargo.toml +0 -0
  11. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit/LICENSE-APACHE +0 -0
  12. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit/LICENSE-MIT +0 -0
  13. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit/NOTICE +0 -0
  14. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit/README.md +0 -0
  15. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit/examples/interchange.rs +0 -0
  16. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit/src/lib.rs +0 -0
  17. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-core/Cargo.toml +0 -0
  18. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-core/LICENSE-APACHE +0 -0
  19. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-core/LICENSE-MIT +0 -0
  20. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-core/NOTICE +0 -0
  21. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-core/README.md +0 -0
  22. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-core/src/aci.rs +0 -0
  23. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-core/src/bytes.rs +0 -0
  24. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-core/src/error.rs +0 -0
  25. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-core/src/export.rs +0 -0
  26. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-core/src/geom.rs +0 -0
  27. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-core/src/geom_ops.rs +0 -0
  28. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-core/src/lib.rs +0 -0
  29. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-core/src/model.rs +0 -0
  30. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-core/src/ops.rs +0 -0
  31. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-core/src/options.rs +0 -0
  32. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-core/src/polygon.rs +0 -0
  33. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-core/src/svg.rs +0 -0
  34. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-core/src/text.rs +0 -0
  35. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-core/src/units.rs +0 -0
  36. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/Cargo.toml +0 -0
  37. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/LICENSE-APACHE +0 -0
  38. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/LICENSE-MIT +0 -0
  39. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/NOTICE +0 -0
  40. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/README.md +0 -0
  41. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/examples/dgn_summary.rs +0 -0
  42. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/examples/raster_structure.rs +0 -0
  43. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/budget.rs +0 -0
  44. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/cfb.rs +0 -0
  45. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/fuzz_tests.rs +0 -0
  46. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/le.rs +0 -0
  47. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/level_names.rs +0 -0
  48. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/lib.rs +0 -0
  49. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/map/mod.rs +0 -0
  50. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/map/v7.rs +0 -0
  51. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/map/v8.rs +0 -0
  52. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/native/decode_v8.rs +0 -0
  53. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/native/element.rs +0 -0
  54. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/native/linkage.rs +0 -0
  55. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/native/mod.rs +0 -0
  56. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/native/v7.rs +0 -0
  57. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/native/v8.rs +0 -0
  58. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/palette.rs +0 -0
  59. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/text.rs +0 -0
  60. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/writer/container.rs +0 -0
  61. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/writer/encode.rs +0 -0
  62. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/writer/mod.rs +0 -0
  63. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/writer/polyline.rs +0 -0
  64. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/writer/raster.rs +0 -0
  65. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/writer/raster_template.rs +0 -0
  66. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/writer/tests/application.rs +0 -0
  67. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/writer/tests/microstation.rs +0 -0
  68. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/writer/tests/raster.rs +0 -0
  69. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/writer/tests/raster_template.rs +0 -0
  70. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/writer/tests/text.rs +0 -0
  71. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/writer/tests.rs +0 -0
  72. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/writer/text.rs +0 -0
  73. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/src/zlib.rs +0 -0
  74. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/tests/common/mod.rs +0 -0
  75. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/tests/private_corpus.rs +0 -0
  76. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/tests/robustness.rs +0 -0
  77. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/tests/v7_corpus.rs +0 -0
  78. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/tests/v8_oracle.rs +0 -0
  79. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/tests/v8_public.rs +0 -0
  80. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dgn/tests/v8_range.rs +0 -0
  81. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/Cargo.toml +0 -0
  82. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/LICENSE-APACHE +0 -0
  83. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/LICENSE-MIT +0 -0
  84. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/NOTICE +0 -0
  85. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/README.md +0 -0
  86. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/examples/docsummary.rs +0 -0
  87. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/examples/dwgdump.rs +0 -0
  88. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/bits.rs +0 -0
  89. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/classes.rs +0 -0
  90. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/codepage.rs +0 -0
  91. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/container/lz77_r2004.rs +0 -0
  92. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/container/lz77_r2007.rs +0 -0
  93. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/container/mod.rs +0 -0
  94. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/container/r13.rs +0 -0
  95. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/container/r2004.rs +0 -0
  96. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/container/r2007.rs +0 -0
  97. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/container/reed_solomon.rs +0 -0
  98. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/crc.rs +0 -0
  99. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/handles.rs +0 -0
  100. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/header.rs +0 -0
  101. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/lib.rs +0 -0
  102. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/mapping/entity.rs +0 -0
  103. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/mapping/mod.rs +0 -0
  104. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/native/entities.rs +0 -0
  105. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/native/mod.rs +0 -0
  106. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/object/annotation.rs +0 -0
  107. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/object/curves.rs +0 -0
  108. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/object/entities.rs +0 -0
  109. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/object/hatch.rs +0 -0
  110. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/object/misc.rs +0 -0
  111. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/object/mod.rs +0 -0
  112. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/object/registry.rs +0 -0
  113. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/object/tables.rs +0 -0
  114. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/reader.rs +0 -0
  115. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/src/version.rs +0 -0
  116. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/tests/corpus.rs +0 -0
  117. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/tests/oracle.rs +0 -0
  118. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dwg/tests/robustness.rs +0 -0
  119. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/Cargo.toml +0 -0
  120. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/LICENSE-APACHE +0 -0
  121. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/LICENSE-MIT +0 -0
  122. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/NOTICE +0 -0
  123. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/README.md +0 -0
  124. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/examples/dump.rs +0 -0
  125. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/src/lib.rs +0 -0
  126. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/src/native/mod.rs +0 -0
  127. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/src/native/text.rs +0 -0
  128. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/src/ocs.rs +0 -0
  129. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/src/reader/common.rs +0 -0
  130. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/src/reader/entities.rs +0 -0
  131. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/src/reader/hatch.rs +0 -0
  132. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/src/reader/mod.rs +0 -0
  133. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/src/reader/records.rs +0 -0
  134. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/src/reader/tables.rs +0 -0
  135. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/src/writer/curves.rs +0 -0
  136. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/src/writer/entities.rs +0 -0
  137. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/src/writer/mod.rs +0 -0
  138. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/src/writer/out.rs +0 -0
  139. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/tests/ascii_vs_binary.rs +0 -0
  140. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/tests/common/mod.rs +0 -0
  141. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/tests/compare_reader_with_ezdxf.py +0 -0
  142. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/tests/review_fixes.rs +0 -0
  143. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/tests/robustness.rs +0 -0
  144. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/tests/roundtrip.rs +0 -0
  145. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/tests/synthetic_read.rs +0 -0
  146. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/tests/synthetic_write.rs +0 -0
  147. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-dxf/tests/validate_with_ezdxf.py +0 -0
  148. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-gml/Cargo.toml +0 -0
  149. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-gml/LICENSE-APACHE +0 -0
  150. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-gml/LICENSE-MIT +0 -0
  151. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-gml/NOTICE +0 -0
  152. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-gml/README.md +0 -0
  153. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-gml/src/curves.rs +0 -0
  154. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-gml/src/export.rs +0 -0
  155. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-gml/src/geometry.rs +0 -0
  156. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-gml/src/lib.rs +0 -0
  157. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-gml/src/mapping.rs +0 -0
  158. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-gml/src/native.rs +0 -0
  159. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-gml/src/tkgm.rs +0 -0
  160. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-gml/src/validate.rs +0 -0
  161. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-gml/src/xml.rs +0 -0
  162. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-gml/tests/roundtrip.rs +0 -0
  163. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-gml/tests/support/export_cases.rs +0 -0
  164. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-gml/tests/support/tkgm_cases.rs +0 -0
  165. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-py/Cargo.toml +0 -0
  166. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-py/LICENSE-APACHE +0 -0
  167. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-py/LICENSE-MIT +0 -0
  168. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-py/NOTICE +0 -0
  169. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-py/README.md +0 -0
  170. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-py/src/lib.rs +0 -0
  171. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-py/tests/conftest.py +0 -0
  172. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-py/tests/test_cadkit.py +0 -0
  173. {pycadkit-0.3.1 → pycadkit-0.3.2}/crates/cadkit-py/tests/test_citygml.py +0 -0
  174. {pycadkit-0.3.1 → pycadkit-0.3.2}/pyproject.toml +0 -0
  175. {pycadkit-0.3.1 → pycadkit-0.3.2}/python/cadkit/__init__.py +0 -0
  176. {pycadkit-0.3.1 → pycadkit-0.3.2}/python/cadkit/__init__.pyi +0 -0
  177. {pycadkit-0.3.1 → pycadkit-0.3.2}/python/cadkit/_cadkit.pyi +0 -0
  178. {pycadkit-0.3.1 → pycadkit-0.3.2}/python/cadkit/py.typed +0 -0
@@ -66,7 +66,7 @@ checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
66
66
 
67
67
  [[package]]
68
68
  name = "cadkit"
69
- version = "0.3.1"
69
+ version = "0.3.2"
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.3.1"
81
+ version = "0.3.2"
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.3.1"
90
+ version = "0.3.2"
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.3.1"
99
+ version = "0.3.2"
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.3.1"
108
+ version = "0.3.2"
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.3.1"
119
+ version = "0.3.2"
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.3.1"
129
+ version = "0.3.2"
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.3.1"
138
+ version = "0.3.2"
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.3.1"
148
+ version = "0.3.2"
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.3.1"
158
+ version = "0.3.2"
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.3.1"
7
+ version = "0.3.2"
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.3.1" }
18
- cadkit-dgn = { path = "crates/cadkit-dgn", version = "0.3.1" }
19
- cadkit-dwg = { path = "crates/cadkit-dwg", version = "0.3.1" }
20
- cadkit-dxf = { path = "crates/cadkit-dxf", version = "0.3.1" }
21
- cadkit-gml = { path = "crates/cadkit-gml", version = "0.3.1" }
22
- cadkit = { path = "crates/cadkit", version = "0.3.1" }
17
+ cadkit-core = { path = "crates/cadkit-core", version = "0.3.2" }
18
+ cadkit-dgn = { path = "crates/cadkit-dgn", version = "0.3.2" }
19
+ cadkit-dwg = { path = "crates/cadkit-dwg", version = "0.3.2" }
20
+ cadkit-dxf = { path = "crates/cadkit-dxf", version = "0.3.2" }
21
+ cadkit-gml = { path = "crates/cadkit-gml", version = "0.3.2" }
22
+ cadkit = { path = "crates/cadkit", version = "0.3.2" }
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.3.1
3
+ Version: 0.3.2
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Intended Audience :: Science/Research
@@ -42,12 +42,50 @@ impl Tables {
42
42
  changed_sets: BTreeMap::new(),
43
43
  };
44
44
  let mut level_names = HashSet::new();
45
- for raw in records {
46
- let e = decode_v8::decode(
47
- &raw,
45
+ let read_record = |raw: &RawElement| {
46
+ decode_v8::decode(
47
+ raw,
48
48
  crate::text::encoding_for(read.fallback_codepage.as_deref()),
49
49
  &read.limits,
50
- );
50
+ )
51
+ };
52
+ let records: Vec<RawElement> = records.collect();
53
+ // Some seeds (files a 3D post-processor touched) carry a second level table
54
+ // whose codes repeat codes of the first one. Elements store the code only, so
55
+ // a repeated code makes readers show new elements on the other table's level.
56
+ // Later definitions of a code move to free codes after the highest one, and the
57
+ // extra table headers are dropped: the output has one table with unique codes.
58
+ let mut free_level = records
59
+ .iter()
60
+ .filter_map(|raw| match read_record(raw).data {
61
+ ElementData::Level(level) => Some(level.id),
62
+ _ => None,
63
+ })
64
+ .max()
65
+ .unwrap_or(0);
66
+ let mut level_codes = HashSet::new();
67
+ let mut level_header = false;
68
+ for mut raw in records {
69
+ let is_level_header = crate::le::u32_at(&raw.bytes, 0).map(|v| v & 0xffff) == Some(96)
70
+ && crate::le::u32_at(&raw.bytes, 12) == Some(1);
71
+ if is_level_header {
72
+ if level_header {
73
+ continue;
74
+ }
75
+ level_header = true;
76
+ }
77
+ let mut e = read_record(&raw);
78
+ if let ElementData::Level(level) = &mut e.data
79
+ && !level_codes.insert(level.id)
80
+ && crate::le::u32_at(&raw.bytes, 0x20) == Some(level.id)
81
+ {
82
+ free_level = free_level
83
+ .checked_add(1)
84
+ .ok_or_else(|| Error::LimitExceeded("DGN levels".into()))?;
85
+ u32_at(&mut raw.bytes, 0x20, free_level)?;
86
+ level.id = free_level;
87
+ level_codes.insert(free_level);
88
+ }
51
89
  match e.data {
52
90
  ElementData::Font { number, name } => {
53
91
  out.fonts.insert(name, number);
@@ -297,3 +297,91 @@ fn literal_names_cannot_collide_with_generated_level_aliases() {
297
297
  (2, Some("Shared")),
298
298
  ]);
299
299
  }
300
+
301
+ /// A seed whose second level table (as left by a 3D post-processor) repeats the codes of
302
+ /// the first one: elements written on a first-table level must read back on that level.
303
+ #[test]
304
+ fn a_second_level_table_with_repeated_codes_cannot_capture_new_elements() {
305
+ let level = |id: u64, code: u32, name: &str| {
306
+ let mut b = prefix(95, 0x30, id, 1, 0.).unwrap();
307
+ u32_at(&mut b, 0x20, code).unwrap();
308
+ u32_at(&mut b, 0x24, u32::MAX).unwrap();
309
+ finish(b, &string_link(1, name).unwrap()).unwrap()
310
+ };
311
+ let header = |id: u64, count: u32| {
312
+ let mut b = prefix(96, 0x28, id, 1, 0.).unwrap();
313
+ u32_at(&mut b, 0x20, count).unwrap();
314
+ finish(b, &[]).unwrap()
315
+ };
316
+ let first = vec![
317
+ header(90, 3),
318
+ level(100, 1, "Frame"),
319
+ level(101, 2, "Area"),
320
+ level(102, 64, "Default"),
321
+ ];
322
+ let second = vec![
323
+ header(200, 2),
324
+ level(201, 1, "Temp"),
325
+ level(202, 2, "Surface"),
326
+ ];
327
+ let mut file = ::cfb::CompoundFile::open(Cursor::new(seed(false))).unwrap();
328
+ file.create_storage_all("Dgn^Nm").unwrap();
329
+ for (path, records) in [("Dgn^Nm/$1", &first), ("Dgn^Nm/$2", &second)] {
330
+ file.create_stream(path)
331
+ .unwrap()
332
+ .write_all(&page(records, 3, 1).unwrap())
333
+ .unwrap();
334
+ }
335
+ file.flush().unwrap();
336
+ let seed = file.into_inner().into_inner();
337
+
338
+ let mut doc = crate::read(&seed, &ReadOptions::default()).unwrap();
339
+ doc.models[0].entities = ["Frame", "Area"]
340
+ .into_iter()
341
+ .map(|name| {
342
+ let mut entity = line();
343
+ entity.layer = Some(name.into());
344
+ entity
345
+ })
346
+ .collect();
347
+ let bytes = write_v8(&doc, &seed, &WriteOptions::default()).unwrap();
348
+ let parsed = crate::read(&bytes, &ReadOptions::default()).unwrap();
349
+ let layers: Vec<_> = parsed.models[0]
350
+ .entities
351
+ .iter()
352
+ .map(|e| e.layer.clone().unwrap())
353
+ .collect();
354
+ assert_eq!(layers, ["Frame", "Area"]);
355
+
356
+ let native = v8::read(&bytes, &ReadOptions::default()).unwrap();
357
+ let records: Vec<_> = native
358
+ .named_pages
359
+ .iter()
360
+ .flat_map(|p| &p.elements)
361
+ .collect();
362
+ let headers: Vec<_> = records
363
+ .iter()
364
+ .filter(|e| {
365
+ crate::le::u32_at(&e.bytes, 0).map(|n| n & 0xffff) == Some(96)
366
+ && crate::le::u32_at(&e.bytes, 12) == Some(1)
367
+ })
368
+ .collect();
369
+ assert_eq!(headers.len(), 1, "one level table");
370
+ let codes: Vec<_> = records
371
+ .iter()
372
+ .filter(|e| e.type_code() == 95 && crate::le::u32_at(&e.bytes, 12) == Some(1))
373
+ .filter_map(|e| crate::le::u32_at(&e.bytes, 0x20))
374
+ .collect();
375
+ let unique: BTreeSet<_> = codes.iter().collect();
376
+ assert_eq!(
377
+ unique.len(),
378
+ codes.len(),
379
+ "level codes are unique: {codes:?}"
380
+ );
381
+ assert_eq!(
382
+ crate::le::u32_at(&headers[0].bytes, 0x20),
383
+ Some(codes.len() as u32)
384
+ );
385
+ // The second table's levels are kept under fresh codes.
386
+ assert!(parsed.layers.iter().any(|l| l.name.starts_with("Temp")));
387
+ }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes