draftwright 0.5.0rc4__tar.gz → 0.5.0rc5__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 (827) hide show
  1. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/PKG-INFO +1 -1
  2. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/pyproject.toml +1 -1
  3. draftwright-0.5.0rc5/src/draftwright/_pmi_datum_geometry.py +174 -0
  4. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_gdt.py +95 -79
  5. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/layout_selection.py +18 -0
  6. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/model/detect.py +45 -4
  7. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/model/ir.py +1 -0
  8. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/model/pmi_lowering.py +75 -11
  9. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/pmi.py +89 -36
  10. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/sheet_feature_lines.py +2 -0
  11. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/_complexity_baseline.json +0 -1
  12. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/_tier_manifest.py +5 -0
  13. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_dimension_lane_canary_issue_1757.py +3 -1
  14. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_document_build.py +9 -3
  15. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_gdt_placement.py +79 -1
  16. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_import_boundaries.py +1 -0
  17. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1357_pmi_frame.py +20 -2
  18. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_manufacturing_pmi_lowering.py +57 -0
  19. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_pmi.py +10 -1
  20. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_pmi_datum_lowering.py +139 -1
  21. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_pre_render_profile_choice.py +50 -0
  22. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_source_shape.py +1 -1
  23. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_tier_manifest.py +5 -0
  24. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/.gitignore +0 -0
  25. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/CHANGELOG.md +0 -0
  26. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/LICENSE +0 -0
  27. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/README.md +0 -0
  28. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/docs/adr/README.md +0 -0
  29. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/docs/reference/recogniser-capabilities.md +0 -0
  30. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/docs/reference/sheet.md +0 -0
  31. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/docs/research/1062-repeating-radial-profile-evidence.md +0 -0
  32. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/skills/SKILL.md +0 -0
  33. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/__init__.py +0 -0
  34. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/_build_profile.py +0 -0
  35. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/_core.py +0 -0
  36. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/_geometry.py +0 -0
  37. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/_pmi_linear_geometry.py +0 -0
  38. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/_pmi_part21.py +0 -0
  39. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/_pmi_schema.py +0 -0
  40. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/_pmi_support_blockers.py +0 -0
  41. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/_pmi_topology.py +0 -0
  42. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/_warnings.py +0 -0
  43. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/analysis.py +0 -0
  44. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/angular_geometry.py +0 -0
  45. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotate.py +0 -0
  46. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotation_layout_profile.py +0 -0
  47. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/__init__.py +0 -0
  48. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_axial_render.py +0 -0
  49. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_circular_recesses.py +0 -0
  50. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_common.py +0 -0
  51. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_diameters.py +0 -0
  52. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_dimension_ink.py +0 -0
  53. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_dimension_ink_repair.py +0 -0
  54. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_edge_callouts.py +0 -0
  55. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_envelope.py +0 -0
  56. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_height_ladder.py +0 -0
  57. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_hole_leader_placement.py +0 -0
  58. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_leader_candidates.py +0 -0
  59. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_leader_commit.py +0 -0
  60. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_leader_fixed_ink.py +0 -0
  61. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_locations.py +0 -0
  62. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_machined_leaders.py +0 -0
  63. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_patterns.py +0 -0
  64. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_placement_geometry.py +0 -0
  65. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_placement_occupancy.py +0 -0
  66. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_pmi_dimensions.py +0 -0
  67. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_pocket_pad.py +0 -0
  68. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_polygonal_prisms.py +0 -0
  69. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_sheet_furniture.py +0 -0
  70. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_slots.py +0 -0
  71. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_step_lengths.py +0 -0
  72. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_strip_postsolve.py +0 -0
  73. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/_thin_profiles.py +0 -0
  74. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/angular.py +0 -0
  75. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/balloons.py +0 -0
  76. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/drawing_port.py +0 -0
  77. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/from_model.py +0 -0
  78. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/gears.py +0 -0
  79. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/hole_leader_candidates.py +0 -0
  80. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/hole_locations.py +0 -0
  81. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/holes.py +0 -0
  82. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/leaders.py +0 -0
  83. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/orchestrator.py +0 -0
  84. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/routed.py +0 -0
  85. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/sections.py +0 -0
  86. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/annotations/solve_trace.py +0 -0
  87. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/audit.py +0 -0
  88. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/auxiliary_layout.py +0 -0
  89. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/blend_contract.py +0 -0
  90. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/build_once.py +0 -0
  91. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/build_options.py +0 -0
  92. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/build_policy.py +0 -0
  93. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/builder.py +0 -0
  94. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/cli.py +0 -0
  95. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/compose.py +0 -0
  96. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/contract_values.py +0 -0
  97. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/document.py +0 -0
  98. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/document_evidence.py +0 -0
  99. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/document_input.py +0 -0
  100. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/drawing.py +0 -0
  101. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/drawing_diagnostics.py +0 -0
  102. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/drawing_evidence.py +0 -0
  103. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/drawing_export.py +0 -0
  104. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/drawing_state.py +0 -0
  105. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/drawing_tables.py +0 -0
  106. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/evaluation/__init__.py +0 -0
  107. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/evaluation/_double_d_evidence.py +0 -0
  108. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/evaluation/_edge_profile_evidence.py +0 -0
  109. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/evaluation/_flat_polygonal_evidence.py +0 -0
  110. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/evaluation/_groove_evidence.py +0 -0
  111. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/evaluation/_hole_family_evidence.py +0 -0
  112. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/evaluation/_pocket_evidence.py +0 -0
  113. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/evaluation/_prismatic_evidence.py +0 -0
  114. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/evaluation/_turned_step_evidence.py +0 -0
  115. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/evaluation/step_analysis.py +0 -0
  116. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/explicit_scale.py +0 -0
  117. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/export.py +0 -0
  118. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/family_table.py +0 -0
  119. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/feature_identity.py +0 -0
  120. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/fits.py +0 -0
  121. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/fonts/IBMPlexMono-Regular.ttf +0 -0
  122. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/fonts/IBMPlexSansCondensed-Regular.ttf +0 -0
  123. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/fonts/LICENSE-IBMPlexMono-OFL.txt +0 -0
  124. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/fonts/LICENSE-IBMPlexSansCondensed-OFL.txt +0 -0
  125. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/fonts/__init__.py +0 -0
  126. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/inspection.py +0 -0
  127. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/inspection_contract.py +0 -0
  128. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/intent_drain.py +0 -0
  129. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/intent_routing.py +0 -0
  130. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/intents.py +0 -0
  131. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/layout.py +0 -0
  132. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/layout_safety.py +0 -0
  133. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/layout_scheme.py +0 -0
  134. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/leader_policy.py +0 -0
  135. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/__init__.py +0 -0
  136. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/_coverage_common.py +0 -0
  137. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/_parameter_coverage.py +0 -0
  138. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/_registry.py +0 -0
  139. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/angled_step_coverage.py +0 -0
  140. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/angular.py +0 -0
  141. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/blend_coverage.py +0 -0
  142. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/boss_coverage.py +0 -0
  143. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/chamfer_coverage.py +0 -0
  144. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/channel_coverage.py +0 -0
  145. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/circular_blind_step_coverage.py +0 -0
  146. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/coverage.py +0 -0
  147. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/envelope_coverage.py +0 -0
  148. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/evidence.py +0 -0
  149. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/fillet_coverage.py +0 -0
  150. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/flat_coverage.py +0 -0
  151. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/gear_coverage.py +0 -0
  152. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/groove_coverage.py +0 -0
  153. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/gusset_rib_coverage.py +0 -0
  154. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/hole_coverage.py +0 -0
  155. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/ink_overlap.py +0 -0
  156. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/issues.py +0 -0
  157. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/orchestration.py +0 -0
  158. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/oriented_slot_coverage.py +0 -0
  159. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/pad_coverage.py +0 -0
  160. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/paired_ramp_step_coverage.py +0 -0
  161. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/passage_coverage.py +0 -0
  162. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/plate_coverage.py +0 -0
  163. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/pmi_coverage.py +0 -0
  164. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/pocket_coverage.py +0 -0
  165. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/pocket_pattern_coverage.py +0 -0
  166. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/polygonal_boss_coverage.py +0 -0
  167. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/polygonal_stock_coverage.py +0 -0
  168. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/prismatic_pocket_coverage.py +0 -0
  169. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/profiled_bore_coverage.py +0 -0
  170. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/quality.py +0 -0
  171. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/rectangular_blind_slot_coverage.py +0 -0
  172. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/requirements.py +0 -0
  173. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/round_bottom_blind_slot_coverage.py +0 -0
  174. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/schedule_evidence.py +0 -0
  175. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/section_recess_coverage.py +0 -0
  176. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/slot_coverage.py +0 -0
  177. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/structural.py +0 -0
  178. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/suggest.py +0 -0
  179. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/through_step_coverage.py +0 -0
  180. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/linting/turned_step_coverage.py +0 -0
  181. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/location_contract.py +0 -0
  182. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/make_drawing.py +0 -0
  183. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/measurement_support.py +0 -0
  184. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/model/__init__.py +0 -0
  185. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/model/callout.py +0 -0
  186. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/model/compiled.py +0 -0
  187. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/model/declare.py +0 -0
  188. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/model/detect_inventory.py +0 -0
  189. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/model/detect_ownership.py +0 -0
  190. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/model/dimension_intent.py +0 -0
  191. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/model/ir_foundation.py +0 -0
  192. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/model/manufacturing_schedule.py +0 -0
  193. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/model/oriented_slot_geometry.py +0 -0
  194. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/model/planner.py +0 -0
  195. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/obligations.py +0 -0
  196. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/oriented_slot_contract.py +0 -0
  197. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/pdf_text.py +0 -0
  198. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/plate_correspondence.py +0 -0
  199. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/profile_angles.py +0 -0
  200. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/progress.py +0 -0
  201. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/projection.py +0 -0
  202. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/py.typed +0 -0
  203. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/recogniser_contract.py +0 -0
  204. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/recogniser_policy.py +0 -0
  205. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/recogniser_schema.py +0 -0
  206. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/recognition/__init__.py +0 -0
  207. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/recognition_cache.py +0 -0
  208. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/recognition_frame.py +0 -0
  209. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/recognition_ownership.py +0 -0
  210. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/registry.py +0 -0
  211. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/repair.py +0 -0
  212. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/replay_assessment.py +0 -0
  213. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/reporting.py +0 -0
  214. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/score.py +0 -0
  215. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/section_recess_contract.py +0 -0
  216. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/sheet.py +0 -0
  217. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/sheet_emit.py +0 -0
  218. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/sheet_features.py +0 -0
  219. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/sheet_layout_controls.py +0 -0
  220. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/sheet_metadata.py +0 -0
  221. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/sheet_object_source.py +0 -0
  222. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/sheet_views.py +0 -0
  223. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/src/draftwright/view_plan.py +0 -0
  224. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/_burden_report.py +0 -0
  225. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/_corpus_cover.py +0 -0
  226. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/_drawing_helpers.py +0 -0
  227. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/_evidence_contract.py +0 -0
  228. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/_function_length_baseline.json +0 -0
  229. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/_issue_module_baseline.txt +0 -0
  230. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/_kernel.py +0 -0
  231. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/_layout_helpers.py +0 -0
  232. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/_layout_sig.py +0 -0
  233. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/_mutation_corpus.py +0 -0
  234. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/_pad_rendering_fixtures.py +0 -0
  235. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/_parts.py +0 -0
  236. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/_pattern_contract.py +0 -0
  237. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/_recogniser_public_contract.py +0 -0
  238. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/_section_recess_cases.py +0 -0
  239. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/_unit_manifest.py +0 -0
  240. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/conftest.py +0 -0
  241. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/annotation-layout-corpus-v1.json +0 -0
  242. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/annotation-layout-corpus-v2.json +0 -0
  243. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/annotation-layout-holdout-ftc09-v1.json +0 -0
  244. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/annotation-layout-holdout-v1.json +0 -0
  245. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/ap242_single_cylinder_diameter.step +0 -0
  246. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/README.md +0 -0
  247. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/ambiguous-open-semicircle.step +0 -0
  248. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/blind-hole.step +0 -0
  249. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/chamfer-asymmetric.step +0 -0
  250. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/chamfer-compound.step +0 -0
  251. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/chamfer-overlap.step +0 -0
  252. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/chamfer-plain.step +0 -0
  253. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/chamfer-planar-x.step +0 -0
  254. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/chamfer-planar-y.step +0 -0
  255. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/chamfer-planar-z.step +0 -0
  256. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/chamfer-topology-a.step +0 -0
  257. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/chamfer-topology-b.step +0 -0
  258. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/chamfer-turned.step +0 -0
  259. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/corpus-chamfers-v1.json +0 -0
  260. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/corpus-countersinks-v1.json +0 -0
  261. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/corpus-double-d-bores-v1.json +0 -0
  262. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/corpus-fillets-v1.json +0 -0
  263. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/corpus-flats-v1.json +0 -0
  264. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/corpus-grooves-v1.json +0 -0
  265. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/corpus-hole-patterns-v1.json +0 -0
  266. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/corpus-plates-v1.json +0 -0
  267. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/corpus-pocket-patterns-v1.json +0 -0
  268. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/corpus-pockets-v1.json +0 -0
  269. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/corpus-polygonal-bosses-v1.json +0 -0
  270. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/corpus-polygonal-stock-v1.json +0 -0
  271. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/corpus-rectangular-pads-v1.json +0 -0
  272. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/corpus-turned-steps-v1.json +0 -0
  273. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/corpus-v1.json +0 -0
  274. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/countersink-deburr.step +0 -0
  275. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/countersink-external-cone.step +0 -0
  276. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/countersink-mixed-pair.step +0 -0
  277. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/countersink-single.step +0 -0
  278. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/countersink-topology-a.step +0 -0
  279. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/countersink-topology-b.step +0 -0
  280. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/double-d-axis-x.step +0 -0
  281. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/double-d-axis-y.step +0 -0
  282. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/double-d-blind.step +0 -0
  283. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/double-d-coaxial-compound.step +0 -0
  284. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/double-d-opposed-blind.step +0 -0
  285. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/double-d-roll-30.step +0 -0
  286. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/double-d-round-bore.step +0 -0
  287. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/double-d-single-z.step +0 -0
  288. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/double-d-topology-a.step +0 -0
  289. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/double-d-topology-b.step +0 -0
  290. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/fillet-compound.step +0 -0
  291. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/fillet-overlap.step +0 -0
  292. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/fillet-plain.step +0 -0
  293. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/fillet-planar-x.step +0 -0
  294. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/fillet-planar-y.step +0 -0
  295. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/fillet-planar-z.step +0 -0
  296. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/fillet-repeated.step +0 -0
  297. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/fillet-topology-a.step +0 -0
  298. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/fillet-topology-b.step +0 -0
  299. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/fillet-turned.step +0 -0
  300. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/flat-coaxial.step +0 -0
  301. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/flat-double-d.step +0 -0
  302. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/flat-lone-d.step +0 -0
  303. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/flat-nonround.step +0 -0
  304. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/flat-slanted-double-d.step +0 -0
  305. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/flat-topology-a.step +0 -0
  306. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/flat-topology-b.step +0 -0
  307. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/groove-compound.step +0 -0
  308. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/groove-lone-x.step +0 -0
  309. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/groove-lone-y.step +0 -0
  310. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/groove-lone-z.step +0 -0
  311. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/groove-monotonic-negative.step +0 -0
  312. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/groove-narrow.step +0 -0
  313. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/groove-topology-a.step +0 -0
  314. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/groove-topology-b.step +0 -0
  315. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pad-compound-equal.step +0 -0
  316. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pad-detached-body-negative.step +0 -0
  317. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pad-full-span-ledge-negative.step +0 -0
  318. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pad-nested-staircase-negative.step +0 -0
  319. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pad-topology-a.step +0 -0
  320. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pad-topology-b.step +0 -0
  321. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pad-x-negative.step +0 -0
  322. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pad-x-positive.step +0 -0
  323. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pad-y-negative.step +0 -0
  324. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pad-y-positive.step +0 -0
  325. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pad-z-negative.step +0 -0
  326. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pad-z-positive.step +0 -0
  327. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pattern-ambiguous.step +0 -0
  328. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pattern-grid.step +0 -0
  329. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pattern-topology-a.step +0 -0
  330. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pattern-topology-b.step +0 -0
  331. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/plain-block.step +0 -0
  332. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/plate-compound-equal.step +0 -0
  333. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/plate-cross-topology-a.step +0 -0
  334. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/plate-cross-topology-b.step +0 -0
  335. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/plate-detached-negative.step +0 -0
  336. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/plate-rotational-negative.step +0 -0
  337. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/plate-single-negative.step +0 -0
  338. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/plate-t-xz.step +0 -0
  339. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/plate-t-yz.step +0 -0
  340. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/plate-thick-negative.step +0 -0
  341. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/plate-u-additive.step +0 -0
  342. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/plate-u-cut.step +0 -0
  343. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pocket-compound.step +0 -0
  344. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pocket-edge-anchored.step +0 -0
  345. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pocket-lone.step +0 -0
  346. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pocket-opposed.step +0 -0
  347. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pocket-pattern-ambiguous.step +0 -0
  348. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pocket-pattern-grid.step +0 -0
  349. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pocket-pattern-linear.step +0 -0
  350. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pocket-pattern-pair.step +0 -0
  351. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pocket-pattern-topology-a.step +0 -0
  352. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pocket-pattern-topology-b.step +0 -0
  353. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pocket-prismatic-negative.step +0 -0
  354. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pocket-side.step +0 -0
  355. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pocket-through-negative.step +0 -0
  356. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pocket-topology-a.step +0 -0
  357. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pocket-topology-b.step +0 -0
  358. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/pocket-two-equal.step +0 -0
  359. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-boss-compound-equal.step +0 -0
  360. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-boss-detached-negative.step +0 -0
  361. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-boss-in-plane-rotated.step +0 -0
  362. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-boss-other-protrusions-negative.step +0 -0
  363. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-boss-recess-negative.step +0 -0
  364. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-boss-stock-negative.step +0 -0
  365. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-boss-topology-a.step +0 -0
  366. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-boss-topology-b.step +0 -0
  367. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-boss-x.step +0 -0
  368. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-boss-y.step +0 -0
  369. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-boss-z.step +0 -0
  370. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-stock-compound-negative.step +0 -0
  371. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-stock-cylinder-negative.step +0 -0
  372. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-stock-irregular-negative.step +0 -0
  373. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-stock-octagon-negative.step +0 -0
  374. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-stock-recess-negative.step +0 -0
  375. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-stock-roll17.step +0 -0
  376. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-stock-topology-a.step +0 -0
  377. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-stock-topology-b.step +0 -0
  378. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-stock-translated.step +0 -0
  379. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-stock-x.step +0 -0
  380. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/polygonal-stock-y.step +0 -0
  381. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/topology-a.step +0 -0
  382. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/topology-b.step +0 -0
  383. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/turned-step-axis-x.step +0 -0
  384. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/turned-step-axis-y.step +0 -0
  385. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/turned-step-axis-z.step +0 -0
  386. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/turned-step-compound.step +0 -0
  387. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/turned-step-repeated-lengths.step +0 -0
  388. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/turned-step-through-bore.step +0 -0
  389. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/turned-step-topology-a.step +0 -0
  390. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/turned-step-topology-b.step +0 -0
  391. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/evaluation/turned-step-translated-blind-bore.step +0 -0
  392. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/grm03_thumbwheel_drive_screw.step +0 -0
  393. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/grm03_thumbwheel_drive_screw_ap242_pmi.step +0 -0
  394. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/grm04_drive_plate.step +0 -0
  395. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/if_step_flat_across_cylinder.step +0 -0
  396. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/issue_1058_wheel_rh.step +0 -0
  397. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/issue_1247_angled_blind_step.step +0 -0
  398. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/issue_1595_whistle_key_frame.step +0 -0
  399. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/issue_1595_whistle_key_lever.step +0 -0
  400. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/issue_909_basic_part_design_017_body.step +0 -0
  401. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/issue_915_case_study_2.step +0 -0
  402. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/nist_ctc_01_asme1_ap203.stp +0 -0
  403. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/nist_ctc_01_asme1_ap242.stp +0 -0
  404. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/nist_ctc_02_asme1_ap203.stp +0 -0
  405. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/nist_ctc_02_asme1_ap242.stp +0 -0
  406. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/nist_ctc_03_asme1_ap203.stp +0 -0
  407. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/nist_ctc_03_asme1_ap242.stp +0 -0
  408. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/nist_ctc_04_asme1_ap203.stp +0 -0
  409. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/nist_ctc_04_asme1_ap242.stp +0 -0
  410. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/nist_ctc_05_asme1_ap203.stp +0 -0
  411. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/nist_ctc_05_asme1_ap242.stp +0 -0
  412. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/nist_ftc_09_asme1_ap242-e1.stp +0 -0
  413. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/tuner_jig_blind_obround_pockets.step +0 -0
  414. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/fixtures/whistle_frame_reference.step +0 -0
  415. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/refactor_golden/bracket_section.json +0 -0
  416. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/refactor_golden/centered_rebate.json +0 -0
  417. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/refactor_golden/chamfered.json +0 -0
  418. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/refactor_golden/filleted.json +0 -0
  419. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/refactor_golden/flange_dense.json +0 -0
  420. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/refactor_golden/grid_plate.json +0 -0
  421. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/refactor_golden/grooved_shaft.json +0 -0
  422. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/refactor_golden/hex_bar.json +0 -0
  423. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/refactor_golden/holed_slot.json +0 -0
  424. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/refactor_golden/pocketed.json +0 -0
  425. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/refactor_golden/prismatic_ladder.json +0 -0
  426. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/refactor_golden/scattered_plate.json +0 -0
  427. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/refactor_golden/side_drilled.json +0 -0
  428. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/refactor_golden/turned_stepped.json +0 -0
  429. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_add_dimension.py +0 -0
  430. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_adr0018_view_routing.py +0 -0
  431. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_adr0018_view_selection.py +0 -0
  432. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_adr_corpus.py +0 -0
  433. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_agent_improvement_canary_issue_1716.py +0 -0
  434. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_agents_guide.py +0 -0
  435. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_analysis_geometry.py +0 -0
  436. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_angle_patterns.py +0 -0
  437. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_angular_references.py +0 -0
  438. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_angular_rendering.py +0 -0
  439. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_annotation_box_composition.py +0 -0
  440. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_annotation_box_corpus.py +0 -0
  441. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_annotation_layout_product.py +0 -0
  442. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_annotation_scheme_compare_script.py +0 -0
  443. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_annotation_scheme_corpus_script.py +0 -0
  444. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_annotation_scheme_shadow_script.py +0 -0
  445. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_api_docs.py +0 -0
  446. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_architecture_docs.py +0 -0
  447. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_arrangement_gate.py +0 -0
  448. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_assessment_comparison_issue_1712.py +0 -0
  449. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_audit_differential.py +0 -0
  450. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_auxiliary_layout.py +0 -0
  451. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_axial_dimensions.py +0 -0
  452. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_balloon_ring_standoff.py +0 -0
  453. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_blind_slot_completeness.py +0 -0
  454. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_blind_slot_semantics.py +0 -0
  455. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_boss_ownership.py +0 -0
  456. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_build_drawing_entrypoints.py +0 -0
  457. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_build_profile_harness.py +0 -0
  458. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_burden_report.py +0 -0
  459. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_candidate_evidence_issue_1726.py +0 -0
  460. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_candidate_preview_sheet_holdout.py +0 -0
  461. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_canonical_angles.py +0 -0
  462. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_carve_free_position_callers.py +0 -0
  463. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_channel_ownership.py +0 -0
  464. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_circular_blind_step_semantics.py +0 -0
  465. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_cli_behavior.py +0 -0
  466. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_cli_report_sidecar.py +0 -0
  467. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_clone_budget.py +0 -0
  468. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_compiled_plan_boundary.py +0 -0
  469. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_compose_then_pack.py +0 -0
  470. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_contract_values.py +0 -0
  471. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_corpus_cover.py +0 -0
  472. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_counting_calls.py +0 -0
  473. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_coverage_mode.py +0 -0
  474. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_declaration_identity_issue_1710.py +0 -0
  475. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_declaration_report_issue_1710.py +0 -0
  476. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_declare.py +0 -0
  477. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_declared_recognition_gate.py +0 -0
  478. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_declared_report_issue_1688.py +0 -0
  479. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_deferred_edits.py +0 -0
  480. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_dense_sheet_canary.py +0 -0
  481. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_deprecation_dates.py +0 -0
  482. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_depth_estimators.py +0 -0
  483. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_derived_view_integration.py +0 -0
  484. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_derived_view_planning.py +0 -0
  485. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_detail_views.py +0 -0
  486. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_detect_once.py +0 -0
  487. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_detect_registry.py +0 -0
  488. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_diameter_deduplication.py +0 -0
  489. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_diameter_leaders.py +0 -0
  490. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_dimension_intent_contract.py +0 -0
  491. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_dimension_role_vocabulary.py +0 -0
  492. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_document_claim_authority.py +0 -0
  493. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_document_claims.py +0 -0
  494. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_document_coverage.py +0 -0
  495. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_document_report.py +0 -0
  496. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_document_report_authority.py +0 -0
  497. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_drawing_encapsulation.py +0 -0
  498. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_drawing_operations.py +0 -0
  499. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_drawing_state.py +0 -0
  500. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_dynamic_corridors.py +0 -0
  501. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_e2e_slice.py +0 -0
  502. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_e2e_standards.py +0 -0
  503. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_edge_profile_coverage.py +0 -0
  504. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_envelope_view_route_issue_1813.py +0 -0
  505. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_equivalent_dimension_presentations_issue_1759.py +0 -0
  506. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_export_dxf_curves.py +0 -0
  507. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_export_dxf_zoom.py +0 -0
  508. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_export_formats.py +0 -0
  509. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_export_reproducible.py +0 -0
  510. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_export_shape.py +0 -0
  511. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_external_recognition_boundary.py +0 -0
  512. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_family_table.py +0 -0
  513. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_feature_edit_corridors.py +0 -0
  514. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_feature_edit_replay.py +0 -0
  515. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_feature_edit_verbs.py +0 -0
  516. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_feature_leader_candidate_regions.py +0 -0
  517. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_feature_provenance.py +0 -0
  518. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_feature_queries.py +0 -0
  519. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_fillets_adjacency.py +0 -0
  520. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_fit_calculations.py +0 -0
  521. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_fits.py +0 -0
  522. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_flat_callout_precision.py +0 -0
  523. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_flat_completeness.py +0 -0
  524. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_flat_stock_identity.py +0 -0
  525. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_flat_stock_opposition.py +0 -0
  526. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_format_selector.py +0 -0
  527. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_formatting.py +0 -0
  528. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_framed_step_family_evidence.py +0 -0
  529. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_gdt_ink_shared.py +0 -0
  530. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_geometry_graph_spike.py +0 -0
  531. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_grid_lattice_convention.py +0 -0
  532. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_groove_completeness_evidence.py +0 -0
  533. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_groove_profile.py +0 -0
  534. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_gusset_rib_semantics.py +0 -0
  535. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_hole_annotations.py +0 -0
  536. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_hole_pattern_callouts.py +0 -0
  537. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_hole_table.py +0 -0
  538. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_inspection_contract.py +0 -0
  539. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_interior_label_placement.py +0 -0
  540. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_ir_foundation.py +0 -0
  541. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_iso_detail_growth.py +0 -0
  542. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_iso_layout.py +0 -0
  543. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_iso_nts_caption_placement.py +0 -0
  544. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_isometric_orientation.py +0 -0
  545. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_isometric_placement.py +0 -0
  546. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1000_envelope_reuse.py +0 -0
  547. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1006_measurement_comparison.py +0 -0
  548. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1058_wheel_profile.py +0 -0
  549. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1073_cross_body_patterns.py +0 -0
  550. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1082_polygonal_stock.py +0 -0
  551. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1086_declared_gears.py +0 -0
  552. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1116_ap242_hole_tolerance_lowering.py +0 -0
  553. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1126_requesting_less_never_scores_better.py +0 -0
  554. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1130_view_planning_evidence.py +0 -0
  555. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1132_turned_profile_span_is_reported.py +0 -0
  556. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1142_hole_leader_labels.py +0 -0
  557. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1143_hole_completeness.py +0 -0
  558. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1144_transactional_hole_table.py +0 -0
  559. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1146_scale_completeness.py +0 -0
  560. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1147_legibility_pair_aggregation.py +0 -0
  561. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1153_contradictory_dimensions.py +0 -0
  562. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1154_one_owner_per_measurement.py +0 -0
  563. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1155_grm04_sheet_use.py +0 -0
  564. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1157_no_implicit_general_tolerance.py +0 -0
  565. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1166_cross_pass_feature_leaders.py +0 -0
  566. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1176_quality_fidelity.py +0 -0
  567. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1177_angular_dimensions.py +0 -0
  568. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1187_unroutable_leaders.py +0 -0
  569. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1188_per_view_assignment.py +0 -0
  570. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1190_section_decision.py +0 -0
  571. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1196_deterministic_view_names.py +0 -0
  572. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1202_observed_drawing_consumer.py +0 -0
  573. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1204_multiscale_view_issues.py +0 -0
  574. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1209_linear_pmi_witnesses.py +0 -0
  575. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1215_envelope_tolerance.py +0 -0
  576. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1215_no_approved_tolerance_is_dropped.py +0 -0
  577. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1216_callout_reservation_measures_ink.py +0 -0
  578. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1216_pairwise_across_scale_groups.py +0 -0
  579. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1217_claimed_representations.py +0 -0
  580. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1217_the_facility_is_shared.py +0 -0
  581. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1219_location_claims_its_own_axis.py +0 -0
  582. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1229_ledger_member_keying.py +0 -0
  583. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1240_iso_above_strip_visibility.py +0 -0
  584. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1245_passage_disposition.py +0 -0
  585. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1246_prismatic_pocket_disposition.py +0 -0
  586. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1247_angled_step_disposition.py +0 -0
  587. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1254_turned_chamfers.py +0 -0
  588. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1260_view_constraints.py +0 -0
  589. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1262_automatic_turned_views.py +0 -0
  590. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1276_turned_leader_targets.py +0 -0
  591. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1281_turned_fillets.py +0 -0
  592. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1296_cylindrical_diameter_pmi.py +0 -0
  593. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1298_manufacturing_requirements.py +0 -0
  594. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1299_page_escalation.py +0 -0
  595. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1308_machined_leader_analytics.py +0 -0
  596. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1312_engine_costs.py +0 -0
  597. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1325_nominal_agreement.py +0 -0
  598. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1332_overlap_remedy.py +0 -0
  599. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1333_bounded_ink_repair.py +0 -0
  600. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1334_prevent_ink.py +0 -0
  601. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1336_grm03_ap242_pmi_fixture.py +0 -0
  602. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1338_scale_before_page_escalation.py +0 -0
  603. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1349_precision_display.py +0 -0
  604. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1350_detected_takeover.py +0 -0
  605. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1351_structured_note_coverage.py +0 -0
  606. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1352_searchable_pdf_text.py +0 -0
  607. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1353_cnc_authoritative_workflow.py +0 -0
  608. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1357_framed_activation.py +0 -0
  609. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1357_framed_boundary.py +0 -0
  610. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1357_plural_turned_profiles.py +0 -0
  611. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1360_thread_depth.py +0 -0
  612. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1369_hole_completeness_evidence.py +0 -0
  613. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1370_countersink_completeness_evidence.py +0 -0
  614. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1370_double_d_completeness_evidence.py +0 -0
  615. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1370_hole_pattern_completeness_evidence.py +0 -0
  616. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1371_flat_completeness_evidence.py +0 -0
  617. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1371_polygonal_stock_completeness_evidence.py +0 -0
  618. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1373_plate_completeness_evidence.py +0 -0
  619. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1374_chamfer_completeness_evidence.py +0 -0
  620. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1374_fillet_completeness_evidence.py +0 -0
  621. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1374_turned_step_completeness_evidence.py +0 -0
  622. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1378_diameter_leader_targets.py +0 -0
  623. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1392_recognisers_048.py +0 -0
  624. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1395_degenerate_iso_region.py +0 -0
  625. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1396_layout_advisories.py +0 -0
  626. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1397_unverifiable_requirement_message.py +0 -0
  627. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1432_adoption.py +0 -0
  628. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1432_boundary_failures.py +0 -0
  629. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1432_oriented_slot_semantics.py +0 -0
  630. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1433_blend_semantics.py +0 -0
  631. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1450_boss_blend_ownership.py +0 -0
  632. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1460_step_inspection.py +0 -0
  633. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1466_dimension_options.py +0 -0
  634. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1466_semantic_sides.py +0 -0
  635. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1479_radius_leader_targets.py +0 -0
  636. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1485_curved_pockets.py +0 -0
  637. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1485_quiddity_024_boundary.py +0 -0
  638. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1485_rounded_pockets.py +0 -0
  639. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1505_diameter_coverage.py +0 -0
  640. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1505_short_axial_chains.py +0 -0
  641. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1511_turned_boss_heights.py +0 -0
  642. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1514_projection_safeguard.py +0 -0
  643. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1515_first_angle.py +0 -0
  644. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1516_dimension_text.py +0 -0
  645. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1517_through_indicator.py +0 -0
  646. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1518_explicit_rear.py +0 -0
  647. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1524_tolerance_magnitude.py +0 -0
  648. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1530_section_provenance.py +0 -0
  649. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1531_semantic_hole_counts.py +0 -0
  650. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1532_authored_section_examples.py +0 -0
  651. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1533_review_diagnostics.py +0 -0
  652. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1534_build_progress.py +0 -0
  653. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1536_title_overflow.py +0 -0
  654. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1543_feature_schedules.py +0 -0
  655. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1543_schedule_requirements.py +0 -0
  656. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1544_frame_document_canary.py +0 -0
  657. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1555_turned_recognition_format_invariance.py +0 -0
  658. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1560_envelope_axes.py +0 -0
  659. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1563_sheet_pmi_reconciliation.py +0 -0
  660. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1585_title_block_date.py +0 -0
  661. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1593_title_block_keepout.py +0 -0
  662. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1596_bolt_circle_corroboration.py +0 -0
  663. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1598_hex_pockets.py +0 -0
  664. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1604_internal_section.py +0 -0
  665. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1612_frame_sergio_coverage.py +0 -0
  666. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1612_sheet_margins.py +0 -0
  667. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_1613_circular_channel.py +0 -0
  668. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_367_leader_ink.py +0 -0
  669. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_443_grm03_axial_coverage.py +0 -0
  670. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_563_placement_intent.py +0 -0
  671. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_676_polygonal_boss.py +0 -0
  672. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_676_polygonal_boss_declare.py +0 -0
  673. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_740_leader_assignment.py +0 -0
  674. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_798_floor_cardinality.py +0 -0
  675. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_798_material_field.py +0 -0
  676. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_798_silhouette_lint.py +0 -0
  677. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_827_real_part_canary.py +0 -0
  678. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_883_location_identity.py +0 -0
  679. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_885_prismatic_coverage.py +0 -0
  680. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_909_sloped_profile.py +0 -0
  681. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_915_dense_case.py +0 -0
  682. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_916_pocket_leader.py +0 -0
  683. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_917_open_channel.py +0 -0
  684. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_924_zero_length_shoulders.py +0 -0
  685. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_955_height_contingency.py +0 -0
  686. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_issue_958_cross_solid_recognition.py +0 -0
  687. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_label_provenance.py +0 -0
  688. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_layout.py +0 -0
  689. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_layout_cleanliness.py +0 -0
  690. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_layout_constants.py +0 -0
  691. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_layout_evidence_issue_1711.py +0 -0
  692. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_layout_generalisation.py +0 -0
  693. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_layout_hypothesis.py +0 -0
  694. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_layout_override_lane_issue_1757.py +0 -0
  695. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_layout_override_side_issue_1757.py +0 -0
  696. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_layout_property.py +0 -0
  697. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_layout_safety.py +0 -0
  698. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_layout_scheme.py +0 -0
  699. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_leader_footprint.py +0 -0
  700. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_leader_region_policy.py +0 -0
  701. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_lint_box_cache.py +0 -0
  702. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_lint_coverage.py +0 -0
  703. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_lint_coverage_common.py +0 -0
  704. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_lint_ink_overlap.py +0 -0
  705. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_lint_reconciliation.py +0 -0
  706. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_lint_structural.py +0 -0
  707. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_lint_suggestions.py +0 -0
  708. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_lint_summary.py +0 -0
  709. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_linting.py +0 -0
  710. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_location_dimensions.py +0 -0
  711. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_location_vocabulary.py +0 -0
  712. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_machined_feature_callouts.py +0 -0
  713. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_make_drawing_entrypoints.py +0 -0
  714. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_manufacturing_schedule.py +0 -0
  715. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_nested_recognition_ownership.py +0 -0
  716. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_nominal_step_pmi.py +0 -0
  717. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_note_verb.py +0 -0
  718. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_object_aspects.py +0 -0
  719. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_occupancy_boxes.py +0 -0
  720. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_occurrence_recognition_ownership.py +0 -0
  721. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_overall_height_coverage.py +0 -0
  722. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_pad_completeness_evidence.py +0 -0
  723. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_pad_rendering.py +0 -0
  724. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_paired_ramp_semantics.py +0 -0
  725. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_parameter_id.py +0 -0
  726. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_pareto_loop_canary_issue_1753.py +0 -0
  727. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_part_classification.py +0 -0
  728. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_part_model.py +0 -0
  729. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_pattern_contract.py +0 -0
  730. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_pattern_ownership.py +0 -0
  731. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_pitch_dim_footprint.py +0 -0
  732. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_place_dimension.py +0 -0
  733. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_plate_ownership.py +0 -0
  734. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_pmi_common_labels.py +0 -0
  735. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_pmi_gtol_lowering.py +0 -0
  736. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_pmi_part21.py +0 -0
  737. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_pmi_records.py +0 -0
  738. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_pocket_completeness_evidence.py +0 -0
  739. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_pocket_pattern.py +0 -0
  740. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_pocket_pattern_completeness_evidence.py +0 -0
  741. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_pocket_pattern_recognition.py +0 -0
  742. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_polygonal_boss_completeness_evidence.py +0 -0
  743. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_principal_profile_classifier.py +0 -0
  744. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_prismatic_boss_diameter.py +0 -0
  745. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_prismatic_classification.py +0 -0
  746. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_prismatic_dimensions.py +0 -0
  747. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_private_test_attr_reads.py +0 -0
  748. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_private_test_imports.py +0 -0
  749. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_profile_angles.py +0 -0
  750. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_projection_symbol_default.py +0 -0
  751. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_quality_components.py +0 -0
  752. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_quiddity_lifecycle_boundary.py +0 -0
  753. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_real_part_fixtures.py +0 -0
  754. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_recogniser_adoption.py +0 -0
  755. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_recogniser_capabilities.py +0 -0
  756. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_recogniser_contract.py +0 -0
  757. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_recogniser_policy.py +0 -0
  758. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_recogniser_step_inventory.py +0 -0
  759. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_recognition_boundary_failures.py +0 -0
  760. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_recognition_evidence_schema.py +0 -0
  761. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_recognition_policy_dispositions.py +0 -0
  762. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_recognition_result.py +0 -0
  763. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_refactor_golden.py +0 -0
  764. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_registry.py +0 -0
  765. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_remaining_ink_overlaps.py +0 -0
  766. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_render_seam.py +0 -0
  767. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_repack_geometry_seam.py +0 -0
  768. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_repair.py +0 -0
  769. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_replay_assessment_issue_1715.py +0 -0
  770. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_report_projection.py +0 -0
  771. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_report_status_reasons_issue_1618.py +0 -0
  772. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_report_writer.py +0 -0
  773. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_requirement_applicability.py +0 -0
  774. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_requirement_carriers.py +0 -0
  775. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_requirement_catalog.py +0 -0
  776. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_requirement_catalog_families.py +0 -0
  777. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_requirement_dimension_sharing.py +0 -0
  778. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_scale_policy.py +0 -0
  779. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_scale_selection.py +0 -0
  780. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_score.py +0 -0
  781. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_script_detail_parity.py +0 -0
  782. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_section_hatching.py +0 -0
  783. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_section_recess_contract.py +0 -0
  784. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_section_recess_pockets.py +0 -0
  785. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_shared_box_memo.py +0 -0
  786. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_shared_drawing_cache.py +0 -0
  787. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_sheet_emit.py +0 -0
  788. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_sheet_fallback_issue_1797.py +0 -0
  789. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_sheet_furniture.py +0 -0
  790. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_sheet_gdt.py +0 -0
  791. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_sheet_generation_snapshot.py +0 -0
  792. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_sheet_identity_invariant.py +0 -0
  793. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_sheet_notes.py +0 -0
  794. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_sheet_of.py +0 -0
  795. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_sheet_section.py +0 -0
  796. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_sheet_tables.py +0 -0
  797. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_slanted_blind_step.py +0 -0
  798. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_slot_completeness.py +0 -0
  799. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_slot_pattern.py +0 -0
  800. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_slot_pattern_recognition.py +0 -0
  801. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_slot_recognition.py +0 -0
  802. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_soft_deprecation.py +0 -0
  803. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_solve_trace.py +0 -0
  804. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_step_analysis_evaluation.py +0 -0
  805. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_step_profile_grouping.py +0 -0
  806. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_strip_layout.py +0 -0
  807. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_strip_zones.py +0 -0
  808. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_suite_shape.py +0 -0
  809. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_suppression_ledger.py +0 -0
  810. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_suppression_marks.py +0 -0
  811. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_through_step_ownership.py +0 -0
  812. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_through_step_semantics.py +0 -0
  813. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_title_block_units_format.py +0 -0
  814. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_tolerances.py +0 -0
  815. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_turned_diameters.py +0 -0
  816. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_turned_lengths.py +0 -0
  817. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_turned_step_ownership.py +0 -0
  818. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_turned_steps.py +0 -0
  819. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_two_pass_layout.py +0 -0
  820. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_typ_dimensions.py +0 -0
  821. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_typed_remediation_projection_issue_1759.py +0 -0
  822. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_version_bump_ci.py +0 -0
  823. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_view_blocks.py +0 -0
  824. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_view_coordinates.py +0 -0
  825. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_view_plan.py +0 -0
  826. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_witness_label_reconciliation.py +0 -0
  827. {draftwright-0.5.0rc4 → draftwright-0.5.0rc5}/tests/test_workflows.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: draftwright
