draftwright 0.4.24__tar.gz → 0.4.26__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 (597) hide show
  1. {draftwright-0.4.24 → draftwright-0.4.26}/PKG-INFO +7 -2
  2. {draftwright-0.4.24 → draftwright-0.4.26}/README.md +4 -0
  3. {draftwright-0.4.24 → draftwright-0.4.26}/docs/reference/sheet.md +236 -9
  4. {draftwright-0.4.24 → draftwright-0.4.26}/pyproject.toml +4 -3
  5. {draftwright-0.4.24 → draftwright-0.4.26}/skills/SKILL.md +62 -23
  6. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/__init__.py +14 -0
  7. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/_core.py +80 -15
  8. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/_geometry.py +26 -0
  9. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/analysis.py +96 -17
  10. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/angular_geometry.py +34 -8
  11. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/annotations/_common.py +78 -5
  12. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/annotations/angular.py +1 -1
  13. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/annotations/balloons.py +42 -30
  14. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/annotations/from_model.py +115 -24
  15. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/annotations/holes.py +172 -110
  16. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/annotations/leaders.py +37 -5
  17. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/annotations/orchestrator.py +24 -4
  18. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/annotations/sections.py +59 -13
  19. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/audit.py +14 -2
  20. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/builder.py +168 -80
  21. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/cli.py +95 -26
  22. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/compose.py +210 -13
  23. draftwright-0.4.26/src/draftwright/document.py +184 -0
  24. draftwright-0.4.26/src/draftwright/document_evidence.py +341 -0
  25. draftwright-0.4.26/src/draftwright/document_input.py +101 -0
  26. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/drawing.py +325 -91
  27. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/export.py +87 -0
  28. draftwright-0.4.26/src/draftwright/linting/_registry.py +177 -0
  29. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/angular.py +27 -11
  30. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/blend_coverage.py +20 -2
  31. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/chamfer_coverage.py +8 -2
  32. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/channel_coverage.py +8 -2
  33. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/circular_blind_step_coverage.py +8 -2
  34. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/coverage.py +146 -93
  35. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/evidence.py +104 -4
  36. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/fillet_coverage.py +8 -2
  37. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/flat_coverage.py +8 -2
  38. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/groove_coverage.py +8 -2
  39. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/hole_coverage.py +222 -23
  40. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/issues.py +5 -0
  41. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/oriented_slot_coverage.py +8 -2
  42. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/pad_coverage.py +43 -13
  43. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/paired_ramp_step_coverage.py +8 -2
  44. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/plate_coverage.py +75 -42
  45. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/pocket_coverage.py +55 -14
  46. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/pocket_pattern_coverage.py +54 -18
  47. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/polygonal_boss_coverage.py +8 -2
  48. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/polygonal_stock_coverage.py +10 -2
  49. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/quality.py +43 -1
  50. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/rectangular_blind_slot_coverage.py +8 -2
  51. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/requirements.py +66 -2
  52. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/round_bottom_blind_slot_coverage.py +8 -2
  53. draftwright-0.4.26/src/draftwright/linting/schedule_evidence.py +96 -0
  54. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/slot_coverage.py +8 -2
  55. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/structural.py +28 -5
  56. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/suggest.py +53 -44
  57. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/through_step_coverage.py +60 -43
  58. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/turned_step_coverage.py +14 -4
  59. draftwright-0.4.26/src/draftwright/location_contract.py +56 -0
  60. draftwright-0.4.26/src/draftwright/measurement_support.py +56 -0
  61. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/model/__init__.py +4 -0
  62. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/model/callout.py +115 -2
  63. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/model/compiled.py +313 -10
  64. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/model/declare.py +4 -0
  65. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/model/detect.py +12 -10
  66. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/model/ir.py +78 -1
  67. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/model/planner.py +157 -17
  68. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/plate_correspondence.py +85 -0
  69. draftwright-0.4.26/src/draftwright/progress.py +209 -0
  70. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/projection.py +3 -1
  71. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/recognition_cache.py +8 -5
  72. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/recognition_frame.py +2 -0
  73. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/registry.py +79 -3
  74. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/repair.py +25 -20
  75. draftwright-0.4.26/src/draftwright/reporting.py +1632 -0
  76. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/sheet.py +158 -21
  77. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/sheet_emit.py +49 -3
  78. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/view_plan.py +55 -10
  79. draftwright-0.4.26/tests/fixtures/whistle_frame_reference.step +18544 -0
  80. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_adr0018_view_selection.py +4 -4
  81. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_adr_corpus.py +1 -0
  82. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_balloon_ring_standoff.py +7 -3
  83. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_compiled_plan_boundary.py +10 -3
  84. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_declare.py +9 -4
  85. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_import_boundaries.py +9 -0
  86. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1144_transactional_hole_table.py +185 -79
  87. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1146_scale_completeness.py +13 -1
  88. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1154_one_owner_per_measurement.py +4 -4
  89. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1166_cross_pass_feature_leaders.py +17 -2
  90. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1190_section_decision.py +3 -3
  91. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1215_envelope_tolerance.py +19 -31
  92. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1260_view_constraints.py +1 -1
  93. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1338_scale_before_page_escalation.py +7 -0
  94. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1351_structured_note_coverage.py +20 -6
  95. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1372_pocket_pattern_completeness_evidence.py +2 -0
  96. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1373_plate_completeness_evidence.py +82 -4
  97. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1374_turned_step_completeness_evidence.py +14 -0
  98. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1378_diameter_leader_targets.py +37 -4
  99. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1382_through_step_semantics.py +17 -0
  100. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1460_step_inspection.py +1 -0
  101. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1466_dimension_options.py +3 -0
  102. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1479_radius_leader_targets.py +12 -1
  103. draftwright-0.4.26/tests/test_issue_1514_projection_safeguard.py +74 -0
  104. draftwright-0.4.26/tests/test_issue_1515_first_angle.py +267 -0
  105. draftwright-0.4.26/tests/test_issue_1516_dimension_text.py +213 -0
  106. draftwright-0.4.26/tests/test_issue_1517_through_indicator.py +473 -0
  107. draftwright-0.4.26/tests/test_issue_1518_explicit_rear.py +673 -0
  108. draftwright-0.4.26/tests/test_issue_1524_tolerance_magnitude.py +58 -0
  109. draftwright-0.4.26/tests/test_issue_1530_section_provenance.py +127 -0
  110. draftwright-0.4.26/tests/test_issue_1531_semantic_hole_counts.py +255 -0
  111. draftwright-0.4.26/tests/test_issue_1532_authored_section_examples.py +123 -0
  112. draftwright-0.4.26/tests/test_issue_1533_review_diagnostics.py +159 -0
  113. draftwright-0.4.26/tests/test_issue_1534_build_progress.py +258 -0
  114. draftwright-0.4.26/tests/test_issue_1536_title_overflow.py +144 -0
  115. draftwright-0.4.26/tests/test_issue_1542_applicability.py +156 -0
  116. draftwright-0.4.26/tests/test_issue_1542_catalog.py +403 -0
  117. draftwright-0.4.26/tests/test_issue_1542_catalog_families.py +130 -0
  118. draftwright-0.4.26/tests/test_issue_1542_claim_authority.py +183 -0
  119. draftwright-0.4.26/tests/test_issue_1542_document.py +203 -0
  120. draftwright-0.4.26/tests/test_issue_1542_document_claims.py +268 -0
  121. draftwright-0.4.26/tests/test_issue_1542_document_coverage.py +244 -0
  122. draftwright-0.4.26/tests/test_issue_1542_document_report.py +389 -0
  123. draftwright-0.4.26/tests/test_issue_1542_report_authority.py +142 -0
  124. draftwright-0.4.26/tests/test_issue_1542_requirement_carriers.py +213 -0
  125. draftwright-0.4.26/tests/test_issue_1543_feature_schedules.py +926 -0
  126. draftwright-0.4.26/tests/test_issue_1543_schedule_requirements.py +596 -0
  127. draftwright-0.4.26/tests/test_issue_1544_frame_document_canary.py +359 -0
  128. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_740_leader_assignment.py +8 -2
  129. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_885_prismatic_coverage.py +20 -2
  130. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_955_height_contingency.py +37 -1
  131. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_label_provenance.py +0 -4
  132. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_layout_cleanliness.py +0 -4
  133. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_make_drawing.py +102 -90
  134. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_registry.py +1 -0
  135. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_sheet_emit.py +2 -0
  136. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_sheet_identity_invariant.py +46 -4
  137. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_suppression_marks.py +2 -2
  138. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_tolerances.py +8 -8
  139. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_workflows.py +1 -0
  140. draftwright-0.4.24/src/draftwright/linting/_registry.py +0 -32
  141. draftwright-0.4.24/src/draftwright/reporting.py +0 -673
  142. {draftwright-0.4.24 → draftwright-0.4.26}/.gitignore +0 -0
  143. {draftwright-0.4.24 → draftwright-0.4.26}/CHANGELOG.md +0 -0
  144. {draftwright-0.4.24 → draftwright-0.4.26}/LICENSE +0 -0
  145. {draftwright-0.4.24 → draftwright-0.4.26}/docs/adr/README.md +0 -0
  146. {draftwright-0.4.24 → draftwright-0.4.26}/docs/reference/recogniser-capabilities.md +0 -0
  147. {draftwright-0.4.24 → draftwright-0.4.26}/docs/research/1062-repeating-radial-profile-evidence.md +0 -0
  148. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/_build_profile.py +0 -0
  149. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/_pmi_part21.py +0 -0
  150. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/_warnings.py +0 -0
  151. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/annotate.py +0 -0
  152. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/annotations/__init__.py +0 -0
  153. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/annotations/gears.py +0 -0
  154. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/blend_contract.py +0 -0
  155. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/evaluation/__init__.py +0 -0
  156. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/evaluation/step_analysis.py +0 -0
  157. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/feature_identity.py +0 -0
  158. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/fits.py +0 -0
  159. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/fonts/IBMPlexMono-Regular.ttf +0 -0
  160. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/fonts/IBMPlexSansCondensed-Regular.ttf +0 -0
  161. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/fonts/LICENSE-IBMPlexMono-OFL.txt +0 -0
  162. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/fonts/LICENSE-IBMPlexSansCondensed-OFL.txt +0 -0
  163. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/fonts/__init__.py +0 -0
  164. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/inspection.py +0 -0
  165. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/inspection_contract.py +0 -0
  166. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/intents.py +0 -0
  167. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/layout.py +0 -0
  168. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/__init__.py +0 -0
  169. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/angled_step_coverage.py +0 -0
  170. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/gear_coverage.py +0 -0
  171. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/ink_overlap.py +0 -0
  172. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/passage_coverage.py +0 -0
  173. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/pmi_coverage.py +0 -0
  174. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/prismatic_pocket_coverage.py +0 -0
  175. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/profiled_bore_coverage.py +0 -0
  176. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/linting/section_recess_coverage.py +0 -0
  177. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/make_drawing.py +0 -0
  178. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/model/pmi_lowering.py +0 -0
  179. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/oriented_slot_contract.py +0 -0
  180. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/pmi.py +0 -0
  181. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/profile_angles.py +0 -0
  182. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/py.typed +0 -0
  183. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/recogniser_contract.py +0 -0
  184. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/recogniser_policy.py +0 -0
  185. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/recogniser_schema.py +0 -0
  186. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/recognition/__init__.py +0 -0
  187. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/recognition_ownership.py +0 -0
  188. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/score.py +0 -0
  189. {draftwright-0.4.24 → draftwright-0.4.26}/src/draftwright/section_recess_contract.py +0 -0
  190. {draftwright-0.4.24 → draftwright-0.4.26}/tests/_evidence_contract.py +0 -0
  191. {draftwright-0.4.24 → draftwright-0.4.26}/tests/_kernel.py +0 -0
  192. {draftwright-0.4.24 → draftwright-0.4.26}/tests/_layout_sig.py +0 -0
  193. {draftwright-0.4.24 → draftwright-0.4.26}/tests/_mutation_corpus.py +0 -0
  194. {draftwright-0.4.24 → draftwright-0.4.26}/tests/_recogniser_public_contract.py +0 -0
  195. {draftwright-0.4.24 → draftwright-0.4.26}/tests/_section_recess_cases.py +0 -0
  196. {draftwright-0.4.24 → draftwright-0.4.26}/tests/conftest.py +0 -0
  197. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/ap242_single_cylinder_diameter.step +0 -0
  198. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/README.md +0 -0
  199. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/ambiguous-open-semicircle.step +0 -0
  200. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/blind-hole.step +0 -0
  201. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/chamfer-asymmetric.step +0 -0
  202. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/chamfer-compound.step +0 -0
  203. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/chamfer-overlap.step +0 -0
  204. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/chamfer-plain.step +0 -0
  205. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/chamfer-planar-x.step +0 -0
  206. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/chamfer-planar-y.step +0 -0
  207. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/chamfer-planar-z.step +0 -0
  208. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/chamfer-topology-a.step +0 -0
  209. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/chamfer-topology-b.step +0 -0
  210. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/chamfer-turned.step +0 -0
  211. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/corpus-chamfers-v1.json +0 -0
  212. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/corpus-countersinks-v1.json +0 -0
  213. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/corpus-double-d-bores-v1.json +0 -0
  214. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/corpus-fillets-v1.json +0 -0
  215. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/corpus-flats-v1.json +0 -0
  216. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/corpus-grooves-v1.json +0 -0
  217. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/corpus-hole-patterns-v1.json +0 -0
  218. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/corpus-plates-v1.json +0 -0
  219. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/corpus-pocket-patterns-v1.json +0 -0
  220. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/corpus-pockets-v1.json +0 -0
  221. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/corpus-polygonal-bosses-v1.json +0 -0
  222. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/corpus-polygonal-stock-v1.json +0 -0
  223. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/corpus-rectangular-pads-v1.json +0 -0
  224. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/corpus-turned-steps-v1.json +0 -0
  225. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/corpus-v1.json +0 -0
  226. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/countersink-deburr.step +0 -0
  227. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/countersink-external-cone.step +0 -0
  228. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/countersink-mixed-pair.step +0 -0
  229. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/countersink-single.step +0 -0
  230. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/countersink-topology-a.step +0 -0
  231. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/countersink-topology-b.step +0 -0
  232. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/double-d-axis-x.step +0 -0
  233. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/double-d-axis-y.step +0 -0
  234. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/double-d-blind.step +0 -0
  235. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/double-d-coaxial-compound.step +0 -0
  236. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/double-d-opposed-blind.step +0 -0
  237. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/double-d-roll-30.step +0 -0
  238. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/double-d-round-bore.step +0 -0
  239. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/double-d-single-z.step +0 -0
  240. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/double-d-topology-a.step +0 -0
  241. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/double-d-topology-b.step +0 -0
  242. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/fillet-compound.step +0 -0
  243. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/fillet-overlap.step +0 -0
  244. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/fillet-plain.step +0 -0
  245. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/fillet-planar-x.step +0 -0
  246. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/fillet-planar-y.step +0 -0
  247. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/fillet-planar-z.step +0 -0
  248. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/fillet-repeated.step +0 -0
  249. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/fillet-topology-a.step +0 -0
  250. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/fillet-topology-b.step +0 -0
  251. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/fillet-turned.step +0 -0
  252. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/flat-coaxial.step +0 -0
  253. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/flat-double-d.step +0 -0
  254. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/flat-lone-d.step +0 -0
  255. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/flat-nonround.step +0 -0
  256. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/flat-slanted-double-d.step +0 -0
  257. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/flat-topology-a.step +0 -0
  258. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/flat-topology-b.step +0 -0
  259. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/groove-compound.step +0 -0
  260. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/groove-lone-x.step +0 -0
  261. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/groove-lone-y.step +0 -0
  262. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/groove-lone-z.step +0 -0
  263. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/groove-monotonic-negative.step +0 -0
  264. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/groove-narrow.step +0 -0
  265. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/groove-topology-a.step +0 -0
  266. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/groove-topology-b.step +0 -0
  267. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pad-compound-equal.step +0 -0
  268. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pad-detached-body-negative.step +0 -0
  269. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pad-full-span-ledge-negative.step +0 -0
  270. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pad-nested-staircase-negative.step +0 -0
  271. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pad-topology-a.step +0 -0
  272. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pad-topology-b.step +0 -0
  273. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pad-x-negative.step +0 -0
  274. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pad-x-positive.step +0 -0
  275. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pad-y-negative.step +0 -0
  276. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pad-y-positive.step +0 -0
  277. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pad-z-negative.step +0 -0
  278. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pad-z-positive.step +0 -0
  279. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pattern-ambiguous.step +0 -0
  280. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pattern-grid.step +0 -0
  281. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pattern-topology-a.step +0 -0
  282. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pattern-topology-b.step +0 -0
  283. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/plain-block.step +0 -0
  284. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/plate-compound-equal.step +0 -0
  285. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/plate-cross-topology-a.step +0 -0
  286. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/plate-cross-topology-b.step +0 -0
  287. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/plate-detached-negative.step +0 -0
  288. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/plate-rotational-negative.step +0 -0
  289. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/plate-single-negative.step +0 -0
  290. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/plate-t-xz.step +0 -0
  291. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/plate-t-yz.step +0 -0
  292. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/plate-thick-negative.step +0 -0
  293. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/plate-u-additive.step +0 -0
  294. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/plate-u-cut.step +0 -0
  295. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pocket-compound.step +0 -0
  296. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pocket-edge-anchored.step +0 -0
  297. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pocket-lone.step +0 -0
  298. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pocket-opposed.step +0 -0
  299. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pocket-pattern-ambiguous.step +0 -0
  300. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pocket-pattern-grid.step +0 -0
  301. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pocket-pattern-linear.step +0 -0
  302. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pocket-pattern-pair.step +0 -0
  303. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pocket-pattern-topology-a.step +0 -0
  304. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pocket-pattern-topology-b.step +0 -0
  305. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pocket-prismatic-negative.step +0 -0
  306. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pocket-side.step +0 -0
  307. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pocket-through-negative.step +0 -0
  308. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pocket-topology-a.step +0 -0
  309. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pocket-topology-b.step +0 -0
  310. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/pocket-two-equal.step +0 -0
  311. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-boss-compound-equal.step +0 -0
  312. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-boss-detached-negative.step +0 -0
  313. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-boss-in-plane-rotated.step +0 -0
  314. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-boss-other-protrusions-negative.step +0 -0
  315. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-boss-recess-negative.step +0 -0
  316. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-boss-stock-negative.step +0 -0
  317. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-boss-topology-a.step +0 -0
  318. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-boss-topology-b.step +0 -0
  319. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-boss-x.step +0 -0
  320. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-boss-y.step +0 -0
  321. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-boss-z.step +0 -0
  322. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-stock-compound-negative.step +0 -0
  323. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-stock-cylinder-negative.step +0 -0
  324. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-stock-irregular-negative.step +0 -0
  325. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-stock-octagon-negative.step +0 -0
  326. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-stock-recess-negative.step +0 -0
  327. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-stock-roll17.step +0 -0
  328. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-stock-topology-a.step +0 -0
  329. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-stock-topology-b.step +0 -0
  330. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-stock-translated.step +0 -0
  331. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-stock-x.step +0 -0
  332. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/polygonal-stock-y.step +0 -0
  333. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/topology-a.step +0 -0
  334. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/topology-b.step +0 -0
  335. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/turned-step-axis-x.step +0 -0
  336. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/turned-step-axis-y.step +0 -0
  337. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/turned-step-axis-z.step +0 -0
  338. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/turned-step-compound.step +0 -0
  339. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/turned-step-repeated-lengths.step +0 -0
  340. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/turned-step-through-bore.step +0 -0
  341. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/turned-step-topology-a.step +0 -0
  342. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/turned-step-topology-b.step +0 -0
  343. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/evaluation/turned-step-translated-blind-bore.step +0 -0
  344. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/grm03_thumbwheel_drive_screw.step +0 -0
  345. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/grm03_thumbwheel_drive_screw_ap242_pmi.step +0 -0
  346. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/grm04_drive_plate.step +0 -0
  347. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/if_step_flat_across_cylinder.step +0 -0
  348. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/issue_1058_wheel_rh.step +0 -0
  349. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/issue_1247_angled_blind_step.step +0 -0
  350. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/issue_909_basic_part_design_017_body.step +0 -0
  351. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/issue_915_case_study_2.step +0 -0
  352. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/nist_ctc_01_asme1_ap203.stp +0 -0
  353. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/nist_ctc_01_asme1_ap242.stp +0 -0
  354. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/nist_ctc_02_asme1_ap203.stp +0 -0
  355. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/nist_ctc_02_asme1_ap242.stp +0 -0
  356. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/nist_ctc_03_asme1_ap203.stp +0 -0
  357. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/nist_ctc_03_asme1_ap242.stp +0 -0
  358. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/nist_ctc_04_asme1_ap203.stp +0 -0
  359. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/nist_ctc_04_asme1_ap242.stp +0 -0
  360. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/nist_ctc_05_asme1_ap203.stp +0 -0
  361. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/nist_ctc_05_asme1_ap242.stp +0 -0
  362. {draftwright-0.4.24 → draftwright-0.4.26}/tests/fixtures/tuner_jig_blind_obround_pockets.step +0 -0
  363. {draftwright-0.4.24 → draftwright-0.4.26}/tests/refactor_golden/bracket_section.json +0 -0
  364. {draftwright-0.4.24 → draftwright-0.4.26}/tests/refactor_golden/centered_rebate.json +0 -0
  365. {draftwright-0.4.24 → draftwright-0.4.26}/tests/refactor_golden/chamfered.json +0 -0
  366. {draftwright-0.4.24 → draftwright-0.4.26}/tests/refactor_golden/filleted.json +0 -0
  367. {draftwright-0.4.24 → draftwright-0.4.26}/tests/refactor_golden/flange_dense.json +0 -0
  368. {draftwright-0.4.24 → draftwright-0.4.26}/tests/refactor_golden/grid_plate.json +0 -0
  369. {draftwright-0.4.24 → draftwright-0.4.26}/tests/refactor_golden/grooved_shaft.json +0 -0
  370. {draftwright-0.4.24 → draftwright-0.4.26}/tests/refactor_golden/hex_bar.json +0 -0
  371. {draftwright-0.4.24 → draftwright-0.4.26}/tests/refactor_golden/holed_slot.json +0 -0
  372. {draftwright-0.4.24 → draftwright-0.4.26}/tests/refactor_golden/pocketed.json +0 -0
  373. {draftwright-0.4.24 → draftwright-0.4.26}/tests/refactor_golden/prismatic_ladder.json +0 -0
  374. {draftwright-0.4.24 → draftwright-0.4.26}/tests/refactor_golden/scattered_plate.json +0 -0
  375. {draftwright-0.4.24 → draftwright-0.4.26}/tests/refactor_golden/side_drilled.json +0 -0
  376. {draftwright-0.4.24 → draftwright-0.4.26}/tests/refactor_golden/turned_stepped.json +0 -0
  377. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_add_dimension.py +0 -0
  378. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_adr0018_arrangement_gate.py +0 -0
  379. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_adr0018_view_routing.py +0 -0
  380. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_agents_guide.py +0 -0
  381. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_api_docs.py +0 -0
  382. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_architecture_docs.py +0 -0
  383. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_audit_differential.py +0 -0
  384. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_build_profile_harness.py +0 -0
  385. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_carve_free_position_callers.py +0 -0
  386. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_clone_budget.py +0 -0
  387. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_counting_calls.py +0 -0
  388. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_declared_recognition_gate.py +0 -0
  389. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_dense_sheet_canary.py +0 -0
  390. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_deprecation_dates.py +0 -0
  391. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_detect_once.py +0 -0
  392. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_detect_registry.py +0 -0
  393. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_dimension_role_vocabulary.py +0 -0
  394. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_drawing_encapsulation.py +0 -0
  395. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_e2e_slice.py +0 -0
  396. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_e2e_standards.py +0 -0
  397. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_export_dxf_curves.py +0 -0
  398. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_export_dxf_zoom.py +0 -0
  399. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_export_reproducible.py +0 -0
  400. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_external_recognition_boundary.py +0 -0
  401. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_fillets_adjacency.py +0 -0
  402. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_fits.py +0 -0
  403. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_flat_completeness.py +0 -0
  404. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_flat_stock_identity.py +0 -0
  405. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_flat_stock_opposition.py +0 -0
  406. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_gdt_placement.py +0 -0
  407. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_geometry_graph_spike.py +0 -0
  408. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_grid_lattice_convention.py +0 -0
  409. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_inspection_contract.py +0 -0
  410. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_iso_nts_caption_placement.py +0 -0
  411. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1000_envelope_reuse.py +0 -0
  412. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1006_measurement_comparison.py +0 -0
  413. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1058_wheel_profile.py +0 -0
  414. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1073_cross_body_patterns.py +0 -0
  415. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1082_polygonal_stock.py +0 -0
  416. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1086_declared_gears.py +0 -0
  417. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1116_ap242_hole_tolerance_lowering.py +0 -0
  418. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1130_view_planning_evidence.py +0 -0
  419. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1142_hole_leader_labels.py +0 -0
  420. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1143_hole_completeness.py +0 -0
  421. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1147_legibility_pair_aggregation.py +0 -0
  422. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1153_contradictory_dimensions.py +0 -0
  423. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1155_grm04_sheet_use.py +0 -0
  424. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1176_quality_fidelity.py +0 -0
  425. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1177_angular_dimensions.py +0 -0
  426. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1187_unroutable_leaders.py +0 -0
  427. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1188_per_view_assignment.py +0 -0
  428. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1196_deterministic_view_names.py +0 -0
  429. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1202_observed_drawing_consumer.py +0 -0
  430. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1204_multiscale_view_issues.py +0 -0
  431. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1209_linear_pmi_witnesses.py +0 -0
  432. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1215_no_approved_tolerance_is_dropped.py +0 -0
  433. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1216_callout_reservation_measures_ink.py +0 -0
  434. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1216_pairwise_across_scale_groups.py +0 -0
  435. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1217_claimed_representations.py +0 -0
  436. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1217_the_facility_is_shared.py +0 -0
  437. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1219_location_claims_its_own_axis.py +0 -0
  438. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1229_ledger_member_keying.py +0 -0
  439. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1240_iso_above_strip_visibility.py +0 -0
  440. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1245_passage_disposition.py +0 -0
  441. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1246_prismatic_pocket_disposition.py +0 -0
  442. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1247_angled_step_disposition.py +0 -0
  443. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1254_turned_chamfers.py +0 -0
  444. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1262_automatic_turned_views.py +0 -0
  445. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1276_turned_leader_targets.py +0 -0
  446. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1281_turned_fillets.py +0 -0
  447. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1296_cylindrical_diameter_pmi.py +0 -0
  448. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1298_manufacturing_requirements.py +0 -0
  449. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1299_page_escalation.py +0 -0
  450. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1308_machined_leader_analytics.py +0 -0
  451. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1312_engine_costs.py +0 -0
  452. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1325_nominal_agreement.py +0 -0
  453. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1332_overlap_remedy.py +0 -0
  454. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1332_zone_labels.py +0 -0
  455. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1333_bounded_ink_repair.py +0 -0
  456. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1334_prevent_ink.py +0 -0
  457. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1336_grm03_ap242_pmi_fixture.py +0 -0
  458. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1349_precision_display.py +0 -0
  459. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1350_detected_takeover.py +0 -0
  460. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1352_searchable_pdf_text.py +0 -0
  461. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1353_cnc_authoritative_workflow.py +0 -0
  462. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1357_framed_activation.py +0 -0
  463. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1357_framed_boundary.py +0 -0
  464. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1357_plural_turned_profiles.py +0 -0
  465. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1357_pmi_frame.py +0 -0
  466. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1360_thread_depth.py +0 -0
  467. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1369_hole_completeness_evidence.py +0 -0
  468. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1370_countersink_completeness_evidence.py +0 -0
  469. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1370_double_d_completeness_evidence.py +0 -0
  470. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1370_hole_pattern_completeness_evidence.py +0 -0
  471. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1371_flat_completeness_evidence.py +0 -0
  472. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1371_polygonal_stock_completeness_evidence.py +0 -0
  473. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1372_groove_completeness_evidence.py +0 -0
  474. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1372_pad_completeness_evidence.py +0 -0
  475. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1372_pocket_completeness_evidence.py +0 -0
  476. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1372_polygonal_boss_completeness_evidence.py +0 -0
  477. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1374_chamfer_completeness_evidence.py +0 -0
  478. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1374_fillet_completeness_evidence.py +0 -0
  479. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1382_046_step_inventory.py +0 -0
  480. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1382_circular_blind_step_semantics.py +0 -0
  481. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1382_framed_step_family_evidence.py +0 -0
  482. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1382_paired_ramp_semantics.py +0 -0
  483. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1390_sheet_registration.py +0 -0
  484. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1392_recognisers_048.py +0 -0
  485. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1395_degenerate_iso_region.py +0 -0
  486. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1396_layout_advisories.py +0 -0
  487. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1397_unverifiable_requirement_message.py +0 -0
  488. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1421_rectangular_blind_slot_completeness.py +0 -0
  489. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1421_rectangular_blind_slot_semantics.py +0 -0
  490. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1421_round_bottom_blind_slot_completeness.py +0 -0
  491. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1421_round_bottom_blind_slot_semantics.py +0 -0
  492. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1432_adoption.py +0 -0
  493. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1432_boundary_failures.py +0 -0
  494. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1432_oriented_slot_semantics.py +0 -0
  495. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1433_blend_semantics.py +0 -0
  496. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1438_boss_ownership.py +0 -0
  497. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1438_channel_ownership.py +0 -0
  498. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1438_cli_report_sidecar.py +0 -0
  499. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1438_generation_snapshot.py +0 -0
  500. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1438_nested_ownership.py +0 -0
  501. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1438_occurrence_ownership.py +0 -0
  502. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1438_pattern_ownership.py +0 -0
  503. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1438_plate_ownership.py +0 -0
  504. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1438_policy_dispositions.py +0 -0
  505. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1438_report_projection.py +0 -0
  506. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1438_report_writer.py +0 -0
  507. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1438_through_step_ownership.py +0 -0
  508. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1438_turned_step_ownership.py +0 -0
  509. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1450_boss_blend_ownership.py +0 -0
  510. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1466_semantic_sides.py +0 -0
  511. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1471_boundary_failures.py +0 -0
  512. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1471_evidence_schema.py +0 -0
  513. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1471_groove_profile.py +0 -0
  514. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1471_section_recess_contract.py +0 -0
  515. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1471_section_recess_pockets.py +0 -0
  516. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1485_curved_pockets.py +0 -0
  517. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1485_quiddity_024_boundary.py +0 -0
  518. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1485_rounded_pockets.py +0 -0
  519. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1504_angle_patterns.py +0 -0
  520. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1504_angular_references.py +0 -0
  521. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1504_angular_rendering.py +0 -0
  522. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1504_canonical_angles.py +0 -0
  523. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1504_profile_angles.py +0 -0
  524. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1505_diameter_coverage.py +0 -0
  525. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1505_short_axial_chains.py +0 -0
  526. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_1511_turned_boss_heights.py +0 -0
  527. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_367_leader_ink.py +0 -0
  528. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_443_grm03_axial_coverage.py +0 -0
  529. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_563_placement_intent.py +0 -0
  530. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_676_polygonal_boss.py +0 -0
  531. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_676_polygonal_boss_declare.py +0 -0
  532. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_798_floor_cardinality.py +0 -0
  533. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_798_material_field.py +0 -0
  534. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_798_silhouette_lint.py +0 -0
  535. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_827_real_part_canary.py +0 -0
  536. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_883_location_identity.py +0 -0
  537. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_909_sloped_profile.py +0 -0
  538. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_915_dense_case.py +0 -0
  539. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_916_pocket_leader.py +0 -0
  540. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_917_open_channel.py +0 -0
  541. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_924_zero_length_shoulders.py +0 -0
  542. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_issue_958_cross_solid_recognition.py +0 -0
  543. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_layout.py +0 -0
  544. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_layout_hypothesis.py +0 -0
  545. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_layout_property.py +0 -0
  546. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_leader_footprint.py +0 -0
  547. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_lint_box_cache.py +0 -0
  548. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_lint_ink_overlap.py +0 -0
  549. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_lint_reconciliation.py +0 -0
  550. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_lint_structural.py +0 -0
  551. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_linting.py +0 -0
  552. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_location_vocabulary.py +0 -0
  553. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_note_verb.py +0 -0
  554. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_object_aspects.py +0 -0
  555. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_occupancy_boxes.py +0 -0
  556. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_overall_height_coverage.py +0 -0
  557. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_parameter_id.py +0 -0
  558. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_part_model.py +0 -0
  559. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_pitch_dim_footprint.py +0 -0
  560. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_pmi.py +0 -0
  561. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_pmi_datum_lowering.py +0 -0
  562. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_pmi_gtol_lowering.py +0 -0
  563. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_pmi_part21.py +0 -0
  564. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_pocket_pattern.py +0 -0
  565. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_pocket_pattern_recognition.py +0 -0
  566. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_principal_profile_classifier.py +0 -0
  567. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_private_test_attr_reads.py +0 -0
  568. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_private_test_imports.py +0 -0
  569. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_quality_components.py +0 -0
  570. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_recogniser_adoption.py +0 -0
  571. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_recogniser_capabilities.py +0 -0
  572. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_recogniser_contract.py +0 -0
  573. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_recognition_result.py +0 -0
  574. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_refactor_golden.py +0 -0
  575. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_render_seam.py +0 -0
  576. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_repack_geometry_seam.py +0 -0
  577. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_score.py +0 -0
  578. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_script_detail_parity.py +0 -0
  579. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_shared_box_memo.py +0 -0
  580. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_sheet_gdt.py +0 -0
  581. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_sheet_notes.py +0 -0
  582. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_sheet_of.py +0 -0
  583. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_sheet_section.py +0 -0
  584. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_sheet_tables.py +0 -0
  585. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_slanted_blind_step.py +0 -0
  586. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_slot_completeness.py +0 -0
  587. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_slot_pattern.py +0 -0
  588. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_slot_pattern_recognition.py +0 -0
  589. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_soft_deprecation.py +0 -0
  590. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_solve_trace.py +0 -0
  591. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_step_analysis_evaluation.py +0 -0
  592. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_strip_layout.py +0 -0
  593. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_suppression_ledger.py +0 -0
  594. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_turned_steps.py +0 -0
  595. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_version_bump_ci.py +0 -0
  596. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_view_plan.py +0 -0
  597. {draftwright-0.4.24 → draftwright-0.4.26}/tests/test_witness_label_reconciliation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: draftwright
