draftwright 0.5.0rc7__tar.gz → 0.5.0rc9__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 (833) hide show
  1. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/PKG-INFO +1 -1
  2. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/pyproject.toml +1 -1
  3. draftwright-0.5.0rc9/src/draftwright/_pmi_linear_geometry.py +145 -0
  4. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/_pmi_support_blockers.py +17 -0
  5. draftwright-0.5.0rc9/src/draftwright/_pmi_topology.py +481 -0
  6. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/analysis.py +30 -1
  7. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_common.py +27 -26
  8. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_gdt.py +96 -50
  9. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_placement_geometry.py +25 -0
  10. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_placement_occupancy.py +44 -2
  11. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_pmi_dimensions.py +33 -17
  12. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_step_lengths.py +19 -0
  13. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/orchestrator.py +3 -0
  14. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/build_policy.py +15 -7
  15. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/builder.py +50 -8
  16. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/compose.py +21 -4
  17. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/drawing.py +10 -0
  18. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/coverage.py +113 -44
  19. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/turned_step_coverage.py +10 -4
  20. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/callout.py +3 -0
  21. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/compiled.py +51 -1
  22. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/declare.py +2 -0
  23. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/detect.py +7 -1
  24. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/dimension_intent.py +6 -1
  25. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/ir.py +6 -0
  26. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/ir_foundation.py +50 -5
  27. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/planner.py +485 -2
  28. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/pmi_lowering.py +282 -108
  29. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/pmi.py +49 -48
  30. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/reporting.py +92 -0
  31. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/sheet.py +11 -7
  32. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/sheet_emit.py +33 -12
  33. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/sheet_feature_lines.py +9 -2
  34. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_complexity_baseline.json +3 -4
  35. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_function_length_baseline.json +2 -2
  36. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_tier_manifest.py +1 -0
  37. draftwright-0.5.0rc9/tests/test_authored_pmi_precedence.py +866 -0
  38. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_dimension_intent_contract.py +3 -0
  39. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_gdt_ink_shared.py +26 -0
  40. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_gdt_placement.py +87 -0
  41. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_hole_table.py +0 -1
  42. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1146_scale_completeness.py +17 -1
  43. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1155_grm04_sheet_use.py +3 -3
  44. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1209_linear_pmi_witnesses.py +141 -1
  45. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1338_scale_before_page_escalation.py +6 -0
  46. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1516_dimension_text.py +12 -2
  47. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_563_placement_intent.py +21 -0
  48. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pmi.py +277 -1
  49. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pmi_gtol_lowering.py +8 -2
  50. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_strip_layout.py +141 -0
  51. draftwright-0.5.0rc7/src/draftwright/_pmi_linear_geometry.py +0 -71
  52. draftwright-0.5.0rc7/src/draftwright/_pmi_topology.py +0 -222
  53. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/.gitignore +0 -0
  54. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/CHANGELOG.md +0 -0
  55. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/LICENSE +0 -0
  56. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/README.md +0 -0
  57. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/docs/adr/README.md +0 -0
  58. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/docs/reference/recogniser-capabilities.md +0 -0
  59. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/docs/reference/sheet.md +0 -0
  60. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/docs/research/1062-repeating-radial-profile-evidence.md +0 -0
  61. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/skills/SKILL.md +0 -0
  62. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/__init__.py +0 -0
  63. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/_build_profile.py +0 -0
  64. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/_core.py +0 -0
  65. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/_geometry.py +0 -0
  66. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/_pmi_datum_geometry.py +0 -0
  67. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/_pmi_part21.py +0 -0
  68. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/_pmi_schema.py +0 -0
  69. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/_warnings.py +0 -0
  70. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/angular_geometry.py +0 -0
  71. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotate.py +0 -0
  72. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotation_layout_profile.py +0 -0
  73. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/__init__.py +0 -0
  74. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_axial_render.py +0 -0
  75. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_circular_recesses.py +0 -0
  76. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_diameters.py +0 -0
  77. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_dimension_ink.py +0 -0
  78. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_dimension_ink_repair.py +0 -0
  79. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_edge_callouts.py +0 -0
  80. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_envelope.py +0 -0
  81. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_height_ladder.py +0 -0
  82. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_hole_leader_placement.py +0 -0
  83. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_leader_candidates.py +0 -0
  84. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_leader_commit.py +0 -0
  85. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_leader_fixed_ink.py +0 -0
  86. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_locations.py +0 -0
  87. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_machined_leaders.py +0 -0
  88. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_patterns.py +0 -0
  89. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_pocket_pad.py +0 -0
  90. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_polygonal_prisms.py +0 -0
  91. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_sheet_furniture.py +0 -0
  92. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_slots.py +0 -0
  93. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_strip_postsolve.py +0 -0
  94. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_thin_profiles.py +0 -0
  95. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/angular.py +0 -0
  96. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/balloons.py +0 -0
  97. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/drawing_port.py +0 -0
  98. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/from_model.py +0 -0
  99. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/gears.py +0 -0
  100. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/hole_leader_candidates.py +0 -0
  101. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/hole_locations.py +0 -0
  102. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/holes.py +0 -0
  103. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/leaders.py +0 -0
  104. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/routed.py +0 -0
  105. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/sections.py +0 -0
  106. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/solve_trace.py +0 -0
  107. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/audit.py +0 -0
  108. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/auxiliary_layout.py +0 -0
  109. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/blend_contract.py +0 -0
  110. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/build_once.py +0 -0
  111. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/build_options.py +0 -0
  112. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/cli.py +0 -0
  113. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/contract_values.py +0 -0
  114. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/document.py +0 -0
  115. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/document_evidence.py +0 -0
  116. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/document_input.py +0 -0
  117. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/drawing_diagnostics.py +0 -0
  118. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/drawing_evidence.py +0 -0
  119. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/drawing_export.py +0 -0
  120. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/drawing_state.py +0 -0
  121. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/drawing_tables.py +0 -0
  122. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/evaluation/__init__.py +0 -0
  123. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/evaluation/_double_d_evidence.py +0 -0
  124. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/evaluation/_edge_profile_evidence.py +0 -0
  125. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/evaluation/_flat_polygonal_evidence.py +0 -0
  126. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/evaluation/_groove_evidence.py +0 -0
  127. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/evaluation/_hole_family_evidence.py +0 -0
  128. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/evaluation/_pocket_evidence.py +0 -0
  129. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/evaluation/_prismatic_evidence.py +0 -0
  130. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/evaluation/_turned_step_evidence.py +0 -0
  131. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/evaluation/step_analysis.py +0 -0
  132. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/explicit_scale.py +0 -0
  133. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/export.py +0 -0
  134. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/family_table.py +0 -0
  135. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/feature_identity.py +0 -0
  136. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/fits.py +0 -0
  137. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/fonts/IBMPlexMono-Regular.ttf +0 -0
  138. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/fonts/IBMPlexSansCondensed-Regular.ttf +0 -0
  139. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/fonts/LICENSE-IBMPlexMono-OFL.txt +0 -0
  140. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/fonts/LICENSE-IBMPlexSansCondensed-OFL.txt +0 -0
  141. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/fonts/__init__.py +0 -0
  142. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/inspection.py +0 -0
  143. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/inspection_contract.py +0 -0
  144. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/intent_drain.py +0 -0
  145. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/intent_routing.py +0 -0
  146. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/intents.py +0 -0
  147. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/layout.py +0 -0
  148. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/layout_safety.py +0 -0
  149. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/layout_scheme.py +0 -0
  150. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/layout_selection.py +0 -0
  151. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/leader_policy.py +0 -0
  152. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/__init__.py +0 -0
  153. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/_coverage_common.py +0 -0
  154. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/_parameter_coverage.py +0 -0
  155. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/_registry.py +0 -0
  156. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/angled_step_coverage.py +0 -0
  157. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/angular.py +0 -0
  158. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/blend_coverage.py +0 -0
  159. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/boss_coverage.py +0 -0
  160. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/chamfer_coverage.py +0 -0
  161. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/channel_coverage.py +0 -0
  162. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/circular_blind_step_coverage.py +0 -0
  163. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/envelope_coverage.py +0 -0
  164. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/evidence.py +0 -0
  165. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/fillet_coverage.py +0 -0
  166. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/flat_coverage.py +0 -0
  167. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/gear_coverage.py +0 -0
  168. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/groove_coverage.py +0 -0
  169. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/gusset_rib_coverage.py +0 -0
  170. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/hole_coverage.py +0 -0
  171. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/ink_overlap.py +0 -0
  172. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/issues.py +0 -0
  173. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/orchestration.py +0 -0
  174. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/oriented_slot_coverage.py +0 -0
  175. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/pad_coverage.py +0 -0
  176. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/paired_ramp_step_coverage.py +0 -0
  177. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/passage_coverage.py +0 -0
  178. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/plate_coverage.py +0 -0
  179. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/pmi_coverage.py +0 -0
  180. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/pocket_coverage.py +0 -0
  181. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/pocket_pattern_coverage.py +0 -0
  182. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/polygonal_boss_coverage.py +0 -0
  183. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/polygonal_stock_coverage.py +0 -0
  184. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/prismatic_pocket_coverage.py +0 -0
  185. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/profiled_bore_coverage.py +0 -0
  186. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/quality.py +0 -0
  187. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/rectangular_blind_slot_coverage.py +0 -0
  188. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/requirements.py +0 -0
  189. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/round_bottom_blind_slot_coverage.py +0 -0
  190. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/schedule_evidence.py +0 -0
  191. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/section_recess_coverage.py +0 -0
  192. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/slot_coverage.py +0 -0
  193. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/structural.py +0 -0
  194. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/suggest.py +0 -0
  195. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/through_step_coverage.py +0 -0
  196. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/location_contract.py +0 -0
  197. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/make_drawing.py +0 -0
  198. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/measurement_support.py +0 -0
  199. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/__init__.py +0 -0
  200. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/detect_inventory.py +0 -0
  201. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/detect_ownership.py +0 -0
  202. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/manufacturing_schedule.py +0 -0
  203. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/oriented_slot_geometry.py +0 -0
  204. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/obligations.py +0 -0
  205. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/oriented_slot_contract.py +0 -0
  206. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/pdf_text.py +0 -0
  207. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/plate_correspondence.py +0 -0
  208. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/profile_angles.py +0 -0
  209. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/progress.py +0 -0
  210. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/projection.py +0 -0
  211. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/py.typed +0 -0
  212. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/recogniser_contract.py +0 -0
  213. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/recogniser_policy.py +0 -0
  214. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/recogniser_schema.py +0 -0
  215. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/recognition/__init__.py +0 -0
  216. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/recognition_cache.py +0 -0
  217. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/recognition_frame.py +0 -0
  218. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/recognition_ownership.py +0 -0
  219. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/registry.py +0 -0
  220. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/repair.py +0 -0
  221. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/replay_assessment.py +0 -0
  222. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/score.py +0 -0
  223. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/section_recess_contract.py +0 -0
  224. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/sheet_features.py +0 -0
  225. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/sheet_layout_controls.py +0 -0
  226. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/sheet_metadata.py +0 -0
  227. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/sheet_object_source.py +0 -0
  228. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/sheet_views.py +0 -0
  229. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/view_plan.py +0 -0
  230. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_burden_report.py +0 -0
  231. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_corpus_cover.py +0 -0
  232. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_drawing_helpers.py +0 -0
  233. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_evidence_contract.py +0 -0
  234. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_issue_module_baseline.txt +0 -0
  235. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_kernel.py +0 -0
  236. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_layout_helpers.py +0 -0
  237. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_layout_sig.py +0 -0
  238. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_mutation_corpus.py +0 -0
  239. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_pad_rendering_fixtures.py +0 -0
  240. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_parts.py +0 -0
  241. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_pattern_contract.py +0 -0
  242. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_recogniser_public_contract.py +0 -0
  243. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_section_recess_cases.py +0 -0
  244. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_unit_manifest.py +0 -0
  245. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/conftest.py +0 -0
  246. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/annotation-layout-corpus-v1.json +0 -0
  247. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/annotation-layout-corpus-v2.json +0 -0
  248. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/annotation-layout-holdout-ftc09-v1.json +0 -0
  249. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/annotation-layout-holdout-v1.json +0 -0
  250. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/ap242_single_cylinder_diameter.step +0 -0
  251. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/README.md +0 -0
  252. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/ambiguous-open-semicircle.step +0 -0
  253. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/blind-hole.step +0 -0
  254. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/chamfer-asymmetric.step +0 -0
  255. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/chamfer-compound.step +0 -0
  256. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/chamfer-overlap.step +0 -0
  257. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/chamfer-plain.step +0 -0
  258. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/chamfer-planar-x.step +0 -0
  259. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/chamfer-planar-y.step +0 -0
  260. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/chamfer-planar-z.step +0 -0
  261. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/chamfer-topology-a.step +0 -0
  262. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/chamfer-topology-b.step +0 -0
  263. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/chamfer-turned.step +0 -0
  264. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-chamfers-v1.json +0 -0
  265. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-countersinks-v1.json +0 -0
  266. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-double-d-bores-v1.json +0 -0
  267. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-fillets-v1.json +0 -0
  268. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-flats-v1.json +0 -0
  269. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-grooves-v1.json +0 -0
  270. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-hole-patterns-v1.json +0 -0
  271. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-plates-v1.json +0 -0
  272. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-pocket-patterns-v1.json +0 -0
  273. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-pockets-v1.json +0 -0
  274. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-polygonal-bosses-v1.json +0 -0
  275. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-polygonal-stock-v1.json +0 -0
  276. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-rectangular-pads-v1.json +0 -0
  277. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-turned-steps-v1.json +0 -0
  278. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-v1.json +0 -0
  279. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/countersink-deburr.step +0 -0
  280. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/countersink-external-cone.step +0 -0
  281. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/countersink-mixed-pair.step +0 -0
  282. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/countersink-single.step +0 -0
  283. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/countersink-topology-a.step +0 -0
  284. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/countersink-topology-b.step +0 -0
  285. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/double-d-axis-x.step +0 -0
  286. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/double-d-axis-y.step +0 -0
  287. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/double-d-blind.step +0 -0
  288. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/double-d-coaxial-compound.step +0 -0
  289. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/double-d-opposed-blind.step +0 -0
  290. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/double-d-roll-30.step +0 -0
  291. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/double-d-round-bore.step +0 -0
  292. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/double-d-single-z.step +0 -0
  293. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/double-d-topology-a.step +0 -0
  294. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/double-d-topology-b.step +0 -0
  295. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/fillet-compound.step +0 -0
  296. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/fillet-overlap.step +0 -0
  297. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/fillet-plain.step +0 -0
  298. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/fillet-planar-x.step +0 -0
  299. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/fillet-planar-y.step +0 -0
  300. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/fillet-planar-z.step +0 -0
  301. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/fillet-repeated.step +0 -0
  302. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/fillet-topology-a.step +0 -0
  303. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/fillet-topology-b.step +0 -0
  304. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/fillet-turned.step +0 -0
  305. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/flat-coaxial.step +0 -0
  306. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/flat-double-d.step +0 -0
  307. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/flat-lone-d.step +0 -0
  308. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/flat-nonround.step +0 -0
  309. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/flat-slanted-double-d.step +0 -0
  310. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/flat-topology-a.step +0 -0
  311. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/flat-topology-b.step +0 -0
  312. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/groove-compound.step +0 -0
  313. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/groove-lone-x.step +0 -0
  314. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/groove-lone-y.step +0 -0
  315. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/groove-lone-z.step +0 -0
  316. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/groove-monotonic-negative.step +0 -0
  317. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/groove-narrow.step +0 -0
  318. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/groove-topology-a.step +0 -0
  319. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/groove-topology-b.step +0 -0
  320. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-compound-equal.step +0 -0
  321. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-detached-body-negative.step +0 -0
  322. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-full-span-ledge-negative.step +0 -0
  323. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-nested-staircase-negative.step +0 -0
  324. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-topology-a.step +0 -0
  325. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-topology-b.step +0 -0
  326. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-x-negative.step +0 -0
  327. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-x-positive.step +0 -0
  328. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-y-negative.step +0 -0
  329. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-y-positive.step +0 -0
  330. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-z-negative.step +0 -0
  331. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-z-positive.step +0 -0
  332. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pattern-ambiguous.step +0 -0
  333. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pattern-grid.step +0 -0
  334. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pattern-topology-a.step +0 -0
  335. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pattern-topology-b.step +0 -0
  336. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plain-block.step +0 -0
  337. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-compound-equal.step +0 -0
  338. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-cross-topology-a.step +0 -0
  339. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-cross-topology-b.step +0 -0
  340. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-detached-negative.step +0 -0
  341. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-rotational-negative.step +0 -0
  342. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-single-negative.step +0 -0
  343. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-t-xz.step +0 -0
  344. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-t-yz.step +0 -0
  345. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-thick-negative.step +0 -0
  346. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-u-additive.step +0 -0
  347. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-u-cut.step +0 -0
  348. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-compound.step +0 -0
  349. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-edge-anchored.step +0 -0
  350. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-lone.step +0 -0
  351. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-opposed.step +0 -0
  352. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-pattern-ambiguous.step +0 -0
  353. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-pattern-grid.step +0 -0
  354. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-pattern-linear.step +0 -0
  355. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-pattern-pair.step +0 -0
  356. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-pattern-topology-a.step +0 -0
  357. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-pattern-topology-b.step +0 -0
  358. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-prismatic-negative.step +0 -0
  359. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-side.step +0 -0
  360. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-through-negative.step +0 -0
  361. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-topology-a.step +0 -0
  362. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-topology-b.step +0 -0
  363. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-two-equal.step +0 -0
  364. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-compound-equal.step +0 -0
  365. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-detached-negative.step +0 -0
  366. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-in-plane-rotated.step +0 -0
  367. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-other-protrusions-negative.step +0 -0
  368. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-recess-negative.step +0 -0
  369. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-stock-negative.step +0 -0
  370. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-topology-a.step +0 -0
  371. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-topology-b.step +0 -0
  372. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-x.step +0 -0
  373. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-y.step +0 -0
  374. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-z.step +0 -0
  375. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-compound-negative.step +0 -0
  376. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-cylinder-negative.step +0 -0
  377. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-irregular-negative.step +0 -0
  378. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-octagon-negative.step +0 -0
  379. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-recess-negative.step +0 -0
  380. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-roll17.step +0 -0
  381. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-topology-a.step +0 -0
  382. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-topology-b.step +0 -0
  383. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-translated.step +0 -0
  384. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-x.step +0 -0
  385. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-y.step +0 -0
  386. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/topology-a.step +0 -0
  387. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/topology-b.step +0 -0
  388. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/turned-step-axis-x.step +0 -0
  389. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/turned-step-axis-y.step +0 -0
  390. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/turned-step-axis-z.step +0 -0
  391. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/turned-step-compound.step +0 -0
  392. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/turned-step-repeated-lengths.step +0 -0
  393. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/turned-step-through-bore.step +0 -0
  394. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/turned-step-topology-a.step +0 -0
  395. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/turned-step-topology-b.step +0 -0
  396. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/turned-step-translated-blind-bore.step +0 -0
  397. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/grm03_edge_face_finish_ap242.step +0 -0
  398. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/grm03_specify_pmi_ap242.step +0 -0
  399. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/grm03_thumbwheel_drive_screw.step +0 -0
  400. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/grm03_thumbwheel_drive_screw_ap242_pmi.step +0 -0
  401. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/grm04_drive_plate.step +0 -0
  402. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/if_step_flat_across_cylinder.step +0 -0
  403. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/issue_1058_wheel_rh.step +0 -0
  404. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/issue_1247_angled_blind_step.step +0 -0
  405. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/issue_1595_whistle_key_frame.step +0 -0
  406. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/issue_1595_whistle_key_lever.step +0 -0
  407. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/issue_909_basic_part_design_017_body.step +0 -0
  408. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/issue_915_case_study_2.step +0 -0
  409. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ctc_01_asme1_ap203.stp +0 -0
  410. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ctc_01_asme1_ap242.stp +0 -0
  411. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ctc_02_asme1_ap203.stp +0 -0
  412. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ctc_02_asme1_ap242.stp +0 -0
  413. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ctc_03_asme1_ap203.stp +0 -0
  414. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ctc_03_asme1_ap242.stp +0 -0
  415. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ctc_04_asme1_ap203.stp +0 -0
  416. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ctc_04_asme1_ap242.stp +0 -0
  417. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ctc_05_asme1_ap203.stp +0 -0
  418. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ctc_05_asme1_ap242.stp +0 -0
  419. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ftc_09_asme1_ap242-e1.stp +0 -0
  420. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/tuner_jig_blind_obround_pockets.step +0 -0
  421. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/whistle_frame_reference.step +0 -0
  422. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/bracket_section.json +0 -0
  423. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/centered_rebate.json +0 -0
  424. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/chamfered.json +0 -0
  425. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/filleted.json +0 -0
  426. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/flange_dense.json +0 -0
  427. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/grid_plate.json +0 -0
  428. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/grooved_shaft.json +0 -0
  429. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/hex_bar.json +0 -0
  430. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/holed_slot.json +0 -0
  431. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/pocketed.json +0 -0
  432. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/prismatic_ladder.json +0 -0
  433. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/scattered_plate.json +0 -0
  434. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/side_drilled.json +0 -0
  435. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/turned_stepped.json +0 -0
  436. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_add_dimension.py +0 -0
  437. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_adr0018_view_routing.py +0 -0
  438. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_adr0018_view_selection.py +0 -0
  439. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_adr_corpus.py +0 -0
  440. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_agent_improvement_canary_issue_1716.py +0 -0
  441. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_agents_guide.py +0 -0
  442. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_analysis_geometry.py +0 -0
  443. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_angle_patterns.py +0 -0
  444. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_angular_references.py +0 -0
  445. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_angular_rendering.py +0 -0
  446. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_annotation_box_composition.py +0 -0
  447. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_annotation_box_corpus.py +0 -0
  448. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_annotation_layout_product.py +0 -0
  449. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_annotation_scheme_compare_script.py +0 -0
  450. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_annotation_scheme_corpus_script.py +0 -0
  451. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_annotation_scheme_shadow_script.py +0 -0
  452. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_api_docs.py +0 -0
  453. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_architecture_docs.py +0 -0
  454. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_arrangement_gate.py +0 -0
  455. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_assessment_comparison_issue_1712.py +0 -0
  456. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_audit_differential.py +0 -0
  457. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_auxiliary_layout.py +0 -0
  458. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_axial_dimensions.py +0 -0
  459. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_balloon_ring_standoff.py +0 -0
  460. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_blind_slot_completeness.py +0 -0
  461. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_blind_slot_semantics.py +0 -0
  462. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_boss_ownership.py +0 -0
  463. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_build_drawing_entrypoints.py +0 -0
  464. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_build_profile_harness.py +0 -0
  465. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_burden_report.py +0 -0
  466. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_candidate_evidence_issue_1726.py +0 -0
  467. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_candidate_preview_sheet_holdout.py +0 -0
  468. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_canonical_angles.py +0 -0
  469. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_carve_free_position_callers.py +0 -0
  470. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_channel_ownership.py +0 -0
  471. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_circular_blind_step_semantics.py +0 -0
  472. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_cli_behavior.py +0 -0
  473. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_cli_report_sidecar.py +0 -0
  474. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_clone_budget.py +0 -0
  475. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_compiled_plan_boundary.py +0 -0
  476. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_compose_then_pack.py +0 -0
  477. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_contract_values.py +0 -0
  478. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_corpus_cover.py +0 -0
  479. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_counting_calls.py +0 -0
  480. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_coverage_mode.py +0 -0
  481. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_declaration_identity_issue_1710.py +0 -0
  482. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_declaration_report_issue_1710.py +0 -0
  483. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_declare.py +0 -0
  484. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_declared_recognition_gate.py +0 -0
  485. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_declared_report_issue_1688.py +0 -0
  486. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_deferred_edits.py +0 -0
  487. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_dense_sheet_canary.py +0 -0
  488. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_deprecation_dates.py +0 -0
  489. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_depth_estimators.py +0 -0
  490. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_derived_view_integration.py +0 -0
  491. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_derived_view_planning.py +0 -0
  492. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_detail_views.py +0 -0
  493. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_detect_once.py +0 -0
  494. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_detect_registry.py +0 -0
  495. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_diameter_deduplication.py +0 -0
  496. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_diameter_leaders.py +0 -0
  497. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_dimension_lane_canary_issue_1757.py +0 -0
  498. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_dimension_role_vocabulary.py +0 -0
  499. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_document_build.py +0 -0
  500. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_document_claim_authority.py +0 -0
  501. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_document_claims.py +0 -0
  502. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_document_coverage.py +0 -0
  503. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_document_report.py +0 -0
  504. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_document_report_authority.py +0 -0
  505. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_drawing_encapsulation.py +0 -0
  506. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_drawing_operations.py +0 -0
  507. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_drawing_state.py +0 -0
  508. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_dynamic_corridors.py +0 -0
  509. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_e2e_slice.py +0 -0
  510. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_e2e_standards.py +0 -0
  511. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_edge_profile_coverage.py +0 -0
  512. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_envelope_view_route_issue_1813.py +0 -0
  513. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_equivalent_dimension_presentations_issue_1759.py +0 -0
  514. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_export_dxf_curves.py +0 -0
  515. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_export_dxf_zoom.py +0 -0
  516. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_export_formats.py +0 -0
  517. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_export_reproducible.py +0 -0
  518. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_export_shape.py +0 -0
  519. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_external_recognition_boundary.py +0 -0
  520. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_family_table.py +0 -0
  521. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_feature_edit_corridors.py +0 -0
  522. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_feature_edit_replay.py +0 -0
  523. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_feature_edit_verbs.py +0 -0
  524. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_feature_leader_candidate_regions.py +0 -0
  525. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_feature_provenance.py +0 -0
  526. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_feature_queries.py +0 -0
  527. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_fillets_adjacency.py +0 -0
  528. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_fit_calculations.py +0 -0
  529. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_fits.py +0 -0
  530. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_flat_callout_precision.py +0 -0
  531. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_flat_completeness.py +0 -0
  532. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_flat_stock_identity.py +0 -0
  533. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_flat_stock_opposition.py +0 -0
  534. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_format_selector.py +0 -0
  535. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_formatting.py +0 -0
  536. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_framed_step_family_evidence.py +0 -0
  537. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_geometry_graph_spike.py +0 -0
  538. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_grid_lattice_convention.py +0 -0
  539. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_groove_completeness_evidence.py +0 -0
  540. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_groove_profile.py +0 -0
  541. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_gusset_rib_semantics.py +0 -0
  542. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_hole_annotations.py +0 -0
  543. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_hole_pattern_callouts.py +0 -0
  544. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_import_boundaries.py +0 -0
  545. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_inspection_contract.py +0 -0
  546. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_interior_label_placement.py +0 -0
  547. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_ir_foundation.py +0 -0
  548. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_iso_detail_growth.py +0 -0
  549. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_iso_layout.py +0 -0
  550. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_iso_nts_caption_placement.py +0 -0
  551. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_isometric_orientation.py +0 -0
  552. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_isometric_placement.py +0 -0
  553. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1000_envelope_reuse.py +0 -0
  554. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1006_measurement_comparison.py +0 -0
  555. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1058_wheel_profile.py +0 -0
  556. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1073_cross_body_patterns.py +0 -0
  557. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1082_polygonal_stock.py +0 -0
  558. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1086_declared_gears.py +0 -0
  559. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1116_ap242_hole_tolerance_lowering.py +0 -0
  560. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1126_requesting_less_never_scores_better.py +0 -0
  561. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1130_view_planning_evidence.py +0 -0
  562. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1132_turned_profile_span_is_reported.py +0 -0
  563. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1142_hole_leader_labels.py +0 -0
  564. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1143_hole_completeness.py +0 -0
  565. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1144_transactional_hole_table.py +0 -0
  566. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1147_legibility_pair_aggregation.py +0 -0
  567. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1153_contradictory_dimensions.py +0 -0
  568. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1154_one_owner_per_measurement.py +0 -0
  569. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1157_no_implicit_general_tolerance.py +0 -0
  570. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1166_cross_pass_feature_leaders.py +0 -0
  571. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1176_quality_fidelity.py +0 -0
  572. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1177_angular_dimensions.py +0 -0
  573. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1187_unroutable_leaders.py +0 -0
  574. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1188_per_view_assignment.py +0 -0
  575. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1190_section_decision.py +0 -0
  576. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1196_deterministic_view_names.py +0 -0
  577. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1202_observed_drawing_consumer.py +0 -0
  578. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1204_multiscale_view_issues.py +0 -0
  579. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1215_envelope_tolerance.py +0 -0
  580. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1215_no_approved_tolerance_is_dropped.py +0 -0
  581. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1216_callout_reservation_measures_ink.py +0 -0
  582. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1216_pairwise_across_scale_groups.py +0 -0
  583. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1217_claimed_representations.py +0 -0
  584. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1217_the_facility_is_shared.py +0 -0
  585. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1219_location_claims_its_own_axis.py +0 -0
  586. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1229_ledger_member_keying.py +0 -0
  587. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1240_iso_above_strip_visibility.py +0 -0
  588. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1245_passage_disposition.py +0 -0
  589. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1246_prismatic_pocket_disposition.py +0 -0
  590. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1247_angled_step_disposition.py +0 -0
  591. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1254_turned_chamfers.py +0 -0
  592. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1260_view_constraints.py +0 -0
  593. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1262_automatic_turned_views.py +0 -0
  594. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1276_turned_leader_targets.py +0 -0
  595. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1281_turned_fillets.py +0 -0
  596. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1296_cylindrical_diameter_pmi.py +0 -0
  597. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1298_manufacturing_requirements.py +0 -0
  598. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1299_page_escalation.py +0 -0
  599. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1308_machined_leader_analytics.py +0 -0
  600. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1312_engine_costs.py +0 -0
  601. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1325_nominal_agreement.py +0 -0
  602. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1332_overlap_remedy.py +0 -0
  603. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1333_bounded_ink_repair.py +0 -0
  604. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1334_prevent_ink.py +0 -0
  605. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1336_grm03_ap242_pmi_fixture.py +0 -0
  606. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1349_precision_display.py +0 -0
  607. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1350_detected_takeover.py +0 -0
  608. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1351_structured_note_coverage.py +0 -0
  609. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1352_searchable_pdf_text.py +0 -0
  610. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1353_cnc_authoritative_workflow.py +0 -0
  611. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1357_framed_activation.py +0 -0
  612. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1357_framed_boundary.py +0 -0
  613. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1357_plural_turned_profiles.py +0 -0
  614. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1357_pmi_frame.py +0 -0
  615. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1360_thread_depth.py +0 -0
  616. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1369_hole_completeness_evidence.py +0 -0
  617. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1370_countersink_completeness_evidence.py +0 -0
  618. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1370_double_d_completeness_evidence.py +0 -0
  619. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1370_hole_pattern_completeness_evidence.py +0 -0
  620. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1371_flat_completeness_evidence.py +0 -0
  621. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1371_polygonal_stock_completeness_evidence.py +0 -0
  622. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1373_plate_completeness_evidence.py +0 -0
  623. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1374_chamfer_completeness_evidence.py +0 -0
  624. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1374_fillet_completeness_evidence.py +0 -0
  625. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1374_turned_step_completeness_evidence.py +0 -0
  626. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1378_diameter_leader_targets.py +0 -0
  627. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1392_recognisers_048.py +0 -0
  628. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1395_degenerate_iso_region.py +0 -0
  629. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1396_layout_advisories.py +0 -0
  630. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1397_unverifiable_requirement_message.py +0 -0
  631. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1432_adoption.py +0 -0
  632. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1432_boundary_failures.py +0 -0
  633. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1432_oriented_slot_semantics.py +0 -0
  634. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1433_blend_semantics.py +0 -0
  635. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1450_boss_blend_ownership.py +0 -0
  636. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1460_step_inspection.py +0 -0
  637. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1466_dimension_options.py +0 -0
  638. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1466_semantic_sides.py +0 -0
  639. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1479_radius_leader_targets.py +0 -0
  640. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1485_curved_pockets.py +0 -0
  641. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1485_quiddity_024_boundary.py +0 -0
  642. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1485_rounded_pockets.py +0 -0
  643. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1505_diameter_coverage.py +0 -0
  644. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1505_short_axial_chains.py +0 -0
  645. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1511_turned_boss_heights.py +0 -0
  646. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1514_projection_safeguard.py +0 -0
  647. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1515_first_angle.py +0 -0
  648. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1517_through_indicator.py +0 -0
  649. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1518_explicit_rear.py +0 -0
  650. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1524_tolerance_magnitude.py +0 -0
  651. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1530_section_provenance.py +0 -0
  652. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1531_semantic_hole_counts.py +0 -0
  653. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1532_authored_section_examples.py +0 -0
  654. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1533_review_diagnostics.py +0 -0
  655. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1534_build_progress.py +0 -0
  656. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1536_title_overflow.py +0 -0
  657. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1543_feature_schedules.py +0 -0
  658. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1543_schedule_requirements.py +0 -0
  659. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1544_frame_document_canary.py +0 -0
  660. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1555_turned_recognition_format_invariance.py +0 -0
  661. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1560_envelope_axes.py +0 -0
  662. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1563_sheet_pmi_reconciliation.py +0 -0
  663. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1585_title_block_date.py +0 -0
  664. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1593_title_block_keepout.py +0 -0
  665. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1596_bolt_circle_corroboration.py +0 -0
  666. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1598_hex_pockets.py +0 -0
  667. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1604_internal_section.py +0 -0
  668. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1612_frame_sergio_coverage.py +0 -0
  669. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1612_sheet_margins.py +0 -0
  670. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1613_circular_channel.py +0 -0
  671. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_367_leader_ink.py +0 -0
  672. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_443_grm03_axial_coverage.py +0 -0
  673. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_676_polygonal_boss.py +0 -0
  674. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_676_polygonal_boss_declare.py +0 -0
  675. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_740_leader_assignment.py +0 -0
  676. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_798_floor_cardinality.py +0 -0
  677. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_798_material_field.py +0 -0
  678. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_798_silhouette_lint.py +0 -0
  679. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_827_real_part_canary.py +0 -0
  680. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_883_location_identity.py +0 -0
  681. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_885_prismatic_coverage.py +0 -0
  682. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_909_sloped_profile.py +0 -0
  683. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_915_dense_case.py +0 -0
  684. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_916_pocket_leader.py +0 -0
  685. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_917_open_channel.py +0 -0
  686. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_924_zero_length_shoulders.py +0 -0
  687. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_955_height_contingency.py +0 -0
  688. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_958_cross_solid_recognition.py +0 -0
  689. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_label_provenance.py +0 -0
  690. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout.py +0 -0
  691. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout_cleanliness.py +0 -0
  692. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout_constants.py +0 -0
  693. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout_evidence_issue_1711.py +0 -0
  694. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout_generalisation.py +0 -0
  695. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout_hypothesis.py +0 -0
  696. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout_override_lane_issue_1757.py +0 -0
  697. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout_override_side_issue_1757.py +0 -0
  698. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout_property.py +0 -0
  699. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout_safety.py +0 -0
  700. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout_scheme.py +0 -0
  701. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_leader_footprint.py +0 -0
  702. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_leader_region_policy.py +0 -0
  703. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_lint_box_cache.py +0 -0
  704. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_lint_coverage.py +0 -0
  705. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_lint_coverage_common.py +0 -0
  706. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_lint_ink_overlap.py +0 -0
  707. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_lint_reconciliation.py +0 -0
  708. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_lint_structural.py +0 -0
  709. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_lint_suggestions.py +0 -0
  710. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_lint_summary.py +0 -0
  711. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_linting.py +0 -0
  712. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_location_dimensions.py +0 -0
  713. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_location_vocabulary.py +0 -0
  714. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_machined_feature_callouts.py +0 -0
  715. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_make_drawing_entrypoints.py +0 -0
  716. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_manufacturing_pmi_lowering.py +0 -0
  717. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_manufacturing_schedule.py +0 -0
  718. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_nested_recognition_ownership.py +0 -0
  719. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_nominal_step_pmi.py +0 -0
  720. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_note_verb.py +0 -0
  721. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_object_aspects.py +0 -0
  722. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_occupancy_boxes.py +0 -0
  723. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_occurrence_recognition_ownership.py +0 -0
  724. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_overall_height_coverage.py +0 -0
  725. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pad_completeness_evidence.py +0 -0
  726. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pad_rendering.py +0 -0
  727. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_paired_ramp_semantics.py +0 -0
  728. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_parameter_id.py +0 -0
  729. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pareto_loop_canary_issue_1753.py +0 -0
  730. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_part_classification.py +0 -0
  731. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_part_model.py +0 -0
  732. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pattern_contract.py +0 -0
  733. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pattern_ownership.py +0 -0
  734. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pitch_dim_footprint.py +0 -0
  735. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_place_dimension.py +0 -0
  736. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_plate_ownership.py +0 -0
  737. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pmi_common_labels.py +0 -0
  738. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pmi_datum_lowering.py +0 -0
  739. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pmi_manufacturing_finish.py +0 -0
  740. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pmi_part21.py +0 -0
  741. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pmi_records.py +0 -0
  742. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pocket_completeness_evidence.py +0 -0
  743. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pocket_pattern.py +0 -0
  744. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pocket_pattern_completeness_evidence.py +0 -0
  745. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pocket_pattern_recognition.py +0 -0
  746. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_polygonal_boss_completeness_evidence.py +0 -0
  747. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pre_render_profile_choice.py +0 -0
  748. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_principal_profile_classifier.py +0 -0
  749. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_prismatic_boss_diameter.py +0 -0
  750. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_prismatic_classification.py +0 -0
  751. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_prismatic_dimensions.py +0 -0
  752. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_private_test_attr_reads.py +0 -0
  753. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_private_test_imports.py +0 -0
  754. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_profile_angles.py +0 -0
  755. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_projection_symbol_default.py +0 -0
  756. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_quality_components.py +0 -0
  757. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_quiddity_lifecycle_boundary.py +0 -0
  758. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_real_part_fixtures.py +0 -0
  759. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_recogniser_adoption.py +0 -0
  760. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_recogniser_capabilities.py +0 -0
  761. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_recogniser_contract.py +0 -0
  762. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_recogniser_policy.py +0 -0
  763. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_recogniser_step_inventory.py +0 -0
  764. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_recognition_boundary_failures.py +0 -0
  765. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_recognition_evidence_schema.py +0 -0
  766. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_recognition_policy_dispositions.py +0 -0
  767. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_recognition_result.py +0 -0
  768. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_refactor_golden.py +0 -0
  769. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_registry.py +0 -0
  770. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_remaining_ink_overlaps.py +0 -0
  771. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_render_seam.py +0 -0
  772. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_repack_geometry_seam.py +0 -0
  773. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_repair.py +0 -0
  774. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_replay_assessment_issue_1715.py +0 -0
  775. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_report_projection.py +0 -0
  776. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_report_status_reasons_issue_1618.py +0 -0
  777. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_report_writer.py +0 -0
  778. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_requirement_applicability.py +0 -0
  779. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_requirement_carriers.py +0 -0
  780. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_requirement_catalog.py +0 -0
  781. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_requirement_catalog_families.py +0 -0
  782. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_requirement_dimension_sharing.py +0 -0
  783. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_scale_policy.py +0 -0
  784. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_scale_selection.py +0 -0
  785. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_score.py +0 -0
  786. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_script_detail_parity.py +0 -0
  787. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_section_hatching.py +0 -0
  788. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_section_recess_contract.py +0 -0
  789. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_section_recess_pockets.py +0 -0
  790. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_shared_box_memo.py +0 -0
  791. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_shared_drawing_cache.py +0 -0
  792. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_sheet_emit.py +0 -0
  793. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_sheet_fallback_issue_1797.py +0 -0
  794. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_sheet_furniture.py +0 -0
  795. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_sheet_gdt.py +0 -0
  796. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_sheet_generation_snapshot.py +0 -0
  797. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_sheet_identity_invariant.py +0 -0
  798. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_sheet_notes.py +0 -0
  799. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_sheet_of.py +0 -0
  800. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_sheet_section.py +0 -0
  801. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_sheet_tables.py +0 -0
  802. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_slanted_blind_step.py +0 -0
  803. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_slot_completeness.py +0 -0
  804. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_slot_pattern.py +0 -0
  805. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_slot_pattern_recognition.py +0 -0
  806. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_slot_recognition.py +0 -0
  807. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_soft_deprecation.py +0 -0
  808. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_solve_trace.py +0 -0
  809. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_source_shape.py +0 -0
  810. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_step_analysis_evaluation.py +0 -0
  811. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_step_profile_grouping.py +0 -0
  812. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_strip_zones.py +0 -0
  813. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_suite_shape.py +0 -0
  814. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_suppression_ledger.py +0 -0
  815. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_suppression_marks.py +0 -0
  816. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_through_step_ownership.py +0 -0
  817. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_through_step_semantics.py +0 -0
  818. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_tier_manifest.py +0 -0
  819. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_title_block_units_format.py +0 -0
  820. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_tolerances.py +0 -0
  821. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_turned_diameters.py +0 -0
  822. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_turned_lengths.py +0 -0
  823. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_turned_step_ownership.py +0 -0
  824. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_turned_steps.py +0 -0
  825. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_two_pass_layout.py +0 -0
  826. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_typ_dimensions.py +0 -0
  827. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_typed_remediation_projection_issue_1759.py +0 -0
  828. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_version_bump_ci.py +0 -0
  829. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_view_blocks.py +0 -0
  830. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_view_coordinates.py +0 -0
  831. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_view_plan.py +0 -0
  832. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_witness_label_reconciliation.py +0 -0
  833. {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_workflows.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: draftwright
3
- Version: 0.5.0rc7
3
+ Version: 0.5.0rc9
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "draftwright"
7
- version = "0.5.0rc7"
7
+ version = "0.5.0rc9"
8
8
  description = "Automated technical-drawing generation for build123d"
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -0,0 +1,145 @@
1
+ """Prove authored PMI linear reference stations before dimension lowering."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import math
6
+
7
+ from draftwright._pmi_topology import (
8
+ _is_mixed_planar_bore,
9
+ _parallel_planar_reference_witness,
10
+ _planar_bore_axis_witness,
11
+ )
12
+ from draftwright.model.ir import _linear_projection_view
13
+
14
+ _LINEAR_AXIS_ABS_TOL = 0.005
15
+ _LINEAR_AXIS_REL_TOL = 1e-3
16
+ _LINEAR_VALUE_ABS_TOL = 0.01
17
+ _LINEAR_VALUE_REL_TOL = 5e-4
18
+ _LINEAR_OBLIQUE_VALUE_ABS_TOL = 0.05
19
+
20
+
21
+ def _proved_planar_linear(groups, stations, nominal, kind, frame, shape_bbox):
22
+ """Resolve the normal span and a face-supported projected witness together."""
23
+ axis, view, witness = _parallel_planar_reference_witness(groups, frame, shape_bbox)
24
+ if witness is None:
25
+ return (
26
+ tuple(point for point in stations if point is not None),
27
+ "?",
28
+ None,
29
+ ("parallel planar source faces have no proven shared witness",),
30
+ )
31
+ if axis is None and kind == "linear" and _is_mixed_planar_bore(groups):
32
+ bore_support = _planar_bore_axis_witness(groups, frame, shape_bbox)
33
+ if bore_support is None:
34
+ points, dominant, reasons = _dimension_reference_stations(
35
+ tuple(stations), nominal, kind
36
+ )
37
+ return (
38
+ points,
39
+ dominant,
40
+ None,
41
+ (
42
+ *reasons,
43
+ "plane-to-bore location has no proven face-supported axis witness",
44
+ ),
45
+ )
46
+ stations, axis, view = bore_support
47
+ if witness:
48
+ stations = tuple(
49
+ tuple(
50
+ next((value for index, value in witness if index == i), point[i]) for i in range(3)
51
+ )
52
+ if point is not None
53
+ else None
54
+ for point in stations
55
+ )
56
+ points, dominant, reasons = _dimension_reference_stations(
57
+ tuple(stations), nominal, kind, plane_axis=axis
58
+ )
59
+ return points, dominant, view, reasons
60
+
61
+
62
+ def _linear_reference_stations(
63
+ stations: tuple[tuple[float, float, float] | None, ...],
64
+ nominal: float,
65
+ *,
66
+ plane_axis: str | None = None,
67
+ ) -> tuple[tuple[tuple[float, float, float], ...], str, tuple[str, ...]]:
68
+ """Prove a truthful principal-axis span from the two authored reference groups.
69
+
70
+ A merged bbox answers how large the referenced faces are, not which direction relates
71
+ them. Circular end faces in GRM-03 are wider than their axial separation, which made
72
+ short X dimensions render across Y. Conversely, CTC-04 includes a genuinely oblique
73
+ relationship and one dimension whose second group XCAF does not transfer. Those must
74
+ remain explicit omissions rather than being guessed from the nominal value (#1209).
75
+ """
76
+ measurable = tuple(station for station in stations if station is not None)
77
+ if len(stations) != 2 or len(measurable) != 2:
78
+ return (
79
+ measurable,
80
+ "?",
81
+ ("linear dimension needs two measurable authored reference groups",),
82
+ )
83
+
84
+ first, second = measurable
85
+ delta = tuple(second[index] - first[index] for index in range(3))
86
+ magnitudes = tuple(abs(value) for value in delta)
87
+ axis_index = (
88
+ "XYZ".index(plane_axis)
89
+ if plane_axis is not None
90
+ else max(range(3), key=magnitudes.__getitem__)
91
+ )
92
+ primary = magnitudes[axis_index]
93
+ if primary <= 1e-9:
94
+ return measurable, "?", ("linear reference groups occupy the same station",)
95
+
96
+ transverse = max(value for index, value in enumerate(magnitudes) if index != axis_index)
97
+ direction_tol = max(_LINEAR_AXIS_ABS_TOL, primary * _LINEAR_AXIS_REL_TOL)
98
+ # Parallel planar supports establish their distance along the plane normal.
99
+ # Their finite face centres can be offset arbitrarily within either plane.
100
+ oblique = plane_axis is None and transverse > direction_tol
101
+ if oblique and _linear_projection_view(measurable) is None:
102
+ return (
103
+ measurable,
104
+ "?",
105
+ (
106
+ "linear reference relationship does not lie in a principal projection plane "
107
+ f"(delta=({delta[0]:.6g}, {delta[1]:.6g}, {delta[2]:.6g}) mm)",
108
+ ),
109
+ )
110
+
111
+ axis = "?" if oblique else "XYZ"[axis_index]
112
+ span = math.hypot(*delta) if oblique else primary
113
+ value_tol = max(
114
+ _LINEAR_OBLIQUE_VALUE_ABS_TOL if oblique else _LINEAR_VALUE_ABS_TOL,
115
+ abs(nominal) * _LINEAR_VALUE_REL_TOL,
116
+ )
117
+ if abs(span - nominal) > value_tol:
118
+ return (
119
+ measurable,
120
+ axis,
121
+ (
122
+ f"linear reference-station span {span:.6g} mm differs from nominal "
123
+ f"{nominal:.6g} mm",
124
+ ),
125
+ )
126
+ return measurable, axis, ()
127
+
128
+
129
+ def _dimension_reference_stations(
130
+ stations: tuple[tuple[float, float, float] | None, ...],
131
+ nominal: float,
132
+ kind: str,
133
+ *,
134
+ plane_axis: str | None = None,
135
+ ) -> tuple[tuple[tuple[float, float, float], ...], str, tuple[str, ...]]:
136
+ """Apply the dimension kind's wording to the shared station proof."""
137
+ points, axis, reasons = _linear_reference_stations(stations, nominal, plane_axis=plane_axis)
138
+ if kind == "thickness":
139
+ reasons = tuple(
140
+ reason.replace("linear dimension", "thickness dimension").replace(
141
+ "linear reference", "thickness reference"
142
+ )
143
+ for reason in reasons
144
+ )
145
+ return points, axis, reasons
@@ -141,6 +141,23 @@ def _is_direct_xcaf_angular_failure(reason: str) -> bool:
141
141
  return reason.startswith(prefixes)
142
142
 
143
143
 
144
+ def _direct_xcaf_support_is_incomplete(record) -> bool:
145
+ """Whether direct XCAF failed to supply all support geometry, independent of rendering."""
146
+ reasons = (*record.lowering_blockers, *record.rendering_blockers)
147
+ missing_groups = (
148
+ "linear dimension needs two measurable authored reference groups",
149
+ "thickness dimension needs two measurable authored reference groups",
150
+ "diameter dimension needs a measurable",
151
+ )
152
+ return any(
153
+ _is_direct_xcaf_reference_failure(reason)
154
+ or _is_direct_xcaf_diameter_failure(reason)
155
+ or _is_direct_xcaf_angular_failure(reason)
156
+ or reason.startswith(missing_groups)
157
+ for reason in reasons
158
+ )
159
+
160
+
144
161
  def _without_direct_xcaf_angular_failures(reasons: tuple[str, ...]) -> tuple[str, ...]:
145
162
  """Drop angular XCAF failures superseded by exact Part21 member supports."""
146
163
  return tuple(reason for reason in reasons if not _is_direct_xcaf_angular_failure(reason))
@@ -0,0 +1,481 @@
1
+ """Exact Part21 support resolvers for imported AP242 PMI topology.
2
+
3
+ Native STEP transfer binders prove source items match the originally imported
4
+ B-rep; geometric likeness alone cannot establish source ownership.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from draftwright._pmi_datum_geometry import _frame_point, _frame_vector
10
+ from draftwright._pmi_support_blockers import _failure_reason
11
+
12
+ try:
13
+ from OCP.TopAbs import TopAbs_COMPOUND, TopAbs_EDGE, TopAbs_FACE
14
+ from OCP.TopExp import TopExp
15
+ from OCP.TopTools import TopTools_IndexedMapOfShape
16
+ except ImportError:
17
+ # The extractor reports unavailable OCP capability before using these resolvers.
18
+ pass
19
+
20
+
21
+ def _parallel_planar_reference_support(groups, frame, shape_bbox) -> tuple[str | None, str | None]:
22
+ """Find the common principal normal and any required witness view."""
23
+ axis, view, _witness = _parallel_planar_reference_witness(groups, frame, shape_bbox)
24
+ return axis, view
25
+
26
+
27
+ def _parallel_planar_reference_witness(groups, frame, shape_bbox):
28
+ """Prove a view and, when its default midpoint misses, a shared face witness."""
29
+ from OCP.BRepAdaptor import BRepAdaptor_Surface
30
+ from OCP.GeomAbs import GeomAbs_Plane
31
+ from OCP.TopoDS import TopoDS
32
+
33
+ if len(groups) != 2 or not all(groups):
34
+ return None, None, ()
35
+ axes: list[int] = []
36
+ group_boxes = []
37
+ group_faces = []
38
+ for shapes in groups:
39
+ group_axis = None
40
+ group_station = None
41
+ boxes = []
42
+ for shape in shapes:
43
+ try:
44
+ if shape.ShapeType() != TopAbs_FACE:
45
+ return None, None, ()
46
+ surface = BRepAdaptor_Surface(TopoDS.Face_s(shape))
47
+ if surface.GetType() != GeomAbs_Plane:
48
+ return None, None, ()
49
+ direction = surface.Plane().Axis().Direction()
50
+ local = _frame_vector((direction.X(), direction.Y(), direction.Z()), frame)
51
+ axis_index = max(range(3), key=lambda index: abs(local[index]))
52
+ if abs(abs(local[axis_index]) - 1.0) > 1e-6:
53
+ return None, None, ()
54
+ if any(abs(local[index]) > 1e-6 for index in range(3) if index != axis_index):
55
+ return None, None, ()
56
+ box = shape_bbox(shape) if frame is None else shape_bbox(shape, frame)
57
+ boxes.append(box)
58
+ station = (box[axis_index] + box[axis_index + 3]) / 2
59
+ if box[axis_index + 3] - box[axis_index] > 1e-5:
60
+ return None, None, ()
61
+ except Exception:
62
+ return None, None, ()
63
+ if group_axis is not None and group_axis != axis_index:
64
+ return None, None, ()
65
+ if group_station is not None and abs(group_station - station) > 1e-5:
66
+ return None, None, ()
67
+ group_axis, group_station = axis_index, station
68
+ assert group_axis is not None # Each validated source group contains a face.
69
+ axes.append(group_axis)
70
+ group_boxes.append(boxes)
71
+ group_faces.append(shapes)
72
+ if axes[0] != axes[1]:
73
+ return None, None, ()
74
+ axis = "XYZ"[axes[0]]
75
+ if axis == "X":
76
+ return _principal_x_planar_witness(group_boxes, group_faces, frame)
77
+ view_axis, view = _supported_planar_view(axis, group_boxes)
78
+ return view_axis, view, ()
79
+
80
+
81
+ def _principal_x_planar_witness(group_boxes, group_faces, frame):
82
+ # A front projection only needs both planes represented at the same Z;
83
+ # parallel face patches may be offset in Y (#2184). The plan fallback,
84
+ # however, claims one shared Y/Z point and must prove it on both trims.
85
+ if _midpoint_witness_supported(group_boxes, 2):
86
+ return "X", None, ()
87
+ common = _common_x_face_witness(group_boxes, group_faces, frame)
88
+ if common is not None:
89
+ y, z = common
90
+ return "X", "plan", ((1, y), (2, z))
91
+ return None, None, None
92
+
93
+
94
+ def _common_x_face_witness(group_boxes, group_faces, frame):
95
+ """Find a point in the interiors of both exact, trimmed X faces."""
96
+ candidates = [
97
+ (
98
+ (min(a[4], b[4]) - max(a[1], b[1])) * (min(a[5], b[5]) - max(a[2], b[2])),
99
+ max(a[1], b[1]),
100
+ max(a[2], b[2]),
101
+ min(a[4], b[4]),
102
+ min(a[5], b[5]),
103
+ a,
104
+ b,
105
+ group_faces[0][i],
106
+ group_faces[1][j],
107
+ )
108
+ for i, a in enumerate(group_boxes[0])
109
+ for j, b in enumerate(group_boxes[1])
110
+ if min(a[4], b[4]) >= max(a[1], b[1]) and min(a[5], b[5]) >= max(a[2], b[2])
111
+ ]
112
+ for _area, y0, z0, y1, z1, a, b, first, second in sorted(
113
+ candidates, key=lambda item: (-item[0], item[1], item[2])
114
+ ):
115
+ # Start at the overlap centre, then sample its interior deterministically.
116
+ # A bounding box may contain a face hole or a concavity; only OCC's
117
+ # trimmed-face classifier can establish a real common witness.
118
+ for y_fraction, z_fraction in ((0.5, 0.5),) + tuple(
119
+ (i / 10, j / 10) for i in range(1, 10) for j in range(1, 10)
120
+ ):
121
+ y = y0 + (y1 - y0) * y_fraction
122
+ z = z0 + (z1 - z0) * z_fraction
123
+ if all(
124
+ _point_inside_x_face(face, (box[0] + box[3]) / 2, y, z, frame)
125
+ for face, box in ((first, a), (second, b))
126
+ ):
127
+ return y, z
128
+ return None
129
+
130
+
131
+ def _point_inside_x_face(face, x, y, z, frame):
132
+ from OCP.BRepClass import BRepClass_FaceClassifier
133
+ from OCP.gp import gp_Pnt
134
+ from OCP.TopAbs import TopAbs_IN
135
+ from OCP.TopoDS import TopoDS
136
+
137
+ local = (x, y, z)
138
+ world = local if frame is None else frame.to_world(local)
139
+ classifier = BRepClass_FaceClassifier()
140
+ try:
141
+ classifier.Perform(TopoDS.Face_s(face), gp_Pnt(*world), 1e-7)
142
+ return classifier.State() == TopAbs_IN
143
+ except Exception:
144
+ return False
145
+
146
+
147
+ def _planar_bore_axis_witness(groups, frame, shape_bbox):
148
+ """Prove a location from one principal plane to one finite Z-bore axis.
149
+
150
+ A cylindrical face's bbox centre is its axial *height*, not the location
151
+ station. The plane must actually contain the axis-aligned witness point;
152
+ a bounding-box overlap alone would invent a witness through a trimmed face.
153
+ """
154
+ from OCP.BRepAdaptor import BRepAdaptor_Surface
155
+ from OCP.BRepClass import BRepClass_FaceClassifier
156
+ from OCP.GeomAbs import GeomAbs_Cylinder, GeomAbs_Plane
157
+ from OCP.gp import gp_Pnt
158
+ from OCP.TopAbs import TopAbs_IN, TopAbs_ON
159
+ from OCP.TopoDS import TopoDS
160
+
161
+ if len(groups) != 2 or any(len(group) != 1 for group in groups):
162
+ return None
163
+ try:
164
+ faces = tuple(TopoDS.Face_s(group[0]) for group in groups)
165
+ surfaces = tuple(BRepAdaptor_Surface(face) for face in faces)
166
+ kinds = tuple(surface.GetType() for surface in surfaces)
167
+ if kinds not in ((GeomAbs_Plane, GeomAbs_Cylinder), (GeomAbs_Cylinder, GeomAbs_Plane)):
168
+ return None
169
+ plane_i = kinds.index(GeomAbs_Plane)
170
+ bore_i = 1 - plane_i
171
+ normal = surfaces[plane_i].Plane().Axis().Direction()
172
+ normal = _frame_vector((normal.X(), normal.Y(), normal.Z()), frame)
173
+ axis = max(range(3), key=lambda index: abs(normal[index]))
174
+ if axis not in (0, 1) or abs(abs(normal[axis]) - 1) > 1e-6:
175
+ return None
176
+ bore = surfaces[bore_i].Cylinder().Axis()
177
+ direction = bore.Direction()
178
+ direction = _frame_vector((direction.X(), direction.Y(), direction.Z()), frame)
179
+ if abs(abs(direction[2]) - 1) > 1e-6 or max(abs(value) for value in direction[:2]) > 1e-6:
180
+ return None
181
+ point = bore.Location()
182
+ centre = _frame_point((point.X(), point.Y(), point.Z()), frame)
183
+ boxes = tuple(
184
+ shape_bbox(group[0]) if frame is None else shape_bbox(group[0], frame)
185
+ for group in groups
186
+ )
187
+ plane_box, bore_box = boxes[plane_i], boxes[bore_i]
188
+ z0 = max(plane_box[2], bore_box[2])
189
+ z1 = min(plane_box[5], bore_box[5])
190
+ if z1 - z0 <= 1e-6:
191
+ return None
192
+ station = (plane_box[axis] + plane_box[axis + 3]) / 2
193
+ if plane_box[axis + 3] - plane_box[axis] > 1e-5:
194
+ return None
195
+ witness = list(centre)
196
+ witness[axis] = station
197
+ witness[2] = (z0 + z1) / 2
198
+ world = witness if frame is None else frame.to_world(tuple(witness))
199
+ classifier = BRepClass_FaceClassifier()
200
+ classifier.Perform(faces[plane_i], gp_Pnt(*world), 1e-7)
201
+ if classifier.State() not in (TopAbs_IN, TopAbs_ON):
202
+ return None
203
+ points = [tuple(witness), tuple(witness)]
204
+ bore_point = list(witness)
205
+ bore_point[axis] = centre[axis]
206
+ points[bore_i] = tuple(bore_point)
207
+ return tuple(points), "XYZ"[axis], "plan"
208
+ except Exception:
209
+ return None
210
+
211
+
212
+ def _is_mixed_planar_bore(groups):
213
+ """Recognise the mixed support even when its location proof fails."""
214
+ from OCP.BRepAdaptor import BRepAdaptor_Surface
215
+ from OCP.GeomAbs import GeomAbs_Cylinder, GeomAbs_Plane
216
+ from OCP.TopoDS import TopoDS
217
+
218
+ if len(groups) != 2 or any(len(group) != 1 for group in groups):
219
+ return False
220
+ try:
221
+ kinds = tuple(BRepAdaptor_Surface(TopoDS.Face_s(group[0])).GetType() for group in groups)
222
+ return kinds in ((GeomAbs_Plane, GeomAbs_Cylinder), (GeomAbs_Cylinder, GeomAbs_Plane))
223
+ except Exception:
224
+ return False
225
+
226
+
227
+ def _common_principal_cylinder_axis(references):
228
+ """Return a shared principal axis only when every exact cylinder proves it."""
229
+ axes = []
230
+ for reference in references:
231
+ vector = reference.axis_direction
232
+ axis = max(range(3), key=lambda index: abs(vector[index]))
233
+ if abs(abs(vector[axis]) - 1.0) > 1e-6 or any(
234
+ abs(vector[index]) > 1e-6 for index in range(3) if index != axis
235
+ ):
236
+ return ""
237
+ axes.append("XYZ"[axis])
238
+ return axes[0] if axes and len(set(axes)) == 1 else ""
239
+
240
+
241
+ def _optional_cylinder_support(probe):
242
+ """Keep an optional axis probe from erasing otherwise valid source PMI."""
243
+ try:
244
+ references, reasons = probe()
245
+ return references if not reasons else ()
246
+ except Exception:
247
+ return ()
248
+
249
+
250
+ def _supported_planar_view(axis: str, group_boxes) -> tuple[str | None, str | None]:
251
+ """Select only projection views whose shared witness touches both groups."""
252
+ if axis in {"X", "Z"}:
253
+ return (
254
+ (axis, None)
255
+ if _midpoint_witness_supported(group_boxes, 2 if axis == "X" else 0)
256
+ else (None, None)
257
+ )
258
+ side = _midpoint_witness_supported(group_boxes, 2)
259
+ plan = _midpoint_witness_supported(group_boxes, 0)
260
+ if side and plan:
261
+ return axis, None
262
+ if side or plan:
263
+ return axis, "side" if side else "plan"
264
+ return None, None
265
+
266
+
267
+ def _midpoint_witness_supported(group_boxes, index: int) -> bool:
268
+ """Require a projected face in each group at the renderer's bbox midpoint."""
269
+ all_boxes = [box for boxes in group_boxes for box in boxes]
270
+ midpoint = (
271
+ min(box[index] for box in all_boxes) + max(box[index + 3] for box in all_boxes)
272
+ ) / 2
273
+ return all(
274
+ any(box[index] - 1e-6 <= midpoint <= box[index + 3] + 1e-6 for box in boxes)
275
+ for boxes in group_boxes
276
+ )
277
+
278
+
279
+ class _DatumTopologyResolver:
280
+ """Resolve Part21 face labels through OCCT's native transfer binders.
281
+
282
+ ``TransferOne(rank)`` stays inside C++, avoiding the OCP wrapper's loss of pointer
283
+ identity when a STEP entity is returned to Python. It reuses the existing transfer
284
+ binder. ``FindIndex`` then proves that result is ``IsSame`` to a face in the original
285
+ imported topology; no geometric comparison participates in correspondence.
286
+ """
287
+
288
+ _dynamic_type = "StepShape_AdvancedFace"
289
+ _part21_noun = "advanced face"
290
+ _shape_noun = "face"
291
+ _exclusive_claims = True
292
+
293
+ def _expected_shape_type(self):
294
+ return TopAbs_FACE
295
+
296
+ def __init__(self, step_reader, imported_faces):
297
+ self._reader = step_reader
298
+ self._model = step_reader.StepModel()
299
+ self._imported_faces = imported_faces
300
+ self._items: dict[str, tuple[object, int]] = {}
301
+ self._definitions: dict[str, tuple[object, ...]] = {}
302
+ self._claims: dict[int, str] = {}
303
+
304
+ def _transfer_face(self, item_id: str):
305
+ cached = self._items.get(item_id)
306
+ if cached is not None:
307
+ return cached, ""
308
+ rank = self._model.NextNumberForLabel(item_id, 0, True)
309
+ if rank <= 0:
310
+ return None, f"Part21 representation item {item_id} is unavailable"
311
+ entity = self._model.Value(rank)
312
+ if entity.DynamicType().Name() != self._dynamic_type:
313
+ return None, f"Part21 representation item {item_id} is not an {self._part21_noun}"
314
+ before = self._reader.NbShapes()
315
+ try:
316
+ transferred = self._reader.TransferOne(rank)
317
+ except Exception as exc:
318
+ return None, (
319
+ f"Part21 representation item {item_id} could not be transferred "
320
+ f"({_failure_reason(exc)})"
321
+ )
322
+ after = self._reader.NbShapes()
323
+ if not transferred or after != before + 1:
324
+ return None, f"Part21 representation item {item_id} could not be transferred"
325
+ shape = self._reader.Shape(after)
326
+ if shape is None or shape.IsNull() or shape.ShapeType() != self._expected_shape_type():
327
+ return None, (
328
+ f"Part21 representation item {item_id} did not transfer to one {self._shape_noun}"
329
+ )
330
+ face_index = self._imported_faces.FindIndex(shape)
331
+ if face_index <= 0:
332
+ return None, (
333
+ f"Part21 representation item {item_id} is not a {self._shape_noun} in the "
334
+ "imported topology"
335
+ )
336
+ result = (shape, face_index)
337
+ self._items[item_id] = result
338
+ return result, ""
339
+
340
+ def resolve(
341
+ self,
342
+ definition_id: str,
343
+ item_ids: tuple[str, ...],
344
+ *,
345
+ noun: str = "datum feature",
346
+ ):
347
+ """Return exact imported faces, or reasons that make the definition unsafe."""
348
+ cached = self._definitions.get(definition_id)
349
+ if cached is not None:
350
+ return cached, ()
351
+ if not item_ids:
352
+ return (), (f"{noun} has no Part21 representation items",)
353
+
354
+ resolved = []
355
+ reasons: list[str] = []
356
+ for item_id in item_ids:
357
+ result, reason = self._transfer_face(item_id)
358
+ if reason:
359
+ reasons.append(reason)
360
+ elif result is not None:
361
+ resolved.append(result)
362
+ if reasons:
363
+ return (), tuple(dict.fromkeys(reasons))
364
+
365
+ indices = [face_index for _shape, face_index in resolved]
366
+ if len(set(indices)) != len(indices):
367
+ return (), (
368
+ f"{noun} representation items resolve to the same imported {self._shape_noun}",
369
+ )
370
+ if self._exclusive_claims:
371
+ for face_index in indices:
372
+ owner = self._claims.get(face_index)
373
+ if owner is not None and owner != definition_id:
374
+ reasons.append(
375
+ f"one imported {self._shape_noun} is already claimed by {noun} {owner}"
376
+ )
377
+ if reasons:
378
+ return (), tuple(dict.fromkeys(reasons))
379
+
380
+ shapes = tuple(shape for shape, _face_index in resolved)
381
+ if self._exclusive_claims:
382
+ for face_index in indices:
383
+ self._claims[face_index] = definition_id
384
+ self._definitions[definition_id] = shapes
385
+ return shapes, ()
386
+
387
+
388
+ class _SurfaceLabelTopologyResolver(_DatumTopologyResolver):
389
+ """Resolve surface-label edge items through the same identity-proof boundary."""
390
+
391
+ _dynamic_type = "StepShape_EdgeCurve"
392
+ _part21_noun = "edge curve"
393
+ _shape_noun = "edge"
394
+ _exclusive_claims = False
395
+
396
+ def _expected_shape_type(self):
397
+ return TopAbs_EDGE
398
+
399
+
400
+ class _CommonLabelTopologyResolver(_DatumTopologyResolver):
401
+ """Resolve common-label face items without claiming them away from other PMI."""
402
+
403
+ _exclusive_claims = False
404
+
405
+
406
+ class _DimensionSupportResolver:
407
+ """Transfer exact dimension supports and prove B-rep items belong to the imported part."""
408
+
409
+ def __init__(self, step_reader):
410
+ self._reader = step_reader
411
+ self._model = step_reader.StepModel()
412
+ self._faces = TopTools_IndexedMapOfShape()
413
+ self._edges = TopTools_IndexedMapOfShape()
414
+ TopExp.MapShapes_s(step_reader.OneShape(), TopAbs_FACE, self._faces)
415
+ TopExp.MapShapes_s(step_reader.OneShape(), TopAbs_EDGE, self._edges)
416
+ self._items: dict[str, object] = {}
417
+ self._groups: dict[str, tuple[tuple[str, ...], tuple[object, ...]]] = {}
418
+
419
+ def _transfer(self, item_id: str):
420
+ cached = self._items.get(item_id)
421
+ if cached is not None:
422
+ return cached, ""
423
+ rank = self._model.NextNumberForLabel(item_id, 0, True)
424
+ if rank <= 0:
425
+ return None, f"Part21 dimension support item {item_id} is unavailable"
426
+ entity = self._model.Value(rank)
427
+ dynamic_type = entity.DynamicType().Name()
428
+ expected = {
429
+ "StepShape_AdvancedFace": (TopAbs_FACE, self._faces, "face"),
430
+ "StepShape_EdgeCurve": (TopAbs_EDGE, self._edges, "edge"),
431
+ "StepShape_GeometricCurveSet": (TopAbs_COMPOUND, None, "geometric curve set"),
432
+ }.get(dynamic_type)
433
+ if expected is None:
434
+ return None, (
435
+ f"Part21 dimension support item {item_id} has unsupported type {dynamic_type}"
436
+ )
437
+ before = self._reader.NbShapes()
438
+ try:
439
+ transferred = self._reader.TransferOne(rank)
440
+ except Exception as exc:
441
+ return None, (
442
+ f"Part21 dimension support item {item_id} could not be transferred "
443
+ f"({_failure_reason(exc)})"
444
+ )
445
+ after = self._reader.NbShapes()
446
+ if not transferred or after != before + 1:
447
+ return None, f"Part21 dimension support item {item_id} could not be transferred"
448
+ shape = self._reader.Shape(after)
449
+ expected_type, imported, noun = expected
450
+ if shape is None or shape.IsNull() or shape.ShapeType() != expected_type:
451
+ return None, f"Part21 dimension support item {item_id} did not transfer to one {noun}"
452
+ # Faces and edge curves are topology claims, so identity with the imported solid is
453
+ # mandatory. A geometric-curve-set is authored construction geometry rather than a
454
+ # B-rep subshape; its exact Part21 identity and successful transfer are the evidence.
455
+ if imported is not None and imported.FindIndex(shape) <= 0:
456
+ return None, f"Part21 dimension support item {item_id} is not in the imported topology"
457
+ self._items[item_id] = shape
458
+ return shape, ""
459
+
460
+ def resolve_group(self, aspect_id: str, item_ids: tuple[str, ...]):
461
+ cached = self._groups.get(aspect_id)
462
+ if cached is not None:
463
+ cached_item_ids, cached_shapes = cached
464
+ if cached_item_ids != item_ids:
465
+ return (), (f"dimension support group {aspect_id} has conflicting Part21 items",)
466
+ return cached_shapes, ()
467
+ if not item_ids:
468
+ return (), (f"dimension support group {aspect_id} has no Part21 items",)
469
+ shapes = []
470
+ reasons = []
471
+ for item_id in item_ids:
472
+ shape, reason = self._transfer(item_id)
473
+ if reason:
474
+ reasons.append(reason)
475
+ elif shape is not None:
476
+ shapes.append(shape)
477
+ if reasons:
478
+ return (), tuple(dict.fromkeys(reasons))
479
+ result = tuple(shapes)
480
+ self._groups[aspect_id] = (item_ids, result)
481
+ return result, ()