draftwright 0.4.14__tar.gz → 0.4.15__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 (290) hide show
  1. {draftwright-0.4.14 → draftwright-0.4.15}/PKG-INFO +1 -1
  2. {draftwright-0.4.14 → draftwright-0.4.15}/pyproject.toml +1 -1
  3. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/annotations/_common.py +49 -11
  4. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/annotations/from_model.py +25 -14
  5. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/builder.py +400 -63
  6. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/compose.py +9 -4
  7. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/drawing.py +13 -1
  8. {draftwright-0.4.14 → draftwright-0.4.15}/tests/refactor_golden/flange_dense.json +70 -89
  9. {draftwright-0.4.14 → draftwright-0.4.15}/tests/refactor_golden/turned_stepped.json +7 -26
  10. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_add_dimension.py +2 -1
  11. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_adr0018_view_selection.py +3 -4
  12. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_audit_differential.py +4 -1
  13. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_compiled_plan_boundary.py +2 -1
  14. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_e2e_standards.py +6 -3
  15. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1130_view_planning_evidence.py +8 -9
  16. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1217_the_facility_is_shared.py +16 -3
  17. draftwright-0.4.15/tests/test_issue_1262_automatic_turned_views.py +85 -0
  18. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1298_manufacturing_requirements.py +3 -1
  19. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1299_page_escalation.py +22 -9
  20. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1308_machined_leader_analytics.py +14 -9
  21. draftwright-0.4.15/tests/test_issue_1332_zone_labels.py +70 -0
  22. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1334_prevent_ink.py +29 -0
  23. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_443_grm03_axial_coverage.py +4 -2
  24. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_798_silhouette_lint.py +8 -2
  25. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_make_drawing.py +92 -29
  26. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_script_detail_parity.py +2 -1
  27. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_view_plan.py +8 -2
  28. draftwright-0.4.14/tests/test_issue_1332_zone_labels.py +0 -49
  29. {draftwright-0.4.14 → draftwright-0.4.15}/.gitignore +0 -0
  30. {draftwright-0.4.14 → draftwright-0.4.15}/CHANGELOG.md +0 -0
  31. {draftwright-0.4.14 → draftwright-0.4.15}/LICENSE +0 -0
  32. {draftwright-0.4.14 → draftwright-0.4.15}/README.md +0 -0
  33. {draftwright-0.4.14 → draftwright-0.4.15}/docs/adr/README.md +0 -0
  34. {draftwright-0.4.14 → draftwright-0.4.15}/docs/reference/recogniser-capabilities.md +0 -0
  35. {draftwright-0.4.14 → draftwright-0.4.15}/docs/reference/sheet.md +0 -0
  36. {draftwright-0.4.14 → draftwright-0.4.15}/docs/research/1062-repeating-radial-profile-evidence.md +0 -0
  37. {draftwright-0.4.14 → draftwright-0.4.15}/skills/SKILL.md +0 -0
  38. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/__init__.py +0 -0
  39. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/_build_profile.py +0 -0
  40. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/_core.py +0 -0
  41. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/_geometry.py +0 -0
  42. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/_pmi_part21.py +0 -0
  43. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/_warnings.py +0 -0
  44. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/analysis.py +0 -0
  45. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/annotate.py +0 -0
  46. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/annotations/__init__.py +0 -0
  47. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/annotations/balloons.py +0 -0
  48. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/annotations/gears.py +0 -0
  49. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/annotations/holes.py +0 -0
  50. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/annotations/leaders.py +0 -0
  51. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/annotations/orchestrator.py +0 -0
  52. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/annotations/sections.py +0 -0
  53. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/audit.py +0 -0
  54. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/cli.py +0 -0
  55. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/evaluation/__init__.py +0 -0
  56. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/evaluation/step_analysis.py +0 -0
  57. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/export.py +0 -0
  58. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/fits.py +0 -0
  59. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/fonts/IBMPlexMono-Regular.ttf +0 -0
  60. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/fonts/IBMPlexSansCondensed-Regular.ttf +0 -0
  61. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/fonts/LICENSE-IBMPlexMono-OFL.txt +0 -0
  62. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/fonts/LICENSE-IBMPlexSansCondensed-OFL.txt +0 -0
  63. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/fonts/__init__.py +0 -0
  64. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/intents.py +0 -0
  65. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/layout.py +0 -0
  66. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/linting/__init__.py +0 -0
  67. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/linting/channel_coverage.py +0 -0
  68. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/linting/coverage.py +0 -0
  69. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/linting/evidence.py +0 -0
  70. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/linting/flat_coverage.py +0 -0
  71. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/linting/gear_coverage.py +0 -0
  72. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/linting/hole_coverage.py +0 -0
  73. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/linting/ink_overlap.py +0 -0
  74. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/linting/issues.py +0 -0
  75. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/linting/pmi_coverage.py +0 -0
  76. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/linting/polygonal_stock_coverage.py +0 -0
  77. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/linting/profiled_bore_coverage.py +0 -0
  78. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/linting/quality.py +0 -0
  79. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/linting/slot_coverage.py +0 -0
  80. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/linting/structural.py +0 -0
  81. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/linting/suggest.py +0 -0
  82. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/make_drawing.py +0 -0
  83. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/model/__init__.py +0 -0
  84. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/model/callout.py +0 -0
  85. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/model/compiled.py +0 -0
  86. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/model/declare.py +0 -0
  87. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/model/detect.py +0 -0
  88. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/model/ir.py +0 -0
  89. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/model/planner.py +0 -0
  90. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/model/pmi_lowering.py +0 -0
  91. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/pmi.py +0 -0
  92. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/projection.py +0 -0
  93. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/py.typed +0 -0
  94. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/recogniser_contract.py +0 -0
  95. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/recognition/__init__.py +0 -0
  96. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/recognition_cache.py +0 -0
  97. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/registry.py +0 -0
  98. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/repair.py +0 -0
  99. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/score.py +0 -0
  100. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/sheet.py +0 -0
  101. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/sheet_emit.py +0 -0
  102. {draftwright-0.4.14 → draftwright-0.4.15}/src/draftwright/view_plan.py +0 -0
  103. {draftwright-0.4.14 → draftwright-0.4.15}/tests/_kernel.py +0 -0
  104. {draftwright-0.4.14 → draftwright-0.4.15}/tests/_layout_sig.py +0 -0
  105. {draftwright-0.4.14 → draftwright-0.4.15}/tests/conftest.py +0 -0
  106. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/ap242_single_cylinder_diameter.step +0 -0
  107. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/evaluation/README.md +0 -0
  108. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/evaluation/ambiguous-open-semicircle.step +0 -0
  109. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/evaluation/blind-hole.step +0 -0
  110. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/evaluation/corpus-v1.json +0 -0
  111. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/evaluation/plain-block.step +0 -0
  112. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/evaluation/topology-a.step +0 -0
  113. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/evaluation/topology-b.step +0 -0
  114. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/grm03_thumbwheel_drive_screw.step +0 -0
  115. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/grm03_thumbwheel_drive_screw_ap242_pmi.step +0 -0
  116. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/grm04_drive_plate.step +0 -0
  117. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/if_step_flat_across_cylinder.step +0 -0
  118. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/issue_1058_wheel_rh.step +0 -0
  119. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/issue_909_basic_part_design_017_body.step +0 -0
  120. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/issue_915_case_study_2.step +0 -0
  121. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/nist_ctc_01_asme1_ap203.stp +0 -0
  122. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/nist_ctc_01_asme1_ap242.stp +0 -0
  123. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/nist_ctc_02_asme1_ap203.stp +0 -0
  124. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/nist_ctc_02_asme1_ap242.stp +0 -0
  125. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/nist_ctc_03_asme1_ap203.stp +0 -0
  126. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/nist_ctc_03_asme1_ap242.stp +0 -0
  127. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/nist_ctc_04_asme1_ap203.stp +0 -0
  128. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/nist_ctc_04_asme1_ap242.stp +0 -0
  129. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/nist_ctc_05_asme1_ap203.stp +0 -0
  130. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/nist_ctc_05_asme1_ap242.stp +0 -0
  131. {draftwright-0.4.14 → draftwright-0.4.15}/tests/fixtures/tuner_jig_blind_obround_pockets.step +0 -0
  132. {draftwright-0.4.14 → draftwright-0.4.15}/tests/refactor_golden/bracket_section.json +0 -0
  133. {draftwright-0.4.14 → draftwright-0.4.15}/tests/refactor_golden/centered_rebate.json +0 -0
  134. {draftwright-0.4.14 → draftwright-0.4.15}/tests/refactor_golden/chamfered.json +0 -0
  135. {draftwright-0.4.14 → draftwright-0.4.15}/tests/refactor_golden/filleted.json +0 -0
  136. {draftwright-0.4.14 → draftwright-0.4.15}/tests/refactor_golden/grid_plate.json +0 -0
  137. {draftwright-0.4.14 → draftwright-0.4.15}/tests/refactor_golden/grooved_shaft.json +0 -0
  138. {draftwright-0.4.14 → draftwright-0.4.15}/tests/refactor_golden/hex_bar.json +0 -0
  139. {draftwright-0.4.14 → draftwright-0.4.15}/tests/refactor_golden/holed_slot.json +0 -0
  140. {draftwright-0.4.14 → draftwright-0.4.15}/tests/refactor_golden/pocketed.json +0 -0
  141. {draftwright-0.4.14 → draftwright-0.4.15}/tests/refactor_golden/prismatic_ladder.json +0 -0
  142. {draftwright-0.4.14 → draftwright-0.4.15}/tests/refactor_golden/scattered_plate.json +0 -0
  143. {draftwright-0.4.14 → draftwright-0.4.15}/tests/refactor_golden/side_drilled.json +0 -0
  144. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_adr0018_arrangement_gate.py +0 -0
  145. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_adr0018_view_routing.py +0 -0
  146. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_agents_guide.py +0 -0
  147. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_api_docs.py +0 -0
  148. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_architecture_docs.py +0 -0
  149. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_balloon_ring_standoff.py +0 -0
  150. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_build_profile_harness.py +0 -0
  151. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_carve_free_position_callers.py +0 -0
  152. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_counting_calls.py +0 -0
  153. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_declare.py +0 -0
  154. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_declared_recognition_gate.py +0 -0
  155. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_dense_sheet_canary.py +0 -0
  156. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_deprecation_dates.py +0 -0
  157. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_detect_once.py +0 -0
  158. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_detect_registry.py +0 -0
  159. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_dimension_role_vocabulary.py +0 -0
  160. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_drawing_encapsulation.py +0 -0
  161. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_e2e_slice.py +0 -0
  162. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_export_dxf_curves.py +0 -0
  163. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_export_dxf_zoom.py +0 -0
  164. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_external_recognition_boundary.py +0 -0
  165. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_fillets_adjacency.py +0 -0
  166. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_fits.py +0 -0
  167. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_flat_completeness.py +0 -0
  168. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_flat_stock_identity.py +0 -0
  169. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_flat_stock_opposition.py +0 -0
  170. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_gdt_placement.py +0 -0
  171. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_grid_lattice_convention.py +0 -0
  172. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_import_boundaries.py +0 -0
  173. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_iso_nts_caption_placement.py +0 -0
  174. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1000_envelope_reuse.py +0 -0
  175. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1058_wheel_profile.py +0 -0
  176. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1073_cross_body_patterns.py +0 -0
  177. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1082_polygonal_stock.py +0 -0
  178. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1086_declared_gears.py +0 -0
  179. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1116_ap242_hole_tolerance_lowering.py +0 -0
  180. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1142_hole_leader_labels.py +0 -0
  181. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1143_hole_completeness.py +0 -0
  182. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1144_transactional_hole_table.py +0 -0
  183. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1146_scale_completeness.py +0 -0
  184. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1147_legibility_pair_aggregation.py +0 -0
  185. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1153_contradictory_dimensions.py +0 -0
  186. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1154_one_owner_per_measurement.py +0 -0
  187. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1155_grm04_sheet_use.py +0 -0
  188. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1166_cross_pass_feature_leaders.py +0 -0
  189. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1176_quality_fidelity.py +0 -0
  190. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1177_angular_dimensions.py +0 -0
  191. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1187_unroutable_leaders.py +0 -0
  192. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1188_per_view_assignment.py +0 -0
  193. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1190_section_decision.py +0 -0
  194. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1196_deterministic_view_names.py +0 -0
  195. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1202_observed_drawing_consumer.py +0 -0
  196. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1204_multiscale_view_issues.py +0 -0
  197. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1209_linear_pmi_witnesses.py +0 -0
  198. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1215_envelope_tolerance.py +0 -0
  199. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1215_no_approved_tolerance_is_dropped.py +0 -0
  200. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1216_callout_reservation_measures_ink.py +0 -0
  201. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1216_pairwise_across_scale_groups.py +0 -0
  202. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1217_claimed_representations.py +0 -0
  203. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1219_location_claims_its_own_axis.py +0 -0
  204. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1229_ledger_member_keying.py +0 -0
  205. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1240_iso_above_strip_visibility.py +0 -0
  206. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1254_turned_chamfers.py +0 -0
  207. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1260_view_constraints.py +0 -0
  208. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1276_turned_leader_targets.py +0 -0
  209. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1281_turned_fillets.py +0 -0
  210. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1296_cylindrical_diameter_pmi.py +0 -0
  211. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1312_engine_costs.py +0 -0
  212. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1332_overlap_remedy.py +0 -0
  213. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1332_overlap_remedy_fast.py +0 -0
  214. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1336_grm03_ap242_pmi_fixture.py +0 -0
  215. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_1338_scale_before_page_escalation.py +0 -0
  216. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_367_leader_ink.py +0 -0
  217. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_676_polygonal_boss.py +0 -0
  218. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_676_polygonal_boss_declare.py +0 -0
  219. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_740_leader_assignment.py +0 -0
  220. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_798_floor_cardinality.py +0 -0
  221. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_798_material_field.py +0 -0
  222. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_885_prismatic_coverage.py +0 -0
  223. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_909_sloped_profile.py +0 -0
  224. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_915_dense_case.py +0 -0
  225. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_916_pocket_leader.py +0 -0
  226. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_917_open_channel.py +0 -0
  227. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_924_zero_length_shoulders.py +0 -0
  228. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_955_height_contingency.py +0 -0
  229. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_issue_958_cross_solid_recognition.py +0 -0
  230. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_label_provenance.py +0 -0
  231. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_layout.py +0 -0
  232. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_layout_cleanliness.py +0 -0
  233. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_layout_hypothesis.py +0 -0
  234. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_layout_property.py +0 -0
  235. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_leader_footprint.py +0 -0
  236. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_lint_box_cache.py +0 -0
  237. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_lint_ink_overlap.py +0 -0
  238. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_lint_reconciliation.py +0 -0
  239. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_lint_structural.py +0 -0
  240. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_linting.py +0 -0
  241. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_location_vocabulary.py +0 -0
  242. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_note_verb.py +0 -0
  243. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_object_aspects.py +0 -0
  244. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_occupancy_boxes.py +0 -0
  245. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_parameter_id.py +0 -0
  246. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_part_model.py +0 -0
  247. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_pitch_dim_footprint.py +0 -0
  248. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_pmi.py +0 -0
  249. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_pmi_datum_lowering.py +0 -0
  250. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_pmi_gtol_lowering.py +0 -0
  251. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_pmi_part21.py +0 -0
  252. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_pocket_pattern.py +0 -0
  253. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_pocket_pattern_recognition.py +0 -0
  254. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_principal_profile_classifier.py +0 -0
  255. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_private_test_attr_reads.py +0 -0
  256. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_private_test_imports.py +0 -0
  257. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_quality_components.py +0 -0
  258. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_recogniser_adoption.py +0 -0
  259. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_recogniser_capabilities.py +0 -0
  260. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_recogniser_contract.py +0 -0
  261. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_recognition.py +0 -0
  262. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_recognition_manifest.py +0 -0
  263. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_recognition_result.py +0 -0
  264. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_refactor_golden.py +0 -0
  265. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_registry.py +0 -0
  266. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_render_seam.py +0 -0
  267. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_repack_geometry_seam.py +0 -0
  268. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_score.py +0 -0
  269. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_shared_box_memo.py +0 -0
  270. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_sheet_emit.py +0 -0
  271. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_sheet_gdt.py +0 -0
  272. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_sheet_identity_invariant.py +0 -0
  273. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_sheet_notes.py +0 -0
  274. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_sheet_of.py +0 -0
  275. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_sheet_section.py +0 -0
  276. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_sheet_tables.py +0 -0
  277. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_slanted_blind_step.py +0 -0
  278. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_slot_completeness.py +0 -0
  279. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_slot_pattern.py +0 -0
  280. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_slot_pattern_recognition.py +0 -0
  281. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_soft_deprecation.py +0 -0
  282. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_solve_trace.py +0 -0
  283. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_step_analysis_evaluation.py +0 -0
  284. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_strip_layout.py +0 -0
  285. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_suppression_ledger.py +0 -0
  286. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_suppression_marks.py +0 -0
  287. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_tolerances.py +0 -0
  288. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_turned_steps.py +0 -0
  289. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_witness_label_reconciliation.py +0 -0
  290. {draftwright-0.4.14 → draftwright-0.4.15}/tests/test_workflows.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: draftwright