3
- Version: 0.4.24
3
+ Version: 0.4.26
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.14.2
687
+ Requires-Dist: build123d-drafting-helpers>=0.15.1
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'
@@ -694,6 +694,7 @@ Requires-Dist: pillow>=10
694
694
  Requires-Dist: pypdfium2>=4
695
695
  Requires-Dist: quiddity==0.2.6
696
696
  Requires-Dist: reportlab>=4.0
697
+ Requires-Dist: rich>=10.11
697
698
  Requires-Dist: steputils==0.1
698
699
  Requires-Dist: svglib>=1.5
699
700
  Requires-Dist: typer>=0.12
@@ -736,6 +737,10 @@ annotation placed by the engine.*
736
737
  pip install draftwright
737
738
  ```
738
739
 
740
+ Already using a CAD project environment? Use a [separate drawing environment](docs/reference/isolated-execution.md)
741
+ and pass an exported STEP file between the two. The guide includes interpreter, dependency and
742
+ import checks for local Python and CAD MCP workflows.
743
+
739
744
  ### Command line
740
745
 
741
746
  Point it at a STEP file — that's the whole workflow:
@@ -34,6 +34,10 @@ annotation placed by the engine.*
34
34
  pip install draftwright
35
35
  ```
36
36
 
37
+ Already using a CAD project environment? Use a [separate drawing environment](docs/reference/isolated-execution.md)
38
+ and pass an exported STEP file between the two. The guide includes interpreter, dependency and
39
+ import checks for local Python and CAD MCP workflows.
40
+
37
41
  ### Command line
