draftwright 0.4.25__tar.gz → 0.4.27__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 (598) hide show
  1. {draftwright-0.4.25 → draftwright-0.4.27}/PKG-INFO +6 -1
  2. {draftwright-0.4.25 → draftwright-0.4.27}/README.md +4 -0
  3. {draftwright-0.4.25 → draftwright-0.4.27}/docs/reference/sheet.md +145 -9
  4. {draftwright-0.4.25 → draftwright-0.4.27}/pyproject.toml +3 -2
  5. {draftwright-0.4.25 → draftwright-0.4.27}/skills/SKILL.md +62 -23
  6. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/__init__.py +14 -0
  7. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/_core.py +21 -15
  8. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/_geometry.py +23 -0
  9. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/analysis.py +40 -2
  10. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotations/_common.py +2 -5
  11. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotations/from_model.py +2 -3
  12. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotations/leaders.py +37 -5
  13. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotations/orchestrator.py +21 -3
  14. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotations/sections.py +57 -11
  15. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/audit.py +13 -1
  16. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/builder.py +51 -13
  17. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/cli.py +87 -28
  18. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/compose.py +6 -4
  19. draftwright-0.4.27/src/draftwright/document.py +184 -0
  20. draftwright-0.4.27/src/draftwright/document_evidence.py +341 -0
  21. draftwright-0.4.27/src/draftwright/document_input.py +101 -0
  22. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/drawing.py +266 -73
  23. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/export.py +87 -0
  24. draftwright-0.4.27/src/draftwright/linting/_registry.py +177 -0
  25. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/angular.py +27 -11
  26. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/blend_coverage.py +20 -2
  27. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/chamfer_coverage.py +8 -2
  28. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/channel_coverage.py +8 -2
  29. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/circular_blind_step_coverage.py +8 -2
  30. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/coverage.py +114 -68
  31. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/evidence.py +104 -4
  32. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/fillet_coverage.py +8 -2
  33. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/flat_coverage.py +8 -2
  34. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/groove_coverage.py +8 -2
  35. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/hole_coverage.py +202 -19
  36. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/issues.py +5 -0
  37. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/oriented_slot_coverage.py +8 -2
  38. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/pad_coverage.py +43 -13
  39. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/paired_ramp_step_coverage.py +8 -2
  40. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/plate_coverage.py +75 -42
  41. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/pocket_coverage.py +55 -14
  42. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/pocket_pattern_coverage.py +54 -18
  43. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/polygonal_boss_coverage.py +8 -2
  44. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/polygonal_stock_coverage.py +10 -2
  45. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/quality.py +43 -1
  46. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/rectangular_blind_slot_coverage.py +8 -2
  47. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/requirements.py +66 -2
  48. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/round_bottom_blind_slot_coverage.py +8 -2
  49. draftwright-0.4.27/src/draftwright/linting/schedule_evidence.py +96 -0
  50. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/slot_coverage.py +8 -2
  51. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/structural.py +23 -1
  52. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/suggest.py +53 -44
  53. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/through_step_coverage.py +60 -43
  54. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/turned_step_coverage.py +14 -4
  55. draftwright-0.4.27/src/draftwright/location_contract.py +56 -0
  56. draftwright-0.4.27/src/draftwright/measurement_support.py +56 -0
  57. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/model/__init__.py +4 -0
  58. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/model/callout.py +5 -2
  59. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/model/compiled.py +296 -5
  60. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/model/detect.py +12 -10
  61. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/model/ir.py +61 -0
  62. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/model/planner.py +145 -14
  63. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/plate_correspondence.py +85 -0
  64. draftwright-0.4.27/src/draftwright/progress.py +209 -0
  65. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/projection.py +3 -1
  66. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/recognition_cache.py +8 -5
  67. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/recognition_frame.py +2 -0
  68. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/registry.py +62 -4
  69. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/repair.py +25 -20
  70. draftwright-0.4.27/src/draftwright/reporting.py +1632 -0
  71. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/sheet.py +136 -9
  72. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/sheet_emit.py +31 -2
  73. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/view_plan.py +4 -2
  74. draftwright-0.4.27/tests/fixtures/whistle_frame_reference.step +18544 -0
  75. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_add_dimension.py +1 -1
  76. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_adr_corpus.py +1 -0
  77. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_compiled_plan_boundary.py +1 -0
  78. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_declare.py +9 -4
  79. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_import_boundaries.py +9 -0
  80. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1144_transactional_hole_table.py +1 -1
  81. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1146_scale_completeness.py +13 -1
  82. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1166_cross_pass_feature_leaders.py +17 -2
  83. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1190_section_decision.py +3 -3
  84. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1217_the_facility_is_shared.py +12 -5
  85. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1308_machined_leader_analytics.py +4 -1
  86. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1338_scale_before_page_escalation.py +7 -0
  87. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1351_structured_note_coverage.py +20 -6
  88. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1373_plate_completeness_evidence.py +82 -4
  89. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1374_turned_step_completeness_evidence.py +14 -0
  90. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1378_diameter_leader_targets.py +11 -0
  91. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1382_through_step_semantics.py +17 -0
  92. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1460_step_inspection.py +1 -0
  93. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1479_radius_leader_targets.py +11 -0
  94. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1514_projection_safeguard.py +1 -1
  95. draftwright-0.4.27/tests/test_issue_1530_section_provenance.py +127 -0
  96. draftwright-0.4.27/tests/test_issue_1531_semantic_hole_counts.py +255 -0
  97. draftwright-0.4.27/tests/test_issue_1532_authored_section_examples.py +123 -0
  98. draftwright-0.4.27/tests/test_issue_1533_review_diagnostics.py +159 -0
  99. draftwright-0.4.27/tests/test_issue_1534_build_progress.py +258 -0
  100. draftwright-0.4.27/tests/test_issue_1536_title_overflow.py +144 -0
  101. draftwright-0.4.27/tests/test_issue_1542_applicability.py +156 -0
  102. draftwright-0.4.27/tests/test_issue_1542_catalog.py +403 -0
  103. draftwright-0.4.27/tests/test_issue_1542_catalog_families.py +130 -0
  104. draftwright-0.4.27/tests/test_issue_1542_claim_authority.py +183 -0
  105. draftwright-0.4.27/tests/test_issue_1542_document.py +203 -0
  106. draftwright-0.4.27/tests/test_issue_1542_document_claims.py +268 -0
  107. draftwright-0.4.27/tests/test_issue_1542_document_coverage.py +244 -0
  108. draftwright-0.4.27/tests/test_issue_1542_document_report.py +389 -0
  109. draftwright-0.4.27/tests/test_issue_1542_report_authority.py +142 -0
  110. draftwright-0.4.27/tests/test_issue_1542_requirement_carriers.py +213 -0
  111. draftwright-0.4.27/tests/test_issue_1543_feature_schedules.py +926 -0
  112. draftwright-0.4.27/tests/test_issue_1543_schedule_requirements.py +596 -0
  113. draftwright-0.4.27/tests/test_issue_1544_frame_document_canary.py +359 -0
  114. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_740_leader_assignment.py +8 -2
  115. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_885_prismatic_coverage.py +20 -2
  116. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_955_height_contingency.py +37 -1
  117. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_label_provenance.py +0 -4
  118. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_layout_cleanliness.py +0 -4
  119. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_make_drawing.py +45 -68
  120. draftwright-0.4.27/tests/test_projection_symbol_default.py +164 -0
  121. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_registry.py +1 -0
  122. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_sheet_emit.py +14 -3
  123. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_sheet_identity_invariant.py +46 -4
  124. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_workflows.py +1 -0
  125. draftwright-0.4.25/src/draftwright/linting/_registry.py +0 -32
  126. draftwright-0.4.25/src/draftwright/reporting.py +0 -673
  127. {draftwright-0.4.25 → draftwright-0.4.27}/.gitignore +0 -0
  128. {draftwright-0.4.25 → draftwright-0.4.27}/CHANGELOG.md +0 -0
  129. {draftwright-0.4.25 → draftwright-0.4.27}/LICENSE +0 -0
  130. {draftwright-0.4.25 → draftwright-0.4.27}/docs/adr/README.md +0 -0
  131. {draftwright-0.4.25 → draftwright-0.4.27}/docs/reference/recogniser-capabilities.md +0 -0
  132. {draftwright-0.4.25 → draftwright-0.4.27}/docs/research/1062-repeating-radial-profile-evidence.md +0 -0
  133. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/_build_profile.py +0 -0
  134. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/_pmi_part21.py +0 -0
  135. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/_warnings.py +0 -0
  136. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/angular_geometry.py +0 -0
  137. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotate.py +0 -0
  138. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotations/__init__.py +0 -0
  139. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotations/angular.py +0 -0
  140. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotations/balloons.py +0 -0
  141. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotations/gears.py +0 -0
  142. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotations/holes.py +0 -0
  143. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/blend_contract.py +0 -0
  144. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/evaluation/__init__.py +0 -0
  145. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/evaluation/step_analysis.py +0 -0
  146. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/feature_identity.py +0 -0
  147. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/fits.py +0 -0
  148. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/fonts/IBMPlexMono-Regular.ttf +0 -0
  149. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/fonts/IBMPlexSansCondensed-Regular.ttf +0 -0
  150. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/fonts/LICENSE-IBMPlexMono-OFL.txt +0 -0
  151. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/fonts/LICENSE-IBMPlexSansCondensed-OFL.txt +0 -0
  152. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/fonts/__init__.py +0 -0
  153. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/inspection.py +0 -0
  154. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/inspection_contract.py +0 -0
  155. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/intents.py +0 -0
  156. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/layout.py +0 -0
  157. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/__init__.py +0 -0
  158. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/angled_step_coverage.py +0 -0
  159. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/gear_coverage.py +0 -0
  160. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/ink_overlap.py +0 -0
  161. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/passage_coverage.py +0 -0
  162. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/pmi_coverage.py +0 -0
  163. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/prismatic_pocket_coverage.py +0 -0
  164. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/profiled_bore_coverage.py +0 -0
  165. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/section_recess_coverage.py +0 -0
  166. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/make_drawing.py +0 -0
  167. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/model/declare.py +0 -0
  168. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/model/pmi_lowering.py +0 -0
  169. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/oriented_slot_contract.py +0 -0
  170. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/pmi.py +0 -0
  171. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/profile_angles.py +0 -0
  172. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/py.typed +0 -0
  173. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/recogniser_contract.py +0 -0
  174. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/recogniser_policy.py +0 -0
  175. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/recogniser_schema.py +0 -0
  176. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/recognition/__init__.py +0 -0
  177. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/recognition_ownership.py +0 -0
  178. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/score.py +0 -0
  179. {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/section_recess_contract.py +0 -0
  180. {draftwright-0.4.25 → draftwright-0.4.27}/tests/_evidence_contract.py +0 -0
  181. {draftwright-0.4.25 → draftwright-0.4.27}/tests/_kernel.py +0 -0
  182. {draftwright-0.4.25 → draftwright-0.4.27}/tests/_layout_sig.py +0 -0
  183. {draftwright-0.4.25 → draftwright-0.4.27}/tests/_mutation_corpus.py +0 -0
  184. {draftwright-0.4.25 → draftwright-0.4.27}/tests/_recogniser_public_contract.py +0 -0
  185. {draftwright-0.4.25 → draftwright-0.4.27}/tests/_section_recess_cases.py +0 -0
  186. {draftwright-0.4.25 → draftwright-0.4.27}/tests/conftest.py +0 -0
  187. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/ap242_single_cylinder_diameter.step +0 -0
  188. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/README.md +0 -0
  189. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/ambiguous-open-semicircle.step +0 -0
  190. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/blind-hole.step +0 -0
  191. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/chamfer-asymmetric.step +0 -0
  192. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/chamfer-compound.step +0 -0
  193. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/chamfer-overlap.step +0 -0
  194. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/chamfer-plain.step +0 -0
  195. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/chamfer-planar-x.step +0 -0
  196. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/chamfer-planar-y.step +0 -0
  197. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/chamfer-planar-z.step +0 -0
  198. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/chamfer-topology-a.step +0 -0
  199. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/chamfer-topology-b.step +0 -0
  200. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/chamfer-turned.step +0 -0
  201. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-chamfers-v1.json +0 -0
  202. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-countersinks-v1.json +0 -0
  203. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-double-d-bores-v1.json +0 -0
  204. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-fillets-v1.json +0 -0
  205. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-flats-v1.json +0 -0
  206. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-grooves-v1.json +0 -0
  207. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-hole-patterns-v1.json +0 -0
  208. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-plates-v1.json +0 -0
  209. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-pocket-patterns-v1.json +0 -0
  210. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-pockets-v1.json +0 -0
  211. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-polygonal-bosses-v1.json +0 -0
  212. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-polygonal-stock-v1.json +0 -0
  213. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-rectangular-pads-v1.json +0 -0
  214. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-turned-steps-v1.json +0 -0
  215. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-v1.json +0 -0
  216. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/countersink-deburr.step +0 -0
  217. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/countersink-external-cone.step +0 -0
  218. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/countersink-mixed-pair.step +0 -0
  219. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/countersink-single.step +0 -0
  220. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/countersink-topology-a.step +0 -0
  221. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/countersink-topology-b.step +0 -0
  222. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/double-d-axis-x.step +0 -0
  223. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/double-d-axis-y.step +0 -0
  224. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/double-d-blind.step +0 -0
  225. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/double-d-coaxial-compound.step +0 -0
  226. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/double-d-opposed-blind.step +0 -0
  227. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/double-d-roll-30.step +0 -0
  228. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/double-d-round-bore.step +0 -0
  229. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/double-d-single-z.step +0 -0
  230. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/double-d-topology-a.step +0 -0
  231. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/double-d-topology-b.step +0 -0
  232. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/fillet-compound.step +0 -0
  233. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/fillet-overlap.step +0 -0
  234. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/fillet-plain.step +0 -0
  235. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/fillet-planar-x.step +0 -0
  236. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/fillet-planar-y.step +0 -0
  237. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/fillet-planar-z.step +0 -0
  238. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/fillet-repeated.step +0 -0
  239. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/fillet-topology-a.step +0 -0
  240. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/fillet-topology-b.step +0 -0
  241. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/fillet-turned.step +0 -0
  242. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/flat-coaxial.step +0 -0
  243. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/flat-double-d.step +0 -0
  244. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/flat-lone-d.step +0 -0
  245. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/flat-nonround.step +0 -0
  246. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/flat-slanted-double-d.step +0 -0
  247. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/flat-topology-a.step +0 -0
  248. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/flat-topology-b.step +0 -0
  249. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/groove-compound.step +0 -0
  250. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/groove-lone-x.step +0 -0
  251. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/groove-lone-y.step +0 -0
  252. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/groove-lone-z.step +0 -0
  253. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/groove-monotonic-negative.step +0 -0
  254. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/groove-narrow.step +0 -0
  255. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/groove-topology-a.step +0 -0
  256. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/groove-topology-b.step +0 -0
  257. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-compound-equal.step +0 -0
  258. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-detached-body-negative.step +0 -0
  259. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-full-span-ledge-negative.step +0 -0
  260. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-nested-staircase-negative.step +0 -0
  261. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-topology-a.step +0 -0
  262. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-topology-b.step +0 -0
  263. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-x-negative.step +0 -0
  264. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-x-positive.step +0 -0
  265. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-y-negative.step +0 -0
  266. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-y-positive.step +0 -0
  267. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-z-negative.step +0 -0
  268. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-z-positive.step +0 -0
  269. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pattern-ambiguous.step +0 -0
  270. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pattern-grid.step +0 -0
  271. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pattern-topology-a.step +0 -0
  272. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pattern-topology-b.step +0 -0
  273. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plain-block.step +0 -0
  274. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-compound-equal.step +0 -0
  275. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-cross-topology-a.step +0 -0
  276. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-cross-topology-b.step +0 -0
  277. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-detached-negative.step +0 -0
  278. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-rotational-negative.step +0 -0
  279. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-single-negative.step +0 -0
  280. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-t-xz.step +0 -0
  281. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-t-yz.step +0 -0
  282. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-thick-negative.step +0 -0
  283. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-u-additive.step +0 -0
  284. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-u-cut.step +0 -0
  285. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-compound.step +0 -0
  286. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-edge-anchored.step +0 -0
  287. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-lone.step +0 -0
  288. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-opposed.step +0 -0
  289. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-pattern-ambiguous.step +0 -0
  290. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-pattern-grid.step +0 -0
  291. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-pattern-linear.step +0 -0
  292. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-pattern-pair.step +0 -0
  293. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-pattern-topology-a.step +0 -0
  294. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-pattern-topology-b.step +0 -0
  295. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-prismatic-negative.step +0 -0
  296. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-side.step +0 -0
  297. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-through-negative.step +0 -0
  298. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-topology-a.step +0 -0
  299. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-topology-b.step +0 -0
  300. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-two-equal.step +0 -0
  301. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-compound-equal.step +0 -0
  302. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-detached-negative.step +0 -0
  303. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-in-plane-rotated.step +0 -0
  304. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-other-protrusions-negative.step +0 -0
  305. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-recess-negative.step +0 -0
  306. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-stock-negative.step +0 -0
  307. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-topology-a.step +0 -0
  308. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-topology-b.step +0 -0
  309. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-x.step +0 -0
  310. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-y.step +0 -0
  311. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-z.step +0 -0
  312. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-compound-negative.step +0 -0
  313. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-cylinder-negative.step +0 -0
  314. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-irregular-negative.step +0 -0
  315. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-octagon-negative.step +0 -0
  316. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-recess-negative.step +0 -0
  317. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-roll17.step +0 -0
  318. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-topology-a.step +0 -0
  319. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-topology-b.step +0 -0
  320. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-translated.step +0 -0
  321. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-x.step +0 -0
  322. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-y.step +0 -0
  323. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/topology-a.step +0 -0
  324. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/topology-b.step +0 -0
  325. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/turned-step-axis-x.step +0 -0
  326. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/turned-step-axis-y.step +0 -0
  327. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/turned-step-axis-z.step +0 -0
  328. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/turned-step-compound.step +0 -0
  329. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/turned-step-repeated-lengths.step +0 -0
  330. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/turned-step-through-bore.step +0 -0
  331. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/turned-step-topology-a.step +0 -0
  332. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/turned-step-topology-b.step +0 -0
  333. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/turned-step-translated-blind-bore.step +0 -0
  334. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/grm03_thumbwheel_drive_screw.step +0 -0
  335. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/grm03_thumbwheel_drive_screw_ap242_pmi.step +0 -0
  336. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/grm04_drive_plate.step +0 -0
  337. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/if_step_flat_across_cylinder.step +0 -0
  338. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/issue_1058_wheel_rh.step +0 -0
  339. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/issue_1247_angled_blind_step.step +0 -0
  340. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/issue_909_basic_part_design_017_body.step +0 -0
  341. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/issue_915_case_study_2.step +0 -0
  342. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/nist_ctc_01_asme1_ap203.stp +0 -0
  343. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/nist_ctc_01_asme1_ap242.stp +0 -0
  344. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/nist_ctc_02_asme1_ap203.stp +0 -0
  345. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/nist_ctc_02_asme1_ap242.stp +0 -0
  346. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/nist_ctc_03_asme1_ap203.stp +0 -0
  347. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/nist_ctc_03_asme1_ap242.stp +0 -0
  348. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/nist_ctc_04_asme1_ap203.stp +0 -0
  349. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/nist_ctc_04_asme1_ap242.stp +0 -0
  350. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/nist_ctc_05_asme1_ap203.stp +0 -0
  351. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/nist_ctc_05_asme1_ap242.stp +0 -0
  352. {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/tuner_jig_blind_obround_pockets.step +0 -0
  353. {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/bracket_section.json +0 -0
  354. {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/centered_rebate.json +0 -0
  355. {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/chamfered.json +0 -0
  356. {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/filleted.json +0 -0
  357. {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/flange_dense.json +0 -0
  358. {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/grid_plate.json +0 -0
  359. {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/grooved_shaft.json +0 -0
  360. {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/hex_bar.json +0 -0
  361. {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/holed_slot.json +0 -0
  362. {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/pocketed.json +0 -0
  363. {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/prismatic_ladder.json +0 -0
  364. {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/scattered_plate.json +0 -0
  365. {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/side_drilled.json +0 -0
  366. {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/turned_stepped.json +0 -0
  367. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_adr0018_arrangement_gate.py +0 -0
  368. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_adr0018_view_routing.py +0 -0
  369. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_adr0018_view_selection.py +0 -0
  370. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_agents_guide.py +0 -0
  371. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_api_docs.py +0 -0
  372. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_architecture_docs.py +0 -0
  373. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_audit_differential.py +0 -0
  374. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_balloon_ring_standoff.py +0 -0
  375. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_build_profile_harness.py +0 -0
  376. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_carve_free_position_callers.py +0 -0
  377. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_clone_budget.py +0 -0
  378. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_counting_calls.py +0 -0
  379. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_declared_recognition_gate.py +0 -0
  380. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_dense_sheet_canary.py +0 -0
  381. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_deprecation_dates.py +0 -0
  382. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_detect_once.py +0 -0
  383. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_detect_registry.py +0 -0
  384. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_dimension_role_vocabulary.py +0 -0
  385. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_drawing_encapsulation.py +0 -0
  386. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_e2e_slice.py +0 -0
  387. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_e2e_standards.py +0 -0
  388. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_export_dxf_curves.py +0 -0
  389. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_export_dxf_zoom.py +0 -0
  390. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_export_reproducible.py +0 -0
  391. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_external_recognition_boundary.py +0 -0
  392. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_fillets_adjacency.py +0 -0
  393. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_fits.py +0 -0
  394. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_flat_completeness.py +0 -0
  395. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_flat_stock_identity.py +0 -0
  396. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_flat_stock_opposition.py +0 -0
  397. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_gdt_placement.py +0 -0
  398. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_geometry_graph_spike.py +0 -0
  399. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_grid_lattice_convention.py +0 -0
  400. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_inspection_contract.py +0 -0
  401. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_iso_nts_caption_placement.py +0 -0
  402. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1000_envelope_reuse.py +0 -0
  403. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1006_measurement_comparison.py +0 -0
  404. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1058_wheel_profile.py +0 -0
  405. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1073_cross_body_patterns.py +0 -0
  406. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1082_polygonal_stock.py +0 -0
  407. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1086_declared_gears.py +0 -0
  408. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1116_ap242_hole_tolerance_lowering.py +0 -0
  409. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1130_view_planning_evidence.py +0 -0
  410. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1142_hole_leader_labels.py +0 -0
  411. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1143_hole_completeness.py +0 -0
  412. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1147_legibility_pair_aggregation.py +0 -0
  413. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1153_contradictory_dimensions.py +0 -0
  414. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1154_one_owner_per_measurement.py +0 -0
  415. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1155_grm04_sheet_use.py +0 -0
  416. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1176_quality_fidelity.py +0 -0
  417. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1177_angular_dimensions.py +0 -0
  418. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1187_unroutable_leaders.py +0 -0
  419. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1188_per_view_assignment.py +0 -0
  420. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1196_deterministic_view_names.py +0 -0
  421. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1202_observed_drawing_consumer.py +0 -0
  422. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1204_multiscale_view_issues.py +0 -0
  423. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1209_linear_pmi_witnesses.py +0 -0
  424. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1215_envelope_tolerance.py +0 -0
  425. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1215_no_approved_tolerance_is_dropped.py +0 -0
  426. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1216_callout_reservation_measures_ink.py +0 -0
  427. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1216_pairwise_across_scale_groups.py +0 -0
  428. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1217_claimed_representations.py +0 -0
  429. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1219_location_claims_its_own_axis.py +0 -0
  430. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1229_ledger_member_keying.py +0 -0
  431. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1240_iso_above_strip_visibility.py +0 -0
  432. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1245_passage_disposition.py +0 -0
  433. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1246_prismatic_pocket_disposition.py +0 -0
  434. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1247_angled_step_disposition.py +0 -0
  435. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1254_turned_chamfers.py +0 -0
  436. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1260_view_constraints.py +0 -0
  437. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1262_automatic_turned_views.py +0 -0
  438. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1276_turned_leader_targets.py +0 -0
  439. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1281_turned_fillets.py +0 -0
  440. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1296_cylindrical_diameter_pmi.py +0 -0
  441. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1298_manufacturing_requirements.py +0 -0
  442. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1299_page_escalation.py +0 -0
  443. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1312_engine_costs.py +0 -0
  444. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1325_nominal_agreement.py +0 -0
  445. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1332_overlap_remedy.py +0 -0
  446. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1332_zone_labels.py +0 -0
  447. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1333_bounded_ink_repair.py +0 -0
  448. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1334_prevent_ink.py +0 -0
  449. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1336_grm03_ap242_pmi_fixture.py +0 -0
  450. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1349_precision_display.py +0 -0
  451. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1350_detected_takeover.py +0 -0
  452. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1352_searchable_pdf_text.py +0 -0
  453. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1353_cnc_authoritative_workflow.py +0 -0
  454. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1357_framed_activation.py +0 -0
  455. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1357_framed_boundary.py +0 -0
  456. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1357_plural_turned_profiles.py +0 -0
  457. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1357_pmi_frame.py +0 -0
  458. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1360_thread_depth.py +0 -0
  459. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1369_hole_completeness_evidence.py +0 -0
  460. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1370_countersink_completeness_evidence.py +0 -0
  461. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1370_double_d_completeness_evidence.py +0 -0
  462. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1370_hole_pattern_completeness_evidence.py +0 -0
  463. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1371_flat_completeness_evidence.py +0 -0
  464. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1371_polygonal_stock_completeness_evidence.py +0 -0
  465. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1372_groove_completeness_evidence.py +0 -0
  466. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1372_pad_completeness_evidence.py +0 -0
  467. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1372_pocket_completeness_evidence.py +0 -0
  468. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1372_pocket_pattern_completeness_evidence.py +0 -0
  469. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1372_polygonal_boss_completeness_evidence.py +0 -0
  470. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1374_chamfer_completeness_evidence.py +0 -0
  471. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1374_fillet_completeness_evidence.py +0 -0
  472. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1382_046_step_inventory.py +0 -0
  473. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1382_circular_blind_step_semantics.py +0 -0
  474. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1382_framed_step_family_evidence.py +0 -0
  475. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1382_paired_ramp_semantics.py +0 -0
  476. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1390_sheet_registration.py +0 -0
  477. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1392_recognisers_048.py +0 -0
  478. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1395_degenerate_iso_region.py +0 -0
  479. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1396_layout_advisories.py +0 -0
  480. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1397_unverifiable_requirement_message.py +0 -0
  481. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1421_rectangular_blind_slot_completeness.py +0 -0
  482. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1421_rectangular_blind_slot_semantics.py +0 -0
  483. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1421_round_bottom_blind_slot_completeness.py +0 -0
  484. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1421_round_bottom_blind_slot_semantics.py +0 -0
  485. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1432_adoption.py +0 -0
  486. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1432_boundary_failures.py +0 -0
  487. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1432_oriented_slot_semantics.py +0 -0
  488. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1433_blend_semantics.py +0 -0
  489. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_boss_ownership.py +0 -0
  490. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_channel_ownership.py +0 -0
  491. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_cli_report_sidecar.py +0 -0
  492. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_generation_snapshot.py +0 -0
  493. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_nested_ownership.py +0 -0
  494. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_occurrence_ownership.py +0 -0
  495. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_pattern_ownership.py +0 -0
  496. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_plate_ownership.py +0 -0
  497. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_policy_dispositions.py +0 -0
  498. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_report_projection.py +0 -0
  499. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_report_writer.py +0 -0
  500. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_through_step_ownership.py +0 -0
  501. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_turned_step_ownership.py +0 -0
  502. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1450_boss_blend_ownership.py +0 -0
  503. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1466_dimension_options.py +0 -0
  504. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1466_semantic_sides.py +0 -0
  505. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1471_boundary_failures.py +0 -0
  506. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1471_evidence_schema.py +0 -0
  507. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1471_groove_profile.py +0 -0
  508. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1471_section_recess_contract.py +0 -0
  509. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1471_section_recess_pockets.py +0 -0
  510. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1485_curved_pockets.py +0 -0
  511. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1485_quiddity_024_boundary.py +0 -0
  512. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1485_rounded_pockets.py +0 -0
  513. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1504_angle_patterns.py +0 -0
  514. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1504_angular_references.py +0 -0
  515. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1504_angular_rendering.py +0 -0
  516. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1504_canonical_angles.py +0 -0
  517. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1504_profile_angles.py +0 -0
  518. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1505_diameter_coverage.py +0 -0
  519. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1505_short_axial_chains.py +0 -0
  520. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1511_turned_boss_heights.py +0 -0
  521. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1515_first_angle.py +0 -0
  522. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1516_dimension_text.py +0 -0
  523. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1517_through_indicator.py +0 -0
  524. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1518_explicit_rear.py +0 -0
  525. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1524_tolerance_magnitude.py +0 -0
  526. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_367_leader_ink.py +0 -0
  527. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_443_grm03_axial_coverage.py +0 -0
  528. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_563_placement_intent.py +0 -0
  529. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_676_polygonal_boss.py +0 -0
  530. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_676_polygonal_boss_declare.py +0 -0
  531. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_798_floor_cardinality.py +0 -0
  532. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_798_material_field.py +0 -0
  533. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_798_silhouette_lint.py +0 -0
  534. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_827_real_part_canary.py +0 -0
  535. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_883_location_identity.py +0 -0
  536. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_909_sloped_profile.py +0 -0
  537. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_915_dense_case.py +0 -0
  538. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_916_pocket_leader.py +0 -0
  539. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_917_open_channel.py +0 -0
  540. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_924_zero_length_shoulders.py +0 -0
  541. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_958_cross_solid_recognition.py +0 -0
  542. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_layout.py +0 -0
  543. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_layout_hypothesis.py +0 -0
  544. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_layout_property.py +0 -0
  545. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_leader_footprint.py +0 -0
  546. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_lint_box_cache.py +0 -0
  547. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_lint_ink_overlap.py +0 -0
  548. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_lint_reconciliation.py +0 -0
  549. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_lint_structural.py +0 -0
  550. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_linting.py +0 -0
  551. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_location_vocabulary.py +0 -0
  552. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_note_verb.py +0 -0
  553. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_object_aspects.py +0 -0
  554. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_occupancy_boxes.py +0 -0
  555. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_overall_height_coverage.py +0 -0
  556. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_parameter_id.py +0 -0
  557. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_part_model.py +0 -0
  558. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_pitch_dim_footprint.py +0 -0
  559. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_pmi.py +0 -0
  560. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_pmi_datum_lowering.py +0 -0
  561. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_pmi_gtol_lowering.py +0 -0
  562. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_pmi_part21.py +0 -0
  563. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_pocket_pattern.py +0 -0
  564. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_pocket_pattern_recognition.py +0 -0
  565. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_principal_profile_classifier.py +0 -0
  566. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_private_test_attr_reads.py +0 -0
  567. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_private_test_imports.py +0 -0
  568. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_quality_components.py +0 -0
  569. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_recogniser_adoption.py +0 -0
  570. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_recogniser_capabilities.py +0 -0
  571. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_recogniser_contract.py +0 -0
  572. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_recognition_result.py +0 -0
  573. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_refactor_golden.py +0 -0
  574. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_render_seam.py +0 -0
  575. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_repack_geometry_seam.py +0 -0
  576. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_score.py +0 -0
  577. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_script_detail_parity.py +0 -0
  578. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_shared_box_memo.py +0 -0
  579. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_sheet_gdt.py +0 -0
  580. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_sheet_notes.py +0 -0
  581. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_sheet_of.py +0 -0
  582. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_sheet_section.py +0 -0
  583. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_sheet_tables.py +0 -0
  584. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_slanted_blind_step.py +0 -0
  585. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_slot_completeness.py +0 -0
  586. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_slot_pattern.py +0 -0
  587. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_slot_pattern_recognition.py +0 -0
  588. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_soft_deprecation.py +0 -0
  589. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_solve_trace.py +0 -0
  590. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_step_analysis_evaluation.py +0 -0
  591. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_strip_layout.py +0 -0
  592. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_suppression_ledger.py +0 -0
  593. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_suppression_marks.py +0 -0
  594. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_tolerances.py +0 -0
  595. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_turned_steps.py +0 -0
  596. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_version_bump_ci.py +0 -0
  597. {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_view_plan.py +0 -0
  598. {draftwright-0.4.25 → draftwright-0.4.27}/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.25
3
+ Version: 0.4.27
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
@@ -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:
@@ -9,7 +9,10 @@ with an underscore.
9
9
  Use `Sheet(part, projection="first")` or `build_drawing(part, projection="first")`
10
10
  for first-angle layout and its matching projection symbol. The CLI equivalent is
11
11
  `--projection first`. Explicit `"third"` selects third-angle layout and its symbol;
12
- omitting `projection` keeps third-angle layout without a symbol.
12
+ omitting `projection` uses third-angle layout and its symbol. Use
13
+ `projection_symbol=False` (CLI: `--no-projection-symbol`) to omit the symbol for an
14
+ embedded illustration; this does not change the projection convention or view layout.
15
+ The visibility choice also survives generated-script replay.
13
16
 
14
17
  View names retain their physical viewing directions in the working part frame. Changing
15
18
  convention changes sheet relationships, not which side of the part a name shows:
@@ -27,6 +30,58 @@ fails before projection; a whole-view pin must preserve the convention's relatio
27
30
 
28
31
  ## Dimension text style
29
32
 
33
+ ### Title fields and notes at paper size
34
+
35
+ Keep title-block values concise and put longer engineering information in a `notes()` block.
36
+ `title_field_overflow` identifies text wider or taller than its title-block cell, even when the
37
+ text remains inside the page. This is a legibility warning, like overlapping annotations;
38
+ text outside the drawable page remains an `annotation_out_of_bounds` error. The full value
39
+ stays rendered; the diagnostic does not truncate it, shrink the font or invent an abbreviation.
40
+ `lint_summary()["passed"]` checks errors only, so inspect warnings and the legibility component
41
+ as well. A title warning does not prevent scale recovery from restoring missing measurements.
42
+
43
+ <!-- issue-1536-notes-example -->
44
+ ```python
45
+ from build123d import Box
46
+ from draftwright import Sheet
47
+
48
+ sheet = Sheet(
49
+ Box(30, 20, 10), page="A4", scale=2,
50
+ title="FRAME - DFM REVIEW", number="REVIEW", material="SEE NOTES",
51
+ detail_view=False,
52
+ )
53
+ sheet.authored_dimensions()
54
+ envelope = sheet.envelope()
55
+ for parameter in envelope.dimension_ids():
56
+ sheet.dimension(envelope, parameter)
57
+ sheet.notes([
58
+ "QUOTATION / DFM REVIEW - NOT RELEASED",
59
+ "Material: TITANIUM - GRADE TBD",
60
+ "Hinge fit and pin retention: engineering decision required",
61
+ ], prefer="tr")
62
+ drawing = sheet.build()
63
+ for issue in drawing.lint():
64
+ print(issue.severity, issue.code, issue.message)
65
+ ```
66
+ <!-- /issue-1536-notes-example -->
67
+
68
+ `page` and `scale` control the sheet and model size. The current annotation preset has a fixed
69
+ 3 mm nominal paper font size; changing scale does not enlarge notes. `Sheet.notes()` and
70
+ `Sheet.table()` have no font-size option. `text_position` and `text_orientation` below control
71
+ dimension style, not note size. A smaller model scale makes notes larger relative to the part;
72
+ a smaller page changes how much of the page they occupy. Neither changes their printed size.
73
+ For the A2 frame trial, retain A2 and the requested scale unless the full package fits the new
74
+ constraints with its required measurements intact; the small box example is not proof that
75
+ the frame fits A4.
76
+
77
+ `prefer="tr"` ranks available table positions near the top-right corner. The shared placement
78
+ solve still measures the whole notes block and checks all occupied regions. If it cannot fit,
79
+ `table_dropped` reports the failure. Split long prose into authored lines or choose an appropriate
80
+ page; do not remove engineering content merely to silence a diagnostic. General notes remain
81
+ uncredited text: they do not automatically satisfy missing dimensions or unsupported features.
82
+
83
+ ### Dimension position and reading direction
84
+
30
85
  Position and reading direction are independent drawing-wide settings:
31
86
 
32
87
  ```python
@@ -74,6 +129,20 @@ resolved wording, machining specifications and placement constraints agree; orig
74
129
  owners and measurement identities remain separate. Removing one owner of a shared callout
75
130
  rebuilds the survivors through the placement solver.
76
131
 
132
+ ## Feature schedules
133
+
134
+ `sheet.schedule([(feature, ("bore.diameter", "location"))], name="holes")` declares a measured
135
+ table through the same IR/compiler as ordinary dimensions. Features may be fluent handles or
136
+ exact owned IR objects. Values, tolerances, units and through/blind wording come from the
137
+ compiler. `location` expands the addressable member coordinates; explicit canonical IDs select
138
+ individual components. Use `prefer="tr"`, `"tl"`, `"br"` or `"bl"` to rank the existing table
139
+ placement candidates.
140
+
141
+ Schedules establish authored dimension intent. Add `sheet.dimension(...)` declarations when a
142
+ measurement should also appear beside a view. Ordinary `table(...)` text has no measurement
143
+ authority. See [shared drawing documents](document.md#feature-schedules) for an executable
144
+ recipe, verified cell evidence and the document report contract.
145
+
77
146
  ## Grooves on coaxial bodies
78
147
 
79
148
  When different turned bodies share an axis line, give their steps distinct `profile_group`
@@ -304,17 +373,84 @@ View declarations are semantic constraints. They name projections, relationships
304
373
  anchors; the layout solve owns the resulting page positions. Authored views must be paired with
305
374
  authored dimensions so a deliberately omitted view cannot strand planner-selected annotations:
306
375
 
376
+ This runnable example includes the part, feature declarations, dimension discovery,
377
+ three principal views and section A–A. The bore's location dimensions are deliberately
378
+ omitted, and lint keeps those omissions visible.
379
+
380
+ <!-- example: authored-section -->
381
+ ```python
382
+ from build123d import Box, Cylinder, Pos
383
+ from draftwright import Sheet
384
+
385
+ bore_tool = Pos(12, 0, 0) * Cylinder(3, 12)
386
+ part = Box(60, 40, 12) - bore_tool
387
+ sheet = Sheet(part, page="A3", scale=1, projection="third")
388
+ sheet.authored_dimensions().authored_views()
389
+
390
+ envelope = sheet.envelope(part)
391
+ for parameter_id in envelope.dimension_ids():
392
+ sheet.dimension(envelope, parameter_id)
393
+ bore = sheet.hole(bore_tool)
394
+ print(bore.dimension_ids()) # discover this handle's Sheet measurement IDs
395
+ sheet.dimension(bore, "bore.diameter")
396
+
397
+ for name in ("front", "plan", "side"):
398
+ sheet.view(name)
399
+ sheet.section_view("A", through=bore) # or at=0 for an explicit model-space Y plane
400
+
401
+ drawing = sheet.build()
402
+ issues = drawing.lint()
403
+ for issue in issues:
404
+ print(issue.severity, issue.code, issue.message)
405
+ # drawing.export("build/section", formats=("pdf", "svg"))
406
+ ```
407
+
408
+ On a Sheet handle, `dimension_ids()` lists dotted measurement IDs; use
409
+ `sheet.dimension(bore, "bore.diameter")`. On a built Drawing, the second argument to
410
+ `drawing.dimension(envelope_feature, "length", role="width")` is a parameter kind,
411
+ with `role=` distinguishing measurements of the same kind. Hole diameter and depth
412
+ are callout content: use `drawing.callout(bore_feature)` for those, not
413
+ `drawing.dimension(...)`. These are different vocabularies.
414
+
415
+ #### Augmenting automatic views
416
+
417
+ `view()` and `section_view()` specify complete authored sets. `add_view()` and
418
+ `add_section_view()` instead augment an explicitly automatic set. Choose the source
419
+ before adding views; an authored set cannot be switched to automatic in place.
420
+
421
+ This separate, runnable example keeps automatic principal and derived views and
422
+ adds a section at model-space Y=0. Its dimensions are still explicitly authored:
423
+
424
+ <!-- example: automatic-section -->
307
425
  ```python
308
- s = Sheet(part).authored_dimensions().authored_views()
309
- front = s.view("front")
310
- plan = s.view("plan").above(front, gap=4).align_x(front)
311
- s.view("iso").scale(0.75)
312
-
313
- section = s.section_view("A", through=hole)
314
- detail = s.detail_view("B", around=hole).scale(2)
315
- dwg = s.build()
426
+ from build123d import Box
427
+ from draftwright import Sheet
428
+
429
+ part = Box(60, 40, 12)
430
+ sheet = Sheet(part, page="A3", scale=1).authored_dimensions()
431
+ envelope = sheet.envelope(part)
432
+ for parameter_id in envelope.dimension_ids():
433
+ sheet.dimension(envelope, parameter_id)
434
+ sheet.auto_views()
435
+ sheet.add_section_view("A", at=0)
436
+ drawing = sheet.build()
437
+ issues = drawing.lint()
438
+ for issue in issues:
439
+ print(issue.severity, issue.code, issue.message)
316
440
  ```
317
441
 
442
+ `auto_views()` emits `SoftDeprecationWarning`: it remains supported and has no removal
443
+ date. The notice recommends the editable authored surface; it does not mean the
444
+ augmentation example is invalid. Automatic dimensions remain supported too, but they
445
+ cannot be paired with a complete authored view set.
446
+
447
+ `Sheet.section()` is deprecated with removal targeted at 0.6.0. For an authored
448
+ workflow replace it with `section_view("A", through=feature)` or `section_view("A", at=y)`;
449
+ for automatic augmentation use `auto_views()` followed by `add_section_view(...)`.
450
+ `Drawing.section()` is a separate automatic post-build operation and may add no section
451
+ when the geometry does not warrant one.
452
+
453
+
318
454
  Rear views are explicitly requested. `s.view("rear")` includes rear in an authored
319
455
  view set; `s.auto_views().add_view("rear")` adds it to the automatic baseline.
320
456
  Rear looks toward the part from +Y with Z upward, so increasing world X runs left
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "draftwright"
7
- version = "0.4.25"
7
+ version = "0.4.27"
8
8
  description = "Automated technical-drawing generation for build123d"
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -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",
@@ -20,7 +20,6 @@ import re
20
20
  from bisect import bisect_left, bisect_right
21
21
  from collections.abc import Callable
22
22
  from dataclasses import dataclass
23
- from decimal import Decimal
24
23
  from pathlib import Path
25
24
  from types import SimpleNamespace
26
25
  from typing import TYPE_CHECKING, Literal
@@ -63,6 +62,7 @@ from draftwright._geometry import ( # noqa: F401
63
62
  HoleRef,
64
63
  _axis_letter,
65
64
  _fmt,
65
+ _fmt_tolerance,
66
66
  _xyz,
67
67
  )
68
68
  from draftwright.fits import FitClass
@@ -110,6 +110,7 @@ def place_annotation(
110
110
  feature=None,
111
111
  measurement=None,
112
112
  satisfaction=None,
113
+ cells=(),
113
114
  ):
114
115
  """The annotation-placement primitive (#817): register *obj* under *name* — replacing any
115
116
  prior object of that name (dropped from the render list *items*) so a name maps to one
@@ -126,7 +127,7 @@ def place_annotation(
126
127
  items.remove(displaced)
127
128
  annotate(obj, name)
128
129
  items.append(obj)
129
- registry.add(obj, name, view, feature, measurement, satisfaction)
130
+ registry.add(obj, name, view, feature, measurement, satisfaction, cells=cells)
130
131
  return obj
131
132
 
132
133
 
@@ -357,15 +358,7 @@ def _tol_suffix(tolerance, draft) -> str:
357
358
  if isinstance(tolerance, FitClass):
358
359
  return tolerance.suffix()
359
360
 
360
- def magnitude(value):
361
- decimal = Decimal(str(value))
362
- precision = max(draft.decimal_precision, -int(decimal.as_tuple().exponent))
363
- return f"{decimal:.{precision}f}"
364
-
365
- if isinstance(tolerance, (int, float)):
366
- return f" ±{magnitude(tolerance)}"
367
- lo, hi = tolerance
368
- return f" +{magnitude(hi)} -{magnitude(lo)}"
361
+ return _fmt_tolerance(tolerance, draft.decimal_precision)
369
362
 
370
363
 
371
364
  def _tag_sequence(n):
@@ -1267,9 +1260,10 @@ class Analysis:
1267
1260
  # Draw a sheet border/frame (#767). When True, `margin` is already the reserved content
1268
1261
  # margin (`_content_margin(True)`), so content clears the frame drawn at `_MARGIN`.
1269
1262
  frame: bool = False
1270
- # Projection-method symbol (#769): "third" / "first" (ISO 5456-2) or None (omit).
1263
+ # Requested convention; None resolves to third-angle. Symbol visibility is independent.
1271
1264
  projection: str | None = None
1272
1265
  projection_convention: str = "third"
1266
+ projection_symbol: bool = True
1273
1267
  text_position: str = "inline"
1274
1268
  text_orientation: str = "aligned"
1275
1269
  # Draw the ISO 5457 zone-grid border ruler (#768). Implies a frame (the ticks sit on it).
@@ -1419,6 +1413,13 @@ def _make_title_block(dwg, a: Analysis):
1419
1413
  )
1420
1414
  )
1421
1415
  tb.pdf_text_specs = tuple(specs)
1416
+ # Keep the exact rendered field inputs for structural cell-overflow checks. Cell geometry
1417
+ # remains owned by TitleBlock.cell_bbox(); it is not copied into a second layout model.
1418
+ tb.title_field_specs = tuple(
1419
+ (field, value, dwg.draft.font_size, PLEX_SANS_CONDENSED)
1420
+ for field, value in fields
1421
+ if value
1422
+ )
1422
1423
  return tb, cell
1423
1424
 
1424
1425
 
@@ -1481,11 +1482,15 @@ def _add_projection_symbol(dwg, a: Analysis):
1481
1482
  just above the drawn title block (deterministic empty space — the block reserves _TB_H but
1482
1483
  draws shorter). Registered ``projection_symbol`` with an ``is_projection_symbol`` identity
1483
1484
  rider. Unlike the page-spanning frame it is NOT lint-exempt: it's a small, well-placed glyph,
1484
- so lint covers it and a future mispositioning is caught. Gated on ``a.projection``."""
1485
+ so lint covers it and a future mispositioning is caught. Suppressed only by
1486
+ ``projection_symbol=False``."""
1487
+ if not a.projection_symbol:
1488
+ return
1489
+
1485
1490
  from build123d_drafting import ProjectionSymbol
1486
1491
 
1487
1492
  sym = ProjectionSymbol(
1488
- a.projection,
1493
+ a.projection_convention,
1489
1494
  draft=draft_preset(
1490
1495
  font_size=dwg.draft.font_size,
1491
1496
  decimal_precision=dwg.draft.decimal_precision,
@@ -1496,7 +1501,8 @@ def _add_projection_symbol(dwg, a: Analysis):
1496
1501
  bx, by = (b.min.X + b.max.X) / 2, (b.min.Y + b.max.Y) / 2
1497
1502
  w, h = b.max.X - b.min.X, b.max.Y - b.min.Y
1498
1503
  # Right side of the title-block column, near the top of its reserved band.
1499
- cx = a.PAGE_W - _TB_CLEAR - w / 2 - 3
1504
+ # Sheet frames reserve an inner content margin; keep furniture inside it too.
1505
+ cx = a.PAGE_W - max(_TB_CLEAR + 3, a.margin) - w / 2
1500
1506
  cy = _TB_CLEAR + _TB_H - h / 2 - 2
1501
1507
  sym = sym.locate(Location((cx - bx, cy - by, 0)))
1502
1508
  sym.is_projection_symbol = True
@@ -588,6 +588,29 @@ def _fmt(v: float, decimals: int | None = None) -> str:
588
588
  return str(r) if abs(v - r) < 1e-6 else f"{v:.1f}"
589
589
 
590
590
 
591
+ def _fmt_tolerance(tolerance, decimal_precision: int = 1) -> str:
592
+ """Shared numeric tolerance suffix, preserving every authored deviation digit."""
593
+ if tolerance is None:
594
+ return ""
595
+
596
+ def magnitude(value):
597
+ decimal = Decimal(str(value))
598
+ precision = max(decimal_precision, -int(decimal.as_tuple().exponent))
599
+ return f"{decimal:.{precision}f}"
600
+
601
+ if isinstance(tolerance, (int, float)):
602
+ return f" ±{magnitude(tolerance)}"
603
+ lo, hi = tolerance
604
+ return f" +{magnitude(hi)} -{magnitude(lo)}"
605
+
606
+
607
+ def _fmt_chamfer(leg_text, leg, other_leg, angle) -> str:
608
+ """Shared chamfer form: equal 45-degree legs use C, asymmetric legs state the angle."""
609
+ if abs(leg - other_leg) < 0.05 and abs(angle - 45.0) < 0.5:
610
+ return f"C{leg_text}"
611
+ return f"{leg_text} × {_fmt(angle)}°"
612
+
613
+
591
614
  def _fmt_angle(value, decimals=None, tolerance=None) -> str:
592
615
  """Complete angular text shared by footprint sizing and compilation.
593
616
 
@@ -57,13 +57,16 @@ from draftwright.compose import (
57
57
  _build_zones,
58
58
  _est_hole_table_sizes,
59
59
  _est_planned_bore_callout_width,
60
+ _est_table_size,
60
61
  _layout_geometry,
61
62
  _measure_strips,
62
63
  choose_scale,
63
64
  )
65
+ from draftwright.model.compiled import compile_dimensions
64
66
  from draftwright.model.detect import _build_part_model_from_recognition
65
67
  from draftwright.model.ir import Datum, GrooveFeature, PartModel, StepFeature, StepLevelFeature
66
- from draftwright.model.planner import plan_dimensions
68
+ from draftwright.model.planner import annotation_groups, plan_dimensions
69
+ from draftwright.progress import observed_stage
67
70
  from draftwright.recognition_cache import _result_from_evidence
68
71
  from draftwright.recognition_frame import (
69
72
  FramedDetection,
@@ -84,6 +87,7 @@ _log = logging.getLogger(__name__)
84
87
  _ScalePick = tuple[float, float, float, float]
85
88
 
86
89
 
90
+ @observed_stage("recognition")
87
91
  def _raw_recognition(
88
92
  part,
89
93
  *,
@@ -777,6 +781,7 @@ def _analyse(
777
781
  company="",
778
782
  frame: bool = False,
779
783
  projection: str | None = None,
784
+ projection_symbol: bool = True,
780
785
  text_position: str = "inline",
781
786
  text_orientation: str = "aligned",
782
787
  zones: bool = False,
@@ -787,11 +792,22 @@ def _analyse(
787
792
  _include_iso: bool = True,
788
793
  _view_constraints=None,
789
794
  _framed_recognition: bool = False,
795
+ _document_input=None,
790
796
  ) -> Analysis:
791
797
  """Load STEP or use a build123d Shape, analyse geometry, compute layout.
792
798
 
793
799
  Returns an :class:`Analysis`.
794
800
  """
801
+ if _document_input is not None:
802
+ if model is None or _framed_recognition:
803
+ raise ValueError("document members require their sealed raw model")
804
+ _document_input.validate(
805
+ step_file, model.features if isinstance(model, PartModel) else model
806
+ )
807
+ if _reuse is None:
808
+ _reuse = _document_input.analysis
809
+ elif _reuse.part is not _document_input.analysis.part:
810
+ raise ValueError("document analysis reuse names a foreign working solid")
795
811
  convention = projection or "third"
796
812
  # The zone-grid ruler (#768) draws its ticks on the frame, so it implies one.
797
813
  frame = frame or zones
@@ -1099,6 +1115,11 @@ def _analyse(
1099
1115
  if ownership_builder is not None
1100
1116
  else None
1101
1117
  )
1118
+ if _document_input is not None:
1119
+ # Declared sizing still reads only the member's authored model. Critique receives
1120
+ # the original conversion authority rather than acquiring another recognition run.
1121
+ recognition_evidence = _document_input.analysis.recognition_evidence
1122
+ recognition_ownership = _document_input.analysis.recognition_ownership
1102
1123
  # Dimension feasibility and annotation footprints consume the authored set.
1103
1124
  # Derived-view dependencies still use sizing_model below; omitting an unrelated
1104
1125
  # envelope extent must not force its view back onto an authored sheet.
@@ -1116,6 +1137,12 @@ def _analyse(
1116
1137
  strip_sizing_model,
1117
1138
  planned_views=third_angle_view_names() if _views is None else _views,
1118
1139
  )
1140
+ schedule_tables = (
1141
+ compile_dimensions(strip_sizing_model, groups=sizing_groups).schedules
1142
+ if strip_sizing_model.schedules
1143
+ else ()
1144
+ )
1145
+ sizing_groups = annotation_groups(strip_sizing_model, sizing_groups)
1119
1146
  bore_callout_width = _est_planned_bore_callout_width(
1120
1147
  sizing_groups, _draft_est, font_size=_FONT_SIZE, pad_around_text=_pad_around_text
1121
1148
  )
@@ -1132,7 +1159,17 @@ def _analyse(
1132
1159
  layout_table_sizes = _est_hole_table_sizes(
1133
1160
  sizing_model, bb, font_size=_FONT_SIZE, pad_around_text=_pad_around_text
1134
1161
  )
1135
- layout_required_tables = tuple(_required_tables)
1162
+ layout_required_tables = tuple(_required_tables) + tuple(
1163
+ (
1164
+ _est_table_size(
1165
+ tuple(tuple(cell.text for cell in row) for row in schedule.rows),
1166
+ font_size=_FONT_SIZE,
1167
+ pad_around_text=_pad_around_text,
1168
+ ),
1169
+ schedule.prefer,
1170
+ )
1171
+ for schedule in schedule_tables
1172
+ )
1136
1173
  planned_iso_scale = _planned_iso_scale(_view_constraints)
1137
1174
 
1138
1175
  # Choose scale/page, iterating so the reserved step corridor matches the
@@ -1406,6 +1443,7 @@ def _analyse(
1406
1443
  company=company,
1407
1444
  frame=frame,
1408
1445
  projection=projection,
1446
+ projection_symbol=projection_symbol,
1409
1447
  text_position=text_position,
1410
1448
  text_orientation=text_orientation,
1411
1449
  projection_convention=convention,