draftwright 0.5.0rc7__tar.gz → 0.5.0rc8__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 (831) hide show
  1. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/PKG-INFO +1 -1
  2. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/pyproject.toml +1 -1
  3. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/_pmi_linear_geometry.py +31 -3
  4. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/_pmi_support_blockers.py +17 -0
  5. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/_pmi_topology.py +78 -0
  6. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/analysis.py +30 -1
  7. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_step_lengths.py +19 -0
  8. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/builder.py +43 -0
  9. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/drawing.py +10 -0
  10. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/coverage.py +113 -44
  11. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/turned_step_coverage.py +10 -4
  12. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/model/callout.py +3 -0
  13. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/model/compiled.py +51 -1
  14. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/model/declare.py +2 -0
  15. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/model/detect.py +1 -0
  16. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/model/ir.py +6 -0
  17. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/model/ir_foundation.py +50 -5
  18. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/model/planner.py +485 -2
  19. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/model/pmi_lowering.py +282 -108
  20. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/pmi.py +38 -40
  21. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/reporting.py +92 -0
  22. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/sheet.py +11 -7
  23. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/sheet_emit.py +33 -12
  24. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/sheet_feature_lines.py +9 -2
  25. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/_complexity_baseline.json +3 -4
  26. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/_function_length_baseline.json +1 -1
  27. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/_tier_manifest.py +1 -0
  28. draftwright-0.5.0rc8/tests/test_authored_pmi_precedence.py +866 -0
  29. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1209_linear_pmi_witnesses.py +141 -1
  30. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/.gitignore +0 -0
  31. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/CHANGELOG.md +0 -0
  32. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/LICENSE +0 -0
  33. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/README.md +0 -0
  34. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/docs/adr/README.md +0 -0
  35. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/docs/reference/recogniser-capabilities.md +0 -0
  36. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/docs/reference/sheet.md +0 -0
  37. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/docs/research/1062-repeating-radial-profile-evidence.md +0 -0
  38. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/skills/SKILL.md +0 -0
  39. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/__init__.py +0 -0
  40. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/_build_profile.py +0 -0
  41. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/_core.py +0 -0
  42. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/_geometry.py +0 -0
  43. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/_pmi_datum_geometry.py +0 -0
  44. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/_pmi_part21.py +0 -0
  45. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/_pmi_schema.py +0 -0
  46. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/_warnings.py +0 -0
  47. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/angular_geometry.py +0 -0
  48. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotate.py +0 -0
  49. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotation_layout_profile.py +0 -0
  50. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/__init__.py +0 -0
  51. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_axial_render.py +0 -0
  52. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_circular_recesses.py +0 -0
  53. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_common.py +0 -0
  54. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_diameters.py +0 -0
  55. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_dimension_ink.py +0 -0
  56. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_dimension_ink_repair.py +0 -0
  57. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_edge_callouts.py +0 -0
  58. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_envelope.py +0 -0
  59. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_gdt.py +0 -0
  60. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_height_ladder.py +0 -0
  61. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_hole_leader_placement.py +0 -0
  62. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_leader_candidates.py +0 -0
  63. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_leader_commit.py +0 -0
  64. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_leader_fixed_ink.py +0 -0
  65. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_locations.py +0 -0
  66. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_machined_leaders.py +0 -0
  67. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_patterns.py +0 -0
  68. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_placement_geometry.py +0 -0
  69. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_placement_occupancy.py +0 -0
  70. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_pmi_dimensions.py +0 -0
  71. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_pocket_pad.py +0 -0
  72. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_polygonal_prisms.py +0 -0
  73. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_sheet_furniture.py +0 -0
  74. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_slots.py +0 -0
  75. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_strip_postsolve.py +0 -0
  76. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/_thin_profiles.py +0 -0
  77. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/angular.py +0 -0
  78. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/balloons.py +0 -0
  79. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/drawing_port.py +0 -0
  80. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/from_model.py +0 -0
  81. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/gears.py +0 -0
  82. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/hole_leader_candidates.py +0 -0
  83. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/hole_locations.py +0 -0
  84. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/holes.py +0 -0
  85. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/leaders.py +0 -0
  86. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/orchestrator.py +0 -0
  87. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/routed.py +0 -0
  88. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/sections.py +0 -0
  89. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/annotations/solve_trace.py +0 -0
  90. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/audit.py +0 -0
  91. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/auxiliary_layout.py +0 -0
  92. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/blend_contract.py +0 -0
  93. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/build_once.py +0 -0
  94. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/build_options.py +0 -0
  95. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/build_policy.py +0 -0
  96. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/cli.py +0 -0
  97. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/compose.py +0 -0
  98. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/contract_values.py +0 -0
  99. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/document.py +0 -0
  100. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/document_evidence.py +0 -0
  101. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/document_input.py +0 -0
  102. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/drawing_diagnostics.py +0 -0
  103. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/drawing_evidence.py +0 -0
  104. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/drawing_export.py +0 -0
  105. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/drawing_state.py +0 -0
  106. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/drawing_tables.py +0 -0
  107. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/evaluation/__init__.py +0 -0
  108. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/evaluation/_double_d_evidence.py +0 -0
  109. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/evaluation/_edge_profile_evidence.py +0 -0
  110. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/evaluation/_flat_polygonal_evidence.py +0 -0
  111. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/evaluation/_groove_evidence.py +0 -0
  112. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/evaluation/_hole_family_evidence.py +0 -0
  113. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/evaluation/_pocket_evidence.py +0 -0
  114. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/evaluation/_prismatic_evidence.py +0 -0
  115. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/evaluation/_turned_step_evidence.py +0 -0
  116. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/evaluation/step_analysis.py +0 -0
  117. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/explicit_scale.py +0 -0
  118. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/export.py +0 -0
  119. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/family_table.py +0 -0
  120. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/feature_identity.py +0 -0
  121. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/fits.py +0 -0
  122. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/fonts/IBMPlexMono-Regular.ttf +0 -0
  123. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/fonts/IBMPlexSansCondensed-Regular.ttf +0 -0
  124. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/fonts/LICENSE-IBMPlexMono-OFL.txt +0 -0
  125. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/fonts/LICENSE-IBMPlexSansCondensed-OFL.txt +0 -0
  126. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/fonts/__init__.py +0 -0
  127. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/inspection.py +0 -0
  128. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/inspection_contract.py +0 -0
  129. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/intent_drain.py +0 -0
  130. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/intent_routing.py +0 -0
  131. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/intents.py +0 -0
  132. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/layout.py +0 -0
  133. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/layout_safety.py +0 -0
  134. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/layout_scheme.py +0 -0
  135. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/layout_selection.py +0 -0
  136. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/leader_policy.py +0 -0
  137. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/__init__.py +0 -0
  138. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/_coverage_common.py +0 -0
  139. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/_parameter_coverage.py +0 -0
  140. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/_registry.py +0 -0
  141. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/angled_step_coverage.py +0 -0
  142. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/angular.py +0 -0
  143. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/blend_coverage.py +0 -0
  144. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/boss_coverage.py +0 -0
  145. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/chamfer_coverage.py +0 -0
  146. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/channel_coverage.py +0 -0
  147. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/circular_blind_step_coverage.py +0 -0
  148. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/envelope_coverage.py +0 -0
  149. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/evidence.py +0 -0
  150. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/fillet_coverage.py +0 -0
  151. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/flat_coverage.py +0 -0
  152. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/gear_coverage.py +0 -0
  153. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/groove_coverage.py +0 -0
  154. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/gusset_rib_coverage.py +0 -0
  155. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/hole_coverage.py +0 -0
  156. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/ink_overlap.py +0 -0
  157. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/issues.py +0 -0
  158. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/orchestration.py +0 -0
  159. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/oriented_slot_coverage.py +0 -0
  160. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/pad_coverage.py +0 -0
  161. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/paired_ramp_step_coverage.py +0 -0
  162. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/passage_coverage.py +0 -0
  163. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/plate_coverage.py +0 -0
  164. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/pmi_coverage.py +0 -0
  165. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/pocket_coverage.py +0 -0
  166. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/pocket_pattern_coverage.py +0 -0
  167. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/polygonal_boss_coverage.py +0 -0
  168. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/polygonal_stock_coverage.py +0 -0
  169. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/prismatic_pocket_coverage.py +0 -0
  170. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/profiled_bore_coverage.py +0 -0
  171. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/quality.py +0 -0
  172. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/rectangular_blind_slot_coverage.py +0 -0
  173. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/requirements.py +0 -0
  174. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/round_bottom_blind_slot_coverage.py +0 -0
  175. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/schedule_evidence.py +0 -0
  176. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/section_recess_coverage.py +0 -0
  177. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/slot_coverage.py +0 -0
  178. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/structural.py +0 -0
  179. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/suggest.py +0 -0
  180. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/linting/through_step_coverage.py +0 -0
  181. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/location_contract.py +0 -0
  182. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/make_drawing.py +0 -0
  183. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/measurement_support.py +0 -0
  184. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/model/__init__.py +0 -0
  185. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/model/detect_inventory.py +0 -0
  186. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/model/detect_ownership.py +0 -0
  187. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/model/dimension_intent.py +0 -0
  188. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/model/manufacturing_schedule.py +0 -0
  189. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/model/oriented_slot_geometry.py +0 -0
  190. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/obligations.py +0 -0
  191. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/oriented_slot_contract.py +0 -0
  192. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/pdf_text.py +0 -0
  193. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/plate_correspondence.py +0 -0
  194. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/profile_angles.py +0 -0
  195. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/progress.py +0 -0
  196. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/projection.py +0 -0
  197. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/py.typed +0 -0
  198. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/recogniser_contract.py +0 -0
  199. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/recogniser_policy.py +0 -0
  200. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/recogniser_schema.py +0 -0
  201. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/recognition/__init__.py +0 -0
  202. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/recognition_cache.py +0 -0
  203. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/recognition_frame.py +0 -0
  204. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/recognition_ownership.py +0 -0
  205. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/registry.py +0 -0
  206. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/repair.py +0 -0
  207. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/replay_assessment.py +0 -0
  208. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/score.py +0 -0
  209. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/section_recess_contract.py +0 -0
  210. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/sheet_features.py +0 -0
  211. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/sheet_layout_controls.py +0 -0
  212. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/sheet_metadata.py +0 -0
  213. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/sheet_object_source.py +0 -0
  214. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/sheet_views.py +0 -0
  215. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/src/draftwright/view_plan.py +0 -0
  216. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/_burden_report.py +0 -0
  217. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/_corpus_cover.py +0 -0
  218. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/_drawing_helpers.py +0 -0
  219. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/_evidence_contract.py +0 -0
  220. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/_issue_module_baseline.txt +0 -0
  221. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/_kernel.py +0 -0
  222. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/_layout_helpers.py +0 -0
  223. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/_layout_sig.py +0 -0
  224. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/_mutation_corpus.py +0 -0
  225. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/_pad_rendering_fixtures.py +0 -0
  226. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/_parts.py +0 -0
  227. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/_pattern_contract.py +0 -0
  228. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/_recogniser_public_contract.py +0 -0
  229. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/_section_recess_cases.py +0 -0
  230. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/_unit_manifest.py +0 -0
  231. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/conftest.py +0 -0
  232. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/annotation-layout-corpus-v1.json +0 -0
  233. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/annotation-layout-corpus-v2.json +0 -0
  234. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/annotation-layout-holdout-ftc09-v1.json +0 -0
  235. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/annotation-layout-holdout-v1.json +0 -0
  236. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/ap242_single_cylinder_diameter.step +0 -0
  237. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/README.md +0 -0
  238. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/ambiguous-open-semicircle.step +0 -0
  239. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/blind-hole.step +0 -0
  240. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/chamfer-asymmetric.step +0 -0
  241. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/chamfer-compound.step +0 -0
  242. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/chamfer-overlap.step +0 -0
  243. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/chamfer-plain.step +0 -0
  244. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/chamfer-planar-x.step +0 -0
  245. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/chamfer-planar-y.step +0 -0
  246. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/chamfer-planar-z.step +0 -0
  247. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/chamfer-topology-a.step +0 -0
  248. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/chamfer-topology-b.step +0 -0
  249. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/chamfer-turned.step +0 -0
  250. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/corpus-chamfers-v1.json +0 -0
  251. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/corpus-countersinks-v1.json +0 -0
  252. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/corpus-double-d-bores-v1.json +0 -0
  253. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/corpus-fillets-v1.json +0 -0
  254. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/corpus-flats-v1.json +0 -0
  255. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/corpus-grooves-v1.json +0 -0
  256. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/corpus-hole-patterns-v1.json +0 -0
  257. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/corpus-plates-v1.json +0 -0
  258. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/corpus-pocket-patterns-v1.json +0 -0
  259. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/corpus-pockets-v1.json +0 -0
  260. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/corpus-polygonal-bosses-v1.json +0 -0
  261. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/corpus-polygonal-stock-v1.json +0 -0
  262. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/corpus-rectangular-pads-v1.json +0 -0
  263. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/corpus-turned-steps-v1.json +0 -0
  264. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/corpus-v1.json +0 -0
  265. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/countersink-deburr.step +0 -0
  266. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/countersink-external-cone.step +0 -0
  267. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/countersink-mixed-pair.step +0 -0
  268. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/countersink-single.step +0 -0
  269. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/countersink-topology-a.step +0 -0
  270. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/countersink-topology-b.step +0 -0
  271. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/double-d-axis-x.step +0 -0
  272. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/double-d-axis-y.step +0 -0
  273. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/double-d-blind.step +0 -0
  274. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/double-d-coaxial-compound.step +0 -0
  275. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/double-d-opposed-blind.step +0 -0
  276. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/double-d-roll-30.step +0 -0
  277. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/double-d-round-bore.step +0 -0
  278. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/double-d-single-z.step +0 -0
  279. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/double-d-topology-a.step +0 -0
  280. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/double-d-topology-b.step +0 -0
  281. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/fillet-compound.step +0 -0
  282. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/fillet-overlap.step +0 -0
  283. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/fillet-plain.step +0 -0
  284. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/fillet-planar-x.step +0 -0
  285. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/fillet-planar-y.step +0 -0
  286. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/fillet-planar-z.step +0 -0
  287. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/fillet-repeated.step +0 -0
  288. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/fillet-topology-a.step +0 -0
  289. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/fillet-topology-b.step +0 -0
  290. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/fillet-turned.step +0 -0
  291. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/flat-coaxial.step +0 -0
  292. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/flat-double-d.step +0 -0
  293. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/flat-lone-d.step +0 -0
  294. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/flat-nonround.step +0 -0
  295. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/flat-slanted-double-d.step +0 -0
  296. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/flat-topology-a.step +0 -0
  297. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/flat-topology-b.step +0 -0
  298. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/groove-compound.step +0 -0
  299. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/groove-lone-x.step +0 -0
  300. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/groove-lone-y.step +0 -0
  301. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/groove-lone-z.step +0 -0
  302. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/groove-monotonic-negative.step +0 -0
  303. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/groove-narrow.step +0 -0
  304. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/groove-topology-a.step +0 -0
  305. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/groove-topology-b.step +0 -0
  306. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pad-compound-equal.step +0 -0
  307. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pad-detached-body-negative.step +0 -0
  308. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pad-full-span-ledge-negative.step +0 -0
  309. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pad-nested-staircase-negative.step +0 -0
  310. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pad-topology-a.step +0 -0
  311. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pad-topology-b.step +0 -0
  312. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pad-x-negative.step +0 -0
  313. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pad-x-positive.step +0 -0
  314. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pad-y-negative.step +0 -0
  315. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pad-y-positive.step +0 -0
  316. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pad-z-negative.step +0 -0
  317. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pad-z-positive.step +0 -0
  318. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pattern-ambiguous.step +0 -0
  319. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pattern-grid.step +0 -0
  320. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pattern-topology-a.step +0 -0
  321. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pattern-topology-b.step +0 -0
  322. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/plain-block.step +0 -0
  323. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/plate-compound-equal.step +0 -0
  324. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/plate-cross-topology-a.step +0 -0
  325. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/plate-cross-topology-b.step +0 -0
  326. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/plate-detached-negative.step +0 -0
  327. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/plate-rotational-negative.step +0 -0
  328. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/plate-single-negative.step +0 -0
  329. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/plate-t-xz.step +0 -0
  330. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/plate-t-yz.step +0 -0
  331. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/plate-thick-negative.step +0 -0
  332. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/plate-u-additive.step +0 -0
  333. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/plate-u-cut.step +0 -0
  334. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pocket-compound.step +0 -0
  335. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pocket-edge-anchored.step +0 -0
  336. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pocket-lone.step +0 -0
  337. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pocket-opposed.step +0 -0
  338. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pocket-pattern-ambiguous.step +0 -0
  339. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pocket-pattern-grid.step +0 -0
  340. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pocket-pattern-linear.step +0 -0
  341. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pocket-pattern-pair.step +0 -0
  342. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pocket-pattern-topology-a.step +0 -0
  343. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pocket-pattern-topology-b.step +0 -0
  344. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pocket-prismatic-negative.step +0 -0
  345. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pocket-side.step +0 -0
  346. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pocket-through-negative.step +0 -0
  347. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pocket-topology-a.step +0 -0
  348. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pocket-topology-b.step +0 -0
  349. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/pocket-two-equal.step +0 -0
  350. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-boss-compound-equal.step +0 -0
  351. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-boss-detached-negative.step +0 -0
  352. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-boss-in-plane-rotated.step +0 -0
  353. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-boss-other-protrusions-negative.step +0 -0
  354. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-boss-recess-negative.step +0 -0
  355. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-boss-stock-negative.step +0 -0
  356. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-boss-topology-a.step +0 -0
  357. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-boss-topology-b.step +0 -0
  358. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-boss-x.step +0 -0
  359. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-boss-y.step +0 -0
  360. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-boss-z.step +0 -0
  361. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-stock-compound-negative.step +0 -0
  362. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-stock-cylinder-negative.step +0 -0
  363. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-stock-irregular-negative.step +0 -0
  364. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-stock-octagon-negative.step +0 -0
  365. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-stock-recess-negative.step +0 -0
  366. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-stock-roll17.step +0 -0
  367. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-stock-topology-a.step +0 -0
  368. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-stock-topology-b.step +0 -0
  369. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-stock-translated.step +0 -0
  370. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-stock-x.step +0 -0
  371. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/polygonal-stock-y.step +0 -0
  372. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/topology-a.step +0 -0
  373. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/topology-b.step +0 -0
  374. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/turned-step-axis-x.step +0 -0
  375. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/turned-step-axis-y.step +0 -0
  376. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/turned-step-axis-z.step +0 -0
  377. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/turned-step-compound.step +0 -0
  378. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/turned-step-repeated-lengths.step +0 -0
  379. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/turned-step-through-bore.step +0 -0
  380. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/turned-step-topology-a.step +0 -0
  381. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/turned-step-topology-b.step +0 -0
  382. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/evaluation/turned-step-translated-blind-bore.step +0 -0
  383. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/grm03_edge_face_finish_ap242.step +0 -0
  384. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/grm03_specify_pmi_ap242.step +0 -0
  385. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/grm03_thumbwheel_drive_screw.step +0 -0
  386. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/grm03_thumbwheel_drive_screw_ap242_pmi.step +0 -0
  387. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/grm04_drive_plate.step +0 -0
  388. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/if_step_flat_across_cylinder.step +0 -0
  389. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/issue_1058_wheel_rh.step +0 -0
  390. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/issue_1247_angled_blind_step.step +0 -0
  391. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/issue_1595_whistle_key_frame.step +0 -0
  392. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/issue_1595_whistle_key_lever.step +0 -0
  393. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/issue_909_basic_part_design_017_body.step +0 -0
  394. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/issue_915_case_study_2.step +0 -0
  395. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/nist_ctc_01_asme1_ap203.stp +0 -0
  396. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/nist_ctc_01_asme1_ap242.stp +0 -0
  397. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/nist_ctc_02_asme1_ap203.stp +0 -0
  398. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/nist_ctc_02_asme1_ap242.stp +0 -0
  399. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/nist_ctc_03_asme1_ap203.stp +0 -0
  400. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/nist_ctc_03_asme1_ap242.stp +0 -0
  401. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/nist_ctc_04_asme1_ap203.stp +0 -0
  402. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/nist_ctc_04_asme1_ap242.stp +0 -0
  403. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/nist_ctc_05_asme1_ap203.stp +0 -0
  404. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/nist_ctc_05_asme1_ap242.stp +0 -0
  405. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/nist_ftc_09_asme1_ap242-e1.stp +0 -0
  406. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/tuner_jig_blind_obround_pockets.step +0 -0
  407. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/fixtures/whistle_frame_reference.step +0 -0
  408. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/refactor_golden/bracket_section.json +0 -0
  409. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/refactor_golden/centered_rebate.json +0 -0
  410. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/refactor_golden/chamfered.json +0 -0
  411. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/refactor_golden/filleted.json +0 -0
  412. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/refactor_golden/flange_dense.json +0 -0
  413. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/refactor_golden/grid_plate.json +0 -0
  414. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/refactor_golden/grooved_shaft.json +0 -0
  415. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/refactor_golden/hex_bar.json +0 -0
  416. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/refactor_golden/holed_slot.json +0 -0
  417. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/refactor_golden/pocketed.json +0 -0
  418. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/refactor_golden/prismatic_ladder.json +0 -0
  419. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/refactor_golden/scattered_plate.json +0 -0
  420. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/refactor_golden/side_drilled.json +0 -0
  421. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/refactor_golden/turned_stepped.json +0 -0
  422. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_add_dimension.py +0 -0
  423. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_adr0018_view_routing.py +0 -0
  424. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_adr0018_view_selection.py +0 -0
  425. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_adr_corpus.py +0 -0
  426. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_agent_improvement_canary_issue_1716.py +0 -0
  427. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_agents_guide.py +0 -0
  428. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_analysis_geometry.py +0 -0
  429. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_angle_patterns.py +0 -0
  430. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_angular_references.py +0 -0
  431. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_angular_rendering.py +0 -0
  432. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_annotation_box_composition.py +0 -0
  433. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_annotation_box_corpus.py +0 -0
  434. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_annotation_layout_product.py +0 -0
  435. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_annotation_scheme_compare_script.py +0 -0
  436. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_annotation_scheme_corpus_script.py +0 -0
  437. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_annotation_scheme_shadow_script.py +0 -0
  438. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_api_docs.py +0 -0
  439. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_architecture_docs.py +0 -0
  440. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_arrangement_gate.py +0 -0
  441. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_assessment_comparison_issue_1712.py +0 -0
  442. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_audit_differential.py +0 -0
  443. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_auxiliary_layout.py +0 -0
  444. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_axial_dimensions.py +0 -0
  445. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_balloon_ring_standoff.py +0 -0
  446. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_blind_slot_completeness.py +0 -0
  447. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_blind_slot_semantics.py +0 -0
  448. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_boss_ownership.py +0 -0
  449. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_build_drawing_entrypoints.py +0 -0
  450. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_build_profile_harness.py +0 -0
  451. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_burden_report.py +0 -0
  452. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_candidate_evidence_issue_1726.py +0 -0
  453. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_candidate_preview_sheet_holdout.py +0 -0
  454. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_canonical_angles.py +0 -0
  455. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_carve_free_position_callers.py +0 -0
  456. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_channel_ownership.py +0 -0
  457. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_circular_blind_step_semantics.py +0 -0
  458. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_cli_behavior.py +0 -0
  459. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_cli_report_sidecar.py +0 -0
  460. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_clone_budget.py +0 -0
  461. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_compiled_plan_boundary.py +0 -0
  462. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_compose_then_pack.py +0 -0
  463. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_contract_values.py +0 -0
  464. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_corpus_cover.py +0 -0
  465. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_counting_calls.py +0 -0
  466. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_coverage_mode.py +0 -0
  467. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_declaration_identity_issue_1710.py +0 -0
  468. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_declaration_report_issue_1710.py +0 -0
  469. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_declare.py +0 -0
  470. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_declared_recognition_gate.py +0 -0
  471. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_declared_report_issue_1688.py +0 -0
  472. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_deferred_edits.py +0 -0
  473. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_dense_sheet_canary.py +0 -0
  474. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_deprecation_dates.py +0 -0
  475. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_depth_estimators.py +0 -0
  476. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_derived_view_integration.py +0 -0
  477. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_derived_view_planning.py +0 -0
  478. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_detail_views.py +0 -0
  479. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_detect_once.py +0 -0
  480. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_detect_registry.py +0 -0
  481. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_diameter_deduplication.py +0 -0
  482. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_diameter_leaders.py +0 -0
  483. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_dimension_intent_contract.py +0 -0
  484. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_dimension_lane_canary_issue_1757.py +0 -0
  485. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_dimension_role_vocabulary.py +0 -0
  486. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_document_build.py +0 -0
  487. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_document_claim_authority.py +0 -0
  488. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_document_claims.py +0 -0
  489. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_document_coverage.py +0 -0
  490. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_document_report.py +0 -0
  491. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_document_report_authority.py +0 -0
  492. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_drawing_encapsulation.py +0 -0
  493. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_drawing_operations.py +0 -0
  494. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_drawing_state.py +0 -0
  495. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_dynamic_corridors.py +0 -0
  496. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_e2e_slice.py +0 -0
  497. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_e2e_standards.py +0 -0
  498. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_edge_profile_coverage.py +0 -0
  499. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_envelope_view_route_issue_1813.py +0 -0
  500. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_equivalent_dimension_presentations_issue_1759.py +0 -0
  501. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_export_dxf_curves.py +0 -0
  502. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_export_dxf_zoom.py +0 -0
  503. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_export_formats.py +0 -0
  504. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_export_reproducible.py +0 -0
  505. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_export_shape.py +0 -0
  506. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_external_recognition_boundary.py +0 -0
  507. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_family_table.py +0 -0
  508. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_feature_edit_corridors.py +0 -0
  509. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_feature_edit_replay.py +0 -0
  510. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_feature_edit_verbs.py +0 -0
  511. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_feature_leader_candidate_regions.py +0 -0
  512. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_feature_provenance.py +0 -0
  513. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_feature_queries.py +0 -0
  514. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_fillets_adjacency.py +0 -0
  515. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_fit_calculations.py +0 -0
  516. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_fits.py +0 -0
  517. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_flat_callout_precision.py +0 -0
  518. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_flat_completeness.py +0 -0
  519. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_flat_stock_identity.py +0 -0
  520. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_flat_stock_opposition.py +0 -0
  521. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_format_selector.py +0 -0
  522. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_formatting.py +0 -0
  523. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_framed_step_family_evidence.py +0 -0
  524. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_gdt_ink_shared.py +0 -0
  525. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_gdt_placement.py +0 -0
  526. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_geometry_graph_spike.py +0 -0
  527. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_grid_lattice_convention.py +0 -0
  528. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_groove_completeness_evidence.py +0 -0
  529. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_groove_profile.py +0 -0
  530. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_gusset_rib_semantics.py +0 -0
  531. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_hole_annotations.py +0 -0
  532. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_hole_pattern_callouts.py +0 -0
  533. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_hole_table.py +0 -0
  534. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_import_boundaries.py +0 -0
  535. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_inspection_contract.py +0 -0
  536. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_interior_label_placement.py +0 -0
  537. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_ir_foundation.py +0 -0
  538. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_iso_detail_growth.py +0 -0
  539. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_iso_layout.py +0 -0
  540. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_iso_nts_caption_placement.py +0 -0
  541. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_isometric_orientation.py +0 -0
  542. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_isometric_placement.py +0 -0
  543. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1000_envelope_reuse.py +0 -0
  544. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1006_measurement_comparison.py +0 -0
  545. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1058_wheel_profile.py +0 -0
  546. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1073_cross_body_patterns.py +0 -0
  547. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1082_polygonal_stock.py +0 -0
  548. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1086_declared_gears.py +0 -0
  549. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1116_ap242_hole_tolerance_lowering.py +0 -0
  550. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1126_requesting_less_never_scores_better.py +0 -0
  551. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1130_view_planning_evidence.py +0 -0
  552. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1132_turned_profile_span_is_reported.py +0 -0
  553. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1142_hole_leader_labels.py +0 -0
  554. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1143_hole_completeness.py +0 -0
  555. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1144_transactional_hole_table.py +0 -0
  556. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1146_scale_completeness.py +0 -0
  557. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1147_legibility_pair_aggregation.py +0 -0
  558. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1153_contradictory_dimensions.py +0 -0
  559. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1154_one_owner_per_measurement.py +0 -0
  560. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1155_grm04_sheet_use.py +0 -0
  561. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1157_no_implicit_general_tolerance.py +0 -0
  562. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1166_cross_pass_feature_leaders.py +0 -0
  563. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1176_quality_fidelity.py +0 -0
  564. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1177_angular_dimensions.py +0 -0
  565. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1187_unroutable_leaders.py +0 -0
  566. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1188_per_view_assignment.py +0 -0
  567. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1190_section_decision.py +0 -0
  568. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1196_deterministic_view_names.py +0 -0
  569. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1202_observed_drawing_consumer.py +0 -0
  570. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1204_multiscale_view_issues.py +0 -0
  571. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1215_envelope_tolerance.py +0 -0
  572. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1215_no_approved_tolerance_is_dropped.py +0 -0
  573. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1216_callout_reservation_measures_ink.py +0 -0
  574. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1216_pairwise_across_scale_groups.py +0 -0
  575. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1217_claimed_representations.py +0 -0
  576. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1217_the_facility_is_shared.py +0 -0
  577. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1219_location_claims_its_own_axis.py +0 -0
  578. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1229_ledger_member_keying.py +0 -0
  579. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1240_iso_above_strip_visibility.py +0 -0
  580. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1245_passage_disposition.py +0 -0
  581. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1246_prismatic_pocket_disposition.py +0 -0
  582. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1247_angled_step_disposition.py +0 -0
  583. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1254_turned_chamfers.py +0 -0
  584. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1260_view_constraints.py +0 -0
  585. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1262_automatic_turned_views.py +0 -0
  586. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1276_turned_leader_targets.py +0 -0
  587. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1281_turned_fillets.py +0 -0
  588. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1296_cylindrical_diameter_pmi.py +0 -0
  589. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1298_manufacturing_requirements.py +0 -0
  590. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1299_page_escalation.py +0 -0
  591. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1308_machined_leader_analytics.py +0 -0
  592. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1312_engine_costs.py +0 -0
  593. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1325_nominal_agreement.py +0 -0
  594. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1332_overlap_remedy.py +0 -0
  595. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1333_bounded_ink_repair.py +0 -0
  596. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1334_prevent_ink.py +0 -0
  597. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1336_grm03_ap242_pmi_fixture.py +0 -0
  598. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1338_scale_before_page_escalation.py +0 -0
  599. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1349_precision_display.py +0 -0
  600. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1350_detected_takeover.py +0 -0
  601. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1351_structured_note_coverage.py +0 -0
  602. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1352_searchable_pdf_text.py +0 -0
  603. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1353_cnc_authoritative_workflow.py +0 -0
  604. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1357_framed_activation.py +0 -0
  605. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1357_framed_boundary.py +0 -0
  606. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1357_plural_turned_profiles.py +0 -0
  607. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1357_pmi_frame.py +0 -0
  608. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1360_thread_depth.py +0 -0
  609. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1369_hole_completeness_evidence.py +0 -0
  610. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1370_countersink_completeness_evidence.py +0 -0
  611. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1370_double_d_completeness_evidence.py +0 -0
  612. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1370_hole_pattern_completeness_evidence.py +0 -0
  613. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1371_flat_completeness_evidence.py +0 -0
  614. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1371_polygonal_stock_completeness_evidence.py +0 -0
  615. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1373_plate_completeness_evidence.py +0 -0
  616. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1374_chamfer_completeness_evidence.py +0 -0
  617. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1374_fillet_completeness_evidence.py +0 -0
  618. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1374_turned_step_completeness_evidence.py +0 -0
  619. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1378_diameter_leader_targets.py +0 -0
  620. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1392_recognisers_048.py +0 -0
  621. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1395_degenerate_iso_region.py +0 -0
  622. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1396_layout_advisories.py +0 -0
  623. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1397_unverifiable_requirement_message.py +0 -0
  624. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1432_adoption.py +0 -0
  625. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1432_boundary_failures.py +0 -0
  626. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1432_oriented_slot_semantics.py +0 -0
  627. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1433_blend_semantics.py +0 -0
  628. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1450_boss_blend_ownership.py +0 -0
  629. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1460_step_inspection.py +0 -0
  630. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1466_dimension_options.py +0 -0
  631. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1466_semantic_sides.py +0 -0
  632. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1479_radius_leader_targets.py +0 -0
  633. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1485_curved_pockets.py +0 -0
  634. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1485_quiddity_024_boundary.py +0 -0
  635. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1485_rounded_pockets.py +0 -0
  636. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1505_diameter_coverage.py +0 -0
  637. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1505_short_axial_chains.py +0 -0
  638. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1511_turned_boss_heights.py +0 -0
  639. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1514_projection_safeguard.py +0 -0
  640. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1515_first_angle.py +0 -0
  641. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1516_dimension_text.py +0 -0
  642. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1517_through_indicator.py +0 -0
  643. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1518_explicit_rear.py +0 -0
  644. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1524_tolerance_magnitude.py +0 -0
  645. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1530_section_provenance.py +0 -0
  646. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1531_semantic_hole_counts.py +0 -0
  647. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1532_authored_section_examples.py +0 -0
  648. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1533_review_diagnostics.py +0 -0
  649. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1534_build_progress.py +0 -0
  650. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1536_title_overflow.py +0 -0
  651. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1543_feature_schedules.py +0 -0
  652. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1543_schedule_requirements.py +0 -0
  653. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1544_frame_document_canary.py +0 -0
  654. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1555_turned_recognition_format_invariance.py +0 -0
  655. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1560_envelope_axes.py +0 -0
  656. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1563_sheet_pmi_reconciliation.py +0 -0
  657. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1585_title_block_date.py +0 -0
  658. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1593_title_block_keepout.py +0 -0
  659. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1596_bolt_circle_corroboration.py +0 -0
  660. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1598_hex_pockets.py +0 -0
  661. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1604_internal_section.py +0 -0
  662. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1612_frame_sergio_coverage.py +0 -0
  663. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1612_sheet_margins.py +0 -0
  664. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_1613_circular_channel.py +0 -0
  665. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_367_leader_ink.py +0 -0
  666. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_443_grm03_axial_coverage.py +0 -0
  667. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_563_placement_intent.py +0 -0
  668. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_676_polygonal_boss.py +0 -0
  669. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_676_polygonal_boss_declare.py +0 -0
  670. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_740_leader_assignment.py +0 -0
  671. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_798_floor_cardinality.py +0 -0
  672. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_798_material_field.py +0 -0
  673. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_798_silhouette_lint.py +0 -0
  674. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_827_real_part_canary.py +0 -0
  675. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_883_location_identity.py +0 -0
  676. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_885_prismatic_coverage.py +0 -0
  677. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_909_sloped_profile.py +0 -0
  678. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_915_dense_case.py +0 -0
  679. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_916_pocket_leader.py +0 -0
  680. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_917_open_channel.py +0 -0
  681. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_924_zero_length_shoulders.py +0 -0
  682. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_955_height_contingency.py +0 -0
  683. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_issue_958_cross_solid_recognition.py +0 -0
  684. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_label_provenance.py +0 -0
  685. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_layout.py +0 -0
  686. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_layout_cleanliness.py +0 -0
  687. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_layout_constants.py +0 -0
  688. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_layout_evidence_issue_1711.py +0 -0
  689. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_layout_generalisation.py +0 -0
  690. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_layout_hypothesis.py +0 -0
  691. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_layout_override_lane_issue_1757.py +0 -0
  692. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_layout_override_side_issue_1757.py +0 -0
  693. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_layout_property.py +0 -0
  694. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_layout_safety.py +0 -0
  695. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_layout_scheme.py +0 -0
  696. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_leader_footprint.py +0 -0
  697. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_leader_region_policy.py +0 -0
  698. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_lint_box_cache.py +0 -0
  699. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_lint_coverage.py +0 -0
  700. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_lint_coverage_common.py +0 -0
  701. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_lint_ink_overlap.py +0 -0
  702. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_lint_reconciliation.py +0 -0
  703. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_lint_structural.py +0 -0
  704. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_lint_suggestions.py +0 -0
  705. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_lint_summary.py +0 -0
  706. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_linting.py +0 -0
  707. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_location_dimensions.py +0 -0
  708. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_location_vocabulary.py +0 -0
  709. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_machined_feature_callouts.py +0 -0
  710. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_make_drawing_entrypoints.py +0 -0
  711. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_manufacturing_pmi_lowering.py +0 -0
  712. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_manufacturing_schedule.py +0 -0
  713. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_nested_recognition_ownership.py +0 -0
  714. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_nominal_step_pmi.py +0 -0
  715. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_note_verb.py +0 -0
  716. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_object_aspects.py +0 -0
  717. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_occupancy_boxes.py +0 -0
  718. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_occurrence_recognition_ownership.py +0 -0
  719. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_overall_height_coverage.py +0 -0
  720. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_pad_completeness_evidence.py +0 -0
  721. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_pad_rendering.py +0 -0
  722. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_paired_ramp_semantics.py +0 -0
  723. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_parameter_id.py +0 -0
  724. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_pareto_loop_canary_issue_1753.py +0 -0
  725. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_part_classification.py +0 -0
  726. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_part_model.py +0 -0
  727. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_pattern_contract.py +0 -0
  728. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_pattern_ownership.py +0 -0
  729. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_pitch_dim_footprint.py +0 -0
  730. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_place_dimension.py +0 -0
  731. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_plate_ownership.py +0 -0
  732. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_pmi.py +0 -0
  733. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_pmi_common_labels.py +0 -0
  734. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_pmi_datum_lowering.py +0 -0
  735. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_pmi_gtol_lowering.py +0 -0
  736. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_pmi_manufacturing_finish.py +0 -0
  737. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_pmi_part21.py +0 -0
  738. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_pmi_records.py +0 -0
  739. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_pocket_completeness_evidence.py +0 -0
  740. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_pocket_pattern.py +0 -0
  741. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_pocket_pattern_completeness_evidence.py +0 -0
  742. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_pocket_pattern_recognition.py +0 -0
  743. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_polygonal_boss_completeness_evidence.py +0 -0
  744. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_pre_render_profile_choice.py +0 -0
  745. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_principal_profile_classifier.py +0 -0
  746. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_prismatic_boss_diameter.py +0 -0
  747. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_prismatic_classification.py +0 -0
  748. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_prismatic_dimensions.py +0 -0
  749. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_private_test_attr_reads.py +0 -0
  750. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_private_test_imports.py +0 -0
  751. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_profile_angles.py +0 -0
  752. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_projection_symbol_default.py +0 -0
  753. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_quality_components.py +0 -0
  754. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_quiddity_lifecycle_boundary.py +0 -0
  755. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_real_part_fixtures.py +0 -0
  756. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_recogniser_adoption.py +0 -0
  757. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_recogniser_capabilities.py +0 -0
  758. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_recogniser_contract.py +0 -0
  759. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_recogniser_policy.py +0 -0
  760. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_recogniser_step_inventory.py +0 -0
  761. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_recognition_boundary_failures.py +0 -0
  762. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_recognition_evidence_schema.py +0 -0
  763. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_recognition_policy_dispositions.py +0 -0
  764. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_recognition_result.py +0 -0
  765. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_refactor_golden.py +0 -0
  766. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_registry.py +0 -0
  767. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_remaining_ink_overlaps.py +0 -0
  768. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_render_seam.py +0 -0
  769. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_repack_geometry_seam.py +0 -0
  770. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_repair.py +0 -0
  771. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_replay_assessment_issue_1715.py +0 -0
  772. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_report_projection.py +0 -0
  773. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_report_status_reasons_issue_1618.py +0 -0
  774. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_report_writer.py +0 -0
  775. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_requirement_applicability.py +0 -0
  776. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_requirement_carriers.py +0 -0
  777. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_requirement_catalog.py +0 -0
  778. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_requirement_catalog_families.py +0 -0
  779. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_requirement_dimension_sharing.py +0 -0
  780. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_scale_policy.py +0 -0
  781. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_scale_selection.py +0 -0
  782. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_score.py +0 -0
  783. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_script_detail_parity.py +0 -0
  784. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_section_hatching.py +0 -0
  785. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_section_recess_contract.py +0 -0
  786. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_section_recess_pockets.py +0 -0
  787. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_shared_box_memo.py +0 -0
  788. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_shared_drawing_cache.py +0 -0
  789. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_sheet_emit.py +0 -0
  790. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_sheet_fallback_issue_1797.py +0 -0
  791. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_sheet_furniture.py +0 -0
  792. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_sheet_gdt.py +0 -0
  793. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_sheet_generation_snapshot.py +0 -0
  794. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_sheet_identity_invariant.py +0 -0
  795. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_sheet_notes.py +0 -0
  796. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_sheet_of.py +0 -0
  797. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_sheet_section.py +0 -0
  798. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_sheet_tables.py +0 -0
  799. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_slanted_blind_step.py +0 -0
  800. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_slot_completeness.py +0 -0
  801. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_slot_pattern.py +0 -0
  802. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_slot_pattern_recognition.py +0 -0
  803. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_slot_recognition.py +0 -0
  804. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_soft_deprecation.py +0 -0
  805. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_solve_trace.py +0 -0
  806. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_source_shape.py +0 -0
  807. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_step_analysis_evaluation.py +0 -0
  808. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_step_profile_grouping.py +0 -0
  809. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_strip_layout.py +0 -0
  810. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_strip_zones.py +0 -0
  811. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_suite_shape.py +0 -0
  812. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_suppression_ledger.py +0 -0
  813. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_suppression_marks.py +0 -0
  814. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_through_step_ownership.py +0 -0
  815. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_through_step_semantics.py +0 -0
  816. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_tier_manifest.py +0 -0
  817. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_title_block_units_format.py +0 -0
  818. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_tolerances.py +0 -0
  819. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_turned_diameters.py +0 -0
  820. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_turned_lengths.py +0 -0
  821. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_turned_step_ownership.py +0 -0
  822. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_turned_steps.py +0 -0
  823. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_two_pass_layout.py +0 -0
  824. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_typ_dimensions.py +0 -0
  825. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_typed_remediation_projection_issue_1759.py +0 -0
  826. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_version_bump_ci.py +0 -0
  827. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_view_blocks.py +0 -0
  828. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_view_coordinates.py +0 -0
  829. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_view_plan.py +0 -0
  830. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/tests/test_witness_label_reconciliation.py +0 -0
  831. {draftwright-0.5.0rc7 → draftwright-0.5.0rc8}/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.0rc8
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.0rc8"
8
8
  description = "Automated technical-drawing generation for build123d"
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -14,7 +14,10 @@ _LINEAR_OBLIQUE_VALUE_ABS_TOL = 0.05
14
14
 