3
- Version: 0.5.0rc4
3
+ Version: 0.5.0rc5
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.0rc4"
7
+ version = "0.5.0rc5"
8
8
  description = "Automated technical-drawing generation for build123d"
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -0,0 +1,174 @@
1
+ """Exact imported datum attachment geometry in source or recognition frame."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import math
6
+ from typing import cast
7
+
8
+ from quiddity import PartFrame
9
+
10
+
11
+ def _bbox_centroid(bbox: tuple) -> tuple[float, float, float]:
12
+ xmin, ymin, zmin, xmax, ymax, zmax = bbox
13
+ return ((xmin + xmax) / 2, (ymin + ymax) / 2, (zmin + zmax) / 2)
14
+
15
+
16
+ def _frame_point(
17
+ point: tuple[float, float, float], frame: PartFrame | None
18
+ ) -> tuple[float, float, float]:
19
+ """Express one source-space point in *frame*, preserving default extraction exactly."""
20
+ if frame is None:
21
+ return point
22
+ return frame.to_local(point)
23
+
24
+
25
+ def _frame_vector(
26
+ vector: tuple[float, float, float], frame: PartFrame | None
27
+ ) -> tuple[float, float, float]:
28
+ """Express one free vector in *frame* without applying the frame origin."""
29
+ if frame is None:
30
+ return vector
31
+ return cast(
32
+ tuple[float, float, float],
33
+ tuple(
34
+ sum(component * basis[index] for index, component in enumerate(vector))
35
+ for basis in (frame.x, frame.y, frame.z)
36
+ ),
37
+ )
38
+
39
+
40
+ def _cylindrical_datum_site(face, bbox, axis_index, frame):
41
+ """Find a normal axis-aligned projection site on the exact trimmed face."""
42
+ from OCP.BRepAdaptor import BRepAdaptor_Surface
43
+ from OCP.BRepBuilderAPI import BRepBuilderAPI_MakeVertex
44
+ from OCP.BRepExtrema import BRepExtrema_DistShapeShape
45
+ from OCP.gp import gp_Pnt
46
+
47
+ cylinder = BRepAdaptor_Surface(face).Cylinder()
48
+ centre = _bbox_centroid(bbox)
49
+ location = cylinder.Axis().Location()
50
+ axis_site = _frame_point((location.X(), location.Y(), location.Z()), frame)
51
+ radial_index = 2 if axis_index < 2 else 0
52
+ preferred_signs = (-1, 1) if axis_index < 2 else (1, -1)
53
+ # The upper station avoids CTC-01's lower source label, but a trimmed
54
+ # sidewall may lose that station to a cross-hole. Try the midpoint too.
55
+ stations: tuple[float, ...] = (centre[axis_index],)
56
+ if axis_index == 2:
57
+ stations = (centre[axis_index] + min((bbox[5] - bbox[2]) / 4, 10.0), *stations)
58
+ for station in stations:
59
+ for sign in preferred_signs:
60
+ silhouette = list(axis_site)
61
+ silhouette[axis_index] = station
62
+ silhouette[radial_index] += sign * cylinder.Radius()
63
+ local_site = tuple(silhouette)
64
+ if not all(
65
+ bbox[index] - 1e-6 <= local_site[index] <= bbox[index + 3] + 1e-6
66
+ for index in range(3)
67
+ ):
68
+ continue
69
+ world_site = local_site if frame is None else frame.to_world(local_site)
70
+ vertex = BRepBuilderAPI_MakeVertex(gp_Pnt(*world_site)).Vertex()
71
+ distance = BRepExtrema_DistShapeShape(vertex, face)
72
+ distance.Perform()
73
+ if distance.IsDone() and distance.Value() <= 1e-6:
74
+ return local_site
75
+ return None
76
+
77
+
78
+ def _datum_face_site(shape, bbox, kind, axis_index, frame):
79
+ """Choose a proven face site, on the projected silhouette for cylinders."""
80
+ from OCP.BRep import BRep_Tool
81
+ from OCP.BRepAdaptor import BRepAdaptor_Surface
82
+ from OCP.BRepClass import BRepClass_FaceClassifier
83
+ from OCP.BRepMesh import BRepMesh_IncrementalMesh
84
+ from OCP.BRepTools import BRepTools
85
+ from OCP.gp import gp_Pnt, gp_Pnt2d
86
+ from OCP.TopAbs import TopAbs_IN
87
+ from OCP.TopLoc import TopLoc_Location
88
+ from OCP.TopoDS import TopoDS
89
+
90
+ face = TopoDS.Face_s(shape)
91
+ if kind == "cylinder":
92
+ return _cylindrical_datum_site(face, bbox, axis_index, frame)
93
+ u0, u1, v0, v1 = BRepTools.UVBounds_s(face)
94
+ surface = BRepAdaptor_Surface(face)
95
+ classifier = BRepClass_FaceClassifier()
96
+ centre = _bbox_centroid(bbox)
97
+ candidates = []
98
+ if all(math.isfinite(value) for value in (u0, u1, v0, v1)):
99
+ for ui in range(13):
100
+ u = u0 + (ui + 0.5) * (u1 - u0) / 13
101
+ for vi in range(13):
102
+ v = v0 + (vi + 0.5) * (v1 - v0) / 13
103
+ classifier.Perform(face, gp_Pnt2d(u, v), 1e-7)
104
+ if classifier.State() == TopAbs_IN:
105
+ point = surface.Value(u, v)
106
+ candidates.append((point.X(), point.Y(), point.Z()))
107
+ if not candidates:
108
+ # A narrow ring can lie entirely between grid samples. Mesh triangles
109
+ # cover the trimmed face, and their centroids supply interior sites.
110
+ for deflection in (0.1, 0.01, 0.001, 0.0001):
111
+ BRepMesh_IncrementalMesh(face, deflection, False, 0.5, False).Perform()
112
+ location = TopLoc_Location()
113
+ mesh = BRep_Tool.Triangulation_s(face, location)
114
+ if mesh is None:
115
+ continue
116
+ transform = location.Transformation()
117
+ for index in range(1, mesh.NbTriangles() + 1):
118
+ vertices = mesh.Triangle(index).Get()
119
+ nodes = [mesh.Node(vertex).Transformed(transform) for vertex in vertices]
120
+ point = tuple(sum(node.Coord()[axis] for node in nodes) / 3 for axis in range(3))
121
+ classifier.Perform(face, gp_Pnt(*point), 1e-7)
122
+ if classifier.State() == TopAbs_IN:
123
+ candidates.append(point)
124
+ if candidates:
125
+ break
126
+ sites = []
127
+ for point in candidates:
128
+ site = _frame_point(point, frame)
129
+ hidden = 0 if axis_index == 1 else 1
130
+ key = (
131
+ abs(site[hidden] - centre[hidden]),
132
+ sum((site[i] - centre[i]) ** 2 for i in range(3)),
133
+ )
134
+ sites.append((key, site))
135
+ return min(sites)[1] if sites else None
136
+
137
+
138
+ def _datum_reference_normal(shapes, points, frame) -> tuple[tuple[float, ...], str]:
139
+ """Measure a planar datum's oriented outward normal."""
140
+ from OCP.BRepAdaptor import BRepAdaptor_Surface
141
+ from OCP.GeomAbs import GeomAbs_Cylinder, GeomAbs_Plane
142
+ from OCP.TopAbs import TopAbs_FORWARD, TopAbs_REVERSED
143
+ from OCP.TopoDS import TopoDS
144
+
145
+ normals = []
146
+ for shape, _site in zip(shapes, points, strict=True):
147
+ face = TopoDS.Face_s(shape)
148
+ surface = BRepAdaptor_Surface(face)
149
+ kind = surface.GetType()
150
+ if kind == GeomAbs_Cylinder:
151
+ continue
152
+ if kind != GeomAbs_Plane:
153
+ return (), "datum reference surface has no supported oriented normal"
154
+ direction = surface.Plane().Axis().Direction()
155
+ vector: tuple[float, ...] = _frame_vector(
156
+ (direction.X(), direction.Y(), direction.Z()), frame
157
+ )
158
+ orientation = face.Orientation()
159
+ if orientation == TopAbs_REVERSED:
160
+ vector = tuple(-component for component in vector)
161
+ elif orientation != TopAbs_FORWARD:
162
+ return (), "datum reference surface has no outward orientation"
163
+ magnitude = math.sqrt(sum(component * component for component in vector))
164
+ if magnitude < 1e-9:
165
+ return (), "datum reference surface has no usable normal"
166
+ normals.append(tuple(component / magnitude for component in vector))
167
+ if not normals:
168
+ return (), ""
169
+ if any(
170
+ sum(a * b for a, b in zip(normals[0], normal, strict=True)) < 0.999
171
+ for normal in normals[1:]
172
+ ):
173
+ return (), "datum reference faces disagree about outward normal"
174
+ return normals[0], ""
@@ -298,6 +298,72 @@ def _attach_gdt_text_evidence(leader, glyph, item, draft) -> None:
298
298
  leader.gdt_visual_zone = zone if leader.gdt_visual_tolerance else ""