3
- Version: 0.4.14
3
+ Version: 0.4.15
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.4.14"
7
+ version = "0.4.15"
8
8
  description = "Automated technical-drawing generation for build123d"
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -1471,6 +1471,7 @@ def prevent_dimension_label_ink(
1471
1471
  page=None,
1472
1472
  immutable=(),
1473
1473
  obstacles=(),
1474
+ perpendicular_step=None,
1474
1475
  ):
1475
1476
  """Choose small along-line label offsets for a just-built dimension batch.
1476
1477
 
@@ -1493,6 +1494,9 @@ def prevent_dimension_label_ink(
1493
1494
  neighbour's. If the bounded choices cannot improve the batch, the natural deterministic
1494
1495
  placement survives and the normal ``annotation_ink_overlap`` lint remains explicit
1495
1496
  evidence of the infeasible fallback. Names in *immutable* are never shifted (pins win).
1497
+ When ``perpendicular_step`` is supplied, a conflicting dimension may also move one
1498
+ established stacking tier away from the view. This is the generic fallback for a chain
1499
+ whose line-work cannot be cleared by moving labels along their measured spans.
1496
1500
  Fixed *obstacles* do not make an existing contact this local batch's responsibility, but
1497
1501
  no selected move may introduce a new label contact with one.
1498
1502
 
@@ -1645,6 +1649,7 @@ def prevent_dimension_label_ink(
1645
1649
  conflicts = _conflicts(batch)
1646
1650
  fixed_conflicts = sum(conflict[0] == "fixed" for conflict in conflicts)
1647
1651
  offsets = []
1652
+ tier_offsets = []
1648
1653
  for (_name, dim), info, natural in zip(batch, infos, natural_centres, strict=True):
1649
1654
  label = _box(dim)
1650
1655
  offsets.append(
@@ -1652,9 +1657,18 @@ def prevent_dimension_label_ink(
1652
1657
  if info is None or natural is None or label is None
1653
1658
  else abs((label[info[0]] + label[info[0] + 2]) / 2.0 - natural)
1654
1659
  )
1660
+ for (_name, dim), (_original_name, original_dim) in zip(batch, original, strict=True):
1661
+ spec = getattr(dim, "_dw_spec", None)
1662
+ original_spec = getattr(original_dim, "_dw_spec", None)
1663
+ tier_offsets.append(
1664
+ 0.0
1665
+ if spec is None or original_spec is None
1666
+ else abs(float(spec.distance) - float(original_spec.distance))
1667
+ )
1655
1668
  return (
1656
1669
  fixed_conflicts,
1657
1670
  len(conflicts),
1671
+ sum(value > 1e-9 for value in tier_offsets),
1658
1672
  round(sum(offsets), 9),
1659
1673
  round(max(offsets, default=0.0), 9),
1660
1674
  tuple(round(value, 9) for value in offsets),
@@ -1665,10 +1679,10 @@ def prevent_dimension_label_ink(
1665
1679
  if not conflicts:
1666
1680
  return current # overwhelmingly common path: no extra Dimension construction
1667
1681
 
1668
- cache: dict[tuple[int, float], Any] = {}
1682
+ cache: dict[tuple[int, float, float], Any] = {}
1669
1683
 
1670
- def _rebuild(index, centre):
1671
- key = (index, round(centre, 6))
1684
+ def _rebuild(index, centre, distance_delta=0.0):
1685
+ key = (index, round(centre, 6), round(distance_delta, 6))
1672
1686
  if key in cache:
1673
1687
  return cache[key]
1674
1688
  name, dim = original[index]
@@ -1682,7 +1696,14 @@ def prevent_dimension_label_ink(
1682
1696
  kwargs["label_offset_x"] = (
1683
1697
  kwargs.get("label_offset_x", 0.0) + (centre - natural) * direction
1684
1698
  )
1685
- rebuilt = _dim(spec.p1, spec.p2, spec.side, spec.distance, spec.draft, **kwargs)
1699
+ rebuilt = _dim(
1700
+ spec.p1,
1701
+ spec.p2,
1702
+ spec.side,
1703
+ spec.distance + distance_delta,
1704
+ spec.draft,
1705
+ **kwargs,
1706
+ )
1686
1707
  # The producer attaches semantic evidence before the corridor commits the
1687
1708
  # survivor. Rebuilding only the rendered Dimension must not erase that evidence:
1688
1709
  # hole-table escalation and coverage lint read these riders from the final object.
@@ -1765,13 +1786,30 @@ def prevent_dimension_label_ink(
1765
1786
  name, _dim_obj = original[index]
1766
1787
  if name in immutable or infos[index] is None:
1767
1788
  continue
1768
- for centre in _centres_for(index, current):
1769
- trial = list(current)
1770
- trial[index] = (name, _rebuild(index, centre))
1771
- objective, trial_conflicts = _objective(trial)
1772
- key = (objective, index, round(centre, 9))
1773
- if objective < current_objective and (best is None or key < best[0]):
1774
- best = (key, trial, objective, trial_conflicts)
1789
+ distances = (0.0,) if perpendicular_step is None else (0.0, perpendicular_step)
1790
+ for distance_delta in distances:
1791
+ for centre in _centres_for(index, current):
1792
+ rebuilt = _rebuild(index, centre, distance_delta)
1793
+ if page is not None:
1794
+ box = _anno_box(rebuilt)
1795
+ if box is not None and not (
1796
+ page[0] <= box[0]
1797
+ and box[2] <= page[2]
1798
+ and page[1] <= box[1]
1799
+ and box[3] <= page[3]
1800
+ ):
1801
+ continue
1802
+ trial = list(current)
1803
+ trial[index] = (name, rebuilt)
1804
+ objective, trial_conflicts = _objective(trial)
1805
+ key = (
1806
+ objective,
1807
+ index,
1808
+ round(distance_delta, 9),
1809
+ round(centre, 9),
1810
+ )
1811
+ if objective < current_objective and (best is None or key < best[0]):
1812
+ best = (key, trial, objective, trial_conflicts)
1775
1813
  if best is None:
1776
1814
  break
1777
1815
  _key, current, current_objective, conflicts = best
@@ -3592,6 +3592,7 @@ def _draw_step_chain(
3592
3592
  for seg in segs
3593
3593
  ]
3594
3594
  mean_v = sum(vals) / len(vals)
3595
+ tier_step = draft.font_size + 2 * draft.pad_around_text
3595
3596
  if (
3596
3597
  allow_collapse
3597
3598
  and all(seg.label is None for seg in segs)
@@ -3610,7 +3611,6 @@ def _draw_step_chain(
3610
3611
  typ_name = f"{name_prefix}_typ" if start == 0 else f"{name_prefix}_typ{start}"
3611
3612
  candidates = [(typ_name, dim, _step_measurements(segs))]
3612
3613
  else:
3613
- tier_step = draft.font_size + 2 * draft.pad_around_text
3614
3614
  tiers = [0] * len(segs)
3615
3615
  if horizontal:
3616
3616
  cw = [
@@ -3699,6 +3699,7 @@ def _draw_step_chain(
3699
3699
  [(name, dim) for name, dim, _measurements in candidates],
3700
3700
  page=page,
3701
3701
  obstacles=strip_obstacles(dwg, view=view, crossable=CROSSABLE_TYPES),
3702
+ perpendicular_step=tier_step if horizontal else None,
3702
3703
  )
3703
3704
  ]
3704
3705
 
@@ -4599,7 +4600,7 @@ def _global_axis_centerline(first, second):
4599
4600
 
4600
4601
  def render_rotational(dwg, plan, a, *, ctx) -> int:
4601
4602
  """Rotational furniture from the IR `RotationalFeature` (#237): the OD dim (above
4602
- the front view), the rotation-axis centrelines (front + side), and the concentric
4603
+ the profile view), rotation-axis centrelines on planned profile projections, and concentric
4603
4604
  bore leaders stacked to the left of the front view. Returns the count placed.