15
15
 
16
16
  def _linear_reference_stations(
17
- stations: tuple[tuple[float, float, float] | None, ...], nominal: float
17
+ stations: tuple[tuple[float, float, float] | None, ...],
18
+ nominal: float,
19
+ *,
20
+ plane_axis: str | None = None,
18
21
  ) -> tuple[tuple[tuple[float, float, float], ...], str, tuple[str, ...]]:
19
22
  """Prove a truthful principal-axis span from the two authored reference groups.
20
23
 
@@ -35,14 +38,20 @@ def _linear_reference_stations(
35
38
  first, second = measurable
36
39
  delta = tuple(second[index] - first[index] for index in range(3))
37
40
  magnitudes = tuple(abs(value) for value in delta)
38
- axis_index = max(range(3), key=magnitudes.__getitem__)
41
+ axis_index = (
42
+ "XYZ".index(plane_axis)
43
+ if plane_axis is not None
44
+ else max(range(3), key=magnitudes.__getitem__)
45
+ )
39
46
  primary = magnitudes[axis_index]
40
47
  if primary <= 1e-9:
41
48
  return measurable, "?", ("linear reference groups occupy the same station",)
42
49
 
43
50
  transverse = max(value for index, value in enumerate(magnitudes) if index != axis_index)
44
51
  direction_tol = max(_LINEAR_AXIS_ABS_TOL, primary * _LINEAR_AXIS_REL_TOL)
45
- oblique = transverse > direction_tol
52
+ # Parallel planar supports establish their distance along the plane normal.
53
+ # Their finite face centres can be offset arbitrarily within either plane.
54
+ oblique = plane_axis is None and transverse > direction_tol
46
55
  if oblique and _linear_projection_view(measurable) is None:
47
56
  return (
48
57
  measurable,
@@ -69,3 +78,22 @@ def _linear_reference_stations(
69
78
  ),
70
79
  )
71
80
  return measurable, axis, ()
81
+
82
+
83
+ def _dimension_reference_stations(
84
+ stations: tuple[tuple[float, float, float] | None, ...],
85
+ nominal: float,
86
+ kind: str,
87
+ *,
88
+ plane_axis: str | None = None,
89
+ ) -> tuple[tuple[tuple[float, float, float], ...], str, tuple[str, ...]]:
90
+ """Apply the dimension kind's wording to the shared station proof."""
91
+ points, axis, reasons = _linear_reference_stations(stations, nominal, plane_axis=plane_axis)
92
+ if kind == "thickness":
93
+ reasons = tuple(
94
+ reason.replace("linear dimension", "thickness dimension").replace(
95
+ "linear reference", "thickness reference"
96
+ )
97
+ for reason in reasons
98
+ )
99
+ 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))
@@ -6,6 +6,7 @@ B-rep; geometric likeness alone cannot establish source ownership.
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
+ from draftwright._pmi_datum_geometry import _frame_vector
9
10
  from draftwright._pmi_support_blockers import _failure_reason