299
299
 
300
300
 
301
+ def _gdt_retry_sides(side: str, *, normal_side_only: bool) -> tuple[str, ...]:
302
+ """Imported datums keep their proven outward side; other glyphs may relax."""
303
+ if normal_side_only:
304
+ return (side,)
305
+ return {
306
+ "above": ("below", "right", "left"),
307
+ "below": ("above", "right", "left"),
308
+ "left": ("right", "above", "below"),
309
+ "right": ("left", "above", "below"),
310
+ }[side]
311
+
312
+
313
+ def _gdt_retry_geometry(state, tier, alt):
314
+ """Give the deferred carve its strip and glyph extent."""
315
+ alt_strip = getattr(state.zones, alt, None)
316
+ if alt_strip is None:
317
+ return None
318
+ hz = alt in ("above", "below")
319
+ axis = "y" if hz else "x"
320
+ extent = state.size[1] if hz else state.size[0]
321
+ perp = (
322
+ (state.px, state.px + state.size[0])
323
+ if hz
324
+ else (state.py - state.size[1] / 2, state.py + state.size[1] / 2)
325
+ )
326
+ return alt_strip, hz, axis, max(tier, extent), perp
327
+
328
+
329
+ def _gdt_retry_blocker(dwg, state, dim) -> str | None:
330
+ """Check a post-drain glyph against the title block and settled ink."""
331
+ if _box_hits(_anno_box(dim), (state.title_block_box,)):
332
+ return "title_block_conflict"
333
+ if not annotation_ink_clear(dwg, dim):
334
+ return "ink_conflict"
335
+ return None
336
+
337
+
338
+ def _gdt_retry_trace(ctx, state, nm):
339
+ """Start one optional trace entry for the deferred retry."""
340
+ trace = getattr(ctx, "trace", None)
341
+ event = (
342
+ trace.pass_event("gdt_post_drain_fallback", view=state.view, requested_side=state.side)
343
+ if trace is not None
344
+ else None
345
+ )
346
+ trace_item = {"name": nm, "outcome": "unmet", "attempts": []} if event is not None else None
347
+ if event is not None:
348
+ event["items"].append(trace_item)
349
+ return trace_item
350
+
351
+
352
+ def _gdt_retry_unmet(ctx, state, nm, normal_side_only):
353
+ """Record why a required glyph could not stay on its legal corridor."""
354
+ ctx.record_issue(
355
+ "warning",
356
+ "pmi_dropped" if state.source_ids else "gdt_dropped",
357
+ (
358
+ f"{nm} not placed (no legible room on its surface-normal {state.side} strip)"
359
+ if normal_side_only
360
+ else f"{nm} not placed (no legible room in any {state.view} strip or sheet fallback)"
361
+ ),
362
+ source=state.source_ids,
363
+ outcome_stage="placement",
364
+ )
365
+
366
+
301
367
  def _gdt_drop_callback(
302
368
  dwg,
303
369
  ctx,
@@ -318,7 +384,6 @@ def _gdt_drop_callback(
318
384
  build_routed,
319
385
  ):
320
386
  """Return the deferred shared-solver fallback for one declared GD&T candidate."""
321
-
322
387
  state = _GdtDropState(
323
388
  view=item.view,
324
389
  side=item.side,
@@ -337,72 +402,24 @@ def _gdt_drop_callback(
337
402
  )
338
403
 
339
404
  def _drop(nm):
340
- # Fallthrough: the declared/derived side is full — try the OPPOSITE side of
341
- # the same view before dropping, so a congested default still places somewhere
342
- # legible rather than vanishing. DEFERRED via ctx.post_drain (the plate
343
- # pattern): the carve then runs after EVERY corridor has drained, so it cannot
344
- # preempt a corner a later sibling's force candidate needs. Force semantics
345
- # (no corridor-cross check) match the primary path, BUT reject a spot over the
346
- # (not-yet-placed) title block — a below/right strip runs into it, and the
347
- # carve can't see it.
348
405
  def _retry():
349
- trace = getattr(ctx, "trace", None)
350
- event = (
351
- trace.pass_event(
352
- "gdt_post_drain_fallback", view=state.view, requested_side=state.side
353
- )
354
- if trace is not None
355
- else None
356
- )
357
- trace_item = (
358
- {"name": nm, "outcome": "unmet", "attempts": []} if event is not None else None
359
- )
360
- if event is not None:
361
- event["items"].append(trace_item)
362
-
363
- # Relax the requested side when its strip is full, so
364
- # try the OPPOSITE side, then the two PERPENDICULAR sides, placing on the first
365
- # with room. A note the caller asked to see should appear somewhere legible
366
- # rather than vanish; when the requested strip has no room, an explicit `side=`
367
- # is a preference, not a hard constraint. A perpendicular side flips the leader
368
- # orientation (`state.build(pos, _hz=hz)`). If the placement lands on a side other than
369
- # requested, record an INFO issue so the relaxation is visible.
370
- # A requested annotation must never be silently lost.
371
- relax_order = {
372
- "above": ("below", "right", "left"),
373
- "below": ("above", "right", "left"),
374
- "left": ("right", "above", "below"),
375
- "right": ("left", "above", "below"),
376
- }[state.side]
377
- for alt in relax_order:
378
- alt_strip = getattr(state.zones, alt, None)
379
- if alt_strip is None:
406
+ trace_item = _gdt_retry_trace(ctx, state, nm)
407
+ normal_side_only = item.kind == "datum_ref" and bool(item.reference_surface_kind)
408
+ for alt in _gdt_retry_sides(state.side, normal_side_only=normal_side_only):
409
+ geometry = _gdt_retry_geometry(state, tier, alt)
410
+ if geometry is None:
380
411
  continue
381
- hz = alt in ("above", "below") # perpendicular sides flip the leader axis
382
- axis2 = "y" if hz else "x"
383
- extent = (
384
- state.size[1] if axis2 == "y" else state.size[0]
385
- ) # the glyph's stacking-axis size
386
- perp = (
387
- (state.px, state.px + state.size[0])
388
- if hz
389
- else (state.py - state.size[1] / 2, state.py + state.size[1] / 2)
390
- )
391
- pos = carve_position(dwg, alt_strip, state.view, axis2, max(tier, extent), perp)
412
+ strip, hz, axis, extent, perp = geometry
413
+ pos = carve_position(dwg, strip, state.view, axis, extent, perp)
392
414
  if pos is None:
393
415
  if trace_item is not None:
394
416
  trace_item["attempts"].append({"side": alt, "outcome": "no_free_position"})
395
417
  continue
396
418
  dim = state.build(pos, _hz=hz)
397
- if _box_hits(_anno_box(dim), (state.title_block_box,)):
419
+ blocker = _gdt_retry_blocker(dwg, state, dim)
420
+ if blocker:
398
421
  if trace_item is not None:
399
- trace_item["attempts"].append(
400
- {"side": alt, "outcome": "title_block_conflict"}
401
- )
402
- continue
403
- if not annotation_ink_clear(dwg, dim):
404
- if trace_item is not None:
405
- trace_item["attempts"].append({"side": alt, "outcome": "ink_conflict"})
422
+ trace_item["attempts"].append({"side": alt, "outcome": blocker})
406
423
  continue
407
424
  ctx.place(
408
425
  dim,
@@ -411,23 +428,28 @@ def _gdt_drop_callback(
411
428
  feature=state.feature,
412
429
  satisfaction=state.satisfaction,
413
430
  declaration=state.declaration,
414
- ) # relaxed side
415
- ctx.record_issue(
416
- "info",
417
- "gdt_side_relaxed",
418
- f"{nm}: the {state.view} {state.side} strip was full — placed on {alt} instead",
419
431
  )
432
+ if alt != state.side:
433
+ ctx.record_issue(
434
+ "info",
435
+ "gdt_side_relaxed",
436
+ f"{nm}: the {state.view} {state.side} strip was full — placed on {alt} instead",
437
+ )
420
438
  if trace_item is not None:
421
439
  trace_item["attempts"].append({"side": alt, "outcome": "placed"})
422
440
  trace_item.update(outcome="placed", side=alt)
423
441
  return
424
- fallback = sheet_fallback(
425
- dwg,
426
- (state.px, state.py),
427
- state.view,
428
- state.build_at,
429
- state.build_routed,
430
- state.size,
442
+ fallback = (
443
+ sheet_fallback(
444
+ dwg,
445
+ (state.px, state.py),
446
+ state.view,
447
+ state.build_at,
448
+ state.build_routed,
449
+ state.size,
450
+ )
451
+ if not normal_side_only
452
+ else None
431
453
  )
432
454
  if fallback is not None:
433
455
  ctx.place(
@@ -448,15 +470,9 @@ def _gdt_drop_callback(
448
470
  trace_item["attempts"].append({"side": "sheet", "outcome": "placed"})
449
471
  trace_item.update(outcome="placed", side="sheet")
450
472
  return
451
- if trace_item is not None:
473
+ if trace_item is not None and not normal_side_only:
452
474
  trace_item["attempts"].append({"side": "sheet", "outcome": "no_clear_route"})
453
- ctx.record_issue(
454
- "warning",
455
- "pmi_dropped" if state.source_ids else "gdt_dropped",
456
- f"{nm} not placed (no legible room in any {state.view} strip or sheet fallback)",
457
- source=state.source_ids,
458
- outcome_stage="placement",
459
- )
475
+ _gdt_retry_unmet(ctx, state, nm, normal_side_only)
460
476
 
461
477
  ctx.post_drain.append(_retry)
462
478
 
@@ -42,6 +42,14 @@ def choose_pre_render_profile(
42
42
  scheme = strips.scheme
43
43
  demand_count = len(scheme.demands) if scheme is not None else 0
44
44
  under_reserved_count = len(report.under_reserved)
45
+ only_unroutable_raw_pmi = (
46
+ scheme is not None
47
+ and bool(scheme.unplanned)
48
+ and all(
49
+ item.family == "pmi" and item.reason == "raw PMI has no typed corridor"
50
+ for item in scheme.unplanned
51
+ )
52
+ )
45
53
  missing_views = (
46
54
  sorted({demand.view for demand in scheme.demands} - set(views))
47
55
  if scheme is not None
@@ -87,6 +95,16 @@ def choose_pre_render_profile(
87
95
  # can displace the required mark even though the original strip fits it.
88
96
  # Keep those strips while allowing the ISO to use free space.
89
97
  profile, reason = "iso-growth", "sparse_authored_corridor"
98
+ elif (
99
+ demand_count <= 25
100
+ and under_reserved_count >= 3
101
+ and 6 * under_reserved_count >= demand_count
102
+ and only_unroutable_raw_pmi
103
+ ):
104
+ # Raw source PMI with no drawable carrier has no corridor to protect.
105
+ # When several typed corridors are short of space, reserve their planned
106
+ # depths before rendering the single normal build.
107
+ profile, reason = "planned", "sparse_typed_corridor_pressure"
90
108
  elif demand_count <= 25 and report.unplanned_count <= 5 and 0 < under_reserved_count <= 3:
91
109
  # Sparse uncertain routes keep baseline annotation placement while
92
110
  # granting the isometric view any sheet slack it can safely consume.
@@ -479,11 +479,52 @@ def build_pmi_features(
479
479
  continue
480
480
  if r.source_category == "datum" and not r.lowering_blockers and r.reference_axis:
481
481
  edge_view = {"X": "front", "Y": "side", "Z": "front"}[r.reference_axis]
482
- vertical_index = 2 if edge_view in ("front", "side") else 1
483
482
  center = bbox.center()
484
- center_coord = (center.X, center.Y, center.Z)[vertical_index]
485
- side = "above" if pmi_origin[vertical_index] >= center_coord else "below"
486
- datum_item = datum(r.label, raw, view=edge_view, side=side)
483
+ center_point = (center.X, center.Y, center.Z)
484
+ site = r.ref_pts[0] if r.ref_pts else pmi_origin
485
+ axial_index = "XYZ".index(r.reference_axis)
486
+ surface_kind = r.reference_surface_kind
487
+ if not surface_kind:
488
+ # Compatibility for hand-constructed records predating exact kind.
489
+ surface_kind = (
490
+ "plane"
491
+ if r.ref_bbox is not None
492
+ and r.ref_bbox[axial_index + 3] - r.ref_bbox[axial_index] < 1e-4
493
+ else "cylinder"
494
+ )
495
+ planar = surface_kind == "plane"
496
+ # A plane's leader follows its normal in the edge-on view. A
497
+ # cylindrical datum instead attaches radially to its profile.
498
+ if planar and axial_index < 2:
499
+ side_index = axial_index
500
+ low_side, high_side = "left", "right"
501
+ elif not planar and axial_index == 2:
502
+ side_index = 0
503
+ low_side, high_side = "left", "right"
504
+ else:
505
+ side_index = 2
506
+ low_side, high_side = "below", "above"
507
+ if len(r.reference_normal) == 3 and abs(r.reference_normal[side_index]) < 0.9:
508
+ out.append(
509
+ replace(
510
+ raw,
511
+ lowering_blockers=(
512
+ "datum surface normal cannot be shown by an axial leader in this view",
513
+ ),
514
+ )
515
+ )
516
+ continue
517
+ if len(r.reference_normal) == 3:
518
+ side = high_side if r.reference_normal[side_index] > 0 else low_side
519
+ else:
520
+ side = high_side if site[side_index] >= center_point[side_index] else low_side
521
+ datum_item = datum(
522
+ r.label,
523
+ replace(raw, frame=Frame(origin=site, axis=ax)),
524
+ view=edge_view,
525
+ side=side,
526
+ )
527
+ datum_item = replace(datum_item, reference_surface_kind=surface_kind)
487
528
  out.append(
488
529
  replace(
489
530
  datum_item,
@@ -2480,6 +2480,7 @@ class DatumRef:
2480
2480
  source_id: str = ""
2481
2481
  source_ids: tuple[str, ...] = ()
2482
2482
  part21_id: str = ""
2483
+ reference_surface_kind: str = ""
2483
2484
  kind: ClassVar[str] = "datum_ref"
2484
2485
 
2485
2486
  def parameters(self) -> list[DimParameter]:
@@ -916,14 +916,9 @@ def _structured_thread_extent(
916
916
  if through:
917
917
  raise ValueError("structured external thread cannot be a through tap")
918
918
  if "thread length" in fields:
919
- length = _structured_number(fields, "thread length")
920
- if len(feature.cylindrical_refs) != 1 or not _same_number(
921
- feature.cylindrical_refs[0].axial_interval[1]
922
- - feature.cylindrical_refs[0].axial_interval[0],
923
- length,
924
- abs_tol=0.01,
925
- ):
926
- raise ValueError("structured thread length disagrees with source cylinder")
919
+ _structured_number(fields, "thread length")
920
+ # A tip chamfer can shorten the source face. Check its full owner span
921
+ # only after a unique geometric owner match is established.
927
922
  elif prose is None or not prose.full_available_length:
928
923
  raise ValueError("structured external thread has no length requirement")
929
924
  return (
@@ -1184,7 +1179,51 @@ def _remap_model_features(model: PartModel, replacements: dict[int, Feature]) ->
1184
1179
  )
1185
1180
 
1186
1181
 
1187
- def _manufacturing_proposal(feature: PmiFeature, owners, bbox):
1182
+ def _turned_tip_chamfers_cover_gap(
1183
+ reference: CylindricalReference,
1184
+ owner: StepFeature | BossFeature,
1185
+ chamfers: tuple[ChamferFeature, ...],
1186
+ ) -> bool:
1187
+ """Require recognised equal-leg end chamfers for a shortened source cylinder."""
1188
+ span = owner.span
1189
+ if span is None:
1190
+ return False
1191
+ axis_index = "xyz".index(owner.frame.axis)
1192
+ owner_lo, owner_hi = sorted((span[0][axis_index], span[1][axis_index]))
1193
+ source_lo, source_hi = reference.axial_interval
1194
+ gaps = ((owner_lo, source_lo), (source_hi, owner_hi))
1195
+ found_gap = False
1196
+ for gap_lo, gap_hi in gaps:
1197
+ gap = gap_hi - gap_lo
1198
+ if gap <= 0.01:
1199
+ continue
1200
+ found_gap = True
1201
+ station = (gap_lo + gap_hi) / 2
1202
+ if not any(
1203
+ chamfer.turned
1204
+ and chamfer.axis == owner.frame.axis
1205
+ and _same_number(chamfer.leg1, gap, abs_tol=0.01)
1206
+ and _same_number(chamfer.leg2, gap, abs_tol=0.01)
1207
+ and _same_number(chamfer.angle, 45.0, abs_tol=0.01)
1208
+ and _same_number(chamfer.frame.origin[axis_index], station, abs_tol=0.01)
1209
+ and _same_number(
1210
+ math.sqrt(
1211
+ sum(
1212
+ (chamfer.frame.origin[index] - reference.axis_origin[index]) ** 2
1213
+ for index in range(3)
1214
+ if index != axis_index
1215
+ )
1216
+ ),
1217
+ reference.radius - gap / 2,
1218
+ abs_tol=0.01,
1219
+ )
1220
+ for chamfer in chamfers
1221
+ ):
1222
+ return False
1223
+ return found_gap
1224
+
1225
+
1226
+ def _manufacturing_proposal(feature: PmiFeature, owners, chamfers, bbox):
1188
1227
  """Validate one source against its exact cylinder and unique canonical owner."""
1189
1228
  requirement = (
1190
1229
  _knurl_requirement(feature)
@@ -1226,7 +1265,31 @@ def _manufacturing_proposal(feature: PmiFeature, owners, bbox):
1226
1265
  if not matches
1227
1266
  else f"ambiguous manufacturing requirement: source topology matches {len(matches)} canonical features"
1228
1267
  )
1229
- return matches[0], requirement
1268
+ owner = matches[0]
1269
+ if (
1270
+ isinstance(requirement, ThreadRequirement)
1271
+ and requirement.application == "external"
1272
+ and isinstance(owner, (StepFeature, BossFeature))
1273
+ and "thread length" in dict(feature.structured_fields)
1274
+ ):
1275
+ length = _structured_number(dict(feature.structured_fields), "thread length")
1276
+ source_length = reference.axial_interval[1] - reference.axial_interval[0]
1277
+ span = owner.span
1278
+ if span is None:
1279
+ raise ValueError("external thread owner has no axial span")
1280
+ axis_index = "xyz".index(owner.frame.axis)
1281
+ owner_length = abs(span[1][axis_index] - span[0][axis_index])
1282
+ if not (
1283
+ _same_number(source_length, length, abs_tol=0.01)
1284
+ or (
1285
+ _same_number(owner_length, length, abs_tol=0.01)
1286
+ and _turned_tip_chamfers_cover_gap(reference, owner, chamfers)
1287
+ )
1288
+ ):
1289
+ raise ValueError(
1290
+ "structured thread length disagrees with source cylinder or evidenced owner span"
1291
+ )
1292
+ return owner, requirement
1230
1293
 
1231
1294
 
1232
1295
  def lower_ap242_manufacturing_requirements(
@@ -1248,6 +1311,7 @@ def lower_ap242_manufacturing_requirements(
1248
1311
  for feature in model.features
1249
1312
  if isinstance(feature, (StepFeature, BossFeature, HoleFeature, PatternFeature))
1250
1313
  ]
1314
+ chamfers = tuple(feature for feature in model.features if isinstance(feature, ChamferFeature))
1251
1315
  replacements: dict[int, Feature] = {}
1252
1316
  consumed: set[int] = set()
1253
1317
  blocked: dict[int, str] = {}
@@ -1265,7 +1329,7 @@ def lower_ap242_manufacturing_requirements(
1265
1329
  if feature.lowering_blockers:
1266
1330
  continue
1267
1331
  try:
1268
- owner, requirement = _manufacturing_proposal(feature, owners, model.bbox)
1332
+ owner, requirement = _manufacturing_proposal(feature, owners, chamfers, model.bbox)
1269
1333
  except ValueError as exc:
1270
1334
  blocked[index] = str(exc)
1271
1335
  continue