4604
4605
 
4605
4606
  The OD/bore dimensions consume only approved compiled entries. Suppressed entries
@@ -4621,6 +4622,14 @@ def render_rotational(dwg, plan, a, *, ctx) -> int:
4621
4622
  # Planner-fed value + authored tolerance/fit suffix (#754).
4622
4623
  return f"ø{dim.value_text}{_tol_suffix(dim.tolerance, draft)}"
4623
4624
 
4625
+ def _place_axis_centerline(item, name, view):
4626
+ # Automatic view selection may omit one of a turned body's two equivalent profile
4627
+ # projections. Furniture is not a semantic requirement and therefore does not pass
4628
+ # through the dimension planner's missing-view gate; guard it explicitly so it cannot
4629
+ # leave an orphan dashed line at the absent view's former page position (#1262).
4630
+ if view in dwg.views:
4631
+ ctx.place(item, name, view=view)
4632
+
4624
4633
  if axis == "z":
4625
4634
  # Vertical turning axis (the common case): OD across the top of the front
4626
4635
  # (profile) view; axis centrelines vertical on front + side.
@@ -4640,21 +4649,21 @@ def render_rotational(dwg, plan, a, *, ctx) -> int:
4640
4649
  measurement=od_dim.id,
4641
4650
  )
4642
4651
  n += 1