10
11
 
11
12
  try:
@@ -17,6 +18,83 @@ except ImportError:
17
18
  pass
18
19
 
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
+ from OCP.BRepAdaptor import BRepAdaptor_Surface
24
+ from OCP.GeomAbs import GeomAbs_Plane
25
+ from OCP.TopoDS import TopoDS
26
+
27
+ if len(groups) != 2 or not all(groups):
28
+ return None, None
29
+ axes: list[int] = []
30
+ group_boxes = []
31
+ for shapes in groups:
32
+ group_axis = None
33
+ group_station = None
34
+ boxes = []
35
+ for shape in shapes:
36
+ try:
37
+ if shape.ShapeType() != TopAbs_FACE:
38
+ return None, None
39
+ surface = BRepAdaptor_Surface(TopoDS.Face_s(shape))
40
+ if surface.GetType() != GeomAbs_Plane:
41
+ return None, None
42
+ direction = surface.Plane().Axis().Direction()
43
+ local = _frame_vector((direction.X(), direction.Y(), direction.Z()), frame)
44
+ axis_index = max(range(3), key=lambda index: abs(local[index]))
45
+ if abs(abs(local[axis_index]) - 1.0) > 1e-6:
46
+ return None, None
47
+ if any(abs(local[index]) > 1e-6 for index in range(3) if index != axis_index):
48
+ return None, None
49
+ box = shape_bbox(shape) if frame is None else shape_bbox(shape, frame)
50
+ boxes.append(box)
51
+ station = (box[axis_index] + box[axis_index + 3]) / 2
52
+ if box[axis_index + 3] - box[axis_index] > 1e-5:
53
+ return None, None
54
+ except Exception:
55
+ return None, None
56
+ if group_axis is not None and group_axis != axis_index:
57
+ return None, None
58
+ if group_station is not None and abs(group_station - station) > 1e-5:
59
+ return None, None
60
+ group_axis, group_station = axis_index, station
61
+ assert group_axis is not None # Each validated source group contains a face.
62
+ axes.append(group_axis)
63
+ group_boxes.append(boxes)
64
+ if axes[0] != axes[1]:
65
+ return None, None
66
+ return _supported_planar_view("XYZ"[axes[0]], group_boxes)
67
+
68
+
69
+ def _supported_planar_view(axis: str, group_boxes) -> tuple[str | None, str | None]:
70
+ """Select only projection views whose shared witness touches both groups."""
71
+ if axis in {"X", "Z"}:
72
+ return (
73
+ (axis, None)
74
+ if _midpoint_witness_supported(group_boxes, 2 if axis == "X" else 0)
75
+ else (None, None)
76
+ )
77
+ side = _midpoint_witness_supported(group_boxes, 2)
78
+ plan = _midpoint_witness_supported(group_boxes, 0)
79
+ if side and plan:
80
+ return axis, None
81
+ if side or plan:
82
+ return axis, "side" if side else "plan"
83
+ return None, None
84
+
85
+
86
+ def _midpoint_witness_supported(group_boxes, index: int) -> bool:
87
+ """Require a projected face in each group at the renderer's bbox midpoint."""
88
+ all_boxes = [box for boxes in group_boxes for box in boxes]
89
+ midpoint = (
90
+ min(box[index] for box in all_boxes) + max(box[index + 3] for box in all_boxes)
91
+ ) / 2
92
+ return all(
93
+ any(box[index] - 1e-6 <= midpoint <= box[index + 3] + 1e-6 for box in boxes)
94
+ for boxes in group_boxes
95
+ )
96
+
97
+
20
98
  class _DatumTopologyResolver:
21
99
  """Resolve Part21 face labels through OCCT's native transfer binders.
22
100
 
@@ -1566,6 +1566,33 @@ def _with_blind_axial_bore_support(model: PartModel, cyls) -> PartModel:
1566
1566
  )
1567
1567
 
1568
1568
 
1569
+ def _sizing_model_pmi_visibility(model, cyls, layout_model, pmi_mode, document_input):
1570
+ hidden = (
1571
+ frozenset(id(feature) for feature in document_input.source_annotations())
1572
+ if document_input is not None and pmi_mode != "annotate"
1573
+ else frozenset()
1574
+ )
1575
+ prepared = _with_blind_axial_bore_support(model, cyls)
1576
+ enabled = layout_model is not None or pmi_mode == "annotate"
1577
+ if (
1578
+ prepared.pmi_annotations_enabled != enabled
1579
+ or prepared.hidden_authored_dimension_ids != hidden
1580
+ ):
1581
+ prepared = replace(
1582
+ prepared,
1583
+ pmi_annotations_enabled=enabled,
1584
+ hidden_authored_dimension_ids=hidden,
1585
+ )
1586
+ if not enabled or not any(
1587
+ feature.kind == "authored_dimension" and id(feature) not in hidden
1588
+ for feature in prepared.features
1589
+ ):
1590
+ return prepared
1591
+ from draftwright.model.pmi_lowering import add_authored_step_positions
1592
+
1593
+ return add_authored_step_positions(prepared)
1594
+
1595
+
1569
1596
  def _build_sizing_model(r: _AnalysisRequest, s: _SourceState) -> _ModelState:
1570
1597
  text_position = r.metadata.text_position
1571
1598
  text_orientation = r.metadata.text_orientation
@@ -1732,7 +1759,9 @@ def _build_sizing_model(r: _AnalysisRequest, s: _SourceState) -> _ModelState:
1732
1759
  cyls=shared_cyls,
1733
1760
  )
1734
1761
  )
1735
- sizing_model = _with_blind_axial_bore_support(sizing_model, shared_cyls)
1762
+ sizing_model = _sizing_model_pmi_visibility(
1763
+ sizing_model, shared_cyls, layout_model, pmi_mode, _document_input
1764
+ )
1736
1765
  recognition_ownership = (
1737
1766
  None
1738
1767
  if layout_model is not None
@@ -425,6 +425,7 @@ def _render_single_profile(
425
425
  ) -> int:
426
426
  """Place one axial profile and request details for crowded shoulders."""
427
427
  rows: list[tuple[str, _StepChainSegment]] = []
428
+ has_baseline_position = False
428
429
  step_origins = []
429
430
  step_geometry = []
430
431
  for g in plan.of_kind("step"):
@@ -435,6 +436,9 @@ def _render_single_profile(
435
436
  length = g.dim(kind="length")
436
437
  if length is None or length.span is None:
437
438
  continue
439
+ has_baseline_position |= (
440
+ length.id is not None and length.id.parameter == "step_position.length"
441
+ )
438
442
  rows.append(
439
443
  (
440
444
  g.facts.frame.axis,
@@ -512,6 +516,21 @@ def _render_single_profile(
512
516
  else _profile_bounds_hint
513
517
  )
514
518
 
519
+ if has_baseline_position:
520
+ # The crowded-head and repeated-run transforms describe a contiguous
521
+ # step chain. A datum-to-shoulder baseline has different witnesses.
522
+ return _draw_step_chain(
523
+ dwg,
524
+ view,
525
+ fsegs,
526
+ "m_steplen",
527
+ allow_collapse=False,
528
+ ctx=ctx,
529
+ start=start,
530
+ profile_bounds=profile_bounds,
531
+ placement_bounds=_profile_bounds_hint,
532
+ )
533
+
515
534
  y_result = _render_y_profile(
516
535
  dwg,
517
536
  view,
@@ -723,6 +723,49 @@ def _assembly_model(a: Analysis, model, decorations, requested, authored) -> Par
723
723
  else ()
724
724
  ),
725
725
  )
726
+ if model is not None or a.model is None:
727
+ pm = replace(
728
+ pm,
729
+ pmi_annotations_enabled=model is not None or a.pmi_mode == "annotate",
730
+ hidden_authored_dimension_ids=(
731
+ frozenset(id(feature) for feature in a.document_source_annotations)
732
+ if a.document_member and a.pmi_mode != "annotate"
733
+ else frozenset()
734
+ ),
735
+ )
736
+ # A caller may supply a PartModel that already contains raw imported PMI. That
737
+ # path skips the extraction/lowering branch above but still needs baseline gap
738
+ # identities before the compiled plan is built.
739
+ if any(feature.kind == "authored_dimension" for feature in pm.features):
740
+ from draftwright.model.pmi_lowering import add_authored_step_positions
741
+
742
+ identities = pm.declaration_identities
743
+ identity_by_feature = {
744
+ id(feature): identity
745
+ for feature, identity in (
746
+ zip(pm.features, identities, strict=True) if identities else ()
747
+ )
748
+ if identity is not None
749
+ }
750
+ step_remapped_identities: dict[int, DeclarationIdentity] = {}
751
+
752
+ def preserve_step_identity(source, replacements, _member_groups) -> None:
753
+ identity = identity_by_feature.get(id(source))
754
+ if identity is not None and replacements:
755
+ step_remapped_identities[id(replacements[0])] = identity
756
+
757
+ updated = add_authored_step_positions(
758
+ pm, feature_remap=preserve_step_identity if identities else None
759
+ )
760
+ if updated is not pm and identities:
761
+ updated = replace(
762
+ updated,
763
+ declaration_identities=tuple(
764
+ identity_by_feature.get(id(feature), step_remapped_identities.get(id(feature)))
765
+ for feature in updated.features
766
+ ),
767
+ )
768
+ pm = updated
726
769
  return _with_blind_axial_bore_support(pm, a.cyls)
727
770
 
728
771
 
@@ -735,6 +735,16 @@ class Drawing:
735
735
 
736
736
  return self._diagnostics().report()
737
737
 
738
+ def dimension_sources(self) -> list[dict[str, object]]:
739
+ """Placed measurements and their exact AP242 or planner provenance.
740
+
741
+ One row is returned per measured term, including each term of a compound
742
+ callout. This is a read-only inventory for inspection-list consumers.
743
+ """
744
+ from draftwright.reporting import placed_dimension_sources
745
+
746
+ return placed_dimension_sources(self._part_model, self._registry)
747
+
738
748
  def requirement_snapshot(self, *, include_lint=False):
739
749
 
740
750
  return self._diagnostics().requirement_snapshot(include_lint=include_lint)
@@ -1909,18 +1909,122 @@ def _profile_projection(dwg, view: str, origin, axis: str) -> tuple[bool, float]
1909
1909
 
1910
1910
 
1911
1911
  def _step_length_owners(dwg, name: str) -> tuple[object, ...]:
1912
- """Exact step features whose compiled length claim produced annotation *name*."""
1912
+ """Exact step features whose axial claim produced annotation *name*."""
1913
1913
  registry = getattr(dwg, "registry", None)
1914
1914
  if registry is None:
1915
1915
  return ()
1916
1916
  return tuple(
1917
1917
  identity.feature
1918
1918
  for identity in registry.measurement_of(name)
1919
- if getattr(identity, "parameter", None) == "step.length"
1919
+ if getattr(identity, "parameter", None) in {"step.length", "step_position.length"}
1920
1920
  and getattr(identity.feature, "kind", None) == "step"
1921
1921
  )
1922
1922
 
1923
1923
 
1924
+ def _authored_axial_witness_on_profile(dwg, name: str, prof, origin, tol: float) -> bool:
1925
+ """Check a source dimension's two witnesses against this profile's shoulder faces."""
1926
+ feature = dwg.registry.feature_of(name)
1927
+ points: tuple = tuple(getattr(feature, "ref_pts", ()))
1928
+ if (
1929
+ getattr(feature, "kind", None) != "authored_dimension"
1930
+ or getattr(feature, "dimension_kind", None) != "linear"
1931
+ or getattr(feature, "dominant_axis", None) != prof.axis.upper()
1932
+ or len(points) != 2
1933
+ ):
1934
+ return False
1935
+ axis = "xyz".index(prof.axis)
1936
+ if abs(abs(float(points[1][axis]) - float(points[0][axis])) - float(feature.value)) > tol:
1937
+ return False
1938
+ transverse = tuple(index for index in range(3) if index != axis)
1939
+ for point in points:
1940
+ station = float(point[axis])
1941
+ touching = [
1942
+ step
1943
+ for step in prof.steps
1944
+ if abs(float(step.lo) - station) <= tol or abs(float(step.hi) - station) <= tol
1945
+ ]
1946
+ if not touching:
1947
+ return False
1948
+ radius = max(float(step.diameter) / 2 for step in touching)
1949
+ radial = sqrt(
1950
+ sum((float(point[index]) - float(origin[index])) ** 2 for index in transverse)
1951
+ )
1952
+ if radial > radius + tol:
1953
+ return False
1954
+ return True
1955
+
1956
+
1957
+ def _axial_view_dimensions(part, dwg, prof, view, base, shoulder_c, sibling_profiles, tol):
1958
+ horizontal, own_cross = _profile_projection(dwg, view, base, prof.axis)
1959
+ eligible = []
1960
+ station_edges = set()
1961
+ for name, ann in dwg.annotations_in_view(view):
1962
+ if not isinstance(ann, Dimension):
1963
+ continue
1964
+ vertices = _dim_vertices(ann, dwg.registry.dimension_spec_of(name))
1965
+ cs = {x if horizontal else y for x, y in vertices}
1966
+ cross_coords = {y if horizontal else x for x, y in vertices}
1967
+ owners = _step_length_owners(dwg, name)
1968
+ if owners and not any(_feature_on_turned_axis(owner, prof) for owner in owners):
1969
+ continue
1970
+ authored = getattr(dwg.registry.feature_of(name), "kind", None) == "authored_dimension"
1971
+ if authored and not _authored_axial_witness_on_profile(dwg, name, prof, base, tol):
1972
+ continue
1973
+ if not owners and getattr(prof, "profile", None) is not None and cross_coords:
1974
+ dim_cross = sum(cross_coords) / len(cross_coords)
1975
+ own_distance = abs(dim_cross - own_cross)
1976
+ sibling_distances = [
1977
+ abs(
1978
+ dim_cross
1979
+ - _profile_projection(
1980
+ dwg, view, _turned_axis_origin(part, sibling), sibling.axis
1981
+ )[1]
1982
+ )
1983
+ for sibling in sibling_profiles
1984
+ if sibling is not prof and sibling.axis == prof.axis
1985
+ ]
1986
+ if any(distance <= own_distance + tol for distance in sibling_distances):
1987
+ continue
1988
+ eligible.append((name, str(getattr(ann, "label", "") or ""), cs))
1989
+ if len(cs) != 2 or not (owners or authored):
1990
+ continue
1991
+ stations = []
1992
+ for coordinate in sorted(cs):
1993
+ matches = [
1994
+ station
1995
+ for station, projected in shoulder_c.items()
1996
+ if abs(coordinate - projected) <= tol
1997
+ ]
1998
+ if len(matches) != 1:
1999
+ break
2000
+ stations.append(matches[0])
2001
+ if len(stations) == 2 and stations[0] != stations[1]:
2002
+ station_edges.add(tuple(sorted(stations)))
2003
+ return eligible, station_edges
2004
+
2005
+
2006
+ def _axial_connected_steps(prof, station_edges) -> set[int]:
2007
+ linked = {station: {station} for station in prof.shoulders}
2008
+ for first, second in station_edges:
2009
+ linked[first].add(second)
2010
+ linked[second].add(first)
2011
+ connected = set()
2012
+ for index, step in enumerate(prof.steps):
2013
+ start, end = float(step.lo), float(step.hi)
2014
+ if start not in linked or end not in linked:
2015
+ continue
2016
+ reached = {start}
2017
+ pending = [start]
2018
+ while pending:
2019
+ current = pending.pop()
2020
+ for neighbour in linked[current] - reached:
2021
+ reached.add(neighbour)
2022
+ pending.append(neighbour)
2023
+ if end in reached:
2024
+ connected.add(index)
2025
+ return connected
2026
+
2027
+
1924
2028
  def _axial_covered_from_drawing(
1925
2029
  part, dwg, prof, *, sibling_profiles=(), tol: float = 0.6
1926
2030
  ) -> set[int]:
@@ -1934,12 +2038,6 @@ def _axial_covered_from_drawing(
1934
2038
  idx = "xyz".index(prof.axis)
1935
2039
  base = list(_turned_axis_origin(part, prof))
1936
2040
 
1937
- def profile_cross(profile, view: str) -> float:
1938
- _horizontal, cross = _profile_projection(
1939
- dwg, view, _turned_axis_origin(part, profile), profile.axis
1940
- )
1941
- return cross
1942
-
1943
2041
  def shoulder_coord(view: str, s: float, *, horizontal: bool) -> float:
1944
2042
  pt = list(base)
1945
2043
  pt[idx] = s
@@ -1952,26 +2050,14 @@ def _axial_covered_from_drawing(
1952
2050
  views = [view for view in _turned_profile_views(prof.axis) if view in dwg.views]
1953
2051
  views += sorted(v for v in dwg.views if v.startswith("detail_"))
1954
2052
  covered_steps: set[int] = set()
2053
+ station_edges: set[tuple[float, float]] = set()
1955
2054
  for view in views:
1956
2055
  horizontal, _own_cross = _profile_projection(dwg, view, base, prof.axis)
1957
2056
  shoulder_c = {s: shoulder_coord(view, s, horizontal=horizontal) for s in prof.shoulders}
1958
- dims = [
1959
- (
1960
- name,
1961
- str(getattr(ann, "label", "") or ""),
1962
- {
1963
- (x if horizontal else y)
1964
- for x, y in _dim_vertices(ann, dwg.registry.dimension_spec_of(name))
1965
- },
1966
- {
1967
- (y if horizontal else x)
1968
- for x, y in _dim_vertices(ann, dwg.registry.dimension_spec_of(name))
1969
- },
1970
- _step_length_owners(dwg, name),
1971
- )
1972
- for name, ann in dwg.annotations_in_view(view)
1973
- if isinstance(ann, Dimension)
1974
- ]
2057
+ eligible, edges = _axial_view_dimensions(
2058
+ part, dwg, prof, view, base, shoulder_c, sibling_profiles, tol
2059
+ )
2060
+ station_edges.update(edges)
1975
2061
  for i, step in enumerate(prof.steps):
1976
2062
  clo, chi = shoulder_c.get(step.lo), shoulder_c.get(step.hi)
1977
2063
  if clo is None or chi is None:
@@ -1984,26 +2070,9 @@ def _axial_covered_from_drawing(
1984
2070
  # An end-on detail projects both shoulder stations onto one
1985
2071
  # point. Coincident witnesses cannot establish an axial length.
1986
2072
  continue
1987
- for name, label, cs, cross_coords, owners in dims:
2073
+ for name, label, cs in eligible:
1988
2074
  if not cs:
1989
2075
  continue
1990
- if owners and not any(_feature_on_turned_axis(owner, prof) for owner in owners):
1991
- continue
1992
- # Parallel profiles can have identical axial ordinates. A dimension belongs to
1993
- # the nearest visible axis line in this profile view; without this gate one
1994
- # shaft's two witnesses would certify every sibling at the same stations.
1995
- if not owners and getattr(prof, "profile", None) is not None and cross_coords:
1996
- dim_cross = sum(cross_coords) / len(cross_coords)
1997
- own_distance = abs(dim_cross - profile_cross(prof, view))
1998
- sibling_distances = [
1999
- abs(dim_cross - profile_cross(sibling, view))
2000
- for sibling in sibling_profiles
2001
- if sibling is not prof and sibling.axis == prof.axis
2002
- ]
2003
- if any(distance < own_distance - tol for distance in sibling_distances) or any(
2004
- abs(distance - own_distance) <= tol for distance in sibling_distances
2005
- ):
2006
- continue
2007
2076
  # A plain dim locates the step when it has a witness at each shoulder.
2008
2077
  if any(abs(v - clo) <= tol for v in cs) and any(abs(v - chi) <= tol for v in cs):
2009
2078
  covered_steps.add(i)
@@ -2022,7 +2091,7 @@ def _axial_covered_from_drawing(
2022
2091
  ):
2023
2092
  covered_steps.add(i)
2024
2093
  break
2025
- return covered_steps
2094
+ return covered_steps | _axial_connected_steps(prof, station_edges)
2026
2095
 
2027
2096
 
2028
2097
  def _overall_axial_extent_is_dimensioned(
@@ -272,10 +272,16 @@ def physical_turned_steps(recognition: RecognitionResult) -> tuple[tuple[object,
272
272
 
273
273
  def _has_parameters(feature) -> bool:
274
274
  try:
275
- return {parameter.parameter_id for parameter in feature.parameters()} == {
276
- "step.length",
277
- "step.diameter",
278
- }
275
+ parameters = {parameter.parameter_id for parameter in feature.parameters()}
276
+ return (
277
+ {"step.length", "step.diameter"}
278
+ <= parameters
279
+ <= {
280
+ "step.length",
281
+ "step.diameter",
282
+ "step_position.length",
283
+ }
284
+ )
279
285
  except (AttributeError, TypeError):
280
286
  return False
281
287
 
@@ -102,6 +102,8 @@ def _merge_member_pattern_batches(batches: list[HoleCalloutBatch]) -> list[HoleC
102
102
 
103
103
  def bore_callout_value(spec: dict, tolerance_suffix=lambda _value: "") -> str:
104
104
  """Format the bore value after the callout's leading diameter symbol."""
