draftwright 0.4.27__tar.gz → 0.4.29__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 (618) hide show
  1. {draftwright-0.4.27 → draftwright-0.4.29}/CHANGELOG.md +268 -0
  2. {draftwright-0.4.27 → draftwright-0.4.29}/PKG-INFO +13 -3
  3. {draftwright-0.4.27 → draftwright-0.4.29}/README.md +10 -0
  4. {draftwright-0.4.27 → draftwright-0.4.29}/docs/reference/recogniser-capabilities.md +26 -3
  5. {draftwright-0.4.27 → draftwright-0.4.29}/docs/reference/sheet.md +59 -1
  6. {draftwright-0.4.27 → draftwright-0.4.29}/pyproject.toml +3 -3
  7. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/_core.py +298 -30
  8. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/analysis.py +76 -13
  9. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/annotations/_common.py +127 -36
  10. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/annotations/balloons.py +5 -4
  11. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/annotations/from_model.py +453 -167
  12. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/annotations/holes.py +57 -38
  13. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/annotations/leaders.py +18 -11
  14. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/annotations/orchestrator.py +49 -18
  15. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/annotations/sections.py +22 -10
  16. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/builder.py +243 -102
  17. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/cli.py +73 -2
  18. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/compose.py +166 -44
  19. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/drawing.py +179 -32
  20. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/evaluation/step_analysis.py +13 -3
  21. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/export.py +11 -3
  22. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/feature_identity.py +17 -0
  23. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/inspection_contract.py +1 -1
  24. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/__init__.py +6 -0
  25. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/_registry.py +24 -0
  26. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/circular_blind_step_coverage.py +3 -25
  27. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/coverage.py +111 -0
  28. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/evidence.py +19 -0
  29. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/hole_coverage.py +38 -6
  30. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/pmi_coverage.py +91 -0
  31. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/quality.py +32 -0
  32. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/requirements.py +19 -3
  33. draftwright-0.4.29/src/draftwright/linting/section_recess_coverage.py +402 -0
  34. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/structural.py +204 -8
  35. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/model/__init__.py +8 -0
  36. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/model/compiled.py +194 -46
  37. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/model/declare.py +17 -0
  38. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/model/detect.py +33 -2
  39. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/model/ir.py +130 -8
  40. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/model/planner.py +80 -2
  41. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/pmi.py +29 -0
  42. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/recognition_ownership.py +76 -0
  43. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/repair.py +9 -4
  44. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/section_recess_contract.py +265 -1
  45. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/sheet.py +58 -9
  46. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/sheet_emit.py +206 -23
  47. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/README.md +6 -1
  48. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/corpus-hole-patterns-v1.json +4 -4
  49. draftwright-0.4.29/tests/fixtures/evaluation/pattern-topology-a.step +1192 -0
  50. draftwright-0.4.29/tests/fixtures/evaluation/pattern-topology-b.step +1192 -0
  51. draftwright-0.4.29/tests/fixtures/issue_1595_whistle_key_frame.step +19649 -0
  52. {draftwright-0.4.27 → draftwright-0.4.29}/tests/refactor_golden/bracket_section.json +45 -14
  53. {draftwright-0.4.27 → draftwright-0.4.29}/tests/refactor_golden/centered_rebate.json +39 -8
  54. {draftwright-0.4.27 → draftwright-0.4.29}/tests/refactor_golden/chamfered.json +33 -2
  55. {draftwright-0.4.27 → draftwright-0.4.29}/tests/refactor_golden/filleted.json +33 -2
  56. {draftwright-0.4.27 → draftwright-0.4.29}/tests/refactor_golden/flange_dense.json +121 -71
  57. {draftwright-0.4.27 → draftwright-0.4.29}/tests/refactor_golden/grid_plate.json +35 -4
  58. {draftwright-0.4.27 → draftwright-0.4.29}/tests/refactor_golden/grooved_shaft.json +39 -8
  59. draftwright-0.4.29/tests/refactor_golden/hex_bar.json +170 -0
  60. {draftwright-0.4.27 → draftwright-0.4.29}/tests/refactor_golden/holed_slot.json +39 -8
  61. {draftwright-0.4.27 → draftwright-0.4.29}/tests/refactor_golden/pocketed.json +29 -22
  62. {draftwright-0.4.27 → draftwright-0.4.29}/tests/refactor_golden/prismatic_ladder.json +29 -22
  63. {draftwright-0.4.27 → draftwright-0.4.29}/tests/refactor_golden/scattered_plate.json +39 -8
  64. {draftwright-0.4.27 → draftwright-0.4.29}/tests/refactor_golden/side_drilled.json +42 -11
  65. {draftwright-0.4.27 → draftwright-0.4.29}/tests/refactor_golden/turned_stepped.json +39 -8
  66. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_add_dimension.py +30 -1
  67. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_adr0018_arrangement_gate.py +13 -0
  68. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_adr0018_view_selection.py +72 -0
  69. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_audit_differential.py +1 -0
  70. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_compiled_plan_boundary.py +14 -3
  71. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_declare.py +7 -1
  72. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_drawing_encapsulation.py +6 -0
  73. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_export_dxf_zoom.py +44 -1
  74. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_export_reproducible.py +39 -18
  75. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_flat_stock_identity.py +14 -9
  76. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_inspection_contract.py +1 -1
  77. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1058_wheel_profile.py +12 -3
  78. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1086_declared_gears.py +5 -5
  79. draftwright-0.4.29/tests/test_issue_1126_requesting_less_never_scores_better.py +99 -0
  80. draftwright-0.4.29/tests/test_issue_1132_turned_profile_span_is_reported.py +174 -0
  81. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1143_hole_completeness.py +5 -1
  82. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1146_scale_completeness.py +6 -2
  83. draftwright-0.4.29/tests/test_issue_1157_no_implicit_general_tolerance.py +140 -0
  84. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1187_unroutable_leaders.py +0 -2
  85. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1215_no_approved_tolerance_is_dropped.py +8 -1
  86. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1217_claimed_representations.py +27 -0
  87. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1217_the_facility_is_shared.py +16 -8
  88. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1246_prismatic_pocket_disposition.py +9 -9
  89. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1296_cylindrical_diameter_pmi.py +11 -0
  90. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1298_manufacturing_requirements.py +5 -0
  91. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1299_page_escalation.py +21 -6
  92. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1308_machined_leader_analytics.py +14 -5
  93. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1333_bounded_ink_repair.py +15 -7
  94. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1338_scale_before_page_escalation.py +7 -7
  95. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1349_precision_display.py +103 -12
  96. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1357_framed_activation.py +6 -4
  97. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1357_plural_turned_profiles.py +12 -8
  98. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1370_hole_pattern_completeness_evidence.py +1 -1
  99. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1396_layout_advisories.py +32 -1
  100. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1438_policy_dispositions.py +1 -1
  101. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1460_step_inspection.py +39 -2
  102. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1466_semantic_sides.py +14 -16
  103. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1536_title_overflow.py +26 -8
  104. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1543_schedule_requirements.py +2 -2
  105. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1544_frame_document_canary.py +87 -27
  106. draftwright-0.4.29/tests/test_issue_1555_turned_recognition_format_invariance.py +84 -0
  107. draftwright-0.4.29/tests/test_issue_1560_envelope_axes.py +69 -0
  108. draftwright-0.4.29/tests/test_issue_1563_sheet_pmi_reconciliation.py +185 -0
  109. draftwright-0.4.29/tests/test_issue_1585_title_block_date.py +183 -0
  110. draftwright-0.4.29/tests/test_issue_1593_title_block_keepout.py +145 -0
  111. draftwright-0.4.29/tests/test_issue_1596_bolt_circle_corroboration.py +452 -0
  112. draftwright-0.4.29/tests/test_issue_1598_hex_pockets.py +388 -0
  113. draftwright-0.4.29/tests/test_issue_1599_duplicate_slot_widths.py +41 -0
  114. draftwright-0.4.29/tests/test_issue_1601_flat_precision.py +47 -0
  115. draftwright-0.4.29/tests/test_issue_1603_cli_output_paths.py +122 -0
  116. draftwright-0.4.29/tests/test_issue_1604_internal_section.py +80 -0
  117. draftwright-0.4.29/tests/test_issue_1612_frame_sergio_coverage.py +32 -0
  118. draftwright-0.4.29/tests/test_issue_1612_sheet_margins.py +210 -0
  119. draftwright-0.4.29/tests/test_issue_1613_circular_channel.py +638 -0
  120. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_740_leader_assignment.py +19 -5
  121. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_909_sloped_profile.py +6 -1
  122. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_label_provenance.py +0 -7
  123. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_layout_cleanliness.py +11 -1
  124. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_lint_structural.py +284 -0
  125. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_location_vocabulary.py +38 -0
  126. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_make_drawing.py +95 -34
  127. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_parameter_id.py +27 -0
  128. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_pmi.py +13 -0
  129. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_private_test_attr_reads.py +2 -2
  130. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_recogniser_capabilities.py +1 -1
  131. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_refactor_golden.py +14 -0
  132. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_render_seam.py +1 -0
  133. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_sheet_emit.py +146 -10
  134. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_sheet_identity_invariant.py +5 -0
  135. draftwright-0.4.27/src/draftwright/linting/section_recess_coverage.py +0 -102
  136. draftwright-0.4.27/tests/fixtures/evaluation/pattern-topology-a.step +0 -1090
  137. draftwright-0.4.27/tests/fixtures/evaluation/pattern-topology-b.step +0 -1090
  138. draftwright-0.4.27/tests/refactor_golden/hex_bar.json +0 -139
  139. {draftwright-0.4.27 → draftwright-0.4.29}/.gitignore +0 -0
  140. {draftwright-0.4.27 → draftwright-0.4.29}/LICENSE +0 -0
  141. {draftwright-0.4.27 → draftwright-0.4.29}/docs/adr/README.md +0 -0
  142. {draftwright-0.4.27 → draftwright-0.4.29}/docs/research/1062-repeating-radial-profile-evidence.md +0 -0
  143. {draftwright-0.4.27 → draftwright-0.4.29}/skills/SKILL.md +0 -0
  144. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/__init__.py +0 -0
  145. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/_build_profile.py +0 -0
  146. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/_geometry.py +0 -0
  147. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/_pmi_part21.py +0 -0
  148. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/_warnings.py +0 -0
  149. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/angular_geometry.py +0 -0
  150. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/annotate.py +0 -0
  151. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/annotations/__init__.py +0 -0
  152. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/annotations/angular.py +0 -0
  153. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/annotations/gears.py +0 -0
  154. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/audit.py +0 -0
  155. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/blend_contract.py +0 -0
  156. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/document.py +0 -0
  157. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/document_evidence.py +0 -0
  158. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/document_input.py +0 -0
  159. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/evaluation/__init__.py +0 -0
  160. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/fits.py +0 -0
  161. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/fonts/IBMPlexMono-Regular.ttf +0 -0
  162. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/fonts/IBMPlexSansCondensed-Regular.ttf +0 -0
  163. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/fonts/LICENSE-IBMPlexMono-OFL.txt +0 -0
  164. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/fonts/LICENSE-IBMPlexSansCondensed-OFL.txt +0 -0
  165. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/fonts/__init__.py +0 -0
  166. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/inspection.py +0 -0
  167. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/intents.py +0 -0
  168. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/layout.py +0 -0
  169. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/angled_step_coverage.py +0 -0
  170. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/angular.py +0 -0
  171. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/blend_coverage.py +0 -0
  172. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/chamfer_coverage.py +0 -0
  173. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/channel_coverage.py +0 -0
  174. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/fillet_coverage.py +0 -0
  175. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/flat_coverage.py +0 -0
  176. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/gear_coverage.py +0 -0
  177. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/groove_coverage.py +0 -0
  178. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/ink_overlap.py +0 -0
  179. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/issues.py +0 -0
  180. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/oriented_slot_coverage.py +0 -0
  181. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/pad_coverage.py +0 -0
  182. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/paired_ramp_step_coverage.py +0 -0
  183. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/passage_coverage.py +0 -0
  184. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/plate_coverage.py +0 -0
  185. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/pocket_coverage.py +0 -0
  186. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/pocket_pattern_coverage.py +0 -0
  187. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/polygonal_boss_coverage.py +0 -0
  188. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/polygonal_stock_coverage.py +0 -0
  189. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/prismatic_pocket_coverage.py +0 -0
  190. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/profiled_bore_coverage.py +0 -0
  191. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/rectangular_blind_slot_coverage.py +0 -0
  192. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/round_bottom_blind_slot_coverage.py +0 -0
  193. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/schedule_evidence.py +0 -0
  194. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/slot_coverage.py +0 -0
  195. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/suggest.py +0 -0
  196. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/through_step_coverage.py +0 -0
  197. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/linting/turned_step_coverage.py +0 -0
  198. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/location_contract.py +0 -0
  199. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/make_drawing.py +0 -0
  200. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/measurement_support.py +0 -0
  201. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/model/callout.py +0 -0
  202. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/model/pmi_lowering.py +0 -0
  203. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/oriented_slot_contract.py +0 -0
  204. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/plate_correspondence.py +0 -0
  205. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/profile_angles.py +0 -0
  206. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/progress.py +0 -0
  207. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/projection.py +0 -0
  208. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/py.typed +0 -0
  209. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/recogniser_contract.py +0 -0
  210. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/recogniser_policy.py +0 -0
  211. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/recogniser_schema.py +0 -0
  212. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/recognition/__init__.py +0 -0
  213. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/recognition_cache.py +0 -0
  214. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/recognition_frame.py +0 -0
  215. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/registry.py +0 -0
  216. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/reporting.py +0 -0
  217. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/score.py +0 -0
  218. {draftwright-0.4.27 → draftwright-0.4.29}/src/draftwright/view_plan.py +0 -0
  219. {draftwright-0.4.27 → draftwright-0.4.29}/tests/_evidence_contract.py +0 -0
  220. {draftwright-0.4.27 → draftwright-0.4.29}/tests/_kernel.py +0 -0
  221. {draftwright-0.4.27 → draftwright-0.4.29}/tests/_layout_sig.py +0 -0
  222. {draftwright-0.4.27 → draftwright-0.4.29}/tests/_mutation_corpus.py +0 -0
  223. {draftwright-0.4.27 → draftwright-0.4.29}/tests/_recogniser_public_contract.py +0 -0
  224. {draftwright-0.4.27 → draftwright-0.4.29}/tests/_section_recess_cases.py +0 -0
  225. {draftwright-0.4.27 → draftwright-0.4.29}/tests/conftest.py +0 -0
  226. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/ap242_single_cylinder_diameter.step +0 -0
  227. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/ambiguous-open-semicircle.step +0 -0
  228. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/blind-hole.step +0 -0
  229. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/chamfer-asymmetric.step +0 -0
  230. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/chamfer-compound.step +0 -0
  231. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/chamfer-overlap.step +0 -0
  232. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/chamfer-plain.step +0 -0
  233. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/chamfer-planar-x.step +0 -0
  234. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/chamfer-planar-y.step +0 -0
  235. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/chamfer-planar-z.step +0 -0
  236. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/chamfer-topology-a.step +0 -0
  237. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/chamfer-topology-b.step +0 -0
  238. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/chamfer-turned.step +0 -0
  239. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/corpus-chamfers-v1.json +0 -0
  240. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/corpus-countersinks-v1.json +0 -0
  241. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/corpus-double-d-bores-v1.json +0 -0
  242. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/corpus-fillets-v1.json +0 -0
  243. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/corpus-flats-v1.json +0 -0
  244. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/corpus-grooves-v1.json +0 -0
  245. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/corpus-plates-v1.json +0 -0
  246. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/corpus-pocket-patterns-v1.json +0 -0
  247. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/corpus-pockets-v1.json +0 -0
  248. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/corpus-polygonal-bosses-v1.json +0 -0
  249. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/corpus-polygonal-stock-v1.json +0 -0
  250. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/corpus-rectangular-pads-v1.json +0 -0
  251. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/corpus-turned-steps-v1.json +0 -0
  252. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/corpus-v1.json +0 -0
  253. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/countersink-deburr.step +0 -0
  254. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/countersink-external-cone.step +0 -0
  255. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/countersink-mixed-pair.step +0 -0
  256. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/countersink-single.step +0 -0
  257. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/countersink-topology-a.step +0 -0
  258. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/countersink-topology-b.step +0 -0
  259. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/double-d-axis-x.step +0 -0
  260. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/double-d-axis-y.step +0 -0
  261. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/double-d-blind.step +0 -0
  262. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/double-d-coaxial-compound.step +0 -0
  263. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/double-d-opposed-blind.step +0 -0
  264. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/double-d-roll-30.step +0 -0
  265. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/double-d-round-bore.step +0 -0
  266. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/double-d-single-z.step +0 -0
  267. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/double-d-topology-a.step +0 -0
  268. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/double-d-topology-b.step +0 -0
  269. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/fillet-compound.step +0 -0
  270. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/fillet-overlap.step +0 -0
  271. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/fillet-plain.step +0 -0
  272. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/fillet-planar-x.step +0 -0
  273. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/fillet-planar-y.step +0 -0
  274. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/fillet-planar-z.step +0 -0
  275. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/fillet-repeated.step +0 -0
  276. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/fillet-topology-a.step +0 -0
  277. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/fillet-topology-b.step +0 -0
  278. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/fillet-turned.step +0 -0
  279. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/flat-coaxial.step +0 -0
  280. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/flat-double-d.step +0 -0
  281. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/flat-lone-d.step +0 -0
  282. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/flat-nonround.step +0 -0
  283. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/flat-slanted-double-d.step +0 -0
  284. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/flat-topology-a.step +0 -0
  285. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/flat-topology-b.step +0 -0
  286. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/groove-compound.step +0 -0
  287. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/groove-lone-x.step +0 -0
  288. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/groove-lone-y.step +0 -0
  289. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/groove-lone-z.step +0 -0
  290. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/groove-monotonic-negative.step +0 -0
  291. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/groove-narrow.step +0 -0
  292. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/groove-topology-a.step +0 -0
  293. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/groove-topology-b.step +0 -0
  294. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pad-compound-equal.step +0 -0
  295. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pad-detached-body-negative.step +0 -0
  296. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pad-full-span-ledge-negative.step +0 -0
  297. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pad-nested-staircase-negative.step +0 -0
  298. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pad-topology-a.step +0 -0
  299. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pad-topology-b.step +0 -0
  300. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pad-x-negative.step +0 -0
  301. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pad-x-positive.step +0 -0
  302. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pad-y-negative.step +0 -0
  303. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pad-y-positive.step +0 -0
  304. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pad-z-negative.step +0 -0
  305. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pad-z-positive.step +0 -0
  306. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pattern-ambiguous.step +0 -0
  307. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pattern-grid.step +0 -0
  308. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/plain-block.step +0 -0
  309. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/plate-compound-equal.step +0 -0
  310. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/plate-cross-topology-a.step +0 -0
  311. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/plate-cross-topology-b.step +0 -0
  312. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/plate-detached-negative.step +0 -0
  313. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/plate-rotational-negative.step +0 -0
  314. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/plate-single-negative.step +0 -0
  315. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/plate-t-xz.step +0 -0
  316. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/plate-t-yz.step +0 -0
  317. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/plate-thick-negative.step +0 -0
  318. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/plate-u-additive.step +0 -0
  319. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/plate-u-cut.step +0 -0
  320. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pocket-compound.step +0 -0
  321. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pocket-edge-anchored.step +0 -0
  322. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pocket-lone.step +0 -0
  323. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pocket-opposed.step +0 -0
  324. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pocket-pattern-ambiguous.step +0 -0
  325. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pocket-pattern-grid.step +0 -0
  326. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pocket-pattern-linear.step +0 -0
  327. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pocket-pattern-pair.step +0 -0
  328. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pocket-pattern-topology-a.step +0 -0
  329. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pocket-pattern-topology-b.step +0 -0
  330. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pocket-prismatic-negative.step +0 -0
  331. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pocket-side.step +0 -0
  332. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pocket-through-negative.step +0 -0
  333. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pocket-topology-a.step +0 -0
  334. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pocket-topology-b.step +0 -0
  335. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/pocket-two-equal.step +0 -0
  336. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-boss-compound-equal.step +0 -0
  337. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-boss-detached-negative.step +0 -0
  338. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-boss-in-plane-rotated.step +0 -0
  339. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-boss-other-protrusions-negative.step +0 -0
  340. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-boss-recess-negative.step +0 -0
  341. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-boss-stock-negative.step +0 -0
  342. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-boss-topology-a.step +0 -0
  343. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-boss-topology-b.step +0 -0
  344. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-boss-x.step +0 -0
  345. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-boss-y.step +0 -0
  346. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-boss-z.step +0 -0
  347. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-stock-compound-negative.step +0 -0
  348. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-stock-cylinder-negative.step +0 -0
  349. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-stock-irregular-negative.step +0 -0
  350. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-stock-octagon-negative.step +0 -0
  351. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-stock-recess-negative.step +0 -0
  352. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-stock-roll17.step +0 -0
  353. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-stock-topology-a.step +0 -0
  354. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-stock-topology-b.step +0 -0
  355. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-stock-translated.step +0 -0
  356. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-stock-x.step +0 -0
  357. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/polygonal-stock-y.step +0 -0
  358. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/topology-a.step +0 -0
  359. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/topology-b.step +0 -0
  360. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/turned-step-axis-x.step +0 -0
  361. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/turned-step-axis-y.step +0 -0
  362. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/turned-step-axis-z.step +0 -0
  363. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/turned-step-compound.step +0 -0
  364. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/turned-step-repeated-lengths.step +0 -0
  365. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/turned-step-through-bore.step +0 -0
  366. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/turned-step-topology-a.step +0 -0
  367. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/turned-step-topology-b.step +0 -0
  368. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/evaluation/turned-step-translated-blind-bore.step +0 -0
  369. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/grm03_thumbwheel_drive_screw.step +0 -0
  370. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/grm03_thumbwheel_drive_screw_ap242_pmi.step +0 -0
  371. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/grm04_drive_plate.step +0 -0
  372. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/if_step_flat_across_cylinder.step +0 -0
  373. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/issue_1058_wheel_rh.step +0 -0
  374. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/issue_1247_angled_blind_step.step +0 -0
  375. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/issue_909_basic_part_design_017_body.step +0 -0
  376. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/issue_915_case_study_2.step +0 -0
  377. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/nist_ctc_01_asme1_ap203.stp +0 -0
  378. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/nist_ctc_01_asme1_ap242.stp +0 -0
  379. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/nist_ctc_02_asme1_ap203.stp +0 -0
  380. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/nist_ctc_02_asme1_ap242.stp +0 -0
  381. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/nist_ctc_03_asme1_ap203.stp +0 -0
  382. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/nist_ctc_03_asme1_ap242.stp +0 -0
  383. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/nist_ctc_04_asme1_ap203.stp +0 -0
  384. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/nist_ctc_04_asme1_ap242.stp +0 -0
  385. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/nist_ctc_05_asme1_ap203.stp +0 -0
  386. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/nist_ctc_05_asme1_ap242.stp +0 -0
  387. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/tuner_jig_blind_obround_pockets.step +0 -0
  388. {draftwright-0.4.27 → draftwright-0.4.29}/tests/fixtures/whistle_frame_reference.step +0 -0
  389. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_adr0018_view_routing.py +0 -0
  390. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_adr_corpus.py +0 -0
  391. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_agents_guide.py +0 -0
  392. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_api_docs.py +0 -0
  393. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_architecture_docs.py +0 -0
  394. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_balloon_ring_standoff.py +0 -0
  395. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_build_profile_harness.py +0 -0
  396. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_carve_free_position_callers.py +0 -0
  397. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_clone_budget.py +0 -0
  398. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_counting_calls.py +0 -0
  399. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_declared_recognition_gate.py +0 -0
  400. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_dense_sheet_canary.py +0 -0
  401. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_deprecation_dates.py +0 -0
  402. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_detect_once.py +0 -0
  403. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_detect_registry.py +0 -0
  404. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_dimension_role_vocabulary.py +0 -0
  405. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_e2e_slice.py +0 -0
  406. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_e2e_standards.py +0 -0
  407. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_export_dxf_curves.py +0 -0
  408. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_external_recognition_boundary.py +0 -0
  409. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_fillets_adjacency.py +0 -0
  410. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_fits.py +0 -0
  411. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_flat_completeness.py +0 -0
  412. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_flat_stock_opposition.py +0 -0
  413. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_gdt_placement.py +0 -0
  414. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_geometry_graph_spike.py +0 -0
  415. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_grid_lattice_convention.py +0 -0
  416. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_import_boundaries.py +0 -0
  417. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_iso_nts_caption_placement.py +0 -0
  418. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1000_envelope_reuse.py +0 -0
  419. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1006_measurement_comparison.py +0 -0
  420. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1073_cross_body_patterns.py +0 -0
  421. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1082_polygonal_stock.py +0 -0
  422. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1116_ap242_hole_tolerance_lowering.py +0 -0
  423. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1130_view_planning_evidence.py +0 -0
  424. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1142_hole_leader_labels.py +0 -0
  425. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1144_transactional_hole_table.py +0 -0
  426. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1147_legibility_pair_aggregation.py +0 -0
  427. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1153_contradictory_dimensions.py +0 -0
  428. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1154_one_owner_per_measurement.py +0 -0
  429. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1155_grm04_sheet_use.py +0 -0
  430. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1166_cross_pass_feature_leaders.py +0 -0
  431. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1176_quality_fidelity.py +0 -0
  432. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1177_angular_dimensions.py +0 -0
  433. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1188_per_view_assignment.py +0 -0
  434. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1190_section_decision.py +0 -0
  435. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1196_deterministic_view_names.py +0 -0
  436. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1202_observed_drawing_consumer.py +0 -0
  437. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1204_multiscale_view_issues.py +0 -0
  438. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1209_linear_pmi_witnesses.py +0 -0
  439. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1215_envelope_tolerance.py +0 -0
  440. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1216_callout_reservation_measures_ink.py +0 -0
  441. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1216_pairwise_across_scale_groups.py +0 -0
  442. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1219_location_claims_its_own_axis.py +0 -0
  443. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1229_ledger_member_keying.py +0 -0
  444. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1240_iso_above_strip_visibility.py +0 -0
  445. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1245_passage_disposition.py +0 -0
  446. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1247_angled_step_disposition.py +0 -0
  447. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1254_turned_chamfers.py +0 -0
  448. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1260_view_constraints.py +0 -0
  449. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1262_automatic_turned_views.py +0 -0
  450. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1276_turned_leader_targets.py +0 -0
  451. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1281_turned_fillets.py +0 -0
  452. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1312_engine_costs.py +0 -0
  453. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1325_nominal_agreement.py +0 -0
  454. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1332_overlap_remedy.py +0 -0
  455. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1332_zone_labels.py +0 -0
  456. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1334_prevent_ink.py +0 -0
  457. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1336_grm03_ap242_pmi_fixture.py +0 -0
  458. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1350_detected_takeover.py +0 -0
  459. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1351_structured_note_coverage.py +0 -0
  460. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1352_searchable_pdf_text.py +0 -0
  461. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1353_cnc_authoritative_workflow.py +0 -0
  462. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1357_framed_boundary.py +0 -0
  463. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1357_pmi_frame.py +0 -0
  464. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1360_thread_depth.py +0 -0
  465. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1369_hole_completeness_evidence.py +0 -0
  466. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1370_countersink_completeness_evidence.py +0 -0
  467. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1370_double_d_completeness_evidence.py +0 -0
  468. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1371_flat_completeness_evidence.py +0 -0
  469. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1371_polygonal_stock_completeness_evidence.py +0 -0
  470. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1372_groove_completeness_evidence.py +0 -0
  471. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1372_pad_completeness_evidence.py +0 -0
  472. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1372_pocket_completeness_evidence.py +0 -0
  473. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1372_pocket_pattern_completeness_evidence.py +0 -0
  474. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1372_polygonal_boss_completeness_evidence.py +0 -0
  475. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1373_plate_completeness_evidence.py +0 -0
  476. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1374_chamfer_completeness_evidence.py +0 -0
  477. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1374_fillet_completeness_evidence.py +0 -0
  478. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1374_turned_step_completeness_evidence.py +0 -0
  479. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1378_diameter_leader_targets.py +0 -0
  480. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1382_046_step_inventory.py +0 -0
  481. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1382_circular_blind_step_semantics.py +0 -0
  482. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1382_framed_step_family_evidence.py +0 -0
  483. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1382_paired_ramp_semantics.py +0 -0
  484. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1382_through_step_semantics.py +0 -0
  485. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1390_sheet_registration.py +0 -0
  486. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1392_recognisers_048.py +0 -0
  487. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1395_degenerate_iso_region.py +0 -0
  488. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1397_unverifiable_requirement_message.py +0 -0
  489. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1421_rectangular_blind_slot_completeness.py +0 -0
  490. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1421_rectangular_blind_slot_semantics.py +0 -0
  491. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1421_round_bottom_blind_slot_completeness.py +0 -0
  492. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1421_round_bottom_blind_slot_semantics.py +0 -0
  493. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1432_adoption.py +0 -0
  494. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1432_boundary_failures.py +0 -0
  495. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1432_oriented_slot_semantics.py +0 -0
  496. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1433_blend_semantics.py +0 -0
  497. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1438_boss_ownership.py +0 -0
  498. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1438_channel_ownership.py +0 -0
  499. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1438_cli_report_sidecar.py +0 -0
  500. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1438_generation_snapshot.py +0 -0
  501. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1438_nested_ownership.py +0 -0
  502. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1438_occurrence_ownership.py +0 -0
  503. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1438_pattern_ownership.py +0 -0
  504. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1438_plate_ownership.py +0 -0
  505. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1438_report_projection.py +0 -0
  506. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1438_report_writer.py +0 -0
  507. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1438_through_step_ownership.py +0 -0
  508. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1438_turned_step_ownership.py +0 -0
  509. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1450_boss_blend_ownership.py +0 -0
  510. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1466_dimension_options.py +0 -0
  511. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1471_boundary_failures.py +0 -0
  512. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1471_evidence_schema.py +0 -0
  513. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1471_groove_profile.py +0 -0
  514. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1471_section_recess_contract.py +0 -0
  515. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1471_section_recess_pockets.py +0 -0
  516. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1479_radius_leader_targets.py +0 -0
  517. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1485_curved_pockets.py +0 -0
  518. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1485_quiddity_024_boundary.py +0 -0
  519. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1485_rounded_pockets.py +0 -0
  520. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1504_angle_patterns.py +0 -0
  521. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1504_angular_references.py +0 -0
  522. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1504_angular_rendering.py +0 -0
  523. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1504_canonical_angles.py +0 -0
  524. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1504_profile_angles.py +0 -0
  525. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1505_diameter_coverage.py +0 -0
  526. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1505_short_axial_chains.py +0 -0
  527. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1511_turned_boss_heights.py +0 -0
  528. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1514_projection_safeguard.py +0 -0
  529. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1515_first_angle.py +0 -0
  530. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1516_dimension_text.py +0 -0
  531. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1517_through_indicator.py +0 -0
  532. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1518_explicit_rear.py +0 -0
  533. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1524_tolerance_magnitude.py +0 -0
  534. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1530_section_provenance.py +0 -0
  535. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1531_semantic_hole_counts.py +0 -0
  536. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1532_authored_section_examples.py +0 -0
  537. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1533_review_diagnostics.py +0 -0
  538. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1534_build_progress.py +0 -0
  539. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1542_applicability.py +0 -0
  540. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1542_catalog.py +0 -0
  541. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1542_catalog_families.py +0 -0
  542. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1542_claim_authority.py +0 -0
  543. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1542_document.py +0 -0
  544. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1542_document_claims.py +0 -0
  545. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1542_document_coverage.py +0 -0
  546. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1542_document_report.py +0 -0
  547. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1542_report_authority.py +0 -0
  548. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1542_requirement_carriers.py +0 -0
  549. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_1543_feature_schedules.py +0 -0
  550. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_367_leader_ink.py +0 -0
  551. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_443_grm03_axial_coverage.py +0 -0
  552. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_563_placement_intent.py +0 -0
  553. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_676_polygonal_boss.py +0 -0
  554. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_676_polygonal_boss_declare.py +0 -0
  555. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_798_floor_cardinality.py +0 -0
  556. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_798_material_field.py +0 -0
  557. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_798_silhouette_lint.py +0 -0
  558. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_827_real_part_canary.py +0 -0
  559. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_883_location_identity.py +0 -0
  560. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_885_prismatic_coverage.py +0 -0
  561. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_915_dense_case.py +0 -0
  562. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_916_pocket_leader.py +0 -0
  563. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_917_open_channel.py +0 -0
  564. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_924_zero_length_shoulders.py +0 -0
  565. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_955_height_contingency.py +0 -0
  566. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_issue_958_cross_solid_recognition.py +0 -0
  567. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_layout.py +0 -0
  568. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_layout_hypothesis.py +0 -0
  569. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_layout_property.py +0 -0
  570. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_leader_footprint.py +0 -0
  571. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_lint_box_cache.py +0 -0
  572. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_lint_ink_overlap.py +0 -0
  573. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_lint_reconciliation.py +0 -0
  574. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_linting.py +0 -0
  575. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_note_verb.py +0 -0
  576. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_object_aspects.py +0 -0
  577. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_occupancy_boxes.py +0 -0
  578. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_overall_height_coverage.py +0 -0
  579. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_part_model.py +0 -0
  580. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_pitch_dim_footprint.py +0 -0
  581. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_pmi_datum_lowering.py +0 -0
  582. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_pmi_gtol_lowering.py +0 -0
  583. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_pmi_part21.py +0 -0
  584. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_pocket_pattern.py +0 -0
  585. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_pocket_pattern_recognition.py +0 -0
  586. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_principal_profile_classifier.py +0 -0
  587. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_private_test_imports.py +0 -0
  588. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_projection_symbol_default.py +0 -0
  589. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_quality_components.py +0 -0
  590. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_recogniser_adoption.py +0 -0
  591. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_recogniser_contract.py +0 -0
  592. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_recognition_result.py +0 -0
  593. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_registry.py +0 -0
  594. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_repack_geometry_seam.py +0 -0
  595. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_score.py +0 -0
  596. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_script_detail_parity.py +0 -0
  597. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_shared_box_memo.py +0 -0
  598. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_sheet_gdt.py +0 -0
  599. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_sheet_notes.py +0 -0
  600. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_sheet_of.py +0 -0
  601. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_sheet_section.py +0 -0
  602. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_sheet_tables.py +0 -0
  603. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_slanted_blind_step.py +0 -0
  604. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_slot_completeness.py +0 -0
  605. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_slot_pattern.py +0 -0
  606. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_slot_pattern_recognition.py +0 -0
  607. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_soft_deprecation.py +0 -0
  608. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_solve_trace.py +0 -0
  609. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_step_analysis_evaluation.py +0 -0
  610. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_strip_layout.py +0 -0
  611. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_suppression_ledger.py +0 -0
  612. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_suppression_marks.py +0 -0
  613. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_tolerances.py +0 -0
  614. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_turned_steps.py +0 -0
  615. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_version_bump_ci.py +0 -0
  616. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_view_plan.py +0 -0
  617. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_witness_label_reconciliation.py +0 -0
  618. {draftwright-0.4.27 → draftwright-0.4.29}/tests/test_workflows.py +0 -0