4643
- ctx.place(
4652
+ _place_axis_centerline(
4644
4653
  _global_axis_centerline(
4645
4654
  (FX(a.cx), FZ(a.bb.min.Z) - 5, 0),
4646
4655
  (FX(a.cx), FZ(a.bb.max.Z) + 5, 0),
4647
4656
  ),
4648
4657
  "centerline_front",
4649
- view="front",
4658
+ "front",
4650
4659
  )
4651
- ctx.place(
4660
+ _place_axis_centerline(
4652
4661
  _global_axis_centerline(
4653
4662
  (SX(a.cy), SZ(a.bb.min.Z) - 5, 0),
4654
4663
  (SX(a.cy), SZ(a.bb.max.Z) + 5, 0),
4655
4664
  ),
4656
4665
  "centerline_side",
4657
- view="side",
4666
+ "side",
4658
4667
  )
4659
4668
 
4660
4669
  # Concentric bore leaders to the left of the front view, centred on the axis.
@@ -4738,21 +4747,21 @@ def render_rotational(dwg, plan, a, *, ctx) -> int:
4738
4747
  measurement=od_dim.id,
4739
4748
  )
4740
4749
  n += 1
4741
- ctx.place(
4750
+ _place_axis_centerline(
4742
4751
  _global_axis_centerline(
4743
4752
  (FX(a.bb.min.X) - 5, FZ(a.cz), 0),
4744
4753
  (FX(a.bb.max.X) + 5, FZ(a.cz), 0),
4745
4754
  ),
4746
4755
  "centerline_front",
4747
- view="front",
4756
+ "front",
4748
4757
  )
4749
- ctx.place(
4758
+ _place_axis_centerline(
4750
4759
  _global_axis_centerline(
4751
4760
  (PX(a.bb.min.X) - 5, PY(a.cy), 0),
4752
4761
  (PX(a.bb.max.X) + 5, PY(a.cy), 0),
4753
4762
  ),
4754
4763
  "centerline_plan",
4755
- view="plan",
4764
+ "plan",
4756
4765
  )
4757
4766
  elif axis == "y":
4758
4767
  # Horizontal turning axis along Y (#222): the OD is the Z extent — a vertical
@@ -4774,21 +4783,21 @@ def render_rotational(dwg, plan, a, *, ctx) -> int:
4774
4783
  measurement=od_dim.id,
4775
4784
  )
4776
4785
  n += 1
4777
- ctx.place(
4786
+ _place_axis_centerline(
4778
4787
  _global_axis_centerline(
4779
4788
  (SX(a.bb.min.Y) - 5, SZ(a.cz), 0),
4780
4789
  (SX(a.bb.max.Y) + 5, SZ(a.cz), 0),
4781
4790
  ),
4782
4791
  "centerline_side",
4783
- view="side",
4792
+ "side",
4784
4793
  )
4785
- ctx.place(
4794
+ _place_axis_centerline(
4786
4795
  _global_axis_centerline(
4787
4796
  (PX(a.cx), PY(a.bb.min.Y) - 5, 0),
4788
4797
  (PX(a.cx), PY(a.bb.max.Y) + 5, 0),
4789
4798
  ),
4790
4799
  "centerline_plan",
4791
- view="plan",
4800
+ "plan",
4792
4801
  )
4793
4802
  return n
4794
4803
 
@@ -4813,6 +4822,8 @@ def render_local_turned_centerlines(dwg, a, *, ctx) -> int:
4813
4822
 
4814
4823
  def _place(item, name, view):
4815
4824
  nonlocal placed
4825
+ if view not in dwg.views:
4826
+ return
4816
4827
  if ctx.registry.named(name) is not None:
4817
4828
  return
4818
4829
  ctx.place(item, name, view=view)