draftwright 0.4.31__tar.gz → 0.4.32__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.31 → draftwright-0.4.32}/PKG-INFO +2 -2
- {draftwright-0.4.31 → draftwright-0.4.32}/docs/reference/recogniser-capabilities.md +11 -3
- {draftwright-0.4.31 → draftwright-0.4.32}/pyproject.toml +2 -2
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/_core.py +61 -1
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotations/from_model.py +59 -5
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotations/orchestrator.py +2 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/builder.py +29 -5
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/drawing.py +18 -4
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/inspection_contract.py +1 -1
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/model/__init__.py +6 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/model/compiled.py +3 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/model/declare.py +8 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/model/detect.py +1 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/model/ir.py +86 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/model/pmi_lowering.py +274 -1
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/pmi.py +34 -1
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/recogniser_schema.py +8 -8
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/section_recess_contract.py +28 -8
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/sheet.py +74 -1
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/sheet_emit.py +45 -2
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_add_dimension.py +3 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_compiled_plan_boundary.py +6 -5
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_inspection_contract.py +1 -1
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1157_no_implicit_general_tolerance.py +18 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1298_manufacturing_requirements.py +462 -10
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1308_machined_leader_analytics.py +34 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1485_curved_pockets.py +4 -4
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pareto_loop_canary_issue_1753.py +2 -2
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_recogniser_capabilities.py +19 -20
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_section_recess_pockets.py +40 -16
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_sheet_emit.py +67 -1
- {draftwright-0.4.31 → draftwright-0.4.32}/.gitignore +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/CHANGELOG.md +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/LICENSE +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/README.md +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/docs/adr/README.md +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/docs/reference/sheet.md +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/docs/research/1062-repeating-radial-profile-evidence.md +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/skills/SKILL.md +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/__init__.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/_build_profile.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/_geometry.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/_pmi_part21.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/_warnings.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/analysis.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/angular_geometry.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotate.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotations/__init__.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotations/_common.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotations/angular.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotations/balloons.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotations/gears.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotations/holes.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotations/leaders.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/annotations/sections.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/audit.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/blend_contract.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/cli.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/compose.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/document.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/document_evidence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/document_input.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/evaluation/__init__.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/evaluation/step_analysis.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/export.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/feature_identity.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/fits.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/fonts/IBMPlexMono-Regular.ttf +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/fonts/IBMPlexSansCondensed-Regular.ttf +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/fonts/LICENSE-IBMPlexMono-OFL.txt +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/fonts/LICENSE-IBMPlexSansCondensed-OFL.txt +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/fonts/__init__.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/inspection.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/intents.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/layout.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/leader_policy.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/__init__.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/_registry.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/angled_step_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/angular.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/blend_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/chamfer_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/channel_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/circular_blind_step_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/evidence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/fillet_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/flat_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/gear_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/groove_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/gusset_rib_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/hole_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/ink_overlap.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/issues.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/oriented_slot_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/pad_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/paired_ramp_step_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/passage_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/plate_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/pmi_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/pocket_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/pocket_pattern_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/polygonal_boss_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/polygonal_stock_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/prismatic_pocket_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/profiled_bore_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/quality.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/rectangular_blind_slot_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/requirements.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/round_bottom_blind_slot_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/schedule_evidence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/section_recess_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/slot_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/structural.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/suggest.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/through_step_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/linting/turned_step_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/location_contract.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/make_drawing.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/measurement_support.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/model/callout.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/model/planner.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/oriented_slot_contract.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/plate_correspondence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/profile_angles.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/progress.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/projection.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/py.typed +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/recogniser_contract.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/recogniser_policy.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/recognition/__init__.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/recognition_cache.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/recognition_frame.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/recognition_ownership.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/registry.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/repair.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/replay_assessment.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/reporting.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/score.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/src/draftwright/view_plan.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/_burden_report.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/_corpus_cover.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/_drawing_helpers.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/_evidence_contract.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/_kernel.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/_layout_helpers.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/_layout_sig.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/_mutation_corpus.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/_parts.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/_recogniser_public_contract.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/_section_recess_cases.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/_tier_manifest.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/_unit_manifest.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/conftest.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/ap242_single_cylinder_diameter.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/README.md +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/ambiguous-open-semicircle.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/blind-hole.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/chamfer-asymmetric.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/chamfer-compound.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/chamfer-overlap.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/chamfer-plain.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/chamfer-planar-x.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/chamfer-planar-y.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/chamfer-planar-z.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/chamfer-topology-a.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/chamfer-topology-b.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/chamfer-turned.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-chamfers-v1.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-countersinks-v1.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-double-d-bores-v1.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-fillets-v1.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-flats-v1.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-grooves-v1.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-hole-patterns-v1.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-plates-v1.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-pocket-patterns-v1.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-pockets-v1.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-polygonal-bosses-v1.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-polygonal-stock-v1.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-rectangular-pads-v1.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-turned-steps-v1.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/corpus-v1.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/countersink-deburr.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/countersink-external-cone.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/countersink-mixed-pair.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/countersink-single.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/countersink-topology-a.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/countersink-topology-b.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/double-d-axis-x.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/double-d-axis-y.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/double-d-blind.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/double-d-coaxial-compound.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/double-d-opposed-blind.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/double-d-roll-30.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/double-d-round-bore.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/double-d-single-z.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/double-d-topology-a.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/double-d-topology-b.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/fillet-compound.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/fillet-overlap.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/fillet-plain.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/fillet-planar-x.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/fillet-planar-y.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/fillet-planar-z.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/fillet-repeated.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/fillet-topology-a.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/fillet-topology-b.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/fillet-turned.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/flat-coaxial.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/flat-double-d.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/flat-lone-d.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/flat-nonround.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/flat-slanted-double-d.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/flat-topology-a.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/flat-topology-b.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/groove-compound.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/groove-lone-x.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/groove-lone-y.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/groove-lone-z.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/groove-monotonic-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/groove-narrow.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/groove-topology-a.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/groove-topology-b.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-compound-equal.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-detached-body-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-full-span-ledge-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-nested-staircase-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-topology-a.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-topology-b.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-x-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-x-positive.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-y-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-y-positive.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-z-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pad-z-positive.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pattern-ambiguous.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pattern-grid.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pattern-topology-a.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pattern-topology-b.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plain-block.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-compound-equal.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-cross-topology-a.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-cross-topology-b.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-detached-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-rotational-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-single-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-t-xz.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-t-yz.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-thick-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-u-additive.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/plate-u-cut.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-compound.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-edge-anchored.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-lone.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-opposed.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-pattern-ambiguous.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-pattern-grid.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-pattern-linear.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-pattern-pair.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-pattern-topology-a.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-pattern-topology-b.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-prismatic-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-side.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-through-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-topology-a.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-topology-b.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/pocket-two-equal.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-compound-equal.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-detached-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-in-plane-rotated.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-other-protrusions-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-recess-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-stock-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-topology-a.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-topology-b.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-x.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-y.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-boss-z.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-compound-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-cylinder-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-irregular-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-octagon-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-recess-negative.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-roll17.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-topology-a.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-topology-b.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-translated.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-x.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/polygonal-stock-y.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/topology-a.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/topology-b.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/turned-step-axis-x.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/turned-step-axis-y.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/turned-step-axis-z.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/turned-step-compound.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/turned-step-repeated-lengths.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/turned-step-through-bore.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/turned-step-topology-a.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/turned-step-topology-b.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/evaluation/turned-step-translated-blind-bore.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/grm03_thumbwheel_drive_screw.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/grm03_thumbwheel_drive_screw_ap242_pmi.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/grm04_drive_plate.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/if_step_flat_across_cylinder.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/issue_1058_wheel_rh.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/issue_1247_angled_blind_step.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/issue_1595_whistle_key_frame.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/issue_1595_whistle_key_lever.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/issue_909_basic_part_design_017_body.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/issue_915_case_study_2.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/nist_ctc_01_asme1_ap203.stp +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/nist_ctc_01_asme1_ap242.stp +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/nist_ctc_02_asme1_ap203.stp +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/nist_ctc_02_asme1_ap242.stp +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/nist_ctc_03_asme1_ap203.stp +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/nist_ctc_03_asme1_ap242.stp +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/nist_ctc_04_asme1_ap203.stp +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/nist_ctc_04_asme1_ap242.stp +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/nist_ctc_05_asme1_ap203.stp +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/nist_ctc_05_asme1_ap242.stp +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/tuner_jig_blind_obround_pockets.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/fixtures/whistle_frame_reference.step +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/bracket_section.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/centered_rebate.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/chamfered.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/filleted.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/flange_dense.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/grid_plate.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/grooved_shaft.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/hex_bar.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/holed_slot.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/pocketed.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/prismatic_ladder.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/scattered_plate.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/side_drilled.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/refactor_golden/turned_stepped.json +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_adr0018_view_routing.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_adr0018_view_selection.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_adr_corpus.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_agent_improvement_canary_issue_1716.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_agents_guide.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_analysis_geometry.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_angle_patterns.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_angular_references.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_angular_rendering.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_annotation_box_composition.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_annotation_box_corpus.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_api_docs.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_architecture_docs.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_arrangement_gate.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_assessment_comparison_issue_1712.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_audit_differential.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_axial_dimensions.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_balloon_ring_standoff.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_boss_ownership.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_build_drawing_entrypoints.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_build_profile_harness.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_burden_report.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_candidate_evidence_issue_1726.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_canonical_angles.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_carve_free_position_callers.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_channel_ownership.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_circular_blind_step_semantics.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_cli_behavior.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_cli_report_sidecar.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_clone_budget.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_compose_then_pack.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_corpus_cover.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_counting_calls.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_coverage_mode.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_declaration_identity_issue_1710.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_declaration_report_issue_1710.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_declare.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_declared_recognition_gate.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_declared_report_issue_1688.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_deferred_edits.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_dense_sheet_canary.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_deprecation_dates.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_depth_estimators.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_detail_views.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_detect_once.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_detect_registry.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_diameter_deduplication.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_diameter_leaders.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_dimension_lane_canary_issue_1757.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_dimension_role_vocabulary.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_document_build.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_document_claim_authority.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_document_claims.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_document_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_document_report.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_document_report_authority.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_drawing_encapsulation.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_drawing_operations.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_drawing_state.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_dynamic_corridors.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_e2e_slice.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_e2e_standards.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_equivalent_dimension_presentations_issue_1759.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_export_dxf_curves.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_export_dxf_zoom.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_export_formats.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_export_reproducible.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_export_shape.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_external_recognition_boundary.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_feature_edit_corridors.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_feature_edit_replay.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_feature_edit_verbs.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_feature_leader_candidate_regions.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_feature_provenance.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_feature_queries.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_fillets_adjacency.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_fit_calculations.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_fits.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_flat_completeness.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_flat_stock_identity.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_flat_stock_opposition.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_format_selector.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_formatting.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_framed_step_family_evidence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_gdt_placement.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_geometry_graph_spike.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_grid_lattice_convention.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_groove_completeness_evidence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_groove_profile.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_gusset_rib_semantics.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_hole_annotations.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_hole_pattern_callouts.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_hole_table.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_import_boundaries.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_interior_label_placement.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_iso_layout.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_iso_nts_caption_placement.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_isometric_orientation.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_isometric_placement.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1000_envelope_reuse.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1006_measurement_comparison.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1058_wheel_profile.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1073_cross_body_patterns.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1082_polygonal_stock.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1086_declared_gears.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1116_ap242_hole_tolerance_lowering.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1126_requesting_less_never_scores_better.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1130_view_planning_evidence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1132_turned_profile_span_is_reported.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1142_hole_leader_labels.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1143_hole_completeness.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1144_transactional_hole_table.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1146_scale_completeness.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1147_legibility_pair_aggregation.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1153_contradictory_dimensions.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1154_one_owner_per_measurement.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1155_grm04_sheet_use.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1166_cross_pass_feature_leaders.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1176_quality_fidelity.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1177_angular_dimensions.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1187_unroutable_leaders.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1188_per_view_assignment.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1190_section_decision.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1196_deterministic_view_names.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1202_observed_drawing_consumer.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1204_multiscale_view_issues.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1209_linear_pmi_witnesses.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1215_envelope_tolerance.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1215_no_approved_tolerance_is_dropped.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1216_callout_reservation_measures_ink.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1216_pairwise_across_scale_groups.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1217_claimed_representations.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1217_the_facility_is_shared.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1219_location_claims_its_own_axis.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1229_ledger_member_keying.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1240_iso_above_strip_visibility.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1245_passage_disposition.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1246_prismatic_pocket_disposition.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1247_angled_step_disposition.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1254_turned_chamfers.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1260_view_constraints.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1262_automatic_turned_views.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1276_turned_leader_targets.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1281_turned_fillets.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1296_cylindrical_diameter_pmi.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1299_page_escalation.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1312_engine_costs.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1325_nominal_agreement.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1332_overlap_remedy.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1332_zone_labels.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1333_bounded_ink_repair.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1334_prevent_ink.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1336_grm03_ap242_pmi_fixture.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1338_scale_before_page_escalation.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1349_precision_display.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1350_detected_takeover.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1351_structured_note_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1352_searchable_pdf_text.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1353_cnc_authoritative_workflow.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1357_framed_activation.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1357_framed_boundary.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1357_plural_turned_profiles.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1357_pmi_frame.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1360_thread_depth.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1369_hole_completeness_evidence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1370_countersink_completeness_evidence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1370_double_d_completeness_evidence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1370_hole_pattern_completeness_evidence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1371_flat_completeness_evidence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1371_polygonal_stock_completeness_evidence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1373_plate_completeness_evidence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1374_chamfer_completeness_evidence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1374_fillet_completeness_evidence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1374_turned_step_completeness_evidence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1378_diameter_leader_targets.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1390_sheet_registration.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1392_recognisers_048.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1395_degenerate_iso_region.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1396_layout_advisories.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1397_unverifiable_requirement_message.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1421_rectangular_blind_slot_completeness.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1421_rectangular_blind_slot_semantics.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1421_round_bottom_blind_slot_completeness.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1421_round_bottom_blind_slot_semantics.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1432_adoption.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1432_boundary_failures.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1432_oriented_slot_semantics.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1433_blend_semantics.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1450_boss_blend_ownership.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1460_step_inspection.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1466_dimension_options.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1466_semantic_sides.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1479_radius_leader_targets.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1485_quiddity_024_boundary.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1485_rounded_pockets.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1505_diameter_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1505_short_axial_chains.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1511_turned_boss_heights.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1514_projection_safeguard.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1515_first_angle.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1516_dimension_text.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1517_through_indicator.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1518_explicit_rear.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1524_tolerance_magnitude.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1530_section_provenance.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1531_semantic_hole_counts.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1532_authored_section_examples.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1533_review_diagnostics.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1534_build_progress.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1536_title_overflow.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1543_feature_schedules.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1543_schedule_requirements.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1544_frame_document_canary.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1555_turned_recognition_format_invariance.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1560_envelope_axes.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1563_sheet_pmi_reconciliation.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1585_title_block_date.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1593_title_block_keepout.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1596_bolt_circle_corroboration.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1598_hex_pockets.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1599_duplicate_slot_widths.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1601_flat_precision.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1603_cli_output_paths.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1604_internal_section.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1612_frame_sergio_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1612_sheet_margins.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_1613_circular_channel.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_367_leader_ink.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_443_grm03_axial_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_563_placement_intent.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_676_polygonal_boss.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_676_polygonal_boss_declare.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_740_leader_assignment.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_798_floor_cardinality.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_798_material_field.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_798_silhouette_lint.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_827_real_part_canary.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_883_location_identity.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_885_prismatic_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_909_sloped_profile.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_915_dense_case.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_916_pocket_leader.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_917_open_channel.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_924_zero_length_shoulders.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_955_height_contingency.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_issue_958_cross_solid_recognition.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_label_provenance.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_layout.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_layout_cleanliness.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_layout_constants.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_layout_evidence_issue_1711.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_layout_generalisation.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_layout_hypothesis.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_layout_override_lane_issue_1757.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_layout_override_side_issue_1757.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_layout_property.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_leader_footprint.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_leader_region_policy.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_lint_box_cache.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_lint_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_lint_ink_overlap.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_lint_reconciliation.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_lint_structural.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_lint_suggestions.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_lint_summary.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_linting.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_location_dimensions.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_location_vocabulary.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_machined_feature_callouts.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_make_drawing_entrypoints.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_nested_recognition_ownership.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_note_verb.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_object_aspects.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_occupancy_boxes.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_occurrence_recognition_ownership.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_overall_height_coverage.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pad_completeness_evidence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_paired_ramp_semantics.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_parameter_id.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_part_classification.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_part_model.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pattern_ownership.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pitch_dim_footprint.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_place_dimension.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_plate_ownership.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pmi.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pmi_common_labels.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pmi_datum_lowering.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pmi_gtol_lowering.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pmi_part21.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pocket_completeness_evidence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pocket_pattern.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pocket_pattern_completeness_evidence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_pocket_pattern_recognition.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_polygonal_boss_completeness_evidence.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_principal_profile_classifier.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_prismatic_boss_diameter.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_prismatic_classification.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_prismatic_dimensions.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_private_test_attr_reads.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_private_test_imports.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_profile_angles.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_projection_symbol_default.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_quality_components.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_quiddity_lifecycle_boundary.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_real_part_fixtures.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_recogniser_adoption.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_recogniser_contract.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_recogniser_policy.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_recogniser_step_inventory.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_recognition_boundary_failures.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_recognition_evidence_schema.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_recognition_policy_dispositions.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_recognition_result.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_refactor_golden.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_registry.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_render_seam.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_repack_geometry_seam.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_repair.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_replay_assessment_issue_1715.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_report_projection.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_report_status_reasons_issue_1618.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_report_writer.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_requirement_applicability.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_requirement_carriers.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_requirement_catalog.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_requirement_catalog_families.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_scale_policy.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_scale_selection.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_score.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_script_detail_parity.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_section_hatching.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_section_recess_contract.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_shared_box_memo.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_shared_drawing_cache.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_sheet_furniture.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_sheet_gdt.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_sheet_generation_snapshot.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_sheet_identity_invariant.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_sheet_notes.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_sheet_of.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_sheet_section.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_sheet_tables.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_slanted_blind_step.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_slot_completeness.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_slot_pattern.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_slot_pattern_recognition.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_slot_recognition.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_soft_deprecation.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_solve_trace.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_step_analysis_evaluation.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_strip_layout.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_strip_zones.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_suite_shape.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_suppression_ledger.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_suppression_marks.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_through_step_ownership.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_through_step_semantics.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_tier_manifest.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_title_block_units_format.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_tolerances.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_turned_diameters.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_turned_lengths.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_turned_step_ownership.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_turned_steps.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_two_pass_layout.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_typ_dimensions.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_typed_remediation_projection_issue_1759.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_version_bump_ci.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_view_blocks.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_view_coordinates.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_view_plan.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_witness_label_reconciliation.py +0 -0
- {draftwright-0.4.31 → draftwright-0.4.32}/tests/test_workflows.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: draftwright
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.32
|
|
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
|
|
@@ -692,7 +692,7 @@ Requires-Dist: numpy>=1.24
|
|
|
692
692
|
Requires-Dist: ocp-gordon<0.3
|
|
693
693
|
Requires-Dist: pillow>=10
|
|
694
694
|
Requires-Dist: pypdfium2>=4
|
|
695
|
-
Requires-Dist: quiddity==0.3.
|
|
695
|
+
Requires-Dist: quiddity==0.3.3
|
|
696
696
|
Requires-Dist: reportlab>=4.0
|
|
697
697
|
Requires-Dist: rich>=10.11
|
|
698
698
|
Requires-Dist: steputils==0.1
|
|
@@ -70,11 +70,19 @@ issue. The contract test derives package record outputs, converter registries, l
|
|
|
70
70
|
and emitter branches independently, so copying a new name into the declaration alone cannot make CI
|
|
71
71
|
pass.
|
|
72
72
|
|
|
73
|
-
### Quiddity 0.3.
|
|
73
|
+
### Quiddity 0.3.3 runtime contract
|
|
74
74
|
|
|
75
|
-
The runtime pins the published `quiddity==0.3.
|
|
75
|
+
The runtime pins the published `quiddity==0.3.3` package. This release adds material-side
|
|
76
|
+
reconstruction facts to fillets, planar chamfers and angled steps, paired ramps, and open-section
|
|
77
|
+
profiles. Draftwright consumes these records to describe and annotate the recognised part; it does
|
|
78
|
+
not reconstruct a cut solid from them, so the new `side`, `corner`, `opening_direction`,
|
|
79
|
+
`half_width`, and `material_side` fields do not enter the drafting IR. The exact consumer schema
|
|
80
|
+
declarations advance with the provider, and the section-recess adapter accepts document schema 4
|
|
81
|
+
while continuing to reject unknown later schemas.
|
|
82
|
+
|
|
83
|
+
Version 0.3.2 followed the 0.2.4 adoption in
|
|
76
84
|
[#1486](https://github.com/pzfreo/draftwright/pull/1486) and the migration in
|
|
77
|
-
[#1471](https://github.com/pzfreo/draftwright/issues/1471).
|
|
85
|
+
[#1471](https://github.com/pzfreo/draftwright/issues/1471). It advanced the public
|
|
78
86
|
`Slot` record to schema 2: `end_radius` distinguishes two semicircular stadium ends and
|
|
79
87
|
`corner_radius` distinguishes rounded rectangular corners. Draftwright consumes
|
|
80
88
|
`end_radius` for through-slot radius requirements; rounded-corner rectangular slots remain a
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "draftwright"
|
|
7
|
-
version = "0.4.
|
|
7
|
+
version = "0.4.32"
|
|
8
8
|
description = "Automated technical-drawing generation for build123d"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { file = "LICENSE" }
|
|
@@ -23,7 +23,7 @@ dependencies = [
|
|
|
23
23
|
# published wheels, not only uv's development resolver constraints.
|
|
24
24
|
"cadquery-ocp-novtk!=7.9.3.1.1 ; python_full_version >= '3.13'",
|
|
25
25
|
"build123d-drafting-helpers>=0.15.4",
|
|
26
|
-
"quiddity==0.3.
|
|
26
|
+
"quiddity==0.3.3",
|
|
27
27
|
"numpy>=1.24",
|
|
28
28
|
# PNG raster export (SVG→PDF→PNG). Both permissively licensed (Pillow HPND; pypdfium2
|
|
29
29
|
# Apache-2.0 wrapping Google PDFium BSD-3) and ship pre-built wheels with NO native system
|
|
@@ -1689,7 +1689,13 @@ def _add_title_block(dwg, a: Analysis):
|
|
|
1689
1689
|
bx + cell["max_x"],
|
|
1690
1690
|
margins.bottom + cell["max_y"],
|
|
1691
1691
|
)
|
|
1692
|
-
place_annotation(
|
|
1692
|
+
place_annotation(
|
|
1693
|
+
dwg.registry,
|
|
1694
|
+
dwg.items,
|
|
1695
|
+
tb,
|
|
1696
|
+
"title_block",
|
|
1697
|
+
feature=dwg._build.general_tolerance_source,
|
|
1698
|
+
)
|
|
1693
1699
|
|
|
1694
1700
|
|
|
1695
1701
|
def _make_sheet_frame(a: Analysis) -> Compound:
|
|
@@ -1768,6 +1774,60 @@ def _add_scale_note(dwg, a: Analysis):
|
|
|
1768
1774
|
place_annotation(dwg.registry, dwg.items, note, "scale_note")
|
|
1769
1775
|
|
|
1770
1776
|
|
|
1777
|
+
def _add_default_surface_finish(dwg, a: Analysis):
|
|
1778
|
+
"""Draw an imported document-wide ISO 1302 requirement without a leader.
|
|
1779
|
+
|
|
1780
|
+
The reserved band above the title block is sheet furniture space. A document default
|
|
1781
|
+
belongs there: hanging it from model geometry would falsely narrow its scope to one face.
|
|
1782
|
+
"""
|
|
1783
|
+
requirement = dwg._build.default_surface_finish_source
|
|
1784
|
+
if requirement is None:
|
|
1785
|
+
return
|
|
1786
|
+
|
|
1787
|
+
from build123d_drafting import SurfaceFinish
|
|
1788
|
+
|
|
1789
|
+
symbol = SurfaceFinish(
|
|
1790
|
+
f"Ra {requirement.ra}",
|
|
1791
|
+
(0, 0),
|
|
1792
|
+
draft=draft_preset(
|
|
1793
|
+
font_size=dwg.draft.font_size,
|
|
1794
|
+
decimal_precision=dwg.draft.decimal_precision,
|
|
1795
|
+
font_path=PLEX_SANS_CONDENSED,
|
|
1796
|
+
),
|
|
1797
|
+
)
|
|
1798
|
+
box = symbol.bounding_box()
|
|
1799
|
+
width, height = box.max.X - box.min.X, box.max.Y - box.min.Y
|
|
1800
|
+
label = symbol.label_bbox
|
|
1801
|
+
label_x = (label[0] + label[2] - box.min.X - box.max.X) / 2
|
|
1802
|
+
label_y = (label[1] + label[3] - box.min.Y - box.max.Y) / 2
|
|
1803
|
+
# Occupy the left end of the title-block furniture band. Scale and projection method use
|
|
1804
|
+
# its right end, leaving independent document controls readable on every standard sheet.
|
|
1805
|
+
cx = a.PAGE_W - a.TB_W - _title_margins(a).right + width / 2
|
|
1806
|
+
cy = _title_block_top(a) + _TB_FURNITURE_GAP + height / 2
|
|
1807
|
+
symbol = symbol.locate(Location((cx - box.min.X - width / 2, cy - box.min.Y - height / 2, 0)))
|
|
1808
|
+
symbol.pdf_text_relative_specs = (
|
|
1809
|
+
(
|
|
1810
|
+
symbol.label,
|
|
1811
|
+
label_x,
|
|
1812
|
+
label_y,
|
|
1813
|
+
dwg.draft.font_size,
|
|
1814
|
+
PLEX_SANS_CONDENSED,
|
|
1815
|
+
"IBM Plex Sans Condensed",
|
|
1816
|
+
"REGULAR",
|
|
1817
|
+
"center",
|
|
1818
|
+
"middle",
|
|
1819
|
+
),
|
|
1820
|
+
)
|
|
1821
|
+
symbol.is_default_surface_finish = True
|
|
1822
|
+
place_annotation(
|
|
1823
|
+
dwg.registry,
|
|
1824
|
+
dwg.items,
|
|
1825
|
+
symbol,
|
|
1826
|
+
"default_surface_finish",
|
|
1827
|
+
feature=requirement,
|
|
1828
|
+
)
|
|
1829
|
+
|
|
1830
|
+
|
|
1771
1831
|
def _add_projection_symbol(dwg, a: Analysis):
|
|
1772
1832
|
"""Place the ISO 5456-2 projection-method glyph (#769) in the reserved title-block band,
|
|
1773
1833
|
just above the drawn title block (deterministic empty space — the block reserves _TB_H but
|
|
@@ -2704,6 +2704,7 @@ def place_machined_leader_jobs(
|
|
|
2704
2704
|
expand_lanes=True,
|
|
2705
2705
|
region_policy=LeaderRegionPolicy.EXTERIOR,
|
|
2706
2706
|
source_ids_by_name=None,
|
|
2707
|
+
source_drop_severity="warning",
|
|
2707
2708
|
priority=0.0,
|
|
2708
2709
|
) -> int:
|
|
2709
2710
|
"""Lower every machined callout to the one shared ``FeatureLeaderJob`` path.
|
|
@@ -2819,8 +2820,25 @@ def place_machined_leader_jobs(
|
|
|
2819
2820
|
feature,
|
|
2820
2821
|
)
|
|
2821
2822
|
|
|
2822
|
-
|
|
2823
|
-
|
|
2823
|
+
source_features = tuple(
|
|
2824
|
+
{
|
|
2825
|
+
id(getattr(identity, "feature", None)): getattr(identity, "feature", None)
|
|
2826
|
+
for identity in measurement
|
|
2827
|
+
if getattr(identity, "feature", None) is not None
|
|
2828
|
+
}.values()
|
|
2829
|
+
)
|
|
2830
|
+
|
|
2831
|
+
def _build(
|
|
2832
|
+
tip,
|
|
2833
|
+
elbow,
|
|
2834
|
+
_feature,
|
|
2835
|
+
*,
|
|
2836
|
+
_label=label,
|
|
2837
|
+
_source_features=source_features,
|
|
2838
|
+
):
|
|
2839
|
+
leader = Leader(tip=(tip[0], tip[1], 0), elbow=elbow, label=_label, draft=dwg.draft)
|
|
2840
|
+
leader.source_features = _source_features
|
|
2841
|
+
return leader
|
|
2824
2842
|
|
|
2825
2843
|
def _fallback_accept(
|
|
2826
2844
|
candidate,
|
|
@@ -2883,8 +2901,13 @@ def place_machined_leader_jobs(
|
|
|
2883
2901
|
):
|
|
2884
2902
|
validation = reason == "geometry_validation"
|
|
2885
2903
|
detail = "rendered geometry validation failed" if validation else "no clear room"
|
|
2904
|
+
severity = (
|
|
2905
|
+
("error" if _source_ids else "warning")
|
|
2906
|
+
if source_drop_severity == "source"
|
|
2907
|
+
else source_drop_severity
|
|
2908
|
+
)
|
|
2886
2909
|
ctx.record_issue(
|
|
2887
|
-
|
|
2910
|
+
severity,
|
|
2888
2911
|
drop_code,
|
|
2889
2912
|
f"{noun} callout {_label} not placed ({detail})",
|
|
2890
2913
|
measurement=_measurement,
|
|
@@ -2934,7 +2957,7 @@ def place_machined_leader_jobs(
|
|
|
2934
2957
|
fallback_accept=_fallback_accept,
|
|
2935
2958
|
interior_label_clear=interior_label_clear,
|
|
2936
2959
|
allow_policy_b_fixed=True,
|
|
2937
|
-
on_drop=_on_drop if source_ids else None,
|
|
2960
|
+
on_drop=(_on_drop if source_ids or source_drop_severity == "source" else None),
|
|
2938
2961
|
)
|
|
2939
2962
|
)
|
|
2940
2963
|
|
|
@@ -2996,6 +3019,7 @@ def render_chamfers(dwg, plan, a, *, ctx, only=None) -> int:
|
|
|
2996
3019
|
collapse.setdefault(spec, []).append((g, pd))
|
|
2997
3020
|
|
|
2998
3021
|
jobs = []
|
|
3022
|
+
source_ids_by_name = {}
|
|
2999
3023
|
for gi, (_spec, members) in enumerate(sorted(collapse.items())):
|
|
3000
3024
|
if only is not None:
|
|
3001
3025
|
# Filter after enumerating the full collapse so a surviving group keeps the same
|
|
@@ -3023,9 +3047,17 @@ def render_chamfers(dwg, plan, a, *, ctx, only=None) -> int:
|
|
|
3023
3047
|
label = _chamfer_label(representative_pd.value_text, representative_pd.value, ch)
|
|
3024
3048
|
if len(members) > 1:
|
|
3025
3049
|
label = f"{len(members)}× {label}"
|
|
3050
|
+
name = f"m_chamfer_{axis}{gi}"
|
|
3051
|
+
source_ids_by_name[name] = tuple(
|
|
3052
|
+
dict.fromkeys(
|
|
3053
|
+
source_id
|
|
3054
|
+
for member, _pd in members
|
|
3055
|
+
for source_id in getattr(member.facts, "source_ids", ())
|
|
3056
|
+
)
|
|
3057
|
+
)
|
|
3026
3058
|
jobs.append(
|
|
3027
3059
|
(
|
|
3028
|
-
|
|
3060
|
+
name,
|
|
3029
3061
|
view,
|
|
3030
3062
|
vb,
|
|
3031
3063
|
label + _tol_suffix(representative_pd.tolerance, draft),
|
|
@@ -3050,6 +3082,8 @@ def render_chamfers(dwg, plan, a, *, ctx, only=None) -> int:
|
|
|
3050
3082
|
ctx=ctx,
|
|
3051
3083
|
joint=True,
|
|
3052
3084
|
region_policy=LeaderRegionPolicy.AUTO,
|
|
3085
|
+
source_ids_by_name=source_ids_by_name,
|
|
3086
|
+
source_drop_severity="source",
|
|
3053
3087
|
)
|
|
3054
3088
|
|
|
3055
3089
|
|
|
@@ -8872,6 +8906,26 @@ def _pmi_source_ids(item) -> tuple[str, ...]:
|
|
|
8872
8906
|
return tuple(dict.fromkeys(((singular,) if singular else ()) + plural))
|
|
8873
8907
|
|
|
8874
8908
|
|
|
8909
|
+
def render_document_notes(dwg, model) -> int:
|
|
8910
|
+
"""Place source-proven drawing-wide requirements in one solver-owned notes block."""
|
|
8911
|
+
notes = [feature for feature in model.features if feature.kind == "document_note"]
|
|
8912
|
+
if not notes:
|
|
8913
|
+
return 0
|
|
8914
|
+
rows = [("GENERAL NOTES",)] + [
|
|
8915
|
+
(f"{index} {_font_safe_text(note.text)}",) for index, note in enumerate(notes, 1)
|
|
8916
|
+
]
|
|
8917
|
+
placed = dwg.add_table(
|
|
8918
|
+
rows,
|
|
8919
|
+
prefer="tr",
|
|
8920
|
+
name="general_notes",
|
|
8921
|
+
_source_ids=tuple(source_id for note in notes for source_id in _pmi_source_ids(note)),
|
|
8922
|
+
_features=tuple(notes),
|
|
8923
|
+
_drop_code="pmi_dropped",
|
|
8924
|
+
_drop_severity="error",
|
|
8925
|
+
)
|
|
8926
|
+
return len(notes) if placed is not None else 0
|
|
8927
|
+
|
|
8928
|
+
|
|
8875
8929
|
def _gdt_glyph(item, draft):
|
|
8876
8930
|
"""Build the ISO 1101/5459/1302 glyph sketch for one GD&T IR item at the origin
|
|
8877
8931
|
(the :class:`Leader` repositions it). A fresh sketch per call — the leader translate
|
|
@@ -24,6 +24,7 @@ from draftwright._core import (
|
|
|
24
24
|
Analysis,
|
|
25
25
|
DetailRequest,
|
|
26
26
|
HoleRef,
|
|
27
|
+
_add_default_surface_finish,
|
|
27
28
|
_add_projection_symbol,
|
|
28
29
|
_add_scale_note,
|
|
29
30
|
_add_sheet_frame,
|
|
@@ -936,6 +937,7 @@ def _auto_annotate(dwg, a: Analysis, *, detail_view: bool = False):
|
|
|
936
937
|
# ISO 5456-2 projection-method glyph (#769) in the reserved title-block band.
|
|
937
938
|
_add_projection_symbol(dwg, a)
|
|
938
939
|
_add_scale_note(dwg, a)
|
|
940
|
+
_add_default_surface_finish(dwg, a)
|
|
939
941
|
|
|
940
942
|
def _s_tabulate():
|
|
941
943
|
# Escalate to a hole table when the plan view is too dense to dimension
|
|
@@ -34,6 +34,7 @@ from draftwright._core import (
|
|
|
34
34
|
_LADDER,
|
|
35
35
|
_PAGE_SIZES,
|
|
36
36
|
_SCALES,
|
|
37
|
+
_add_default_surface_finish,
|
|
37
38
|
_add_projection_symbol,
|
|
38
39
|
_add_scale_note,
|
|
39
40
|
_add_sheet_frame,
|
|
@@ -58,6 +59,7 @@ from draftwright.annotations._common import (
|
|
|
58
59
|
annotation_ink_obstacles,
|
|
59
60
|
place_iso_nts_note,
|
|
60
61
|
)
|
|
62
|
+
from draftwright.annotations.from_model import render_document_notes
|
|
61
63
|
from draftwright.annotations.gears import render_gear_tables
|
|
62
64
|
from draftwright.annotations.orchestrator import (
|
|
63
65
|
_WITHHOLDING_CODES,
|
|
@@ -567,6 +569,7 @@ def _assemble(
|
|
|
567
569
|
features=[*pm.features, rot],
|
|
568
570
|
declaration_identities=(*identities, None) if identities else (),
|
|
569
571
|
)
|
|
572
|
+
|
|
570
573
|
# A z step declares a segment of a z-turned profile. `.step()` on a BOSS — an external
|
|
571
574
|
# cylinder on a prismatic part — is a misuse of the verb, and the symptom is that the
|
|
572
575
|
# declared steps leave the bulk of the part unspanned (#631). This is a verb-misuse
|
|
@@ -586,13 +589,16 @@ def _assemble(
|
|
|
586
589
|
# annotations detection would (render_pmi reads them off the model, gated on a.pmi_mode)
|
|
587
590
|
# so a re-run reproduces the PMI dims (#472). Gated on the caller not having declared
|
|
588
591
|
# imported authored annotations, so an explicit set wins.
|
|
592
|
+
def _declares_imported_pmi(feature) -> bool:
|
|
593
|
+
if feature.kind in ("authored_dimension", "pmi"):
|
|
594
|
+
return True
|
|
595
|
+
return bool(
|
|
596
|
+
getattr(feature, "source_id", "") or tuple(getattr(feature, "source_ids", ()))
|
|
597
|
+
)
|
|
598
|
+
|
|
589
599
|
if (
|
|
590
600
|
a.pmi_mode == "annotate"
|
|
591
|
-
and not any(
|
|
592
|
-
f.kind in ("authored_dimension", "pmi")
|
|
593
|
-
or (f.kind == "control_frame" and bool(getattr(f, "source_id", "")))
|
|
594
|
-
for f in pm.features
|
|
595
|
-
)
|
|
601
|
+
and not any(_declares_imported_pmi(feature) for feature in pm.features)
|
|
596
602
|
and not any(
|
|
597
603
|
getattr(value, "source", "") == "ap242_pmi" and getattr(value, "source_ids", ())
|
|
598
604
|
for value in pm.decorations.values()
|
|
@@ -636,6 +642,15 @@ def _assemble(
|
|
|
636
642
|
else ()
|
|
637
643
|
),
|
|
638
644
|
)
|
|
645
|
+
# A source-proven document default uses the existing title-block carrier when the caller
|
|
646
|
+
# did not explicitly author one. An explicit tolerance, including the blank string, wins.
|
|
647
|
+
general_tolerance_source = None
|
|
648
|
+
if a.tolerance is None:
|
|
649
|
+
defaults = [feature for feature in pm.features if feature.kind == "general_tolerance"]
|
|
650
|
+
if len(defaults) == 1:
|
|
651
|
+
general_tolerance_source = defaults[0]
|
|
652
|
+
a = replace(a, tolerance=getattr(general_tolerance_source, "designation"))
|
|
653
|
+
|
|
639
654
|
# ADR 1 (was 0005 §2) (#639): the ONE build-context attachment — analysis + finished model
|
|
640
655
|
# in a single typed BuildState; the compat properties on Drawing read through it.
|
|
641
656
|
dwg._build.analysis = a
|
|
@@ -655,6 +670,13 @@ def _assemble(
|
|
|
655
670
|
ownership=a.recognition_ownership,
|
|
656
671
|
)
|
|
657
672
|
dwg._build.part_model = pm
|
|
673
|
+
dwg._build.general_tolerance_source = general_tolerance_source
|
|
674
|
+
default_finishes = [
|
|
675
|
+
feature for feature in pm.features if feature.kind == "default_surface_finish"
|
|
676
|
+
]
|
|
677
|
+
dwg._build.default_surface_finish_source = (
|
|
678
|
+
default_finishes[0] if len(default_finishes) == 1 else None
|
|
679
|
+
)
|
|
658
680
|
# Persist the caller's detail-view setting: on the auto_dims=False path the flag
|
|
659
681
|
# reaches no pass here, but the finalize drain gates the prismatic detail
|
|
660
682
|
# request on it exactly as the auto pass does (#661).
|
|
@@ -784,6 +806,7 @@ def _assemble(
|
|
|
784
806
|
_add_zone_grid(dwg, a)
|
|
785
807
|
_add_projection_symbol(dwg, a)
|
|
786
808
|
_add_scale_note(dwg, a)
|
|
809
|
+
_add_default_surface_finish(dwg, a)
|
|
787
810
|
|
|
788
811
|
# The NTS caption is post-fit late furniture too, and goes FIRST: it is tied to the
|
|
789
812
|
# iso block it labels, whereas a table may sit anywhere the sheet has room. Placing
|
|
@@ -796,6 +819,7 @@ def _assemble(
|
|
|
796
819
|
# `_fit_iso_view`; placing a table there lets the subsequently fitted ISO view move into
|
|
797
820
|
# it. Every initial/repacked assembly reaches this common point after its final ISO fit,
|
|
798
821
|
# and `add_table()` now sees the settled views plus all earlier annotations as obstacles.
|
|
822
|
+
render_document_notes(dwg, pm)
|
|
799
823
|
render_gear_tables(dwg, pm)
|
|
800
824
|
|
|
801
825
|
# The audit ledger, filled at ONE site for both paths (#996 / ADR 1 (was 0005 §2)).
|
|
@@ -20,7 +20,7 @@ from contextvars import ContextVar
|
|
|
20
20
|
from dataclasses import dataclass
|
|
21
21
|
from dataclasses import field as dataclasses_field
|
|
22
22
|
from itertools import permutations
|
|
23
|
-
from typing import TYPE_CHECKING, Any, NamedTuple
|
|
23
|
+
from typing import TYPE_CHECKING, Any, Literal, NamedTuple
|
|
24
24
|
|
|
25
25
|
if TYPE_CHECKING:
|
|
26
26
|
from quiddity import RecognitionResult
|
|
@@ -526,6 +526,11 @@ class BuildState:
|
|
|
526
526
|
#: The title block's deterministic page-space footprint, measured before it is
|
|
527
527
|
#: drawn so strip placement can avoid it (#1593). None until the builder sets it.
|
|
528
528
|
pending_title_block_box: tuple | None = None
|
|
529
|
+
#: Imported document default selected as the title-block tolerance carrier. ``None``
|
|
530
|
+
#: when the caller supplied any explicit value, even identical display text.
|
|
531
|
+
general_tolerance_source: object | None = None
|
|
532
|
+
#: Imported document-wide surface finish rendered as title-block furniture.
|
|
533
|
+
default_surface_finish_source: object | None = None
|
|
529
534
|
#: Per-view filled projected material (#798) as ``{id(view_shape): (shape, field)}``.
|
|
530
535
|
#: Keyed by shape identity because the projected shapes carry no view label (lint
|
|
531
536
|
#: takes their names from ``Drawing.views`` since #1196), and holding the shape
|
|
@@ -3804,6 +3809,10 @@ class Drawing:
|
|
|
3804
3809
|
name="table",
|
|
3805
3810
|
block_cols=None,
|
|
3806
3811
|
_source_id: str | None = None,
|
|
3812
|
+
_source_ids: tuple[str, ...] = (),
|
|
3813
|
+
_features: tuple[object, ...] = (),
|
|
3814
|
+
_drop_code: str = "table_dropped",
|
|
3815
|
+
_drop_severity: Literal["error", "warning", "info"] = "warning",
|
|
3807
3816
|
_cells=(),
|
|
3808
3817
|
):
|
|
3809
3818
|
"""Add a generic data table in the preferred available sheet region (#93/#1145).
|
|
@@ -3876,18 +3885,23 @@ class Drawing:
|
|
|
3876
3885
|
detail = "solver returned no placement trace"
|
|
3877
3886
|
self._registry.record_issue(
|
|
3878
3887
|
LintIssue(
|
|
3879
|
-
severity=
|
|
3880
|
-
code=
|
|
3888
|
+
severity=_drop_severity,
|
|
3889
|
+
code=_drop_code,
|
|
3881
3890
|
message=(
|
|
3882
3891
|
f"table {name!r} did not fit the sheet; measured page-space footprint "
|
|
3883
3892
|
f"{measured}; {detail}"
|
|
3884
3893
|
),
|
|
3885
|
-
source_ids=(
|
|
3894
|
+
source_ids=tuple(
|
|
3895
|
+
dict.fromkeys(
|
|
3896
|
+
((_source_id,) if _source_id is not None else ()) + _source_ids
|
|
3897
|
+
)
|
|
3898
|
+
),
|
|
3886
3899
|
measurement_ids=tuple(cell.measurement for cell in _cells),
|
|
3887
3900
|
)
|
|
3888
3901
|
)
|
|
3889
3902
|
return None
|
|
3890
3903
|
placed = table.locate(Location((pos[0], pos[1], 0)))
|
|
3904
|
+
placed.source_features = _features
|
|
3891
3905
|
if not _cells:
|
|
3892
3906
|
return self._add(placed, name)
|
|
3893
3907
|
snapshot = self._registry.snapshot()
|
|
@@ -17,7 +17,7 @@ from quiddity.inspection import inspection_api_manifest
|
|
|
17
17
|
CONSUMER_INSPECTION_FORMAT = "draftwright-inspection-api"
|
|
18
18
|
CONSUMER_INSPECTION_FORMAT_VERSION = 1
|
|
19
19
|
SUPPORTED_INSPECTION_API_MAJOR = 1
|
|
20
|
-
SUPPORTED_RECOGNISER_VERSION = "0.3.
|
|
20
|
+
SUPPORTED_RECOGNISER_VERSION = "0.3.3"
|
|
21
21
|
_DISTRIBUTION = "quiddity"
|
|
22
22
|
_PROVIDER_FORMAT = "quiddity-inspection-api"
|
|
23
23
|
_NAMESPACE = "quiddity.inspection"
|
|
@@ -82,8 +82,10 @@ from draftwright.model.ir import (
|
|
|
82
82
|
Datum,
|
|
83
83
|
DatumRef,
|
|
84
84
|
DeclarationIdentity,
|
|
85
|
+
DefaultSurfaceFinish,
|
|
85
86
|
DimensionParameterId,
|
|
86
87
|
DimParameter,
|
|
88
|
+
DocumentNote,
|
|
87
89
|
EnvelopeFeature,
|
|
88
90
|
ExternalSpurGearFeature,
|
|
89
91
|
Feature,
|
|
@@ -91,6 +93,7 @@ from draftwright.model.ir import (
|
|
|
91
93
|
FilletFeature,
|
|
92
94
|
FlatFeature,
|
|
93
95
|
Frame,
|
|
96
|
+
GeneralTolerance,
|
|
94
97
|
GrooveFeature,
|
|
95
98
|
GussetRibFeature,
|
|
96
99
|
HexPocketFeature,
|
|
@@ -165,8 +168,10 @@ __all__ = [
|
|
|
165
168
|
"GussetRibFeature",
|
|
166
169
|
"Datum",
|
|
167
170
|
"DatumRef",
|
|
171
|
+
"DefaultSurfaceFinish",
|
|
168
172
|
"DeclarationIdentity",
|
|
169
173
|
"DimParameter",
|
|
174
|
+
"DocumentNote",
|
|
170
175
|
"EnvelopeFeature",
|
|
171
176
|
"ExternalSpurGearFeature",
|
|
172
177
|
"AddressableDimension",
|
|
@@ -176,6 +181,7 @@ __all__ = [
|
|
|
176
181
|
"ViewPlanIncomplete",
|
|
177
182
|
"Feature",
|
|
178
183
|
"Frame",
|
|
184
|
+
"GeneralTolerance",
|
|
179
185
|
"HoleFeature",
|
|
180
186
|
"KnurlRequirement",
|
|
181
187
|
"LayoutOverride",
|
|
@@ -603,6 +603,10 @@ def chamfer(
|
|
|
603
603
|
angle=None,
|
|
604
604
|
at=None,
|
|
605
605
|
turned=False,
|
|
606
|
+
source_ids=(),
|
|
607
|
+
part21_id="",
|
|
608
|
+
shape_aspect_ids=(),
|
|
609
|
+
reference_item_ids=(),
|
|
606
610
|
) -> ChamferFeature:
|
|
607
611
|
"""A chamfer (bevelled edge, #560/#576). Either ``chamfer(bevel_face)`` — the oblique
|
|
608
612
|
chamfer face supplies axis, both legs and a leader point **on the bevel** — or explicit
|
|
@@ -647,6 +651,10 @@ def chamfer(
|
|
|
647
651
|
leg2=lo,
|
|
648
652
|
angle=angle,
|
|
649
653
|
turned=bool(turned),
|
|
654
|
+
source_ids=tuple(source_ids),
|
|
655
|
+
part21_id=str(part21_id),
|
|
656
|
+
shape_aspect_ids=tuple(shape_aspect_ids),
|
|
657
|
+
reference_item_ids=tuple(reference_item_ids),
|
|
650
658
|
)
|
|
651
659
|
|
|
652
660
|
|
|
@@ -487,6 +487,7 @@ def build_pmi_features(
|
|
|
487
487
|
semantic_name=r.semantic_name,
|
|
488
488
|
shape_aspect_ids=r.shape_aspect_ids,
|
|
489
489
|
cylindrical_refs=r.cylindrical_refs,
|
|
490
|
+
reference_bboxes=r.reference_bboxes,
|
|
490
491
|
)
|
|
491
492
|
if r.source_category == "geometric_tolerance" and not r.lowering_blockers:
|
|
492
493
|
material_modifier = None
|
|
@@ -2393,6 +2393,10 @@ class ChamferFeature:
|
|
|
2393
2393
|
# same ``axis`` field is the bevel-edge direction for a prismatic chamfer, so this semantic
|
|
2394
2394
|
# discriminator is required for faithful view selection and Sheet round-trip (#1276).
|
|
2395
2395
|
turned: bool = False
|
|
2396
|
+
source_ids: tuple[str, ...] = ()
|
|
2397
|
+
part21_id: str = ""
|
|
2398
|
+
shape_aspect_ids: tuple[str, ...] = ()
|
|
2399
|
+
reference_item_ids: tuple[str, ...] = ()
|
|
2396
2400
|
kind: ClassVar[str] = "chamfer"
|
|
2397
2401
|
|
|
2398
2402
|
def parameters(self) -> list[DimParameter]:
|
|
@@ -3687,6 +3691,7 @@ class PmiFeature:
|
|
|
3687
3691
|
semantic_name: str = ""
|
|
3688
3692
|
shape_aspect_ids: tuple[str, ...] = ()
|
|
3689
3693
|
cylindrical_refs: tuple[CylindricalReference, ...] = ()
|
|
3694
|
+
reference_bboxes: tuple[tuple[float, float, float, float, float, float], ...] = ()
|
|
3690
3695
|
kind: ClassVar[str] = "pmi"
|
|
3691
3696
|
|
|
3692
3697
|
def parameters(self) -> list[DimParameter]:
|
|
@@ -3696,6 +3701,87 @@ class PmiFeature:
|
|
|
3696
3701
|
return []
|
|
3697
3702
|
|
|
3698
3703
|
|
|
3704
|
+
@dataclass(frozen=True)
|
|
3705
|
+
class GeneralTolerance:
|
|
3706
|
+
"""A document-wide dimensional tolerance requirement carried by the title block."""
|
|
3707
|
+
|
|
3708
|
+
frame: Frame
|
|
3709
|
+
designation: str
|
|
3710
|
+
statement: str = ""
|
|
3711
|
+
source_id: str = ""
|
|
3712
|
+
part21_id: str = ""
|
|
3713
|
+
kind: ClassVar[str] = "general_tolerance"
|
|
3714
|
+
|
|
3715
|
+
def __post_init__(self) -> None:
|
|
3716
|
+
if not isinstance(self.designation, str) or not self.designation.strip():
|
|
3717
|
+
raise ValueError("general tolerance needs a non-empty designation")
|
|
3718
|
+
if self.designation != self.designation.strip():
|
|
3719
|
+
raise ValueError("general tolerance designation cannot contain surrounding whitespace")
|
|
3720
|
+
|
|
3721
|
+
def parameters(self) -> list[DimParameter]:
|
|
3722
|
+
return []
|
|
3723
|
+
|
|
3724
|
+
def references(self) -> list[Datum]:
|
|
3725
|
+
return []
|
|
3726
|
+
|
|
3727
|
+
|
|
3728
|
+
@dataclass(frozen=True)
|
|
3729
|
+
class DefaultSurfaceFinish:
|
|
3730
|
+
"""A document-wide ISO 1302 surface-texture requirement.
|
|
3731
|
+
|
|
3732
|
+
Unlike :class:`Finish`, this requirement has no geometric target and therefore renders as
|
|
3733
|
+
sheet furniture without a leader. ``statement`` retains the source wording while ``ra`` is
|
|
3734
|
+
the normalized micrometre value shown by the drafting symbol.
|
|
3735
|
+
"""
|
|
3736
|
+
|
|
3737
|
+
frame: Frame
|
|
3738
|
+
ra: str
|
|
3739
|
+
statement: str = ""
|
|
3740
|
+
source_id: str = ""
|
|
3741
|
+
part21_id: str = ""
|
|
3742
|
+
kind: ClassVar[str] = "default_surface_finish"
|
|
3743
|
+
|
|
3744
|
+
def __post_init__(self) -> None:
|
|
3745
|
+
if not isinstance(self.ra, str) or not self.ra.strip():
|
|
3746
|
+
raise ValueError("default surface finish needs a non-empty Ra value")
|
|
3747
|
+
if self.ra != self.ra.strip():
|
|
3748
|
+
raise ValueError(
|
|
3749
|
+
"default surface finish Ra value cannot contain surrounding whitespace"
|
|
3750
|
+
)
|
|
3751
|
+
|
|
3752
|
+
def parameters(self) -> list[DimParameter]:
|
|
3753
|
+
return []
|
|
3754
|
+
|
|
3755
|
+
def references(self) -> list[Datum]:
|
|
3756
|
+
return []
|
|
3757
|
+
|
|
3758
|
+
|
|
3759
|
+
@dataclass(frozen=True)
|
|
3760
|
+
class DocumentNote:
|
|
3761
|
+
"""A source-proven document requirement with no honest geometric attachment."""
|
|
3762
|
+
|
|
3763
|
+
frame: Frame
|
|
3764
|
+
text: str
|
|
3765
|
+
note_kind: str
|
|
3766
|
+
source_id: str = ""
|
|
3767
|
+
part21_id: str = ""
|
|
3768
|
+
kind: ClassVar[str] = "document_note"
|
|
3769
|
+
|
|
3770
|
+
def __post_init__(self) -> None:
|
|
3771
|
+
if not isinstance(self.text, str) or not self.text.strip():
|
|
3772
|
+
raise ValueError("document note needs non-empty text")
|
|
3773
|
+
if self.text != self.text.strip():
|
|
3774
|
+
raise ValueError("document note text cannot contain surrounding whitespace")
|
|
3775
|
+
if self.note_kind not in ("datum_scheme", "model_representation"):
|
|
3776
|
+
raise ValueError(f"unsupported document-note kind {self.note_kind!r}")
|
|
3777
|
+
|
|
3778
|
+
def parameters(self) -> list[DimParameter]:
|
|
3779
|
+
return []
|
|
3780
|
+
|
|
3781
|
+
def references(self) -> list[Datum]:
|
|
3782
|
+
return []
|
|
3783
|
+
|
|
3784
|
+
|
|
3699
3785
|
@dataclass(frozen=True)
|
|
3700
3786
|
class ControlFrame:
|
|
3701
3787
|
"""A geometric-tolerance feature control frame (ISO 1101) declared on the drawing
|