105
+ if spec.get("authored_diameter_label") and spec.get("tolerance") is None:
106
+ return str(spec["authored_diameter_label"])[1:]
105
107
  if limits := spec.get("diameter_limits"):
106
108
  lower, upper = limits
107
109
  nominal = spec["diameter"]
@@ -797,6 +799,7 @@ def hole_callout_spec(
797
799
  )
798
800
  spec = {
799
801
  "diameter": bore,
802
+ "authored_diameter_label": bore_pd.param.source_label if bore_pd is not None else None,
800
803
  "diameter_decimals": _display_decimals(group, "diameter", "bore"),
801
804
  "count": count if count and count > 1 else None,
802
805
  "through": hole.through, # the feature's fact, not the param list's shape (#868)
@@ -65,6 +65,7 @@ from draftwright.measurement_support import coincident_location_axes
65
65
  from draftwright.model.callout import resolved_through_indicator
66
66
  from draftwright.model.ir import (
67
67
  AngularReference,
68
+ AuthoredDimension,
68
69
  ChamferFeature,
69
70
  CircularChannelFeature,
70
71
  EnvelopeFeature,
@@ -89,6 +90,9 @@ from draftwright.model.planner import (
89
90
  CORRELATED_SETS,
90
91
  DimensionId,
91
92
  _authored_for,
93
+ _authored_linear_stations,
94
+ _authored_location_matches,
95
+ _authored_same_span,
92
96
  _decorated,
93
97
  _extent_can_convey,
94
98
  _is_zero_step_position,
@@ -1212,7 +1216,9 @@ def _compile_overall_height(
1212
1216
  return None, None, []
1213
1217
  mark = marked.get((id(env), "height.length")) if env is not None else None
1214
1218
  if env is not None:
1215
- if mark is not None and mark[1] == _AUTHORED_OMISSION:
1219
+ if mark is not None and (
1220
+ mark[1] == _AUTHORED_OMISSION or mark[1].startswith("authored PMI dimension ")
1221
+ ):
1216
1222
  return None, None, [Omission(env, "height.length", mark[0], mark[1])]
1217
1223
  elif model.authored_dimensions is not None:
1218
1224
  # No `EnvelopeFeature`, so the height falls back to the bounding box and no
@@ -2062,6 +2068,50 @@ def compile_dimensions(
2062
2068
  off_axis, off_axis_omissions = _compile_off_axis_hole_locations(model)
2063
2069
  locations.extend(off_axis)
2064
2070
  location_omissions.extend(off_axis_omissions)
2071
+ # A source location may cover one directional component without covering its
2072
+ # orthogonal sibling. Only exact witness correspondence can remove that component.
2073
+ sources = tuple(
2074
+ f
2075
+ for f in model.features
2076
+ if isinstance(f, AuthoredDimension)
2077
+ and model.pmi_annotations_enabled
2078
+ and id(f) not in model.hidden_authored_dimension_ids
2079
+ )
2080
+ if sources and model.authored_dimensions is None:
2081
+ unique_cover: dict[int, list[AuthoredDimension]] = {}
2082
+ for source in sources:
2083
+ stations = _authored_linear_stations(source)
2084
+ if stations is None:
2085
+ continue
2086
+ matching = [
2087
+ location
2088
+ for location in locations
2089
+ if location.discriminator == "xyz"[stations[0]]
2090
+ and location.span is not None
2091
+ and (
2092
+ _authored_same_span(source, location.span, location.value)
2093
+ or _authored_location_matches(
2094
+ source, location.span, location.discriminator, location.value
2095
+ )
2096
+ )
2097
+ ]
2098
+ if len(matching) == 1:
2099
+ unique_cover.setdefault(id(matching[0]), []).append(source)
2100
+ uncovered = []
2101
+ for location in locations:
2102
+ covering = unique_cover.get(id(location), [])
2103
+ if len(covering) != 1 or location.id is None:
2104
+ uncovered.append(location)
2105
+ else:
2106
+ location_omissions.append(
2107
+ Omission(
2108
+ location.id.feature,
2109
+ location.id.parameter,
2110
+ location.value,
2111
+ f"authored PMI dimension {covering[0].source_id} covers this location",
2112
+ )
2113
+ )
2114
+ locations = uncovered
2065
2115
  result = RenderableDimensionPlan(
2066
2116
  groups=tuple(groups_out),
2067
2117
  ladders=tuple(ladders),