38
42
 
39
43
  Point it at a STEP file — that's the whole workflow:
@@ -4,6 +4,142 @@
4
4
  are documented here because they are part of normal use even though their Python names begin
5
5
  with an underscore.
6
6
 
7
+ ## Projection convention
8
+
9
+ Use `Sheet(part, projection="first")` or `build_drawing(part, projection="first")`
10
+ for first-angle layout and its matching projection symbol. The CLI equivalent is
11
+ `--projection first`. Explicit `"third"` selects third-angle layout and its symbol;
12
+ omitting `projection` keeps third-angle layout without a symbol.
13
+
14
+ View names retain their physical viewing directions in the working part frame. Changing
15
+ convention changes sheet relationships, not which side of the part a name shows:
16
+
17
+ | View | Viewed from | Page directions | Third-angle position | First-angle position |
18
+ |---|---|---|---|---|
19
+ | `front` | Negative Y | X right, Z up | Reference | Reference |
20
+ | `plan` | Positive Z | X right, Y up | Above front | Below front |
21
+ | `side` | Positive X | Y right, Z up | Right of front | Left of front |
22
+
23
+ The resolved convention is available as `drawing.view_plan.convention`. Generated scripts
24
+ retain the requested convention. Annotation footprints, scale/page selection and measured
25
+ repacking use the same convention. An authored relation contradicting the principal layout
26
+ fails before projection; a whole-view pin must preserve the convention's relationships.
27
+
28
+ ## Dimension text style
29
+
30
+ ### Title fields and notes at paper size
31
+
32
+ Keep title-block values concise and put longer engineering information in a `notes()` block.
33
+ `title_field_overflow` identifies text wider or taller than its title-block cell, even when the
34
+ text remains inside the page. This is a legibility warning, like overlapping annotations;
35
+ text outside the drawable page remains an `annotation_out_of_bounds` error. The full value
36
+ stays rendered; the diagnostic does not truncate it, shrink the font or invent an abbreviation.
37
+ `lint_summary()["passed"]` checks errors only, so inspect warnings and the legibility component
38
+ as well. A title warning does not prevent scale recovery from restoring missing measurements.
39
+
40
+ <!-- issue-1536-notes-example -->
41
+ ```python
42
+ from build123d import Box
43
+ from draftwright import Sheet
44
+
45
+ sheet = Sheet(
46
+ Box(30, 20, 10), page="A4", scale=2,
47
+ title="FRAME - DFM REVIEW", number="REVIEW", material="SEE NOTES",
48
+ detail_view=False,
49
+ )
50
+ sheet.authored_dimensions()
51
+ envelope = sheet.envelope()
52
+ for parameter in envelope.dimension_ids():
53
+ sheet.dimension(envelope, parameter)
54
+ sheet.notes([
55
+ "QUOTATION / DFM REVIEW - NOT RELEASED",
56
+ "Material: TITANIUM - GRADE TBD",
57
+ "Hinge fit and pin retention: engineering decision required",
58
+ ], prefer="tr")
59
+ drawing = sheet.build()
60
+ for issue in drawing.lint():
61
+ print(issue.severity, issue.code, issue.message)
62
+ ```
63
+ <!-- /issue-1536-notes-example -->
64
+
65
+ `page` and `scale` control the sheet and model size. The current annotation preset has a fixed
66
+ 3 mm nominal paper font size; changing scale does not enlarge notes. `Sheet.notes()` and
67
+ `Sheet.table()` have no font-size option. `text_position` and `text_orientation` below control
68
+ dimension style, not note size. A smaller model scale makes notes larger relative to the part;
69
+ a smaller page changes how much of the page they occupy. Neither changes their printed size.
70
+ For the A2 frame trial, retain A2 and the requested scale unless the full package fits the new
71
+ constraints with its required measurements intact; the small box example is not proof that
72
+ the frame fits A4.
73
+
74
+ `prefer="tr"` ranks available table positions near the top-right corner. The shared placement
75
+ solve still measures the whole notes block and checks all occupied regions. If it cannot fit,
76
+ `table_dropped` reports the failure. Split long prose into authored lines or choose an appropriate
77
+ page; do not remove engineering content merely to silence a diagnostic. General notes remain
78
+ uncredited text: they do not automatically satisfy missing dimensions or unsupported features.
79
+
80
+ ### Dimension position and reading direction
81
+
82
+ Position and reading direction are independent drawing-wide settings:
83
+
84
+ ```python
85
+ sheet = Sheet(part, text_position="above", text_orientation="horizontal")
86
+ # Declare features and dimensions as usual, then build.
87
+ drawing = sheet.build()
88
+ ```
89
+
90
+ `text_position="inline"` (the default) leaves a gap for the value in the dimension
91
+ line; `"above"` keeps the line continuous and offsets the full value and tolerance.
92
+ For angular dimensions, above means outside the arc. `text_orientation="aligned"`
93
+ (the default) follows the dimension line or arc tangent; `"horizontal"` keeps text
94
+ horizontal on the sheet. An aligned vertical value reads from the right. Short
95
+ spans use outside arrows while retaining their complete text.
96
+
97
+ The same options are accepted by `build_drawing()`, `make_drawing()`,
98
+ `emit_sheet_script()` and `generate_sheet_script()`. The CLI flags are
99
+ `--text-position` and `--text-orientation`. Generated scripts retain these settings;
100
+ SVG, PDF and DXF export the same resolved ink. Unsupported values raise `ValueError`.
101
+ The choices affect rendering and its placement footprint, not feature measurements
102
+ or tolerances. These are explicit rendering choices, not a claim of standards conformity.
103
+
104
+ ## Through-hole wording
105
+
106
+ The optional argument to a hole handle's `through()` controls its printed indicator:
107
+
108
+ ```python
109
+ hole.through() # default THRU
110
+ hole.through("THRU") # explicit wording
111
+ hole.through("") # omit the printed indicator
112
+ hole.through("THROUGH ALL") # alternative wording
113
+ ```
114
+
115
+ Each declares a through hole and clears any blind depth. Diameter, tolerances, fits and
116
+ measurement identities remain unchanged. The empty string is an explicit display omission;
117
+ it remains visible in the suppression ledger and does not count as a printed through
118
+ qualifier. `.depth(4)` makes the hole blind and clears the override; a later `.through()`
119
+ returns to the default.
120
+
121
+ The override is also accepted as `through_indicator=` by `Sheet.hole()` and the IR `hole()`
122
+ constructor, including pattern members. Generated scripts preserve the difference between
123
+ no override, explicit default wording and an empty string. Callouts and hole tables measure
124
+ the selected wording before placement. Compatible holes can share a callout when their
125
+ resolved wording, machining specifications and placement constraints agree; original feature
126
+ owners and measurement identities remain separate. Removing one owner of a shared callout
127
+ rebuilds the survivors through the placement solver.
128
+
129
+ ## Feature schedules
130
+
131
+ `sheet.schedule([(feature, ("bore.diameter", "location"))], name="holes")` declares a measured
132
+ table through the same IR/compiler as ordinary dimensions. Features may be fluent handles or
133
+ exact owned IR objects. Values, tolerances, units and through/blind wording come from the
134
+ compiler. `location` expands the addressable member coordinates; explicit canonical IDs select
135
+ individual components. Use `prefer="tr"`, `"tl"`, `"br"` or `"bl"` to rank the existing table
136
+ placement candidates.
137
+
138
+ Schedules establish authored dimension intent. Add `sheet.dimension(...)` declarations when a
139
+ measurement should also appear beside a view. Ordinary `table(...)` text has no measurement
140
+ authority. See [shared drawing documents](document.md#feature-schedules) for an executable
141
+ recipe, verified cell evidence and the document report contract.
142
+
7
143
  ## Grooves on coaxial bodies
8
144
 
9
145
  When different turned bodies share an axis line, give their steps distinct `profile_group`
@@ -234,17 +370,108 @@ View declarations are semantic constraints. They name projections, relationships
234
370
  anchors; the layout solve owns the resulting page positions. Authored views must be paired with
235
371
  authored dimensions so a deliberately omitted view cannot strand planner-selected annotations:
236
372
 
373
+ This runnable example includes the part, feature declarations, dimension discovery,
374
+ three principal views and section A–A. The bore's location dimensions are deliberately
375
+ omitted, and lint keeps those omissions visible.
376
+
377
+ <!-- example: authored-section -->
378
+ ```python
379
+ from build123d import Box, Cylinder, Pos
380
+ from draftwright import Sheet
381
+
382
+ bore_tool = Pos(12, 0, 0) * Cylinder(3, 12)
383
+ part = Box(60, 40, 12) - bore_tool
384
+ sheet = Sheet(part, page="A3", scale=1, projection="third")
385
+ sheet.authored_dimensions().authored_views()
386
+
387
+ envelope = sheet.envelope(part)
388
+ for parameter_id in envelope.dimension_ids():
389
+ sheet.dimension(envelope, parameter_id)
390
+ bore = sheet.hole(bore_tool)
391
+ print(bore.dimension_ids()) # discover this handle's Sheet measurement IDs
392
+ sheet.dimension(bore, "bore.diameter")
393
+
394
+ for name in ("front", "plan", "side"):
395
+ sheet.view(name)
396
+ sheet.section_view("A", through=bore) # or at=0 for an explicit model-space Y plane
397
+
398
+ drawing = sheet.build()
399
+ issues = drawing.lint()
400
+ for issue in issues:
401
+ print(issue.severity, issue.code, issue.message)
402
+ # drawing.export("build/section", formats=("pdf", "svg"))
403
+ ```
404
+
405
+ On a Sheet handle, `dimension_ids()` lists dotted measurement IDs; use
406
+ `sheet.dimension(bore, "bore.diameter")`. On a built Drawing, the second argument to
407
+ `drawing.dimension(envelope_feature, "length", role="width")` is a parameter kind,
408
+ with `role=` distinguishing measurements of the same kind. Hole diameter and depth
409
+ are callout content: use `drawing.callout(bore_feature)` for those, not
410
+ `drawing.dimension(...)`. These are different vocabularies.
411
+
412
+ #### Augmenting automatic views
413
+
414
+ `view()` and `section_view()` specify complete authored sets. `add_view()` and
415
+ `add_section_view()` instead augment an explicitly automatic set. Choose the source
416
+ before adding views; an authored set cannot be switched to automatic in place.
417
+
418
+ This separate, runnable example keeps automatic principal and derived views and
419
+ adds a section at model-space Y=0. Its dimensions are still explicitly authored:
420
+
421
+ <!-- example: automatic-section -->
237
422
  ```python
238
- s = Sheet(part).authored_dimensions().authored_views()
239
- front = s.view("front")
240
- plan = s.view("plan").above(front, gap=4).align_x(front)
241
- s.view("iso").scale(0.75)
242
-
243
- section = s.section_view("A", through=hole)
244
- detail = s.detail_view("B", around=hole).scale(2)
245
- dwg = s.build()
423
+ from build123d import Box
424
+ from draftwright import Sheet
425
+
426
+ part = Box(60, 40, 12)
427
+ sheet = Sheet(part, page="A3", scale=1).authored_dimensions()
428
+ envelope = sheet.envelope(part)
429
+ for parameter_id in envelope.dimension_ids():
430
+ sheet.dimension(envelope, parameter_id)
431
+ sheet.auto_views()
432
+ sheet.add_section_view("A", at=0)
433
+ drawing = sheet.build()
434
+ issues = drawing.lint()
435
+ for issue in issues:
436
+ print(issue.severity, issue.code, issue.message)
246
437
  ```
247
438
 
439
+ `auto_views()` emits `SoftDeprecationWarning`: it remains supported and has no removal
440
+ date. The notice recommends the editable authored surface; it does not mean the
441
+ augmentation example is invalid. Automatic dimensions remain supported too, but they
442
+ cannot be paired with a complete authored view set.
443
+
444
+ `Sheet.section()` is deprecated with removal targeted at 0.6.0. For an authored
445
+ workflow replace it with `section_view("A", through=feature)` or `section_view("A", at=y)`;
446
+ for automatic augmentation use `auto_views()` followed by `add_section_view(...)`.
447
+ `Drawing.section()` is a separate automatic post-build operation and may add no section
448
+ when the geometry does not warrant one.
449
+
450
+
451
+ Rear views are explicitly requested. `s.view("rear")` includes rear in an authored
452
+ view set; `s.auto_views().add_view("rear")` adds it to the automatic baseline.
453
+ Rear looks toward the part from +Y with Z upward, so increasing world X runs left
454
+ on the page. This physical direction is the same under both projection conventions.
455
+ When side is also present, rear sits beyond side in the unfolding direction: left
456
+ for first-angle, right for third-angle.
457
+
458
+ Y-axis hole and hole-pattern callouts, locations and pitch dimensions can use rear,
459
+ as can overall width and height. For example:
460
+
461
+ ```python
462
+ s = Sheet(part, projection="first").authored_dimensions()
463
+ hole = s.hole(diameter=6, at=(10, 20, 5), axis="y").through("THRU")
464
+ s.dimension(hole, "bore.diameter")
465
+ s.dimension(hole, "location")
466
+ s.view("rear")
467
+ drawing = s.build()
468
+ ```
469
+
470
+ Dimensions still use the shared placement solve. An unsupported measurement/view
471
+ combination is refused; a required depth extent, for example, needs side. Rear is
472
+ never added automatically to improve visibility, coverage or hidden lines. Generated
473
+ scripts preserve an explicit rear request.
474
+
248
475
  `view(...)`, `section_view(...)` and `detail_view(...)` define complete authored sets;
249
476
  omission suppresses a view. `add_view(...)`, `add_section_view(...)` and
250
477
  `add_detail_view(...)` augment an explicitly selected `auto_views()` source. `row(...)` and
@@ -403,7 +630,7 @@ geometry cannot prove a complete chain or the provider aggregate's Fillet preced
403
630
  referential `DimensionIntent`. The handle never carries a replacement nominal and never chooses
404
631
  page coordinates. Use `format(decimals=n)` to preserve between 0 and 15 decimal places in the
405
632
  printed nominal while reconciliation, tolerance, suppression and provenance continue to read the
406
- numeric parameter from the feature. Optional `view="front|plan|side"` and
633
+ numeric parameter from the feature. Optional `view="front|plan|side|rear"` and
407
634
  `side="above|below|left|right"` arguments select a supported semantic corridor when authored
408
635
  routing must override the derived default; the normal placement solve still chooses coordinates
409
636
  and reports capacity/crossing failures. Trailing zeroes are intentional manufacturing display text:
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "draftwright"
7
- version = "0.4.24"
7
+ version = "0.4.26"
8
8
  description = "Automated technical-drawing generation for build123d"
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -22,7 +22,7 @@ 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.14.2",
25
+ "build123d-drafting-helpers>=0.15.1",
26
26
  "quiddity==0.2.6",
27
27
  "numpy>=1.24",
28
28
  # PNG raster export (SVG→PDF→PNG). Both permissively licensed (Pillow HPND; pypdfium2
@@ -38,6 +38,7 @@ dependencies = [
38
38
  "antlr4-python3-runtime<4.10",
39
39
  "svglib>=1.5",
40
40
  "typer>=0.12",
41
+ "rich>=10.11",
41
42
  # PEP 702 @deprecated: stdlib `warnings.deprecated` lands in 3.13; backport for 3.10–3.12.
42
43
  "typing_extensions>=4.5 ; python_full_version < '3.13'",
43
44
  ]
@@ -90,7 +91,7 @@ timeout = 300
90
91
  # (minutes each), deselected by default. `smoke` is a curated, build-light subset
91
92
  # (~30 s) for a quick local "did I break something obvious" check — run it with
92
93
  # `uv run pytest -m smoke`. The default run is the full fast tier (`-m 'not slow'`,
93
- # runtime depends on worker count). CI runs one real-part canary before merge,
94
+ # runtime depends on worker count). CI runs bounded real-part canaries before merge,
94
95
  # the full slow tier after merge, and the fast tier across its compatibility matrix.
95
96
  markers = [
96
97
  "slow: end-to-end integration builds, including CTC fixtures (deselected by default)",
@@ -29,9 +29,9 @@ verbs existed then, and the dotted parameter ids in Step 2 are new in 0.4.0.)
29
29
  everything automatically** (placement is constraint-based; you never compute page
30
30
  coordinates). When the first pass isn't perfect, you drive a **build → critique
31
31
  → fix** loop (Step "Lint → critique → fix" below), not a hand-layout edit. The
32
- rationale lives in `docs/adr/`: 0001 (deterministic generation over an editable
33
- DSL), 0002 (the lint critique domain-repair loop), 0003 (the constraint-based
34
- layout engine). Edit through the domain API; treat `Placeable`/page mechanics as
32
+ rationale lives in the five current records in `docs/adr/`: ADR 1 (compiler pipeline),
33
+ ADR 2 (layout and view planning), ADR 3 (recognition), ADR 4 (declared intent), and
34
+ ADR 5 (trust and honest failure). Edit through the domain API; treat `Placeable`/page mechanics as
35
35
  internals.
36
36
 
37
37
  ---
@@ -145,19 +145,26 @@ rather than the bare family role (`"width"`): the bare spelling is deprecated,
145
145
  because it is what let a single call silently declare two dimensions.
146
146
 
147
147
  `place_dim(p1, p2, side, view, …)` still exists for raw page coordinates, but it is
148
- the **escape hatch of last resort** (ADR 0012) and is deprecated: it bypasses the
148
+ the **escape hatch of last resort** (ADR 4) and is deprecated: it bypasses the
149
149
  layout solve, so nothing re-flows around it.
150
150
 
151
- **Add a diameter callout on a hole the auto-pass missed** — find the bore in the
152
- model IR and hand it to `callout()`. This is what the `feature_not_dimensioned`
153
- lint suggestion hands you (it emits `dwg.callout(f)` say *what*, not *where*):
151
+ **Add a callout on a hole the auto-pass missed** — inspect its semantic requirement
152
+ finding first. Equal diameters can belong to different axes, blind depths, threads
153
+ or fits; a diameter-total warning never authorises increasing a callout count.
154
154
 
155
155
  ```python
156
- for f in dwg.model().features:
157
- if f.kind == "hole" and abs(f.diameter - 4.0) < 0.2:
158
- dwg.callout(f) # engine picks the view, leader and elbow
156
+ for issue in dwg.lint():
157
+ if issue.code.startswith("hole_requirement_"):
158
+ print(issue.message)
159
+ if issue.suggestion:
160
+ print(issue.suggestion)
159
161
  ```
160
162
 
163
+ For a verified missing bore on an automatic model, the suggestion targets the exact
164
+ feature with `dwg.callout(...)` through the shared solve. It applies to that Drawing;
165
+ re-run lint after rebuilding. Authored omissions, unverified ownership and conflicting
166
+ counts require inspection of the declared operation rather than an automatic count edit.
167
+
161
168
  **Free text** at a chosen point is `note()` — a domain verb, not an escape hatch:
162
169
 
163
170
  ```python
@@ -183,24 +190,56 @@ warn from 0.4.0. See `docs/deprecations.md`.
183
190
  `make_drawing(...)` is `build_drawing(...).export(formats=("svg", "dxf"))`, unpacked to a
184
191
  tuple — not a bare `.export()`, which is the deprecated shape above.
185
192
 
186
- **Section views** come from the section verb rather than from projecting a view by
187
- hand. The two entry points are *not* equivalent:
193
+ **Authored section views** use `section_view()` alongside an explicit dimension and
194
+ view set. This complete example declares the bore diameter and overall extents;
195
+ it deliberately leaves the bore's location dimensions unrequested:
188
196
 
197
+ <!-- example: authored-section -->
189
198
  ```python
199
+ from build123d import Box, Cylinder, Pos
190
200
  from draftwright import Sheet
191
201
 
192
- # Sheet.section() FORCES a cut, wherever you point it.
193
- cut = Sheet.from_part(part, number="DWG-042").section().build()
194
- "section_aa" in cut.views # True
195
- # section(feature) cuts through that feature; section(at=y) at an explicit Y.
196
-
197
- # Drawing.section() adds only the AUTOMATIC A–A, which fires just for qualifying
198
- # hidden internal geometry (a counterbore, spotface, or blind bottom). It returns
199
- # the placed annotation names, or [] when no section is warranted — so on a plain
200
- # through-holed block it does nothing at all.
201
- dwg.section()
202
+ bore_tool = Pos(12, 0, 0) * Cylinder(3, 12)
203
+ part = Box(60, 40, 12) - bore_tool
204
+ sheet = Sheet(part, page="A3", scale=1, projection="third")
205
+ sheet.authored_dimensions().authored_views()
206
+
207
+ envelope = sheet.envelope(part)
208
+ for parameter_id in envelope.dimension_ids():
209
+ sheet.dimension(envelope, parameter_id)
210
+ bore = sheet.hole(bore_tool)
211
+ print(bore.dimension_ids()) # discover this handle's Sheet measurement IDs
212
+ sheet.dimension(bore, "bore.diameter")
213
+
214
+ for name in ("front", "plan", "side"):
215
+ sheet.view(name)
216
+ sheet.section_view("A", through=bore) # or at=0 for an explicit model-space Y plane
217
+
218
+ drawing = sheet.build()
219
+ issues = drawing.lint()
220
+ for issue in issues:
221
+ print(issue.severity, issue.code, issue.message)
222
+ # drawing.export("build/section", formats=("pdf", "svg"))
202
223
  ```
203
224
 
225
+ `dimension_ids()` lists the Sheet handle's dotted IDs: use `"bore.diameter"` here.
226
+ Drawing.dimension instead takes a kind and optional role, such as `"length"` with
227
+ `role="width"` for an envelope. Hole diameter/depth use Drawing.callout, not
228
+ Drawing.dimension. Inspect `issues`: authored omissions
229
+ remain visible, so a successfully built section does not prove a complete drawing.
230
+
231
+ `view()` and `section_view()` define complete authored principal and derived sets.
232
+ To augment automatic views instead, start a new Sheet, explicitly select
233
+ `auto_views()`, and use `add_section_view("A", through=...)` or `at=...`.
234
+ That mode remains supported; `auto_views()` emits a soft-deprecation notice with
235
+ no removal date. Do not switch an already-authored view set to `auto_views()`.
236
+ See the runnable augmentation example in `docs/reference/sheet.md`.
237
+
238
+ `Sheet.section()` is deprecated with removal targeted at 0.6.0. Migrate it to the
239
+ method for your view source above. `Drawing.section()` remains the automatic
240
+ post-build section operation: it may return no section when the geometry does not
241
+ warrant one. It does not replace an explicit authored section request.
242
+
204
243
  Arbitrary **auxiliary** views have no public verb: `add_view()` was the way to
205
244
  project one and is deprecated, so a custom viewing direction is not currently part
206
245
  of the supported surface.
@@ -311,7 +350,7 @@ for i in dwg.lint():
311
350
  dwg.repair()
312
351
 
313
352
  # Pin a deliberate placement so repair won't move it (the constraint solver will
314
- # honour it too as it lands — ADR 0003):
353
+ # honour it too as it lands — ADR 2):
315
354
  dwg.pin(name) # name from dwg.annotations(); dwg.unpin(name) to release
316
355
  ```
317
356
 
@@ -27,6 +27,9 @@ _LAZY = {
27
27
  "ScaleIncompatibilityError": "draftwright.builder",
28
28
  "make_drawing": "draftwright.builder",
29
29
  "Drawing": "draftwright.drawing",
30
+ "BuildEvent": "draftwright.progress",
31
+ "BuildCancelled": "draftwright.progress",
32
+ "observe_build": "draftwright.progress",
30
33
  "FeatureInfo": "draftwright.drawing",
31
34
  "ReportUnavailableError": "draftwright.reporting",
32
35
  "INSPECTION_SCHEMA": "draftwright.inspection",
@@ -34,6 +37,9 @@ _LAZY = {
34
37
  "InspectionUnavailableError": "draftwright.inspection",
35
38
  "inspect_step": "draftwright.inspection",
36
39
  "Sheet": "draftwright.sheet",
40
+ "Document": "draftwright.document",
41
+ "DocumentResult": "draftwright.document",
42
+ "DocumentBuildError": "draftwright.document",
37
43
  "lint_feature_coverage": "draftwright.linting",
38
44
  "PmiExtractionReport": "draftwright.pmi",
39
45
  "PmiRecord": "draftwright.pmi",
@@ -89,6 +95,7 @@ if TYPE_CHECKING: # static analysers / IDEs — no runtime import, no kernel co
89
95
  from draftwright._warnings import ScaleCompletenessWarning, SoftDeprecationWarning
90
96
  from draftwright.builder import ScaleIncompatibilityError, build_drawing, make_drawing
91
97
  from draftwright.compose import choose_scale
98
+ from draftwright.document import Document, DocumentBuildError, DocumentResult
92
99
  from draftwright.drawing import Drawing, FeatureInfo
93
100
  from draftwright.inspection import (
94
101
  INSPECTION_SCHEMA,
@@ -104,6 +111,7 @@ if TYPE_CHECKING: # static analysers / IDEs — no runtime import, no kernel co
104
111
  extract_pmi,
105
112
  extract_pmi_report,
106
113
  )
114
+ from draftwright.progress import BuildCancelled, BuildEvent, observe_build
107
115
  from draftwright.reporting import ReportUnavailableError
108
116
  from draftwright.sheet import Sheet
109
117
  from draftwright.view_plan import ViewConstraints, ViewPlanIncomplete, ViewSpec
@@ -117,9 +125,15 @@ def __dir__():
117
125
 
118
126
 
119
127
  __all__ = [
128
+ "BuildEvent",
129
+ "BuildCancelled",
130
+ "observe_build",
120
131
  "INSPECTION_SCHEMA",
121
132
  "INSPECTION_SCHEMA_VERSION",
122
133
  "Drawing",
134
+ "Document",
135
+ "DocumentResult",
136
+ "DocumentBuildError",
123
137
  "SoftDeprecationWarning",
124
138
  "FeatureInfo",
125
139
  "InspectionUnavailableError",