@@ -2,6 +2,259 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ### Added
6
+
7
+ - Circular-seat recognition, declared features, and generated-script replay (#1613).
8
+ Diameter, open run, arc sweep, and three datum-to-axis coordinates retain each physical
9
+ seat's measurement identities, including counted coaxial callouts and shared axis marks.
10
+ - Opt-in independent sheet margins and exact title-block width on `Sheet`, `build_drawing`,
11
+ `make_drawing`, and the CLI, including generated-script replay (#1612, #1589). Sergio's
12
+ 25/10/10/10 mm margins and 175 mm block are explicit options; existing defaults remain.
13
+
14
+ ### Fixed
15
+
16
+ - Direct and generated builds use the same final IR step ladder for page layout (#1592).
17
+ Raw face levels owned by another feature no longer reserve a phantom step corridor at
18
+ the title-block clearance threshold.
19
+
20
+ - Location intents now accept `.format(decimals=...)` for all selected directions (#1610),
21
+ including plan locations, side-drilled holes and slots. Compiler-owned labels reach
22
+ placement footprints, live location edits and generated scripts. Coincident marks with
23
+ incompatible explicit display text are refused instead of overriding an intent.
24
+
25
+ - Explicit dimension precision, including `.format(decimals=0)`, now reaches geometric
26
+ label critique (#1620). Correct rounding is reported as information; labels outside
27
+ the requested rounding interval still produce `label_vs_measured`. Height and step
28
+ ladders retain the same compiler policy as ordinary dimensions.
29
+
30
+ - **`label_vs_measured` no longer reports the drawing's own rounding as a topology error
31
+ (#1600).** A sheet at one decimal place prints 4.450 as `4.5`; the check then compared
32
+ `4.5` against 4.450 and said "possible axis swap or wrong endpoint". The comparison was
33
+ *relative*, so the same 0.05 mm of rounding passed silently on a 100 mm dimension and was
34
+ an error on a 4 mm one — it fired on smallness, not on wrongness.
35
+
36
+ A label now states its own precision: `4.5` shows one place, `4.45` two, `12` none. A
37
+ difference within half of the last displayed place is the label doing its job; anything
38
+ beyond it is still reported, and an axis swap or wrong endpoint misses by far more.
39
+
40
+ This is a prerequisite for #1602's proposed CI gate: `label_vs_measured` sits in the
41
+ register of codes meaning *the sheet says something untrue*, and a code that fires on
42
+ correct rounding cannot be hard-failed on.
43
+
44
+ ### Added
45
+
46
+ - **`nominal_rounded` says where the sheet's precision loses the model value.** Silencing
47
+ the false alarm above left nothing reporting it at all, and `4.5` for 4.450 is still a
48
+ real 0.05 mm between drawing and model — on a part carrying 0.05 mm clearances, the whole
49
+ clearance. One `info` per sheet, naming the worst case:
50
+
51
+ > 7 dimension(s) print a nominal the model does not have, rounded to the sheet's
52
+ > precision; the largest is '15.7' for 15.6500 (0.0500 mm). Within a general tolerance
53
+ > this is ordinary; where a fit depends on it, raise that dimension's places with
54
+ > `.format(decimals=...)`
55
+
56
+ `.format(decimals=…)` cannot yet reach a **location** dimension (#1610), and on the
57
+ fixture this was measured against six of the seven offenders are locations — so the
58
+ message says so rather than prescribing a remedy that raises `ValueError`.
59
+
60
+ It does **not** guess, and does not change any rounding. `4.450` locating a hinge axis is
61
+ design intent; `71.595` as an overall envelope is parametric fallout no drafter would
62
+ print in full — and telling them apart needs to know what the part is *for*, which a STEP
63
+ file does not carry (the same gap as #1597). So the engine reports and the author decides:
64
+ `.format(decimals=…)` already sets places per dimension and survives the `--script` round
65
+ trip.
66
+
67
+ Measured: 7 of 25 numeric dimension labels on `whistle_frame_reference.step`; silent on
68
+ every golden fixture, all of which are built from round numbers.
69
+
70
+ ### Fixed
71
+ - Adopt published Quiddity 0.2.9 (#1619). The frame document now retains six separate
72
+ hinge bores instead of a single path spanning air gaps. Three cylindrical seat occurrences
73
+ are reported explicitly; their drawing grammar remains pending #1613.
74
+ - Refused hole patterns retain their members in the hole-completeness ledger (#1607).
75
+ The adapter records the refusal against the exact recognition run, so a six-hole group
76
+ is no longer reported as an unverifiable four-hole pattern and two loose holes. Declared
77
+ pattern mismatches still undergo the independent correspondence checks.
78
+
79
+ - **A required dimension with nowhere to go now re-plans the sheet instead of being
80
+ reported and left (#1590).** The automatic recovery ladder — larger scales on the
81
+ selected page, then dropping the optional pictorial, then a larger page — already
82
+ existed and already refused any candidate that had not fixed the problem. It ran on
83
+ two symptoms: a turned part missing an axial station, and an **authored** intent that
84
+ failed to place. A required *envelope* dimension that found no room was neither, so
85
+ these drawings never entered the ladder at all — `scale_decision["attempts"]` came
86
+ back empty and an `overall_dim_withheld` error was reported on the first sheet tried.
87
+
88
+ `overall_dim_withheld` is deliberately not a scale blocker, and that is right:
89
+ reporting it through `placement_unsatisfiable` once made `build_drawing(part,
90
+ scale=...)` raise on parts that had always built. But that argument is about refusing
91
+ the scale a **caller asked for**. Choosing one automatically is a different question,
92
+ and one predicate was answering both.
93
+
94
+ What it changes, measured:
95
+
96
+ | part | before | after |
97
+ |---|---|---|
98
+ | stepped `Box(80, 60, 30)` | A4 1:1, overall depth withheld (error) | A4 1:1, **clean**, pictorial dropped |
99
+ | 80 × 60 plate, two close bores | A4 1:1, `incomplete`: unlocated hole, dropped location, withheld depth | A2 2:1, **clean**, every dimension placed |
100
+
101
+ **ADR 2 invariant 13 is amended** to match. It read "the optional isometric yields only
102
+ to close missing axial coverage", which had been one trigger behind the code since
103
+ 2026-08-23 — the record was consolidated twelve days later and transcribed the narrower
104
+ claim. It now states the principle the triggers share: the isometric yields only to
105
+ preserve manufacturing completeness, never for space, crowding or preference. The list
106
+ itself is `builder._ISO_YIELD_TRIGGERS`, and a guard fails if it changes, so the next
107
+ widening is caught by a test rather than by a reader.
108
+
109
+ Dropping the optional pictorial is the first lever, which is the order #443/#1299
110
+ already argue for — a pictorial cannot outrank a dimension needed to manufacture the
111
+ part. Pin `page=` or `scale=` to opt out; a pinned sheet still reports honestly rather
112
+ than replanning.
113
+
114
+ - **A generated `--script` reproduces a re-planned layout.** A declared build does what
115
+ it is told and never enters the recovery ladder, so `generate_sheet_script` pins the
116
+ settled page, scale and view set into the script. It used to do that only for the two
117
+ families whose replan could be predicted from the model; nothing predicts the new
118
+ trigger, because whether a mark fits is a fact about a measured sheet. The reference
119
+ build is now unconditional — one extra `build_drawing` per generated script, measured
120
+ at 0.19 s for a plain box, 0.34 s for a pocket and 1.17 s for a part that actually
121
+ replans — and an **undrawable** source can never be the reason a script is not
122
+ written, the standard the inspection sidecar beside it already meets. A deliberate
123
+ refusal (an unknown page size, `ScaleIncompatibilityError`, `ViewPlanIncomplete`)
124
+ still reaches the caller.
125
+
126
+ A script that keeps `auto_dimensions()` is not handed a pinned view set: `Sheet`
127
+ refuses `authored_views()` beside it, so the two together wrote a script that raised
128
+ when run. The settled set is reported in a comment instead.
129
+
130
+ - **A bolt circle is no longer stated unless something other than the fit supports it
131
+ (#1596).** `EQ SP ON ø… BC` tells a machinist to work from a centre; #1595 found a real
132
+ part where that centre was in mid-air. Six ⌀2.4 holes in a 2×3 rectangular grid came out
133
+ as `4× ⌀2.4 THRU EQ SP ON ø34.4 BC` plus an unrelated `2× ⌀2.4 THRU`, the circle centred
134
+ on (0, −20.11) — nothing is concentric with it.
135
+
136
+ The fit was not a near miss. **Any three non-collinear points are concyclic, and so are the
137
+ four corners of any rectangle** — for those arrangements the residual is zero by
138
+ construction, so no tolerance on it can help. Nor does equal spacing rescue it: that
139
+ rectangle is near-square (24.30 × 24.38), so its corners sit 90.19° / 89.81° apart and
140
+ would pass an `EQ SP` check too.
141
+
142
+ What gives it away is the leftover callout beside it. Corroboration must now come from
143
+ somewhere the fit cannot reach — any one of:
144
+
145
+ 1. **five or more members** — a circle through five holes could have failed to fit;
146
+ 2. **a concentric physical feature** — a boss, spigot, central bore, or a round body whose
147
+ own axis is the circle's, something a machinist can indicate off;
148
+ 3. **it accounts for every hole of its kind** — no identical hole left off the circle.
149
+
150
+ (3) is the discriminator here: six identical holes and the circle claimed four. A drawing
151
+ does not put two of six bolts on a different plan. It is also a question about the part
152
+ rather than about its angle to the axes, unlike the row/column test it replaced.
153
+
154
+ Refused patterns keep every hole: the members fall through to ordinary grouping, so the
155
+ #1595 part now reads `6× ⌀2.4 THRU` — which also repairs the fragmentation into 4 + 2.
156
+
157
+ **What refusing costs, measured.** `hole_requirement_outcomes` builds its pattern-member
158
+ set from the recogniser's patterns rather than the ones the IR adopted, so after a refusal
159
+ it keeps those holes out of the loose groups, finds no `PatternFeature` to join, and warns
160
+ `hole_requirement_unverifiable` about holes the sheet states correctly — two on this part,
161
+ 26 issues against 23. The pre-existing oblique-pattern refusal (#971) has the same hole and
162
+ was simply never reachable; #1596 makes it so. Tracked as **#1607** with three attempted
163
+ fixes recorded, and guarded by an `xfail(strict)` here.
164
+
165
+ Refused at the recognition→IR adapter, not in the recogniser: a circle through those holes
166
+ is genuinely findable, and ADR 3 leaves the recogniser to report the geometry it finds.
167
+ Whether it may be *stated as a drafting datum* is drafting policy, which is draftwright's.
168
+
169
+ ### Changed
170
+
171
+ - **The title block carries every ISO 7200:2004 mandatory data field.** Three had
172
+ no representation at all before — segment/sheet number (5.1.6), approval person
173
+ (5.3.4) and document type (5.3.6) — and are now `sheet=`, `approved_by=` and
174
+ `document_type=` on `build_drawing`, `make_drawing`, `Sheet`, the CLI and the
175
+ `--script` emitter. Cell widths come from the standard's own recommended
176
+ character counts (via `build123d-drafting-helpers>=0.15.4`), so they follow ISO
177
+ 7200 and the font rather than a chosen proportion.
178
+
179
+ Eleven fields need four rows, so **the block is 32 mm tall rather than 16**, and
180
+ the band reserved for it goes 35 → 40 mm. `material` and `general_tolerance`
181
+ stay although neither is an ISO 7200 title-block field; they are on every real
182
+ drawing.
183
+
184
+ - **The scale is stated outside the title block**, beside the projection symbol,
185
+ per ISO 7200 §4 ("presented outside the title block only when used, e.g. scale,
186
+ projection symbol"). It is drawn unconditionally, and the new **`scale_not_stated`
187
+ error** checks the rendered sheet rather than trusting the code that draws it.
188
+ The `SCALE` cell is gone from the block.
189
+
190
+ **Two consequences worth knowing before you upgrade:**
191
+
192
+ - A dense sheet may escalate a page size. In the golden corpus one fixture of
193
+ fourteen (`flange_dense`) moves A4 → A3; the other thirteen keep their page
194
+ and scale, and a sweep of ten ordinary shapes showed no change at all.
195
+ - **Dimension placement now avoids the title block (#1593)**, which it never
196
+ did: the block is drawn after placement, so only GD&T frames ever avoided it
197
+ (#481). A two-row block kept that out of reach; a four-row one does not.
198
+ `build_drawing(Box(40, 30, 12))` used to run its `30` dimension 2.1 mm into
199
+ the block with `lint()` reporting a clean sheet; a stepped
200
+ `Box(80, 60, 30)` put the whole `60` label inside it, reported only as an
201
+ `annotation_overlap` between the labels `60` and `DRAWING`.
202
+
203
+ Most displaced dimensions move to the view's opposite strip and stay on the
204
+ sheet. Where both strips are full the dimension is **withheld as an error
205
+ naming the block**, rather than drawn through it: in the golden corpus
206
+ `pocketed` and `prismatic_ladder` lose their overall depth at the automatic
207
+ A4/1:1, and place it on A3 or at 1:2. Likewise a **pinned** A4 for a
208
+ five-step turned shaft no longer reaches 5:1, because at that scale the front
209
+ view runs down past the block and the overall height cannot be placed; the
210
+ 2:1 sheet is returned with `axial_length_missing` stated. Leaving the page
211
+ automatic still carries every station, on A3 at 5:1.
212
+
213
+ Choosing a page and scale without knowing which dimensions will still need
214
+ room is #1590.
215
+
216
+ ### Changed
217
+
218
+ - **Exports are reproducible by default.** `reproducible` now defaults to `True`
219
+ on `build_drawing`, `make_drawing`, `Drawing` and `Drawing.export`, so two
220
+ exports of one drawing are byte-identical without asking. Pass
221
+ `reproducible=False` to opt out.
222
+
223
+ It was opt-in on a cost argument, and the cost turns out to be small at the
224
+ scale most drawings are made: on the NIST CTC-01 AP242 fixture, +0.27 s on a
225
+ 13.4 s job (+3.2% of export, +2.0% overall). The +32% of export measured when
226
+ the flag was introduced was a 358-part assembly; the ordering work is one
227
+ bounding box and one edge walk per part, so it scales with part count and a
228
+ part-heavy sheet is still the case to opt out of.
229
+
230
+ Two things pushed the default over. A file that changes between runs cannot be
231
+ diffed, checksummed or cached — the reason to want it is not speed-shaped. And
232
+ neither the CLI nor `Sheet` exposes the flag at all, so every drawing made
233
+ through those surfaces was non-reproducible with no way to change it.
234
+
235
+ One behaviour follows from the default rather than from this change: a DXF
236
+ export that cannot reach the ezdxf document to pin its metadata now raises
237
+ rather than writing live data, because every export now claims
238
+ reproducibility. Opting out restores the old fallback.
239
+ ### Fixed
240
+
241
+ - **A supplied title-block `date` is stated on the sheet** (#1585). `TitleBlock`
242
+ could show only one of `revision`/`date` in its top-right cell and revision
243
+ won, while draftwright defaults `revision` to `"A"` — so every drawing that
244
+ set a date lost it, silently, in every version that has had the parameter.
245
+ Adopting `build123d-drafting-helpers>=0.15.4` gives the date a cell of its
246
+ own whenever a revision is also set, and `_make_title_block` now names that
247
+ cell, so the date reaches the PDF text layer and the cell-overflow lint
248
+ rather than only the rendered geometry.
249
+
250
+ `date`, `revision` and `company` are stripped before use, matching what the
251
+ block itself does: a whitespace-only `company` previously raised `KeyError`
252
+ from `cell_bbox`, and padded values were measured at a width the sheet never
253
+ drew. (The DRAWN BY narrowing this entry originally described, and the shared
254
+ top-right cell it named, are both gone with the ISO 7200 layout above — the
255
+ date has its own cell in its own row, so it costs DRAWN BY nothing.)
256
+
257
+
5
258
  ### Added
6
259
 
7
260
  - Report schema v1 now projects one recognition-owned physical requirement ledger shared with
@@ -154,6 +407,21 @@
154
407
 
155
408
  ### Changed
156
409
 
410
+ - Updated the exact Quiddity runtime and declared-inspection contract to **0.2.8**, which stops
411
+ a modelled thread being read as a stack of turned shoulders and coalesces contiguous
412
+ equal-diameter bands into the one span they physically are. Measured on the repo corpus,
413
+ NIST CTC-05 is again the only fixture that moves: its ⌀304.8 region was three adjacent
414
+ rungs and is now one, in both STEP encodings (#1135, quiddity#587).
415
+
416
+ - Updated the exact Quiddity runtime and declared-inspection contract to **0.2.7**. Unlike the
417
+ 0.2.5 adoption below, this one changes drawings: the provider now requires circumferential
418
+ cylinder support to establish a turned-profile axis line, so rounded plate corners and parallel
419
+ offset cylinders no longer form a false stepped shaft. Measured on the repo corpus, NIST CTC-05
420
+ is the only fixture whose recognised turned profile moves — its two STEP encodings previously
421
+ disagreed (3 steps and 9 steps for the same solid) and now agree on 5 — and a plate part that
422
+ previously raised out of `generate_sheet_script` now emits and builds. No family, record schema
423
+ or adapter changed (#1555, quiddity#586).
424
+
157
425
  - Updated the exact Quiddity runtime and declared-inspection contract to 0.2.5 for the
158
426
  provider's recognition performance improvements.
159
427
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: draftwright
3
- Version: 0.4.27
3
+ Version: 0.4.29
4
4
  Summary: Automated technical-drawing generation for build123d
5
5
  Project-URL: Homepage, https://github.com/pzfreo/draftwright
6
6
  Project-URL: Repository, https://github.com/pzfreo/draftwright
@@ -684,7 +684,7 @@ Classifier: Programming Language :: Python :: 3.14
684
684
  Classifier: Topic :: Scientific/Engineering
685
685
  Requires-Python: <3.15,>=3.10
686
686
  Requires-Dist: antlr4-python3-runtime<4.10
687
- Requires-Dist: build123d-drafting-helpers>=0.15.1
687
+ Requires-Dist: build123d-drafting-helpers>=0.15.4
688
688
  Requires-Dist: build123d<0.11,>=0.9.0; python_full_version < '3.13'
689
689
  Requires-Dist: build123d<0.12,>=0.11; python_full_version >= '3.13'
690
690
  Requires-Dist: cadquery-ocp-novtk!=7.9.3.1.1; python_full_version >= '3.13'
@@ -692,7 +692,7 @@ Requires-Dist: numpy>=1.24
692
692
  Requires-Dist: ocp-gordon<0.3
693
693
  Requires-Dist: pillow>=10
694
694
  Requires-Dist: pypdfium2>=4
695
- Requires-Dist: quiddity==0.2.6
695
+ Requires-Dist: quiddity==0.2.9
696
696
  Requires-Dist: reportlab>=4.0
697
697
  Requires-Dist: rich>=10.11
698
698
  Requires-Dist: steputils==0.1
@@ -758,8 +758,18 @@ draftwright my_part.step --no-report # opt out of the JSON sidecar
758
758
  draftwright my_part.step --scale 2 --page A3 # override the auto scale / page
759
759
  draftwright my_part.step --scale 1 --page A4 --scale-policy strict
760
760
  draftwright my_part.step --script # write an editable declarative Sheet script
761
+ draftwright /parts/my_part.step --out-dir . # explicitly write into the working directory
762
+ draftwright my_part.step --out-dir drawings # create/use a separate output directory
761
763
  ```
762
764
 
765
+ CLI outputs default to the directory containing the STEP input, including an absolute or
766
+ nested input path. `--script` writes its Python file and inspection sidecar there too; the
767
+ script retains that output destination when run from another directory. Use `--out-dir DIR`
768
+ to choose a directory, or `--out PREFIX` to choose a basename as well (these options are
769
+ mutually exclusive). Relative overrides use the current working directory. Live object
770
+ scripts (`module:part`) default to `drawing.py` in the working directory.
771
+
772
+
763
773
  `draftwright --help` lists every flag; `--version` prints the version.
764
774
 
765
775
  ### Python
@@ -55,8 +55,18 @@ draftwright my_part.step --no-report # opt out of the JSON sidecar
55
55
  draftwright my_part.step --scale 2 --page A3 # override the auto scale / page
56
56
  draftwright my_part.step --scale 1 --page A4 --scale-policy strict
57
57
  draftwright my_part.step --script # write an editable declarative Sheet script
58
+ draftwright /parts/my_part.step --out-dir . # explicitly write into the working directory
59
+ draftwright my_part.step --out-dir drawings # create/use a separate output directory
58
60
  ```
59
61
 
62
+ CLI outputs default to the directory containing the STEP input, including an absolute or
63
+ nested input path. `--script` writes its Python file and inspection sidecar there too; the
64
+ script retains that output destination when run from another directory. Use `--out-dir DIR`
65
+ to choose a directory, or `--out PREFIX` to choose a basename as well (these options are
66
+ mutually exclusive). Relative overrides use the current working directory. Live object
67
+ scripts (`module:part`) default to `drawing.py` in the working directory.
68
+
69
+
60
70
  `draftwright --help` lists every flag; `--version` prints the version.
61
71
 
62
72
  ### Python
@@ -70,11 +70,34 @@ issue. The contract test derives package record outputs, converter registries, l
70
70
  and emitter branches independently, so copying a new name into the declaration alone cannot make CI
71
71
  pass.
72
72
 
73
- ### Quiddity 0.2.6 runtime contract
73
+ ### Quiddity 0.2.9 runtime contract
74
74
 
75
- The runtime pins the published `quiddity==0.2.6` package, following the 0.2.4 adoption in
75
+ The runtime pins the published `quiddity==0.2.9` package, following the 0.2.4 adoption in
76
76
  [#1486](https://github.com/pzfreo/draftwright/pull/1486) and the migration in
77
- [#1471](https://github.com/pzfreo/draftwright/issues/1471). Its public `quiddity`, `quiddity.evidence` and
77
+ [#1471](https://github.com/pzfreo/draftwright/issues/1471). 0.2.7 is a patch adoption: it requires
78
+ circumferential cylinder support to establish a turned-profile axis line, so rounded plate corners
79
+ and parallel offset cylinders no longer form a false stepped shaft
80
+ ([quiddity#586](https://github.com/pzfreo/quiddity/issues/586), [#1555](https://github.com/pzfreo/draftwright/issues/1555)).
81
+ No family, record schema or adapter changed.
82
+
83
+ Quiddity 0.2.9 exposes native cylindrical seats as open-arc `SectionRecess` channels and
84
+ keeps coaxial bores separated across exterior air gaps. The pinned frame now retains six
85
+ Ø1.1 × 3.0 mm hinge bores and three Ø14.3 seats. The seat grammar remains explicitly
86
+ unsupported in Draftwright pending [#1613](https://github.com/pzfreo/draftwright/issues/1613).
87
+ Adapter refusals of derived hole patterns are recorded with same-run identity so their
88
+ physical members remain in the ordinary-hole requirement ledger (#1607/#1619). These changes
89
+ use the existing public schemas. Identical patterns on different opening planes retain the
90
+ provider's documented grouping limitation ([quiddity#595](https://github.com/pzfreo/quiddity/issues/595));
91
+ separate physical bores must not be merged to recover a pattern.
92
+
93
+ 0.2.7 also partitions bands by physical axis line rather than by axis direction, requiring two
94
+ distinct diameters *per line*. One body can therefore publish **several** coaxial
95
+ `TurnedProfile`s where 0.2.6 published at most one. `Analysis.profiles` already holds every
96
+ body-local profile and is unaffected; `Analysis.prof` remains the compatible zero/one view and
97
+ is `None` for a plural result, which sends `holes.py`'s `a.prof is not None` branches down their
98
+ non-rotational path. **No fixture in this repository reaches plural cardinality on either
99
+ version**, so the green tiers are not evidence that path behaves well — it is newly reachable
100
+ and untested. Its public `quiddity`, `quiddity.evidence` and
78
101
  `quiddity.inspection` surfaces supply recognition, exact occurrence evidence and declared geometry
79
102
  reads. There is one recognition aggregate per build; consumers project that result rather than
80
103
  calling the document builder to obtain another run.
@@ -28,6 +28,47 @@ retain the requested convention. Annotation footprints, scale/page selection and
28
28
  repacking use the same convention. An authored relation contradicting the principal layout
29
29
  fails before projection; a whole-view pin must preserve the convention's relationships.
30
30
 
31
+ ## Sheet margins and title-block width
32
+
33
+ Set each physical sheet edge independently with `margin_left`, `margin_right`,
34
+ `margin_top`, and `margin_bottom` (millimetres). Omitted edges remain 10 mm. `frame=True`
35
+ draws the border at those margins and reserves a further 6 mm inside it for content.
36
+ `zones=True` adds the zone ruler and implies a frame; each margin must fit its labels.
37
+
38
+ Sergio's folded-sheet arrangement is an explicit option on A4, A3, or A2:
39
+
40
+ ```python
41
+ from draftwright import build_drawing
42
+
43
+ drawing = build_drawing(
44
+ "part.step", page="A3", frame=True,
45
+ margin_left=25, margin_right=10, margin_top=10, margin_bottom=10,
46
+ title_block_width=175,
47
+ )
48
+ drawing.export("sergio", formats=("pdf", "svg"))
49
+ ```
50
+
51
+ The same keywords work on `Sheet(...)` and `make_drawing(...)`. An explicit
52
+ `title_block_width` measures between border centrelines and aligns the block to the right
53
+ and bottom sheet margins. The 175 mm block therefore fits the 210 mm folded face with
54
+ 25 mm left and 10 mm right clearance. Its visible border extends half its 0.15 mm stroke
55
+ beyond each centreline. Without an explicit width, the existing widths remain 120 mm on
56
+ A4 and 150 mm on larger ISO sheets, with the existing extra 1 mm right/bottom clearance.
57
+ Revision defaults also remain unchanged.
58
+
59
+ CLI parameters carry the same options into rendered drawings and generated scripts:
60
+
61
+ ```sh
62
+ draftwright part.step --page A3 --frame \
63
+ --margin-left 25 --margin-right 10 --margin-top 10 --margin-bottom 10 \
64
+ --title-block-width 175 --out sergio --format pdf,svg
65
+ ```
66
+
67
+ Add `--script` to write a replayable `Sheet` script. Margins must be finite and nonnegative;
68
+ the width must be finite and positive. An explicit sheet too small for its margins and
69
+ block is refused. `drawing.drawable_bounds` exposes the physical drawable rectangle as
70
+ `(left, bottom, right, top)` page coordinates in millimetres.
71
+
31
72
  ## Dimension text style
32
73
 
33
74
  ### Title fields and notes at paper size
@@ -278,7 +319,7 @@ produces `angular_support_unverifiable`; contradictory supports produce
278
319
  `angular_support_mismatch`.
279
320
 
280
321
  Automatic drawings derive outside-profile angular requirements from ordered face
281
- supports in Quiddity 0.2.6. Angles already defined by a recognised chamfer or
322
+ supports, available since Quiddity 0.2.6. Angles already defined by a recognised chamfer or
282
323
  regular-polygon callout do not add duplicate automatic requirements. This requires
283
324
  the same run's exact face or shared-edge evidence, not matching numerical angles;
284
325
  explicit angle declarations remain available on those corners.
@@ -642,8 +683,15 @@ and reports capacity/crossing failures. Trailing zeroes are intentional manufact
642
683
  sheet.authored_dimensions()
643
684
  sheet.dimension(envelope, "width.length").format(decimals=2) # 13.5 prints as 13.50
644
685
  sheet.dimension(tapped_hole, "bore.diameter", view="plan", side="left")
686
+ sheet.dimension(tapped_hole, "location").format(decimals=2) # all selected directions
645
687
  ```
646
688
 
689
+ A location intent's precision applies to all its selected directional values, including
690
+ side-drilled holes and slots. The policy survives generated-script replay. When several
691
+ location intents share one coincident mark, give them matching display precision; incompatible
692
+ printed values raise an actionable error instead of silently choosing one intent's label.
693
+
694
+
647
695
  ::: draftwright.sheet.DimensionIntent
648
696
  options:
649
697
  filters: public
@@ -665,6 +713,16 @@ sheet.dimension(tapped_hole, "bore.diameter", view="plan", side="left")
665
713
  Circular-blind, paired-ramp and through steps use a multi-parameter handle because their
666
714
  requirements remain separately addressable:
667
715
 
716
+ Circular seats open at both run ends use `sheet.circular_channel(...)`. The
717
+ `centreline` gives ordered endpoints on the cylinder axis; `section` gives three
718
+ physical arc points (start, angular midpoint, end) in ascending transverse world axes.
719
+ The geometry supports minor, semicircular, and major arcs. The engine anchors its
720
+ leader on the curved wall and locates the axis from the stock bounding-box minimum.
721
+ In an authored set, request `seat_diameter.diameter`, `seat_run.length`,
722
+ `seat_sweep.angle`, and `location` independently. A location intent covers X, Y, and Z;
723
+ its `format(decimals=...)` applies to all three. Generated scripts retain the full
724
+ geometry and these intents.
725
+
668
726
  ```python
669
727
  ramp = sheet.paired_ramp_step(
670
728
  axis="y",
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "draftwright"
7
- version = "0.4.27"
7
+ version = "0.4.29"
8
8
  description = "Automated technical-drawing generation for build123d"
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -22,8 +22,8 @@ dependencies = [
22
22
  # This novtk release lacks OCP.GccEnt on macOS. The exclusion must reach
23
23
  # published wheels, not only uv's development resolver constraints.
24
24
  "cadquery-ocp-novtk!=7.9.3.1.1 ; python_full_version >= '3.13'",
25
- "build123d-drafting-helpers>=0.15.1",
26
- "quiddity==0.2.6",
25
+ "build123d-drafting-helpers>=0.15.4",
26
+ "quiddity==0.2.9",
27
27
  "numpy>=1.24",
28
28
  # PNG raster export (SVG→PDF→PNG). Both permissively licensed (Pillow HPND; pypdfium2
29
29
  # Apache-2.0 wrapping Google PDFium BSD-3) and ship pre-built wheels with NO native system