draftwright 0.4.16__tar.gz → 0.4.18__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.
- {draftwright-0.4.16 → draftwright-0.4.18}/CHANGELOG.md +394 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/PKG-INFO +12 -7
- {draftwright-0.4.16 → draftwright-0.4.18}/README.md +10 -5
- draftwright-0.4.18/docs/adr/README.md +48 -0
- draftwright-0.4.18/docs/reference/recogniser-capabilities.md +737 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/docs/reference/sheet.md +117 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/docs/research/1062-repeating-radial-profile-evidence.md +5 -5
- {draftwright-0.4.16 → draftwright-0.4.18}/pyproject.toml +3 -2
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/__init__.py +17 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/_core.py +48 -18
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/_geometry.py +219 -5
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/_warnings.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/analysis.py +406 -150
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/annotations/__init__.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/annotations/_common.py +219 -32
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/annotations/balloons.py +5 -5
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/annotations/from_model.py +1702 -162
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/annotations/holes.py +139 -96
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/annotations/leaders.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/annotations/orchestrator.py +86 -27
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/annotations/sections.py +63 -18
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/audit.py +1 -1
- draftwright-0.4.18/src/draftwright/blend_contract.py +147 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/builder.py +134 -62
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/cli.py +38 -4
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/compose.py +85 -24
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/drawing.py +610 -115
- draftwright-0.4.18/src/draftwright/evaluation/step_analysis.py +5817 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/export.py +2 -2
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/fits.py +1 -1
- draftwright-0.4.18/src/draftwright/inspection.py +281 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/inspection_contract.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/intents.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/layout.py +17 -17
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/__init__.py +39 -1
- draftwright-0.4.18/src/draftwright/linting/angled_step_coverage.py +38 -0
- draftwright-0.4.18/src/draftwright/linting/blend_coverage.py +219 -0
- draftwright-0.4.18/src/draftwright/linting/chamfer_coverage.py +195 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/channel_coverage.py +5 -1
- draftwright-0.4.18/src/draftwright/linting/circular_blind_step_coverage.py +355 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/coverage.py +832 -181
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/evidence.py +5 -5
- draftwright-0.4.18/src/draftwright/linting/fillet_coverage.py +192 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/flat_coverage.py +11 -3
- draftwright-0.4.18/src/draftwright/linting/groove_coverage.py +268 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/hole_coverage.py +48 -19
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/ink_overlap.py +3 -3
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/issues.py +42 -1
- draftwright-0.4.18/src/draftwright/linting/pad_coverage.py +399 -0
- draftwright-0.4.18/src/draftwright/linting/paired_ramp_step_coverage.py +231 -0
- draftwright-0.4.18/src/draftwright/linting/passage_coverage.py +38 -0
- draftwright-0.4.18/src/draftwright/linting/plate_coverage.py +774 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/pmi_coverage.py +1 -1
- draftwright-0.4.18/src/draftwright/linting/pocket_coverage.py +333 -0
- draftwright-0.4.18/src/draftwright/linting/pocket_pattern_coverage.py +389 -0
- draftwright-0.4.18/src/draftwright/linting/polygonal_boss_coverage.py +394 -0
- draftwright-0.4.18/src/draftwright/linting/polygonal_stock_coverage.py +472 -0
- draftwright-0.4.18/src/draftwright/linting/prismatic_pocket_coverage.py +38 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/quality.py +151 -44
- draftwright-0.4.18/src/draftwright/linting/rectangular_blind_slot_coverage.py +322 -0
- draftwright-0.4.18/src/draftwright/linting/requirements.py +102 -0
- draftwright-0.4.18/src/draftwright/linting/round_bottom_blind_slot_coverage.py +328 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/slot_coverage.py +16 -9
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/structural.py +5 -5
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/suggest.py +1 -1
- draftwright-0.4.18/src/draftwright/linting/through_step_coverage.py +662 -0
- draftwright-0.4.18/src/draftwright/linting/turned_step_coverage.py +525 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/make_drawing.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/model/__init__.py +28 -2
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/model/callout.py +6 -6
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/model/compiled.py +180 -37
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/model/declare.py +255 -21
- draftwright-0.4.18/src/draftwright/model/detect.py +2666 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/model/ir.py +766 -33
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/model/planner.py +77 -38
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/model/pmi_lowering.py +31 -6
- draftwright-0.4.18/src/draftwright/plate_correspondence.py +318 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/pmi.py +172 -52
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/projection.py +39 -3
- draftwright-0.4.18/src/draftwright/recogniser_contract.py +1366 -0
- draftwright-0.4.18/src/draftwright/recogniser_policy.py +132 -0
- draftwright-0.4.18/src/draftwright/recogniser_schema.py +89 -0
- draftwright-0.4.18/src/draftwright/recognition_cache.py +78 -0
- draftwright-0.4.18/src/draftwright/recognition_frame.py +350 -0
- draftwright-0.4.18/src/draftwright/recognition_ownership.py +812 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/registry.py +6 -6
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/repair.py +4 -2
- draftwright-0.4.18/src/draftwright/reporting.py +583 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/sheet.py +134 -53
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/sheet_emit.py +343 -78
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/view_plan.py +18 -18
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/_kernel.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/_layout_sig.py +1 -1
- draftwright-0.4.18/tests/_recogniser_public_contract.py +150 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/conftest.py +63 -23
- draftwright-0.4.18/tests/fixtures/evaluation/README.md +243 -0
- draftwright-0.4.18/tests/fixtures/evaluation/chamfer-asymmetric.step +505 -0
- draftwright-0.4.18/tests/fixtures/evaluation/chamfer-compound.step +547 -0
- draftwright-0.4.18/tests/fixtures/evaluation/chamfer-overlap.step +776 -0
- draftwright-0.4.18/tests/fixtures/evaluation/chamfer-plain.step +415 -0
- draftwright-0.4.18/tests/fixtures/evaluation/chamfer-planar-x.step +535 -0
- draftwright-0.4.18/tests/fixtures/evaluation/chamfer-planar-y.step +535 -0
- draftwright-0.4.18/tests/fixtures/evaluation/chamfer-planar-z.step +505 -0
- draftwright-0.4.18/tests/fixtures/evaluation/chamfer-topology-a.step +596 -0
- draftwright-0.4.18/tests/fixtures/evaluation/chamfer-topology-b.step +596 -0
- draftwright-0.4.18/tests/fixtures/evaluation/chamfer-turned.step +210 -0
- draftwright-0.4.18/tests/fixtures/evaluation/corpus-chamfers-v1.json +200 -0
- draftwright-0.4.18/tests/fixtures/evaluation/corpus-countersinks-v1.json +188 -0
- draftwright-0.4.18/tests/fixtures/evaluation/corpus-double-d-bores-v1.json +287 -0
- draftwright-0.4.18/tests/fixtures/evaluation/corpus-fillets-v1.json +211 -0
- draftwright-0.4.18/tests/fixtures/evaluation/corpus-flats-v1.json +227 -0
- draftwright-0.4.18/tests/fixtures/evaluation/corpus-grooves-v1.json +164 -0
- draftwright-0.4.18/tests/fixtures/evaluation/corpus-hole-patterns-v1.json +151 -0
- draftwright-0.4.18/tests/fixtures/evaluation/corpus-plates-v1.json +257 -0
- draftwright-0.4.18/tests/fixtures/evaluation/corpus-pocket-patterns-v1.json +199 -0
- draftwright-0.4.18/tests/fixtures/evaluation/corpus-pockets-v1.json +269 -0
- draftwright-0.4.18/tests/fixtures/evaluation/corpus-polygonal-bosses-v1.json +939 -0
- draftwright-0.4.18/tests/fixtures/evaluation/corpus-polygonal-stock-v1.json +198 -0
- draftwright-0.4.18/tests/fixtures/evaluation/corpus-rectangular-pads-v1.json +222 -0
- draftwright-0.4.18/tests/fixtures/evaluation/corpus-turned-steps-v1.json +166 -0
- draftwright-0.4.18/tests/fixtures/evaluation/countersink-deburr.step +876 -0
- draftwright-0.4.18/tests/fixtures/evaluation/countersink-external-cone.step +274 -0
- draftwright-0.4.18/tests/fixtures/evaluation/countersink-mixed-pair.step +736 -0
- draftwright-0.4.18/tests/fixtures/evaluation/countersink-single.step +575 -0
- draftwright-0.4.18/tests/fixtures/evaluation/countersink-topology-a.step +736 -0
- draftwright-0.4.18/tests/fixtures/evaluation/countersink-topology-b.step +736 -0
- draftwright-0.4.18/tests/fixtures/evaluation/double-d-axis-x.step +814 -0
- draftwright-0.4.18/tests/fixtures/evaluation/double-d-axis-y.step +814 -0
- draftwright-0.4.18/tests/fixtures/evaluation/double-d-blind.step +790 -0
- draftwright-0.4.18/tests/fixtures/evaluation/double-d-coaxial-compound.step +1591 -0
- draftwright-0.4.18/tests/fixtures/evaluation/double-d-opposed-blind.step +1164 -0
- draftwright-0.4.18/tests/fixtures/evaluation/double-d-roll-30.step +814 -0
- draftwright-0.4.18/tests/fixtures/evaluation/double-d-round-bore.step +511 -0
- draftwright-0.4.18/tests/fixtures/evaluation/double-d-single-z.step +784 -0
- draftwright-0.4.18/tests/fixtures/evaluation/double-d-topology-a.step +1591 -0
- draftwright-0.4.18/tests/fixtures/evaluation/double-d-topology-b.step +1591 -0
- draftwright-0.4.18/tests/fixtures/evaluation/fillet-compound.step +977 -0
- draftwright-0.4.18/tests/fixtures/evaluation/fillet-overlap.step +597 -0
- draftwright-0.4.18/tests/fixtures/evaluation/fillet-plain.step +415 -0
- draftwright-0.4.18/tests/fixtures/evaluation/fillet-planar-x.step +537 -0
- draftwright-0.4.18/tests/fixtures/evaluation/fillet-planar-y.step +537 -0
- draftwright-0.4.18/tests/fixtures/evaluation/fillet-planar-z.step +507 -0
- draftwright-0.4.18/tests/fixtures/evaluation/fillet-repeated.step +820 -0
- draftwright-0.4.18/tests/fixtures/evaluation/fillet-topology-a.step +617 -0
- draftwright-0.4.18/tests/fixtures/evaluation/fillet-topology-b.step +617 -0
- draftwright-0.4.18/tests/fixtures/evaluation/fillet-turned.step +211 -0
- draftwright-0.4.18/tests/fixtures/evaluation/flat-coaxial.step +437 -0
- draftwright-0.4.18/tests/fixtures/evaluation/flat-double-d.step +419 -0
- draftwright-0.4.18/tests/fixtures/evaluation/flat-lone-d.step +237 -0
- draftwright-0.4.18/tests/fixtures/evaluation/flat-nonround.step +415 -0
- draftwright-0.4.18/tests/fixtures/evaluation/flat-slanted-double-d.step +449 -0
- draftwright-0.4.18/tests/fixtures/evaluation/flat-topology-a.step +437 -0
- draftwright-0.4.18/tests/fixtures/evaluation/flat-topology-b.step +437 -0
- draftwright-0.4.18/tests/fixtures/evaluation/groove-compound.step +665 -0
- draftwright-0.4.18/tests/fixtures/evaluation/groove-lone-x.step +381 -0
- draftwright-0.4.18/tests/fixtures/evaluation/groove-lone-y.step +381 -0
- draftwright-0.4.18/tests/fixtures/evaluation/groove-lone-z.step +351 -0
- draftwright-0.4.18/tests/fixtures/evaluation/groove-monotonic-negative.step +249 -0
- draftwright-0.4.18/tests/fixtures/evaluation/groove-narrow.step +351 -0
- draftwright-0.4.18/tests/fixtures/evaluation/groove-topology-a.step +556 -0
- draftwright-0.4.18/tests/fixtures/evaluation/groove-topology-b.step +556 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pad-compound-equal.step +1595 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pad-detached-body-negative.step +853 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pad-full-span-ledge-negative.step +776 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pad-nested-staircase-negative.step +2230 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pad-topology-a.step +1156 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pad-topology-b.step +1156 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pad-x-negative.step +786 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pad-x-positive.step +786 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pad-y-negative.step +786 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pad-y-positive.step +786 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pad-z-negative.step +786 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pad-z-positive.step +786 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pattern-ambiguous.step +703 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pattern-grid.step +992 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pattern-topology-a.step +1090 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pattern-topology-b.step +1090 -0
- draftwright-0.4.18/tests/fixtures/evaluation/plate-compound-equal.step +1575 -0
- draftwright-0.4.18/tests/fixtures/evaluation/plate-cross-topology-a.step +1497 -0
- draftwright-0.4.18/tests/fixtures/evaluation/plate-cross-topology-b.step +1497 -0
- draftwright-0.4.18/tests/fixtures/evaluation/plate-detached-negative.step +793 -0
- draftwright-0.4.18/tests/fixtures/evaluation/plate-rotational-negative.step +147 -0
- draftwright-0.4.18/tests/fixtures/evaluation/plate-single-negative.step +415 -0
- draftwright-0.4.18/tests/fixtures/evaluation/plate-t-xz.step +776 -0
- draftwright-0.4.18/tests/fixtures/evaluation/plate-t-yz.step +776 -0
- draftwright-0.4.18/tests/fixtures/evaluation/plate-thick-negative.step +776 -0
- draftwright-0.4.18/tests/fixtures/evaluation/plate-u-additive.step +776 -0
- draftwright-0.4.18/tests/fixtures/evaluation/plate-u-cut.step +776 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pocket-compound.step +1595 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pocket-edge-anchored.step +685 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pocket-lone.step +786 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pocket-opposed.step +1156 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pocket-pattern-ambiguous.step +1526 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pocket-pattern-grid.step +2638 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pocket-pattern-linear.step +1897 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pocket-pattern-pair.step +1156 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pocket-pattern-topology-a.step +3008 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pocket-pattern-topology-b.step +3007 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pocket-prismatic-negative.step +966 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pocket-side.step +816 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pocket-through-negative.step +780 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pocket-topology-a.step +1156 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pocket-topology-b.step +1156 -0
- draftwright-0.4.18/tests/fixtures/evaluation/pocket-two-equal.step +1156 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-compound-equal.step +1008 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-detached-negative.step +1033 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-in-plane-rotated.step +966 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-other-protrusions-negative.step +990 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-recess-negative.step +966 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-stock-negative.step +625 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-topology-a.step +1516 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-topology-b.step +1516 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-x.step +996 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-y.step +996 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-boss-z.step +966 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-compound-negative.step +637 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-cylinder-negative.step +147 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-irregular-negative.step +595 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-octagon-negative.step +776 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-recess-negative.step +705 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-roll17.step +625 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-topology-a.step +595 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-topology-b.step +595 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-translated.step +625 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-x.step +625 -0
- draftwright-0.4.18/tests/fixtures/evaluation/polygonal-stock-y.step +625 -0
- draftwright-0.4.18/tests/fixtures/evaluation/turned-step-axis-x.step +381 -0
- draftwright-0.4.18/tests/fixtures/evaluation/turned-step-axis-y.step +279 -0
- draftwright-0.4.18/tests/fixtures/evaluation/turned-step-axis-z.step +249 -0
- draftwright-0.4.18/tests/fixtures/evaluation/turned-step-compound.step +521 -0
- draftwright-0.4.18/tests/fixtures/evaluation/turned-step-repeated-lengths.step +381 -0
- draftwright-0.4.18/tests/fixtures/evaluation/turned-step-through-bore.step +345 -0
- draftwright-0.4.18/tests/fixtures/evaluation/turned-step-topology-a.step +351 -0
- draftwright-0.4.18/tests/fixtures/evaluation/turned-step-topology-b.step +381 -0
- draftwright-0.4.18/tests/fixtures/evaluation/turned-step-translated-blind-bore.step +381 -0
- draftwright-0.4.18/tests/fixtures/issue_1247_angled_blind_step.step +776 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_add_dimension.py +50 -7
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_adr0018_arrangement_gate.py +4 -4
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_adr0018_view_routing.py +3 -3
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_adr0018_view_selection.py +42 -4
- draftwright-0.4.18/tests/test_adr_corpus.py +134 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_architecture_docs.py +7 -4
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_audit_differential.py +8 -6
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_carve_free_position_callers.py +10 -10
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_compiled_plan_boundary.py +123 -28
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_counting_calls.py +25 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_declare.py +44 -14
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_declared_recognition_gate.py +32 -38
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_dense_sheet_canary.py +2 -2
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_deprecation_dates.py +3 -2
- draftwright-0.4.18/tests/test_detect_once.py +147 -0
- draftwright-0.4.18/tests/test_detect_registry.py +309 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_drawing_encapsulation.py +41 -25
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_e2e_slice.py +1 -1
- draftwright-0.4.18/tests/test_external_recognition_boundary.py +127 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_fits.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_flat_completeness.py +1 -2
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_flat_stock_identity.py +2 -2
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_gdt_placement.py +4 -4
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_grid_lattice_convention.py +3 -3
- draftwright-0.4.18/tests/test_import_boundaries.py +1220 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_inspection_contract.py +7 -3
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1058_wheel_profile.py +203 -293
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1082_polygonal_stock.py +9 -5
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1130_view_planning_evidence.py +9 -7
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1142_hole_leader_labels.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1143_hole_completeness.py +36 -12
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1146_scale_completeness.py +13 -10
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1153_contradictory_dimensions.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1166_cross_pass_feature_leaders.py +30 -26
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1176_quality_fidelity.py +2 -2
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1177_angular_dimensions.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1196_deterministic_view_names.py +2 -2
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1202_observed_drawing_consumer.py +11 -12
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1215_envelope_tolerance.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1215_no_approved_tolerance_is_dropped.py +11 -11
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1216_callout_reservation_measures_ink.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1217_claimed_representations.py +2 -2
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1217_the_facility_is_shared.py +3 -3
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1229_ledger_member_keying.py +2 -1
- draftwright-0.4.18/tests/test_issue_1245_passage_disposition.py +180 -0
- draftwright-0.4.18/tests/test_issue_1246_prismatic_pocket_disposition.py +187 -0
- draftwright-0.4.18/tests/test_issue_1247_angled_step_disposition.py +100 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1254_turned_chamfers.py +10 -14
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1260_view_constraints.py +31 -2
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1262_automatic_turned_views.py +5 -2
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1308_machined_leader_analytics.py +10 -2
- draftwright-0.4.16/tests/test_issue_1332_overlap_remedy_fast.py → draftwright-0.4.18/tests/test_issue_1332_overlap_remedy.py +17 -24
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1351_structured_note_coverage.py +4 -2
- draftwright-0.4.18/tests/test_issue_1357_framed_activation.py +224 -0
- draftwright-0.4.18/tests/test_issue_1357_framed_boundary.py +312 -0
- draftwright-0.4.18/tests/test_issue_1357_plural_turned_profiles.py +1013 -0
- draftwright-0.4.18/tests/test_issue_1357_pmi_frame.py +171 -0
- draftwright-0.4.18/tests/test_issue_1369_hole_completeness_evidence.py +166 -0
- draftwright-0.4.18/tests/test_issue_1370_countersink_completeness_evidence.py +524 -0
- draftwright-0.4.18/tests/test_issue_1370_double_d_completeness_evidence.py +702 -0
- draftwright-0.4.18/tests/test_issue_1370_hole_pattern_completeness_evidence.py +335 -0
- draftwright-0.4.18/tests/test_issue_1371_flat_completeness_evidence.py +287 -0
- draftwright-0.4.18/tests/test_issue_1371_polygonal_stock_completeness_evidence.py +1206 -0
- draftwright-0.4.18/tests/test_issue_1372_groove_completeness_evidence.py +677 -0
- draftwright-0.4.18/tests/test_issue_1372_pad_completeness_evidence.py +789 -0
- draftwright-0.4.18/tests/test_issue_1372_pocket_completeness_evidence.py +454 -0
- draftwright-0.4.18/tests/test_issue_1372_pocket_pattern_completeness_evidence.py +906 -0
- draftwright-0.4.18/tests/test_issue_1372_polygonal_boss_completeness_evidence.py +847 -0
- draftwright-0.4.18/tests/test_issue_1373_plate_completeness_evidence.py +1427 -0
- draftwright-0.4.18/tests/test_issue_1374_chamfer_completeness_evidence.py +560 -0
- draftwright-0.4.18/tests/test_issue_1374_fillet_completeness_evidence.py +528 -0
- draftwright-0.4.18/tests/test_issue_1374_turned_step_completeness_evidence.py +1503 -0
- draftwright-0.4.18/tests/test_issue_1382_046_step_inventory.py +66 -0
- draftwright-0.4.18/tests/test_issue_1382_circular_blind_step_semantics.py +1071 -0
- draftwright-0.4.18/tests/test_issue_1382_framed_step_family_evidence.py +426 -0
- draftwright-0.4.18/tests/test_issue_1382_paired_ramp_semantics.py +468 -0
- draftwright-0.4.18/tests/test_issue_1382_through_step_semantics.py +1749 -0
- draftwright-0.4.18/tests/test_issue_1392_recognisers_048.py +584 -0
- draftwright-0.4.18/tests/test_issue_1395_degenerate_iso_region.py +277 -0
- draftwright-0.4.18/tests/test_issue_1397_unverifiable_requirement_message.py +247 -0
- draftwright-0.4.18/tests/test_issue_1421_rectangular_blind_slot_completeness.py +589 -0
- draftwright-0.4.18/tests/test_issue_1421_rectangular_blind_slot_semantics.py +448 -0
- draftwright-0.4.18/tests/test_issue_1421_round_bottom_blind_slot_completeness.py +621 -0
- draftwright-0.4.18/tests/test_issue_1421_round_bottom_blind_slot_semantics.py +479 -0
- draftwright-0.4.18/tests/test_issue_1433_blend_semantics.py +1061 -0
- draftwright-0.4.18/tests/test_issue_1438_boss_ownership.py +481 -0
- draftwright-0.4.18/tests/test_issue_1438_channel_ownership.py +376 -0
- draftwright-0.4.18/tests/test_issue_1438_cli_report_sidecar.py +132 -0
- draftwright-0.4.18/tests/test_issue_1438_generation_snapshot.py +276 -0
- draftwright-0.4.18/tests/test_issue_1438_nested_ownership.py +318 -0
- draftwright-0.4.18/tests/test_issue_1438_occurrence_ownership.py +329 -0
- draftwright-0.4.18/tests/test_issue_1438_pattern_ownership.py +350 -0
- draftwright-0.4.18/tests/test_issue_1438_plate_ownership.py +444 -0
- draftwright-0.4.18/tests/test_issue_1438_policy_dispositions.py +316 -0
- draftwright-0.4.18/tests/test_issue_1438_report_projection.py +882 -0
- draftwright-0.4.18/tests/test_issue_1438_report_writer.py +136 -0
- draftwright-0.4.18/tests/test_issue_1438_through_step_ownership.py +462 -0
- draftwright-0.4.18/tests/test_issue_1438_turned_step_ownership.py +249 -0
- draftwright-0.4.18/tests/test_issue_1460_step_inspection.py +790 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_676_polygonal_boss.py +3 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_740_leader_assignment.py +7 -2
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_798_silhouette_lint.py +12 -10
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_885_prismatic_coverage.py +7 -3
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_915_dense_case.py +23 -14
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_958_cross_solid_recognition.py +7 -5
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_label_provenance.py +2 -2
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_layout.py +5 -4
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_layout_cleanliness.py +6 -6
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_layout_hypothesis.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_layout_property.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_lint_ink_overlap.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_lint_structural.py +2 -2
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_linting.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_location_vocabulary.py +3 -3
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_make_drawing.py +115 -58
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_object_aspects.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_parameter_id.py +66 -3
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_part_model.py +11 -10
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_pitch_dim_footprint.py +2 -2
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_pmi.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_pocket_pattern_recognition.py +10 -6
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_private_test_attr_reads.py +3 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_private_test_imports.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_quality_components.py +122 -1
- draftwright-0.4.18/tests/test_recogniser_capabilities.py +1862 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_recogniser_contract.py +325 -68
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_recognition_result.py +18 -73
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_refactor_golden.py +9 -9
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_registry.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_render_seam.py +4 -4
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_repack_geometry_seam.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_sheet_emit.py +234 -14
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_sheet_gdt.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_sheet_identity_invariant.py +6 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_sheet_notes.py +2 -2
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_sheet_of.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_sheet_section.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_sheet_tables.py +3 -3
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_slanted_blind_step.py +1 -49
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_slot_pattern_recognition.py +10 -2
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_soft_deprecation.py +2 -2
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_strip_layout.py +100 -21
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_suppression_ledger.py +3 -3
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_suppression_marks.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_tolerances.py +8 -8
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_turned_steps.py +1 -1
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_view_plan.py +28 -13
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_workflows.py +159 -0
- draftwright-0.4.16/docs/adr/README.md +0 -57
- draftwright-0.4.16/docs/reference/recogniser-capabilities.md +0 -98
- draftwright-0.4.16/src/draftwright/evaluation/step_analysis.py +0 -924
- draftwright-0.4.16/src/draftwright/linting/polygonal_stock_coverage.py +0 -129
- draftwright-0.4.16/src/draftwright/model/detect.py +0 -1142
- draftwright-0.4.16/src/draftwright/recogniser_contract.py +0 -667
- draftwright-0.4.16/src/draftwright/recognition_cache.py +0 -26
- draftwright-0.4.16/tests/fixtures/evaluation/README.md +0 -20
- draftwright-0.4.16/tests/test_detect_once.py +0 -121
- draftwright-0.4.16/tests/test_detect_registry.py +0 -209
- draftwright-0.4.16/tests/test_external_recognition_boundary.py +0 -62
- draftwright-0.4.16/tests/test_import_boundaries.py +0 -512
- draftwright-0.4.16/tests/test_issue_1332_overlap_remedy.py +0 -89
- draftwright-0.4.16/tests/test_recogniser_capabilities.py +0 -762
- draftwright-0.4.16/tests/test_recognition_manifest.py +0 -723
- {draftwright-0.4.16 → draftwright-0.4.18}/.gitignore +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/LICENSE +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/skills/SKILL.md +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/_build_profile.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/_pmi_part21.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/annotate.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/annotations/gears.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/evaluation/__init__.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/fonts/IBMPlexMono-Regular.ttf +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/fonts/IBMPlexSansCondensed-Regular.ttf +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/fonts/LICENSE-IBMPlexMono-OFL.txt +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/fonts/LICENSE-IBMPlexSansCondensed-OFL.txt +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/fonts/__init__.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/_registry.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/gear_coverage.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/linting/profiled_bore_coverage.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/py.typed +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/recognition/__init__.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/src/draftwright/score.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/ap242_single_cylinder_diameter.step +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/evaluation/ambiguous-open-semicircle.step +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/evaluation/blind-hole.step +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/evaluation/corpus-v1.json +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/evaluation/plain-block.step +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/evaluation/topology-a.step +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/evaluation/topology-b.step +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/grm03_thumbwheel_drive_screw.step +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/grm03_thumbwheel_drive_screw_ap242_pmi.step +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/grm04_drive_plate.step +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/if_step_flat_across_cylinder.step +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/issue_1058_wheel_rh.step +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/issue_909_basic_part_design_017_body.step +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/issue_915_case_study_2.step +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/nist_ctc_01_asme1_ap203.stp +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/nist_ctc_01_asme1_ap242.stp +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/nist_ctc_02_asme1_ap203.stp +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/nist_ctc_02_asme1_ap242.stp +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/nist_ctc_03_asme1_ap203.stp +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/nist_ctc_03_asme1_ap242.stp +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/nist_ctc_04_asme1_ap203.stp +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/nist_ctc_04_asme1_ap242.stp +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/nist_ctc_05_asme1_ap203.stp +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/nist_ctc_05_asme1_ap242.stp +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/fixtures/tuner_jig_blind_obround_pockets.step +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/bracket_section.json +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/centered_rebate.json +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/chamfered.json +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/filleted.json +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/flange_dense.json +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/grid_plate.json +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/grooved_shaft.json +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/hex_bar.json +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/holed_slot.json +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/pocketed.json +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/prismatic_ladder.json +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/scattered_plate.json +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/side_drilled.json +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/refactor_golden/turned_stepped.json +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_agents_guide.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_api_docs.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_balloon_ring_standoff.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_build_profile_harness.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_dimension_role_vocabulary.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_e2e_standards.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_export_dxf_curves.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_export_dxf_zoom.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_export_reproducible.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_fillets_adjacency.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_flat_stock_opposition.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_geometry_graph_spike.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_iso_nts_caption_placement.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1000_envelope_reuse.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1073_cross_body_patterns.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1086_declared_gears.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1116_ap242_hole_tolerance_lowering.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1144_transactional_hole_table.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1147_legibility_pair_aggregation.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1154_one_owner_per_measurement.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1155_grm04_sheet_use.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1187_unroutable_leaders.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1188_per_view_assignment.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1190_section_decision.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1204_multiscale_view_issues.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1209_linear_pmi_witnesses.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1216_pairwise_across_scale_groups.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1219_location_claims_its_own_axis.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1240_iso_above_strip_visibility.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1276_turned_leader_targets.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1281_turned_fillets.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1296_cylindrical_diameter_pmi.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1298_manufacturing_requirements.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1299_page_escalation.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1312_engine_costs.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1332_zone_labels.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1334_prevent_ink.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1336_grm03_ap242_pmi_fixture.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1338_scale_before_page_escalation.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1349_precision_display.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1350_detected_takeover.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1352_searchable_pdf_text.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1353_cnc_authoritative_workflow.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_1360_thread_depth.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_367_leader_ink.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_443_grm03_axial_coverage.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_563_placement_intent.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_676_polygonal_boss_declare.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_798_floor_cardinality.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_798_material_field.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_909_sloped_profile.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_916_pocket_leader.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_917_open_channel.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_924_zero_length_shoulders.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_issue_955_height_contingency.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_leader_footprint.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_lint_box_cache.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_lint_reconciliation.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_note_verb.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_occupancy_boxes.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_pmi_datum_lowering.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_pmi_gtol_lowering.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_pmi_part21.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_pocket_pattern.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_principal_profile_classifier.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_recogniser_adoption.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_recognition.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_score.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_script_detail_parity.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_shared_box_memo.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_slot_completeness.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_slot_pattern.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_solve_trace.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_step_analysis_evaluation.py +0 -0
- {draftwright-0.4.16 → draftwright-0.4.18}/tests/test_witness_label_reconciliation.py +0 -0
|
@@ -4,6 +4,123 @@
|
|
|
4
4
|
|
|
5
5
|
### Added
|
|
6
6
|
|
|
7
|
+
- Report schema v1 now projects one recognition-owned physical requirement ledger shared with
|
|
8
|
+
completeness. Each bounded requirement identifies its accepted source occurrence(s), final IR
|
|
9
|
+
owner(s), semantic parameter where applicable, placement/satisfaction state, annotation names,
|
|
10
|
+
and representation rationale. The roster is evaluated once per report and fails closed when
|
|
11
|
+
exact same-run evidence or provenance is absent; it does not create a second recognition scan,
|
|
12
|
+
persistent topology identity, inferred manufacturing intent, or visual change (#1438, ADR 0017
|
|
13
|
+
Amendment 26).
|
|
14
|
+
|
|
15
|
+
- Direct CLI rendering now writes `<output>.draftwright.json` by default, after successful visual
|
|
16
|
+
export, and prints its path with the requested artefacts. `--no-report` is the explicit opt-out;
|
|
17
|
+
library `Drawing.export()` remains free of report-writing side effects (#1438, ADR 0017
|
|
18
|
+
Amendment 25).
|
|
19
|
+
|
|
20
|
+
- Generated Sheet Python now embeds a deterministic, versioned, JSON-compatible snapshot of
|
|
21
|
+
actionable accepted-occurrence gaps from the exact recognition run that produced its model.
|
|
22
|
+
The compact snapshot carries only unsupported, deferred, evidence-only, and unexpectedly
|
|
23
|
+
missing public records; STEP inputs are read once and recognition uses a private copy of the
|
|
24
|
+
exact bytes named by the embedded basename and SHA-256, with a best-effort final replay-target
|
|
25
|
+
check before writing. The hash is a later reconciliation boundary, not a lock on the mutable
|
|
26
|
+
source path. It is explicitly generation-time evidence, never current completeness authority
|
|
27
|
+
(#1438, ADR 0017 Amendment 24).
|
|
28
|
+
|
|
29
|
+
- Accepted Plate occurrences now retain exact conditional ownership. Genuine multi-axis plates
|
|
30
|
+
keep their direct `PlateFeature`; other slabs are absorbed only when released same-run AAG
|
|
31
|
+
evidence joins them to the exact retained face-level, riser-shoulder, or slot-pattern owner.
|
|
32
|
+
Multi-owner claims are conjunctive, while whole-envelope, polygonal-boss, disconnected,
|
|
33
|
+
ambiguous, or malformed cases remain visibly `unexpectedly_missing` rather than borrowing an
|
|
34
|
+
owner from matching values or traversal order (#1438, ADR 0017 Amendment 23).
|
|
35
|
+
|
|
36
|
+
- `Drawing.write_report(path)` now atomically writes the versioned report as deterministic,
|
|
37
|
+
strict UTF-8 JSON without coupling library export to sidecar generation. Report and filesystem
|
|
38
|
+
failures leave any existing destination untouched, with best-effort temporary cleanup that does
|
|
39
|
+
not mask the primary error (#1438, ADR 0017 Amendment 22).
|
|
40
|
+
|
|
41
|
+
- Raw automatic drawings now expose `Drawing.report()`, a strict version-1 JSON-compatible
|
|
42
|
+
projection of every accepted recognition occurrence, its explicit consumer disposition and
|
|
43
|
+
report-local final IR owner(s), plus the existing lint summary. The published schema never
|
|
44
|
+
serializes provider references, topology IDs, object addresses, or transient member positions;
|
|
45
|
+
it makes requirement coverage an explicit field (subsequently populated by Amendment 26) and
|
|
46
|
+
calls a clean result `bounded-clear`, not manufacturing-ready. Paths without exact occurrence
|
|
47
|
+
ownership and raw paths with an unclassified accepted occurrence fail explicitly rather than
|
|
48
|
+
emit an empty or inferred report. Rendering remains unchanged (#1438, ADR 0017 Amendment 21).
|
|
49
|
+
|
|
50
|
+
- Accepted `FaceLevel` and `RiserEvidence` occurrences now receive explicit `evidence_only`
|
|
51
|
+
outcomes. The released records remain shared substrate for the supported correlated height
|
|
52
|
+
ladder and shoulder projection, not independent inferred features or drawing requirements; no
|
|
53
|
+
IR, Sheet DSL, renderer, or recogniser API change is introduced (#1438, ADR 0017 Amendment 20).
|
|
54
|
+
|
|
55
|
+
- Accepted round-boss occurrences now retain the exact existing consumer outcome: a singleton
|
|
56
|
+
`BossFeature`, one diameter-consolidated representative with transient member lineage, the exact
|
|
57
|
+
turned-step owner, or the exact groove owner reached through that step or the profile-gate
|
|
58
|
+
fallback. Ambiguous or missing correspondence fails closed without another scan, persistent ID,
|
|
59
|
+
generated artefact, or visual change (#1438, ADR 0017 Amendment 19).
|
|
60
|
+
|
|
61
|
+
- Accepted through-step occurrences now retain either their exact `ThroughStepFeature` or every
|
|
62
|
+
exact final `StepLevelFeature`, `PlateFeature`, and `EnvelopeFeature` that jointly carries the
|
|
63
|
+
established compatibility projection. Plate claims are body-local, replacement is atomic, and a
|
|
64
|
+
missing or ambiguous selected owner fails closed rather than granting partial credit. One
|
|
65
|
+
occurrence can name multiple run-local IR owners without a second scan, persistent ID, generated
|
|
66
|
+
artefact, or change to rendering machinery (#1438, ADR 0017 Amendment 18).
|
|
67
|
+
|
|
68
|
+
- Accepted turned-step occurrences now retain the conversion decision that already gives an
|
|
69
|
+
ordinary profile band its exact `StepFeature` or absorbs a groove-floor band into the exact
|
|
70
|
+
same-run `GrooveFeature`. The takeover must be one-to-one in both directions, so an ambiguous
|
|
71
|
+
groove, an adjacent band inside its positional tolerance, or any missing final owner fails closed
|
|
72
|
+
as `unexpectedly_missing`, with no second scan, persistent ID, generated artefact, or visual
|
|
73
|
+
change (#1438, ADR 0017 Amendment 17).
|
|
74
|
+
|
|
75
|
+
- Accepted channel occurrences now receive an exact conditional consumer outcome. A genuine
|
|
76
|
+
multi-axis plate channel is `represented` by its `ChannelFeature`; a monolithic Z-depth rebate is
|
|
77
|
+
`absorbed` only when one retained body-local support carries its floor and both shoulders into the
|
|
78
|
+
final step ladder. Cross-axis, disconnected, or filtered channels fail closed as
|
|
79
|
+
`unexpectedly_missing` instead of inheriting an unrelated ladder, without a second scan,
|
|
80
|
+
persistent ID, generated artefact, or visual change (#1438, ADR 0017 Amendment 16).
|
|
81
|
+
|
|
82
|
+
- Accepted countersink occurrences now receive an exact run-local outcome. A seat carried by a
|
|
83
|
+
`HoleRecord` is `absorbed` by that hole's final feature and transient member lineage; an unattached,
|
|
84
|
+
unowned, or duplicate nested occurrence fails closed without dimension matching, topology IDs, a
|
|
85
|
+
second scan, duplicate IR requirements, or visual changes (#1438, ADR 0017 Amendment 15).
|
|
86
|
+
|
|
87
|
+
- Accepted angled-step, passage, prismatic-pocket, oriented-slot, and repeating-radial-profile
|
|
88
|
+
occurrences now receive exact run-local ownerless outcomes from Draftwright's existing consumer
|
|
89
|
+
capability declaration: `unsupported`, `deferred`, or report-facing `evidence_only`, with closed
|
|
90
|
+
reason codes and existing tracking issues. Equal-valued occurrences stay distinct; policy does
|
|
91
|
+
not invent IR owners, requirements, topology IDs, recognition scans, generated artefacts, or
|
|
92
|
+
visual output (#1438, ADR 0017 Amendment 14).
|
|
93
|
+
|
|
94
|
+
- Accepted physical hole, slot, and pocket occurrences now retain explicit run-local ownership
|
|
95
|
+
when conversion represents a singleton or absorbs members into one same-spec hole group or
|
|
96
|
+
derived pattern feature. Family-specific reason codes and transient member lineage follow
|
|
97
|
+
member-specific AP242 splits to the exact final IR objects; missing lineage fails closed rather
|
|
98
|
+
than retaining a stale owner. Provider-derived patterns do not become invented occurrences, and
|
|
99
|
+
no report ID, extra recognition scan, generated artefact, or visual output is introduced (#1438,
|
|
100
|
+
ADR 0017 Amendment 13).
|
|
101
|
+
|
|
102
|
+
- Raw automatic builds now capture run-local, conversion-time ownership from accepted provider
|
|
103
|
+
occurrences to their exact Draftwright IR features for unconditional one-to-one adapters. Equal
|
|
104
|
+
record values, order, coordinates and topology indices cannot create a binding; an omitted direct
|
|
105
|
+
binding fails closed as unexpectedly missing, while ownership rules not yet implemented remain
|
|
106
|
+
explicitly unclassified. The experimental read-only `Drawing.recognition_ownership()` exposes
|
|
107
|
+
the non-serializable ledger; it stays outside the IR/compiler and changes no generated or visual
|
|
108
|
+
artefact (#1438, ADR 0017 Amendment 12).
|
|
109
|
+
|
|
110
|
+
- Raw automatic recognition now retains the provider's run-scoped `RecognitionEvidence` beside
|
|
111
|
+
its exact `RecognitionResult`, exposed through the experimental read-only
|
|
112
|
+
`Drawing.recognition_evidence()`. Declared drawings acquire the pair lazily on first physical
|
|
113
|
+
critique; bare and framed results remain evidence-less, and Draftwright never rescans merely to
|
|
114
|
+
backfill evidence. This is a non-visual reporting foundation and changes no rendered artefact
|
|
115
|
+
(#1438, ADRs 0015, 0017, 0020).
|
|
116
|
+
|
|
117
|
+
- Automatic drawings can opt into the provider-owned local recognition frame with
|
|
118
|
+
`framed_recognition=True`. The returned drawing exposes caller provenance, the exact downstream
|
|
119
|
+
working solid, frame, and a copied framed/raw/refusal decision. PMI correlation, off-axis pattern
|
|
120
|
+
placement, compilation, projection and physical lint remain in one coordinate system; typed frame
|
|
121
|
+
refusal performs one visible top-level raw fallback. Raw remains the rollout default (#1357,
|
|
122
|
+
ADR 0020).
|
|
123
|
+
|
|
7
124
|
- Referential and measured Sheet dimensions accept optional `view=` / `side=` placement
|
|
8
125
|
intent. Supported pairs survive IR/compiler and generated-script round trips, constrain
|
|
9
126
|
ordinary corridor candidates without exposing page coordinates, and fail clearly when a
|
|
@@ -37,11 +154,287 @@
|
|
|
37
154
|
|
|
38
155
|
### Changed
|
|
39
156
|
|
|
157
|
+
- Accepted schema-v3 straight or circular `Blend` chains, including concave occurrences, now cross
|
|
158
|
+
a dedicated end-to-end consumer path:
|
|
159
|
+
`BlendFeature`, explicit `Sheet.blend(...)`, executable generated declarations, one
|
|
160
|
+
compiler-approved `blend.radius` requirement, and a solver-owned grouped `n× R` leader. The
|
|
161
|
+
discriminated path kind, full canonical direction/normal, circular-path major radius,
|
|
162
|
+
rolling-ball radius, and material side remain in IR instead of being coerced to legacy Fillet
|
|
163
|
+
semantics; the provider aggregate remains the sole exact Fillet/Blend precedence authority.
|
|
164
|
+
Exact public-record/IR validation and completeness follow every accepted occurrence to placed,
|
|
165
|
+
structured-note, authored-suppressed, dropped, missing, or unverifiable outcomes. Raw and
|
|
166
|
+
provider-framed arbitrary rigid motions retain straight-path radius meaning; framed recognition
|
|
167
|
+
also retains circular paths, while raw arbitrarily rotated circular recognition remains an
|
|
168
|
+
upstream limitation (b123d-recognisers#491) (#1433; ADRs 0011, 0013–0017, 0020).
|
|
169
|
+
|
|
170
|
+
- Draftwright now exactly pins the immutable `b123d-recognisers` 0.4.14 release and advances its
|
|
171
|
+
fail-closed capability and inspection joins. `Blend` schema v3 replaces the old flat cylindrical
|
|
172
|
+
fields with exact `StraightBlendPath` and `CircularBlendPath` records and admits proved concave
|
|
173
|
+
and toroidal occurrences; Draftwright preserves those semantics through IR, `Sheet.blend(...)`,
|
|
174
|
+
generated replay, reporting, drawing, and completeness. Passage nested records advance to schema
|
|
175
|
+
v2 without changing Draftwright's unsupported passage policy. The provider's previously
|
|
176
|
+
recognised shallow nonzero `PairedRampStep` keeps its existing
|
|
177
|
+
two-requirement IR, public `Sheet.paired_ramp_step(...)` declaration, generated-code, compiler
|
|
178
|
+
callout, solver placement, and completeness meaning (#1430; ADRs 0011, 0013–0017, 0020).
|
|
179
|
+
|
|
180
|
+
- Rectangular blind slots recognised by `b123d-recognisers` 0.4.10 now cross a dedicated
|
|
181
|
+
Draftwright semantic path: `RectangularBlindSlotFeature`, the explicit
|
|
182
|
+
`Sheet.rectangular_blind_slot(...)` word, generated-code and role-specific tolerance round
|
|
183
|
+
trips, compiler-approved width/capped-run/depth measurements, and one solver-owned
|
|
184
|
+
`OPEN SLOT … DEEP` leader. Authored subsets retain every approved value with explicit
|
|
185
|
+
`WIDE`/`LONG`/`DEEP` roles, and leaders target proved cap/side material rather than the open
|
|
186
|
+
mouth. Native raw and rigidly moved framed builds retain the same three
|
|
187
|
+
measurement outcomes. A seven-case independently authored corpus now pins all six run/open-side
|
|
188
|
+
orientations plus an independently sized specimen: each occurrence contributes separate width,
|
|
189
|
+
capped-run and depth requirements followed by exact structural correspondence and measurement
|
|
190
|
+
provenance to placed, structured-note, suppressed, dropped, missing or unverifiable outcomes.
|
|
191
|
+
Removing recognition cannot shrink that 21-requirement benchmark (#1421; ADRs 0011,
|
|
192
|
+
0013–0017, 0020).
|
|
193
|
+
|
|
194
|
+
- Round-bottom blind slots recognised by `b123d-recognisers` 0.4.10 now have their own complete
|
|
195
|
+
Draftwright path rather than borrowing through-slot, pocket or rectangular-blind-slot grammar.
|
|
196
|
+
`RoundBottomBlindSlotFeature` retains the released run/opening topology and exposes the three
|
|
197
|
+
independent manufacturing requirements: capped run length, straight bottom-flat width and equal
|
|
198
|
+
side radius. `Sheet.round_bottom_blind_slot(...)`, generated code, role-specific tolerances and
|
|
199
|
+
one solver-owned `ROUND-BOTTOM OPEN SLOT …` leader all preserve those exact identities; derived
|
|
200
|
+
total width and depth are not double-counted. A seven-case independently authored corpus covers
|
|
201
|
+
all six signed principal orientations plus a separately sized specimen (21 physical requirements),
|
|
202
|
+
proves raw/framed drawing parity, and follows exact source-to-IR correspondence to placed,
|
|
203
|
+
structured-note, suppressed, dropped, missing or unverifiable outcomes without labels, views or
|
|
204
|
+
page coordinates. The released 0.4.10 API is sufficient; no recogniser change is required (#1421;
|
|
205
|
+
ADRs 0011, 0013–0017, 0020).
|
|
206
|
+
|
|
207
|
+
- Turned-step completeness is now backed by an independently authored, hash-pinned 11-case STEP
|
|
208
|
+
corpus with 26 physical outside-diameter bands, 52 parameter checks and 104 downstream checks.
|
|
209
|
+
Axis line and station preserve body-local occurrence identity across automatic IR, the existing
|
|
210
|
+
public `Sheet.step(...)` DSL word, executed-and-built generated code, and exact compiler-confirmed
|
|
211
|
+
length and OD drawing evidence. Grouped equal-length chains retain every adjacent member identity
|
|
212
|
+
and their exact compiler-approved multiplier and value; native and global OD labels are checked
|
|
213
|
+
in full. Generated declarations preserve the half-thousandth midpoint of odd-thousandth spans,
|
|
214
|
+
complete body-local profile ownership is compared at its full published precision, and malformed
|
|
215
|
+
or surplus records fail closed—including coercible or non-finite groove evidence that controls
|
|
216
|
+
band ownership. The root turned-step and groove inventories must remain immutable tuples; a
|
|
217
|
+
mutable or one-shot substitute is snapshotted once only to preserve its observable requirement
|
|
218
|
+
denominator, then remains unverifiable; a non-iterable substitute retains one explicit aggregate
|
|
219
|
+
contract outcome rather than masquerading as an empty family. A profile OD may
|
|
220
|
+
satisfy one uniquely identifiable equivalent largest-band diameter
|
|
221
|
+
without multiplying across disjoint bodies; and uniquely groove-owned narrow
|
|
222
|
+
bands are excluded once by a shared fail-closed Groove schema and ownership rule used by lowering,
|
|
223
|
+
lint and the evidence ledger. That join accounts for the provider's 0.001 mm Groove coordinate
|
|
224
|
+
quantum against its eight-decimal profile axis without widening either published identity
|
|
225
|
+
(#1374; ADRs 0010, 0011, 0013, 0015, 0017, 0020).
|
|
226
|
+
|
|
227
|
+
- Framed recognition now carries all three 0.4.6 step families through their complete existing
|
|
228
|
+
consumer paths. `CircularBlindStep`, `PairedRampStep` and `ThroughStep` retain the same
|
|
229
|
+
manufacturing requirements from raw recognition through their public `Sheet` words, generated
|
|
230
|
+
code, compiler-owned drawing ink and lint; the provider-owned local records and Draftwright IR
|
|
231
|
+
remain invariant under a combined non-principal rotation and translation. Circular-step
|
|
232
|
+
validation now derives its bound from each independently published endpoint, centre, radius and
|
|
233
|
+
depth value's six-significant-figure decimal cell, while outside-cell geometric inconsistencies
|
|
234
|
+
still fail closed (#1382; ADRs 0011, 0013, 0015, 0017, 0018, 0020).
|
|
235
|
+
|
|
236
|
+
- Countersink completeness is now backed by an independently authored, hash-pinned seven-case STEP
|
|
237
|
+
corpus covering functional seats, solid external-cone and deburr negatives, grouped equal seats,
|
|
238
|
+
and reverse-serialized topology. Detection identity and all four provider measurements are scored
|
|
239
|
+
separately from the two actual drawing requirements. Exact aggregate object ownership follows
|
|
240
|
+
each seat once, validates the provider-selected hole semantically, and fails closed on swapped,
|
|
241
|
+
duplicated, or canonically colliding owners. It then crosses automatic IR, public `Sheet.hole`,
|
|
242
|
+
generated code, and role-specific confirmed placed diameter/angle ink without recounting the parent bore. The known second seat of a two-sided bore
|
|
243
|
+
remains explicitly unverifiable rather than hidden or heuristically attached (#1370; ADRs 0010,
|
|
244
|
+
0013, 0015, 0017).
|
|
245
|
+
|
|
246
|
+
- Double-D completeness is now backed by an independently authored, hash-pinned 11-case STEP
|
|
247
|
+
corpus with ten physical profile facts, 50 provider-parameter checks and 40 downstream checks.
|
|
248
|
+
Full-frame identity preserves disconnected coaxial bodies; exact multiplicity crosses automatic
|
|
249
|
+
IR, public `Sheet.double_d_bore`, generated code and role-specific compiler-confirmed
|
|
250
|
+
`⌀major THRU DOUBLE-D across A/F` ink. Round, blind, opposed-blind, malformed, duplicated and
|
|
251
|
+
foreign-owner mutations fail closed, while the provider's exclusive aggregate ownership keeps
|
|
252
|
+
each profile from being recounted as an ordinary hole (#1370; ADRs 0010, 0011, 0013, 0015,
|
|
253
|
+
0017).
|
|
254
|
+
- Updated the immutable `b123d-recognisers` pin and fail-closed inspection/capability joins to
|
|
255
|
+
0.4.10. All 28 previously consumed family schemas remain unchanged. The two new blind-slot
|
|
256
|
+
families were adopted fail-closed under #1421 and remain visible as unscored recognised
|
|
257
|
+
inventories until each gains independent completeness evidence; Draftwright does not coerce
|
|
258
|
+
their depth, terminal/open-end, or round-floor evidence into its ordinary through-slot grammar.
|
|
259
|
+
The provider's additive evidence API is not consumed by
|
|
260
|
+
this bounded adoption slice. Recognition output does change under the unchanged schemas: the
|
|
261
|
+
release closes slot-depth, subdivided paired-ramp/AngledStep, and noisy stubby-pocket gaps; fixes
|
|
262
|
+
Double-D/Hole ownership, external-cone countersink false positives, Plate tie covariance, and
|
|
263
|
+
turned-step translation covariance; and can move an edge-open rectangular recess from `Pocket`
|
|
264
|
+
to the dedicated blind-slot inventory. Draftwright regression tests pin the consumer-visible
|
|
265
|
+
ownership changes while the provider release suite owns its private predicates
|
|
266
|
+
([provider release](https://github.com/pzfreo/b123d-recognisers/releases/tag/v0.4.10); ADRs 0013,
|
|
267
|
+
0015, 0017, 0020).
|
|
268
|
+
|
|
269
|
+
- Principal-profile lint now correlates its independent extremal-face evidence with the cached
|
|
270
|
+
public `DoubleDBore` aggregate instead of importing provider-private profile helpers. Exact
|
|
271
|
+
axis/span, end-plane, centre, radius, A/F, chord, arc, and flat-direction checks fail closed;
|
|
272
|
+
occurrence mouths are consumed with matching multiplicity, and malformed records cannot earn
|
|
273
|
+
coverage. The exported low-level check now requires the aggregate projection explicitly so an
|
|
274
|
+
omitted inventory fails loudly; lint still owns its physical denominator and never reruns
|
|
275
|
+
recognition (#1411, ADRs 0013, 0015, 0017).
|
|
276
|
+
|
|
277
|
+
- Whole polygonal-stock completeness is now backed by an independently authored, hash-pinned
|
|
278
|
+
13-case STEP corpus covering all principal axes, in-plane rotation, translation, topology
|
|
279
|
+
order and circular/rectangular/irregular/octagonal/attached/recessed/compound negatives. The
|
|
280
|
+
provider's exact six-side stock boundary, A/F, axial length and coupled physical flat supports
|
|
281
|
+
are scored separately from four downstream boundaries. A fail-closed two-requirement ledger
|
|
282
|
+
follows A/F and stock length through automatic IR, public `Sheet.polygonal_stock`, generated
|
|
283
|
+
code and solver-placed semantic ink; malformed or duplicate correspondence cannot borrow
|
|
284
|
+
credit from another support ring (#1371).
|
|
285
|
+
|
|
286
|
+
- Multi-plate slab completeness is now backed by an independently authored, hash-pinned 11-case
|
|
287
|
+
STEP corpus covering all principal orientations, additive/cut channels, equal compound
|
|
288
|
+
occurrences, topology order and envelope/detached/thick/rotational negatives. A fail-closed
|
|
289
|
+
one-requirement ledger follows each body-local `thickness.length` through automatic IR, public
|
|
290
|
+
`Sheet.plate`, generated code and solver-placed Dimension provenance; the compiler-derived
|
|
291
|
+
opposite U-channel wall is represented explicitly without inventing duplicate ink. The corpus
|
|
292
|
+
owns 20 physical occurrences and cannot shrink when provider output is weakened or removed.
|
|
293
|
+
Exact step-level, slot-pattern, polygonal-boss and envelope ownership prevents derived material
|
|
294
|
+
spans from becoming duplicate Plate requirements while failing closed when that ownership cannot
|
|
295
|
+
be established (#1373).
|
|
296
|
+
|
|
297
|
+
- Polygonal-boss completeness is now backed by an independently authored, hash-pinned STEP
|
|
298
|
+
corpus covering all three principal axes, in-plane rotation, equal compound occurrences,
|
|
299
|
+
topology order, and recess/detached/stock/other-protrusion negatives. Detection, the provider's
|
|
300
|
+
six-side schema invariant, across-flats, height, physical flat supports, and four downstream
|
|
301
|
+
boundaries are observed; a
|
|
302
|
+
two-requirement fail-closed ledger follows across-flats and boss height through the existing
|
|
303
|
+
IR/compiler/shared-solve path. The corpus owns the independent evaluation denominator; runtime
|
|
304
|
+
drawing lint remains explicitly denominated by the recognition inventory (#1372).
|
|
305
|
+
|
|
306
|
+
- Updated the immutable `b123d-recognisers` pin and fail-closed manifest joins to 0.4.9. The
|
|
307
|
+
provider's body-local FaceLevel, RiserEvidence, and TurnedProfile schemas now cross an owned
|
|
308
|
+
prepared-frame boundary that normalizes, reuses one cylinder substrate, classifies locally,
|
|
309
|
+
and preserves the exact working solid/result pair. Every frame gauge and typed refusal has an
|
|
310
|
+
explicit conservative policy; refusal never hides a raw retry. Multiple physical turned
|
|
311
|
+
profiles fail explicitly where a singular adapter is required, while the unchanged raw
|
|
312
|
+
production route preserves its historical no-global-profile compound behavior with a visible
|
|
313
|
+
#1357 deferral. Production drawing remains on the explicit raw boundary until rigid-motion,
|
|
314
|
+
PMI, platform, and canary activation evidence is complete (ADR 0020, #1357).
|
|
315
|
+
|
|
316
|
+
- Updated the immutable `b123d-recognisers` pin and lock to 0.4.8. Draftwright now names
|
|
317
|
+
its existing caller/world-coordinate aggregate boundary explicitly with
|
|
318
|
+
`build_raw_recognition_result`; framed recognition remains disabled until #1357's
|
|
319
|
+
frame-to-IR adapter is reviewed end to end. Installed-wheel tests exercise the public
|
|
320
|
+
framed fixes for rectangular pads, polygonal bosses, and nested multi-body plates without
|
|
321
|
+
making that API the production path (#1392).
|
|
322
|
+
|
|
323
|
+
- Rectangular pads now consume `RaisedPad` schema v2 without assuming +Z. The IR, public
|
|
324
|
+
`Sheet.pad`, generated code, compiler, semantic-view planner, shared placement solve, and
|
|
325
|
+
lint correspondence preserve the exact footprint, terminal-to-attachment height, two
|
|
326
|
+
in-plane locations, axis, direction, and world bounds for all six signed principal
|
|
327
|
+
orientations. Every height uses one solver-placed `… HIGH` leader with stable measurement
|
|
328
|
+
identity; side-normal pad footprints no longer leak into the unrelated Z-level grammar
|
|
329
|
+
(#1392).
|
|
330
|
+
|
|
331
|
+
- Rectangular-pad completeness is now independently evidenced by a hash-pinned 12-case STEP
|
|
332
|
+
corpus covering all six signed principal orientations, equal compound occurrences, topology
|
|
333
|
+
order, and ledge/staircase/detached-body negatives. Detection, width/length/height fidelity,
|
|
334
|
+
and four downstream boundaries are scored separately; a five-requirement fail-closed ledger
|
|
335
|
+
follows both footprint sizes, height and directional location evidence through the shared
|
|
336
|
+
compiler and placement solve (#1372).
|
|
337
|
+
|
|
338
|
+
- Circular blind steps recognised by `b123d-recognisers` now have a complete consumer path.
|
|
339
|
+
The oriented terminal-to-open centreline and transverse quarter-arc lower without rescanning
|
|
340
|
+
to an explicit-only IR/Sheet feature; generated code preserves the full correspondence.
|
|
341
|
+
Radius and stopped depth remain independently addressable and tolerance-aware while sharing
|
|
342
|
+
one solver-placed end-view `R… × … DEEP` leader, and a fail-closed two-requirement ledger
|
|
343
|
+
follows each outcome without parsing labels or guessing by order (#1382).
|
|
344
|
+
|
|
345
|
+
- Paired-ramp steps recognised by `b123d-recognisers` now have one complete consumer path:
|
|
346
|
+
exact IR conversion, explicit `Sheet.paired_ramp_step(...)` declaration, generated-code
|
|
347
|
+
round trip, end-view solver-placed `2× angle × run RUN` leader, independent angle/run
|
|
348
|
+
tolerances and authored suppression, and a two-requirement fail-closed completeness ledger
|
|
349
|
+
(#1382).
|
|
350
|
+
|
|
351
|
+
- Rectangular through steps recognised by `b123d-recognisers` now lower without rescanning to
|
|
352
|
+
an explicit-only IR/Sheet feature. Automatic and explicit lowering support every principal
|
|
353
|
+
axis; an X/Y occurrence stays with the established face-level and shoulder/plate grammar only
|
|
354
|
+
when that grammar proves both exact leg intervals, avoiding both silent loss and duplicate
|
|
355
|
+
dimensions. The two
|
|
356
|
+
orthogonal open-section legs are independently addressable, tolerance-aware, solver-placed in
|
|
357
|
+
the end view, preserved by generated code and scored by a fail-closed two-requirement
|
|
358
|
+
completeness ledger. The through extent stays owned by the envelope (#1382).
|
|
359
|
+
|
|
360
|
+
- Hole completeness is now supported by a versioned, independently authored STEP corpus rather
|
|
361
|
+
than a Draftwright-derived census. Detection, parameter fidelity and downstream usefulness stay
|
|
362
|
+
separate, while the IR adapter, public Sheet declaration, executed generated code and placed
|
|
363
|
+
drawing are each observed through their real seam. Mutations prove that a missing provider hole
|
|
364
|
+
or a broken downstream boundary lowers the relevant evidence even when internal state remains
|
|
365
|
+
self-consistent (#1369).
|
|
366
|
+
- Hole-pattern completeness is now supported by a separate independently authored STEP
|
|
367
|
+
arrangement corpus covering grids, bolt circles, linear arrays, false-positive controls,
|
|
368
|
+
compound cases and topology-order variants. It scores one grouping fact per pattern while the
|
|
369
|
+
hole corpus remains the sole owner of member diameter/depth/location requirements, and follows
|
|
370
|
+
each group through the IR, public Sheet declaration, generated code and placed pattern
|
|
371
|
+
dimensions (#1370).
|
|
372
|
+
- Flat completeness is now supported by an independently authored STEP corpus covering lone,
|
|
373
|
+
opposed, slanted, parallel and coaxial stock plus negative and topology-order controls. It
|
|
374
|
+
counts one physical across-flats requirement per stock line and span, then observes automatic
|
|
375
|
+
IR, public `Sheet.flat`, executed generated code and placed measurement provenance independently
|
|
376
|
+
(#1371).
|
|
377
|
+
- Lone-pocket completeness is now supported by an independently authored STEP corpus covering
|
|
378
|
+
off-centre, edge-anchored, equal, opposed-opening, side-opening, compound, ownership-negative
|
|
379
|
+
and topology-order cases. Provider `open_sign` now survives the IR, declaration and generated
|
|
380
|
+
code boundaries; pocket sizes and both physical location ordinates are followed through exact
|
|
381
|
+
semantic placement evidence without counting pocket-pattern members twice (#1372).
|
|
382
|
+
- Pocket-pattern completeness is now supported by a separate independently authored STEP corpus
|
|
383
|
+
covering axis-aligned and 30° linear/grid arrangements, threshold and unequal-spacing
|
|
384
|
+
negatives, a compound underside pattern and reverse-serialized topology variants. One grouped
|
|
385
|
+
count/size/lattice/location requirement reaches automatic IR, public `Sheet.pocket_pattern`,
|
|
386
|
+
generated code and exact placed ink—including approved pitch tolerances—without recounting its
|
|
387
|
+
member pockets. Diagonal pocket-pattern dimensions use exact label-ink clearance instead of a
|
|
388
|
+
false-blocking hull; generated code preserves the member opening side and grouped callouts
|
|
389
|
+
retain structured count provenance (#1372).
|
|
390
|
+
- Groove completeness is now supported by an independently authored STEP corpus covering a
|
|
391
|
+
monotonic-step negative, all principal axes, a narrow circlip ownership contest, equal grooves
|
|
392
|
+
on separate bodies and reversed Boolean order. Each physical groove's width and floor diameter
|
|
393
|
+
pass independently through automatic IR, public `Sheet.groove`, executed generated code and
|
|
394
|
+
one exact compiler-backed `WIDE × ø` callout; mutations prove that recognition, identity,
|
|
395
|
+
parameters, provenance and printed syntax cannot disappear without lowering evidence (#1372).
|
|
396
|
+
- Chamfer completeness is now supported by an independently authored STEP corpus covering all
|
|
397
|
+
principal axes, equal and asymmetric planar bevels, conical turned treatments, equal features
|
|
398
|
+
on separate bodies, topology-order variants, a plain negative and the AngledStep ownership
|
|
399
|
+
boundary. Each physical bevel is followed through exact IR, public `Sheet.chamfer`, executed
|
|
400
|
+
generated code, compiler measurement provenance, callout syntax and its physical leader target;
|
|
401
|
+
equal requirements may share ink without collapsing occurrence identity (#1374).
|
|
402
|
+
- Fillet completeness is now supported by an independently authored STEP corpus covering all
|
|
403
|
+
principal axes, repeated equal rounds, turned toroidal treatments, separate bodies,
|
|
404
|
+
topology-order variants, a plain negative and the CircularBlindStep ownership boundary. Each
|
|
405
|
+
physical round is followed through exact IR, public `Sheet.fillet`, executed generated code,
|
|
406
|
+
compiler measurement provenance, `R`/`n× R` syntax and its physical leader target; grouped ink
|
|
407
|
+
retains every rounded edge's measurement identity (#1374).
|
|
408
|
+
|
|
409
|
+
- Recognised angled blind steps now fail visibly instead of remaining an undecided inventory.
|
|
410
|
+
Each aggregate-reconciled `AngledStep` produces an actionable warning and one `unsupported`
|
|
411
|
+
completeness outcome. A frozen STEP corpus fixture pins the AngledStep/Chamfer ownership
|
|
412
|
+
boundary, while Draftwright deliberately invents no angle/run, IR, Sheet, generated-code,
|
|
413
|
+
section/detail, or annotation semantics (#1247).
|
|
414
|
+
|
|
415
|
+
- Aggregate-reconciled `PrismaticPocket` occurrences now fail visibly instead of
|
|
416
|
+
remaining an unscored inventory. Each produces an actionable warning and one `unsupported`
|
|
417
|
+
completeness outcome, without repeating the provider's cross-family reconciliation or
|
|
418
|
+
inventing width/length, across-flats, IR, Sheet, generated-code, or annotation semantics (#1246).
|
|
419
|
+
|
|
420
|
+
- Recognised prismatic passages now fail visibly instead of disappearing into an unscored
|
|
421
|
+
inventory. Each authoritative `SectionPassage` produces an actionable warning and an
|
|
422
|
+
`unsupported` completeness outcome; the legacy `Passage` compatibility projection is never
|
|
423
|
+
double-counted. Draftwright retains the family-level unsupported disposition rather than
|
|
424
|
+
claiming a regular-polygon callout represents the provider's complete line/arc schema (#1245).
|
|
425
|
+
|
|
40
426
|
- Declared Double-D bore, countersink, chamfer, fillet, and groove geometry reads now use the
|
|
41
|
-
stable `b123d_recognisers.inspection` namespace from the exact 0.4.
|
|
427
|
+
stable `b123d_recognisers.inspection` namespace from the exact 0.4.6 wheel. A separate
|
|
42
428
|
Draftwright-owned format-1 contract fails closed on changes to the consumed signatures, result
|
|
43
429
|
schemas, units, bevel rejection reasons, or cylindrical surface layout (#1362).
|
|
44
430
|
|
|
431
|
+
- Updated the exact `b123d-recognisers` production lock to 0.4.6. At adoption time, circular
|
|
432
|
+
blind, paired ramp, and through-step inventories were carried from the one aggregate and
|
|
433
|
+
surfaced as unscored completeness evidence pending the #1382 semantic slices now recorded
|
|
434
|
+
above. Rectangular-grid pitch placement also uses a
|
|
435
|
+
deterministic outer witness line across plan, front, and side views despite the release's
|
|
436
|
+
coordinate-rounding differences.
|
|
437
|
+
|
|
45
438
|
- `annotation_overlap` now reports the whole defect when the same pair also draws
|
|
46
439
|
line-work through one of the two labels: the message names the crosser, the label
|
|
47
440
|
crossed and the millimetres, and replaces the "use `label_offset_x`" remedy, which
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: draftwright
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.18
|
|
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
|
|
@@ -684,7 +684,7 @@ Classifier: Programming Language :: Python :: 3.14
|
|
|
684
684
|
Classifier: Topic :: Scientific/Engineering
|
|
685
685
|
Requires-Python: <3.15,>=3.10
|
|
686
686
|
Requires-Dist: antlr4-python3-runtime<4.10
|
|
687
|
-
Requires-Dist: b123d-recognisers==0.4.
|
|
687
|
+
Requires-Dist: b123d-recognisers==0.4.14
|
|
688
688
|
Requires-Dist: build123d-drafting-helpers>=0.14.2
|
|
689
689
|
Requires-Dist: build123d<0.11,>=0.9.0; python_full_version < '3.13'
|
|
690
690
|
Requires-Dist: build123d<0.12,>=0.11; python_full_version >= '3.13'
|
|
@@ -703,11 +703,15 @@ Description-Content-Type: text/markdown
|
|
|
703
703
|
</h1>
|
|
704
704
|
|
|
705
705
|
[](https://github.com/pzfreo/draftwright/actions/workflows/ci.yml)
|
|
706
|
+
[](https://pzfreo.github.io/draftwright/)
|
|
706
707
|
[](https://codecov.io/gh/pzfreo/draftwright)
|
|
707
708
|
[](https://pypi.org/project/draftwright/)
|
|
708
709
|
[](https://pypi.org/project/draftwright/)
|
|
710
|
+
[](https://pepy.tech/project/draftwright)
|
|
709
711
|
[](LICENSE)
|
|
710
712
|
[](https://github.com/astral-sh/ruff)
|
|
713
|
+
[](https://mypy-lang.org/)
|
|
714
|
+
[](https://github.com/astral-sh/uv)
|
|
711
715
|
|
|
712
716
|
**[API reference](https://pzfreo.github.io/draftwright/)** ·
|
|
713
717
|
**[Examples and source](https://github.com/pzfreo/draftwright#readme)**
|
|
@@ -736,13 +740,14 @@ Point it at a STEP file — that's the whole workflow:
|
|
|
736
740
|
|
|
737
741
|
```
|
|
738
742
|
draftwright my_part.step --title "Mounting Plate" --number DWG-001
|
|
739
|
-
# writes my_part.pdf (the
|
|
743
|
+
# writes my_part.pdf and my_part.draftwright.json (the defaults)
|
|
740
744
|
```
|
|
741
745
|
|
|
742
746
|
Choose formats, scale, and page; or emit an editable drawing script:
|
|
743
747
|
|
|
744
748
|
```
|
|
745
749
|
draftwright my_part.step --format pdf,dxf # also: svg, all
|
|
750
|
+
draftwright my_part.step --no-report # opt out of the JSON sidecar
|
|
746
751
|
draftwright my_part.step --scale 2 --page A3 # override the auto scale / page
|
|
747
752
|
draftwright my_part.step --scale 1 --page A4 --scale-policy strict
|
|
748
753
|
draftwright my_part.step --script # write an editable declarative Sheet script
|
|
@@ -790,7 +795,7 @@ and removed in 0.5.0 (see [docs/deprecations.md](docs/deprecations.md)).
|
|
|
790
795
|
Instead of relying on detection, **reference the build123d objects you built** and declare
|
|
791
796
|
only the drawing intent — geometry supplies the sizes (⌀ read off the object), you supply
|
|
792
797
|
tolerances, fits, datums, GD&T, and surface finish. The fluent `Sheet` skips detection and
|
|
793
|
-
dimensions exactly what you declare (ADR 0011):
|
|
798
|
+
dimensions exactly what you declare (ADR 4 (was 0011)):
|
|
794
799
|
|
|
795
800
|
```python
|
|
796
801
|
from build123d import Box, Cylinder, Pos
|
|
@@ -806,7 +811,7 @@ hole = sheet.hole(bore).finish("1.6").note("M3x0.5 TAP") # ⌀8 bore, Ra 1.6, t
|
|
|
806
811
|
sheet.control(hole).position(0.1, to="A", diameter=True) # ⌀0.1 position wrt A
|
|
807
812
|
|
|
808
813
|
sheet.authored_dimensions() # THIS is the complete set
|
|
809
|
-
sheet.dimension(env, "width.length") # (ADR 0016: a build says where
|
|
814
|
+
sheet.dimension(env, "width.length") # (ADR 4 (was 0016): a build says where
|
|
810
815
|
sheet.dimension(env, "height.length") # its dimensions come from, and
|
|
811
816
|
sheet.dimension(hole, "bore.diameter") # omitting one means suppress it)
|
|
812
817
|
|
|
@@ -853,7 +858,7 @@ draftwright mymodule:thumbwheel --script
|
|
|
853
858
|
|
|
854
859
|
The emitted values are *detected* off the geometry — honest, and a good starting point. Since
|
|
855
860
|
you have the objects, swap each numbered line for a reference so the object stays the single
|
|
856
|
-
source of truth (ADR 0011 — the size is read off the object, no numbers restated):
|
|
861
|
+
source of truth (ADR 4 (was 0011) — the size is read off the object, no numbers restated):
|
|
857
862
|
|
|
858
863
|
```python
|
|
859
864
|
# generated (detected):
|
|
@@ -987,7 +992,7 @@ generation, the lint→repair loop, and collect-then-solve placement).
|
|
|
987
992
|
|
|
988
993
|
## Architecture
|
|
989
994
|
|
|
990
|
-
draftwright is structured as a **part-drawing compiler** (ADR 0015): recognised
|
|
995
|
+
draftwright is structured as a **part-drawing compiler** (ADR 1 (was 0015)): recognised
|
|
991
996
|
or declared features converge on a `PartModel` IR, then planner-fed and
|
|
992
997
|
sanctioned model-routed render intents feed shared placement, projection, and
|
|
993
998
|
export. Coverage lint independently compares recognised geometry with the
|
|
@@ -3,11 +3,15 @@
|
|
|
3
3
|
</h1>
|
|
4
4
|
|
|
5
5
|
[](https://github.com/pzfreo/draftwright/actions/workflows/ci.yml)
|
|
6
|
+
[](https://pzfreo.github.io/draftwright/)
|
|
6
7
|
[](https://codecov.io/gh/pzfreo/draftwright)
|
|
7
8
|
[](https://pypi.org/project/draftwright/)
|
|
8
9
|
[](https://pypi.org/project/draftwright/)
|
|
10
|
+
[](https://pepy.tech/project/draftwright)
|
|
9
11
|
[](LICENSE)
|
|
10
12
|
[](https://github.com/astral-sh/ruff)
|
|
13
|
+
[](https://mypy-lang.org/)
|
|
14
|
+
[](https://github.com/astral-sh/uv)
|
|
11
15
|
|
|
12
16
|
**[API reference](https://pzfreo.github.io/draftwright/)** ·
|
|
13
17
|
**[Examples and source](https://github.com/pzfreo/draftwright#readme)**
|
|
@@ -36,13 +40,14 @@ Point it at a STEP file — that's the whole workflow:
|
|
|
36
40
|
|
|
37
41
|
```
|
|
38
42
|
draftwright my_part.step --title "Mounting Plate" --number DWG-001
|
|
39
|
-
# writes my_part.pdf (the
|
|
43
|
+
# writes my_part.pdf and my_part.draftwright.json (the defaults)
|
|
40
44
|
```
|
|
41
45
|
|
|
42
46
|
Choose formats, scale, and page; or emit an editable drawing script:
|
|
43
47
|
|
|
44
48
|
```
|
|
45
49
|
draftwright my_part.step --format pdf,dxf # also: svg, all
|
|
50
|
+
draftwright my_part.step --no-report # opt out of the JSON sidecar
|
|
46
51
|
draftwright my_part.step --scale 2 --page A3 # override the auto scale / page
|
|
47
52
|
draftwright my_part.step --scale 1 --page A4 --scale-policy strict
|
|
48
53
|
draftwright my_part.step --script # write an editable declarative Sheet script
|
|
@@ -90,7 +95,7 @@ and removed in 0.5.0 (see [docs/deprecations.md](docs/deprecations.md)).
|
|
|
90
95
|
Instead of relying on detection, **reference the build123d objects you built** and declare
|
|
91
96
|
only the drawing intent — geometry supplies the sizes (⌀ read off the object), you supply
|
|
92
97
|
tolerances, fits, datums, GD&T, and surface finish. The fluent `Sheet` skips detection and
|
|
93
|
-
dimensions exactly what you declare (ADR 0011):
|
|
98
|
+
dimensions exactly what you declare (ADR 4 (was 0011)):
|
|
94
99
|
|
|
95
100
|
```python
|
|
96
101
|
from build123d import Box, Cylinder, Pos
|
|
@@ -106,7 +111,7 @@ hole = sheet.hole(bore).finish("1.6").note("M3x0.5 TAP") # ⌀8 bore, Ra 1.6, t
|
|
|
106
111
|
sheet.control(hole).position(0.1, to="A", diameter=True) # ⌀0.1 position wrt A
|
|
107
112
|
|
|
108
113
|
sheet.authored_dimensions() # THIS is the complete set
|
|
109
|
-
sheet.dimension(env, "width.length") # (ADR 0016: a build says where
|
|
114
|
+
sheet.dimension(env, "width.length") # (ADR 4 (was 0016): a build says where
|
|
110
115
|
sheet.dimension(env, "height.length") # its dimensions come from, and
|
|
111
116
|
sheet.dimension(hole, "bore.diameter") # omitting one means suppress it)
|
|
112
117
|
|
|
@@ -153,7 +158,7 @@ draftwright mymodule:thumbwheel --script
|
|
|
153
158
|
|
|
154
159
|
The emitted values are *detected* off the geometry — honest, and a good starting point. Since
|
|
155
160
|
you have the objects, swap each numbered line for a reference so the object stays the single
|
|
156
|
-
source of truth (ADR 0011 — the size is read off the object, no numbers restated):
|
|
161
|
+
source of truth (ADR 4 (was 0011) — the size is read off the object, no numbers restated):
|
|
157
162
|
|
|
158
163
|
```python
|
|
159
164
|
# generated (detected):
|
|
@@ -287,7 +292,7 @@ generation, the lint→repair loop, and collect-then-solve placement).
|
|
|
287
292
|
|
|
288
293
|
## Architecture
|
|
289
294
|
|
|
290
|
-
draftwright is structured as a **part-drawing compiler** (ADR 0015): recognised
|
|
295
|
+
draftwright is structured as a **part-drawing compiler** (ADR 1 (was 0015)): recognised
|
|
291
296
|
or declared features converge on a `PartModel` IR, then planner-fed and
|
|
292
297
|
sanctioned model-routed render intents feed shared placement, projection, and
|
|
293
298
|
export. Coverage lint independently compares recognised geometry with the
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Architecture decision records
|
|
2
|
+
|
|
3
|
+
Five live records, one per core aspect of Draftwright. Read them before changing anything they
|
|
4
|
+
govern. Each states a decision, then a numbered list of invariants an agent must not violate,
|
|
5
|
+
each naming the test that fails if it is — that list is the reason the document exists.
|
|
6
|
+
|
|
7
|
+
| ADR | Owns | Guard tests (representative) |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| [1 — The compiler pipeline](0001-compiler-pipeline.md) | One engine, the `PartModel` IR waist, the module DAG, single-owner build state, the compiled plan fed to placement | `test_import_boundaries.py`, `test_drawing_encapsulation.py`, `test_detect_once.py`, `test_compiled_plan_boundary.py` |
|
|
10
|
+
| [2 — Sheet layout and view planning](0002-sheet-layout-and-view-planning.md) | Requirement-driven view planning, compose-then-pack, collect-then-solve placement, Policy B, scale-before-sheet | `test_carve_free_position_callers.py`, `test_layout_cleanliness.py`, `test_issue_1146_scale_completeness.py`, `test_issue_1260_view_constraints.py` |
|
|
11
|
+
| [3 — The recognition boundary](0003-recognition-boundary.md) | External geometry-only recognition, one run per build, the fail-closed provider join, occurrence ownership, the framed boundary | `test_recogniser_capabilities.py`, `test_declared_recognition_gate.py`, `test_detect_registry.py`, `test_issue_1357_framed_boundary.py` |
|
|
12
|
+
| [4 — Declared intent](0004-declared-intent.md) | The IR as public input, authored dimension sets, suppression by omission, the compiled-plan boundary, one declarative script | `test_declare.py`, `test_label_provenance.py`, `test_parameter_id.py`, `test_sheet_identity_invariant.py` |
|
|
13
|
+
| [5 — Trust and honest failure](0005-trust-and-honest-failure.md) | Determinism, lint as an independent judge, provenance, reports that refuse rather than shrink, absences reported | `test_export_reproducible.py`, `test_render_seam.py`, `test_issue_1215_no_approved_tolerance_is_dropped.py`, `test_issue_1438_report_projection.py` |
|
|
14
|
+
|
|
15
|
+
`archive/` holds the twenty records these replaced, frozen, with their filenames and numbers
|
|
16
|
+
unchanged. Each is stamped with the live record that now owns its decision. They are the
|
|
17
|
+
why-trail; nothing in them is a work instruction.
|
|
18
|
+
|
|
19
|
+
## Rules of engagement
|
|
20
|
+
|
|
21
|
+
These exist because the previous corpus reached 21 files, 8,787 lines and one record with 28
|
|
22
|
+
amendments, and its own "at roughly four amendments, write a successor" rule was a convention
|
|
23
|
+
that nothing enforced. Each rule below is enforced by `tests/test_adr_corpus.py` where a test can
|
|
24
|
+
enforce it.
|
|
25
|
+
|
|
26
|
+
1. **A record changes only when a boundary or invariant changes.** Adopting a provider version,
|
|
27
|
+
adding a feature family, recording ownership for one more record type, adding a report field:
|
|
28
|
+
that is a PR body, not an amendment. If the change does not alter the Invariants section, it
|
|
29
|
+
does not touch the record.
|
|
30
|
+
2. **No record text is written without the maintainer's sign-off.** An agent or contributor who
|
|
31
|
+
believes a record needs to change says so in the PR in two sentences and waits. A reviewer
|
|
32
|
+
recommending an ADR is a recommendation, not an authorisation.
|
|
33
|
+
3. **Each live record is at most 200 lines; the five together at most 1,000.** Enforced.
|
|
34
|
+
4. **No live document cites an archived record as its authority.** Code, tests and docs cite
|
|
35
|
+
ADR 1–5. A pointer into the archive is written `ADR n (was 00NN …)` so the history stays
|
|
36
|
+
findable while the live number is the one a reader acts on. A bare `ADR 00NN` outside
|
|
37
|
+
`archive/` fails the guard.
|
|
38
|
+
5. **Every invariant names its guard.** One without a test is listed under *Unguarded* with the
|
|
39
|
+
reason, never mixed into the numbered list. The guard checks that every named test module and
|
|
40
|
+
test function exists. That list is expected to shrink.
|
|
41
|
+
6. **Cite symbols and test names, never source line numbers.**
|
|
42
|
+
|
|
43
|
+
## Reading order
|
|
44
|
+
|
|
45
|
+
Pipeline first (1), then whichever aspect the change touches. Layout (2) and declared intent (4)
|
|
46
|
+
each assume the pipeline; recognition (3) and trust (5) each assume the other four's boundaries.
|
|
47
|
+
|
|
48
|
+
The consolidation itself is recorded in `docs/plans/adr-consolidation-plan.md`.
|