draftwright 0.4.25__tar.gz → 0.4.27__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.25 → draftwright-0.4.27}/PKG-INFO +6 -1
- {draftwright-0.4.25 → draftwright-0.4.27}/README.md +4 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/docs/reference/sheet.md +145 -9
- {draftwright-0.4.25 → draftwright-0.4.27}/pyproject.toml +3 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/skills/SKILL.md +62 -23
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/__init__.py +14 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/_core.py +21 -15
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/_geometry.py +23 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/analysis.py +40 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotations/_common.py +2 -5
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotations/from_model.py +2 -3
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotations/leaders.py +37 -5
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotations/orchestrator.py +21 -3
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotations/sections.py +57 -11
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/audit.py +13 -1
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/builder.py +51 -13
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/cli.py +87 -28
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/compose.py +6 -4
- draftwright-0.4.27/src/draftwright/document.py +184 -0
- draftwright-0.4.27/src/draftwright/document_evidence.py +341 -0
- draftwright-0.4.27/src/draftwright/document_input.py +101 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/drawing.py +266 -73
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/export.py +87 -0
- draftwright-0.4.27/src/draftwright/linting/_registry.py +177 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/angular.py +27 -11
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/blend_coverage.py +20 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/chamfer_coverage.py +8 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/channel_coverage.py +8 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/circular_blind_step_coverage.py +8 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/coverage.py +114 -68
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/evidence.py +104 -4
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/fillet_coverage.py +8 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/flat_coverage.py +8 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/groove_coverage.py +8 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/hole_coverage.py +202 -19
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/issues.py +5 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/oriented_slot_coverage.py +8 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/pad_coverage.py +43 -13
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/paired_ramp_step_coverage.py +8 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/plate_coverage.py +75 -42
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/pocket_coverage.py +55 -14
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/pocket_pattern_coverage.py +54 -18
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/polygonal_boss_coverage.py +8 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/polygonal_stock_coverage.py +10 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/quality.py +43 -1
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/rectangular_blind_slot_coverage.py +8 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/requirements.py +66 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/round_bottom_blind_slot_coverage.py +8 -2
- draftwright-0.4.27/src/draftwright/linting/schedule_evidence.py +96 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/slot_coverage.py +8 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/structural.py +23 -1
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/suggest.py +53 -44
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/through_step_coverage.py +60 -43
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/turned_step_coverage.py +14 -4
- draftwright-0.4.27/src/draftwright/location_contract.py +56 -0
- draftwright-0.4.27/src/draftwright/measurement_support.py +56 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/model/__init__.py +4 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/model/callout.py +5 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/model/compiled.py +296 -5
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/model/detect.py +12 -10
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/model/ir.py +61 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/model/planner.py +145 -14
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/plate_correspondence.py +85 -0
- draftwright-0.4.27/src/draftwright/progress.py +209 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/projection.py +3 -1
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/recognition_cache.py +8 -5
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/recognition_frame.py +2 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/registry.py +62 -4
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/repair.py +25 -20
- draftwright-0.4.27/src/draftwright/reporting.py +1632 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/sheet.py +136 -9
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/sheet_emit.py +31 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/view_plan.py +4 -2
- draftwright-0.4.27/tests/fixtures/whistle_frame_reference.step +18544 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_add_dimension.py +1 -1
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_adr_corpus.py +1 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_compiled_plan_boundary.py +1 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_declare.py +9 -4
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_import_boundaries.py +9 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1144_transactional_hole_table.py +1 -1
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1146_scale_completeness.py +13 -1
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1166_cross_pass_feature_leaders.py +17 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1190_section_decision.py +3 -3
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1217_the_facility_is_shared.py +12 -5
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1308_machined_leader_analytics.py +4 -1
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1338_scale_before_page_escalation.py +7 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1351_structured_note_coverage.py +20 -6
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1373_plate_completeness_evidence.py +82 -4
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1374_turned_step_completeness_evidence.py +14 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1378_diameter_leader_targets.py +11 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1382_through_step_semantics.py +17 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1460_step_inspection.py +1 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1479_radius_leader_targets.py +11 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1514_projection_safeguard.py +1 -1
- draftwright-0.4.27/tests/test_issue_1530_section_provenance.py +127 -0
- draftwright-0.4.27/tests/test_issue_1531_semantic_hole_counts.py +255 -0
- draftwright-0.4.27/tests/test_issue_1532_authored_section_examples.py +123 -0
- draftwright-0.4.27/tests/test_issue_1533_review_diagnostics.py +159 -0
- draftwright-0.4.27/tests/test_issue_1534_build_progress.py +258 -0
- draftwright-0.4.27/tests/test_issue_1536_title_overflow.py +144 -0
- draftwright-0.4.27/tests/test_issue_1542_applicability.py +156 -0
- draftwright-0.4.27/tests/test_issue_1542_catalog.py +403 -0
- draftwright-0.4.27/tests/test_issue_1542_catalog_families.py +130 -0
- draftwright-0.4.27/tests/test_issue_1542_claim_authority.py +183 -0
- draftwright-0.4.27/tests/test_issue_1542_document.py +203 -0
- draftwright-0.4.27/tests/test_issue_1542_document_claims.py +268 -0
- draftwright-0.4.27/tests/test_issue_1542_document_coverage.py +244 -0
- draftwright-0.4.27/tests/test_issue_1542_document_report.py +389 -0
- draftwright-0.4.27/tests/test_issue_1542_report_authority.py +142 -0
- draftwright-0.4.27/tests/test_issue_1542_requirement_carriers.py +213 -0
- draftwright-0.4.27/tests/test_issue_1543_feature_schedules.py +926 -0
- draftwright-0.4.27/tests/test_issue_1543_schedule_requirements.py +596 -0
- draftwright-0.4.27/tests/test_issue_1544_frame_document_canary.py +359 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_740_leader_assignment.py +8 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_885_prismatic_coverage.py +20 -2
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_955_height_contingency.py +37 -1
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_label_provenance.py +0 -4
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_layout_cleanliness.py +0 -4
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_make_drawing.py +45 -68
- draftwright-0.4.27/tests/test_projection_symbol_default.py +164 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_registry.py +1 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_sheet_emit.py +14 -3
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_sheet_identity_invariant.py +46 -4
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_workflows.py +1 -0
- draftwright-0.4.25/src/draftwright/linting/_registry.py +0 -32
- draftwright-0.4.25/src/draftwright/reporting.py +0 -673
- {draftwright-0.4.25 → draftwright-0.4.27}/.gitignore +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/CHANGELOG.md +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/LICENSE +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/docs/adr/README.md +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/docs/reference/recogniser-capabilities.md +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/docs/research/1062-repeating-radial-profile-evidence.md +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/_build_profile.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/_pmi_part21.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/_warnings.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/angular_geometry.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotate.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotations/__init__.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotations/angular.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotations/balloons.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotations/gears.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/annotations/holes.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/blend_contract.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/evaluation/__init__.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/evaluation/step_analysis.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/feature_identity.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/fits.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/fonts/IBMPlexMono-Regular.ttf +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/fonts/IBMPlexSansCondensed-Regular.ttf +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/fonts/LICENSE-IBMPlexMono-OFL.txt +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/fonts/LICENSE-IBMPlexSansCondensed-OFL.txt +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/fonts/__init__.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/inspection.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/inspection_contract.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/intents.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/layout.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/__init__.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/angled_step_coverage.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/gear_coverage.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/ink_overlap.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/passage_coverage.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/pmi_coverage.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/prismatic_pocket_coverage.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/profiled_bore_coverage.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/linting/section_recess_coverage.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/make_drawing.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/model/declare.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/model/pmi_lowering.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/oriented_slot_contract.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/pmi.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/profile_angles.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/py.typed +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/recogniser_contract.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/recogniser_policy.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/recogniser_schema.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/recognition/__init__.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/recognition_ownership.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/score.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/src/draftwright/section_recess_contract.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/_evidence_contract.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/_kernel.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/_layout_sig.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/_mutation_corpus.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/_recogniser_public_contract.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/_section_recess_cases.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/conftest.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/ap242_single_cylinder_diameter.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/README.md +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/ambiguous-open-semicircle.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/blind-hole.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/chamfer-asymmetric.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/chamfer-compound.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/chamfer-overlap.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/chamfer-plain.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/chamfer-planar-x.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/chamfer-planar-y.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/chamfer-planar-z.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/chamfer-topology-a.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/chamfer-topology-b.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/chamfer-turned.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-chamfers-v1.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-countersinks-v1.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-double-d-bores-v1.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-fillets-v1.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-flats-v1.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-grooves-v1.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-hole-patterns-v1.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-plates-v1.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-pocket-patterns-v1.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-pockets-v1.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-polygonal-bosses-v1.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-polygonal-stock-v1.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-rectangular-pads-v1.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-turned-steps-v1.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/corpus-v1.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/countersink-deburr.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/countersink-external-cone.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/countersink-mixed-pair.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/countersink-single.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/countersink-topology-a.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/countersink-topology-b.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/double-d-axis-x.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/double-d-axis-y.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/double-d-blind.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/double-d-coaxial-compound.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/double-d-opposed-blind.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/double-d-roll-30.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/double-d-round-bore.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/double-d-single-z.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/double-d-topology-a.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/double-d-topology-b.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/fillet-compound.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/fillet-overlap.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/fillet-plain.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/fillet-planar-x.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/fillet-planar-y.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/fillet-planar-z.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/fillet-repeated.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/fillet-topology-a.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/fillet-topology-b.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/fillet-turned.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/flat-coaxial.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/flat-double-d.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/flat-lone-d.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/flat-nonround.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/flat-slanted-double-d.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/flat-topology-a.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/flat-topology-b.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/groove-compound.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/groove-lone-x.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/groove-lone-y.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/groove-lone-z.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/groove-monotonic-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/groove-narrow.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/groove-topology-a.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/groove-topology-b.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-compound-equal.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-detached-body-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-full-span-ledge-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-nested-staircase-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-topology-a.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-topology-b.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-x-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-x-positive.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-y-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-y-positive.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-z-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pad-z-positive.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pattern-ambiguous.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pattern-grid.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pattern-topology-a.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pattern-topology-b.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plain-block.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-compound-equal.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-cross-topology-a.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-cross-topology-b.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-detached-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-rotational-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-single-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-t-xz.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-t-yz.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-thick-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-u-additive.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/plate-u-cut.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-compound.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-edge-anchored.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-lone.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-opposed.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-pattern-ambiguous.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-pattern-grid.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-pattern-linear.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-pattern-pair.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-pattern-topology-a.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-pattern-topology-b.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-prismatic-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-side.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-through-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-topology-a.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-topology-b.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/pocket-two-equal.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-compound-equal.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-detached-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-in-plane-rotated.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-other-protrusions-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-recess-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-stock-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-topology-a.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-topology-b.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-x.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-y.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-boss-z.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-compound-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-cylinder-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-irregular-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-octagon-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-recess-negative.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-roll17.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-topology-a.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-topology-b.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-translated.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-x.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/polygonal-stock-y.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/topology-a.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/topology-b.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/turned-step-axis-x.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/turned-step-axis-y.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/turned-step-axis-z.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/turned-step-compound.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/turned-step-repeated-lengths.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/turned-step-through-bore.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/turned-step-topology-a.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/turned-step-topology-b.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/evaluation/turned-step-translated-blind-bore.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/grm03_thumbwheel_drive_screw.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/grm03_thumbwheel_drive_screw_ap242_pmi.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/grm04_drive_plate.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/if_step_flat_across_cylinder.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/issue_1058_wheel_rh.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/issue_1247_angled_blind_step.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/issue_909_basic_part_design_017_body.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/issue_915_case_study_2.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/nist_ctc_01_asme1_ap203.stp +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/nist_ctc_01_asme1_ap242.stp +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/nist_ctc_02_asme1_ap203.stp +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/nist_ctc_02_asme1_ap242.stp +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/nist_ctc_03_asme1_ap203.stp +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/nist_ctc_03_asme1_ap242.stp +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/nist_ctc_04_asme1_ap203.stp +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/nist_ctc_04_asme1_ap242.stp +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/nist_ctc_05_asme1_ap203.stp +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/nist_ctc_05_asme1_ap242.stp +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/fixtures/tuner_jig_blind_obround_pockets.step +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/bracket_section.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/centered_rebate.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/chamfered.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/filleted.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/flange_dense.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/grid_plate.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/grooved_shaft.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/hex_bar.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/holed_slot.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/pocketed.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/prismatic_ladder.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/scattered_plate.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/side_drilled.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/refactor_golden/turned_stepped.json +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_adr0018_arrangement_gate.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_adr0018_view_routing.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_adr0018_view_selection.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_agents_guide.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_api_docs.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_architecture_docs.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_audit_differential.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_balloon_ring_standoff.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_build_profile_harness.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_carve_free_position_callers.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_clone_budget.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_counting_calls.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_declared_recognition_gate.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_dense_sheet_canary.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_deprecation_dates.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_detect_once.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_detect_registry.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_dimension_role_vocabulary.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_drawing_encapsulation.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_e2e_slice.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_e2e_standards.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_export_dxf_curves.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_export_dxf_zoom.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_export_reproducible.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_external_recognition_boundary.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_fillets_adjacency.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_fits.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_flat_completeness.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_flat_stock_identity.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_flat_stock_opposition.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_gdt_placement.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_geometry_graph_spike.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_grid_lattice_convention.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_inspection_contract.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_iso_nts_caption_placement.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1000_envelope_reuse.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1006_measurement_comparison.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1058_wheel_profile.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1073_cross_body_patterns.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1082_polygonal_stock.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1086_declared_gears.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1116_ap242_hole_tolerance_lowering.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1130_view_planning_evidence.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1142_hole_leader_labels.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1143_hole_completeness.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1147_legibility_pair_aggregation.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1153_contradictory_dimensions.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1154_one_owner_per_measurement.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1155_grm04_sheet_use.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1176_quality_fidelity.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1177_angular_dimensions.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1187_unroutable_leaders.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1188_per_view_assignment.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1196_deterministic_view_names.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1202_observed_drawing_consumer.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1204_multiscale_view_issues.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1209_linear_pmi_witnesses.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1215_envelope_tolerance.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1215_no_approved_tolerance_is_dropped.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1216_callout_reservation_measures_ink.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1216_pairwise_across_scale_groups.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1217_claimed_representations.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1219_location_claims_its_own_axis.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1229_ledger_member_keying.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1240_iso_above_strip_visibility.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1245_passage_disposition.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1246_prismatic_pocket_disposition.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1247_angled_step_disposition.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1254_turned_chamfers.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1260_view_constraints.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1262_automatic_turned_views.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1276_turned_leader_targets.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1281_turned_fillets.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1296_cylindrical_diameter_pmi.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1298_manufacturing_requirements.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1299_page_escalation.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1312_engine_costs.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1325_nominal_agreement.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1332_overlap_remedy.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1332_zone_labels.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1333_bounded_ink_repair.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1334_prevent_ink.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1336_grm03_ap242_pmi_fixture.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1349_precision_display.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1350_detected_takeover.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1352_searchable_pdf_text.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1353_cnc_authoritative_workflow.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1357_framed_activation.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1357_framed_boundary.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1357_plural_turned_profiles.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1357_pmi_frame.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1360_thread_depth.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1369_hole_completeness_evidence.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1370_countersink_completeness_evidence.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1370_double_d_completeness_evidence.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1370_hole_pattern_completeness_evidence.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1371_flat_completeness_evidence.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1371_polygonal_stock_completeness_evidence.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1372_groove_completeness_evidence.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1372_pad_completeness_evidence.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1372_pocket_completeness_evidence.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1372_pocket_pattern_completeness_evidence.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1372_polygonal_boss_completeness_evidence.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1374_chamfer_completeness_evidence.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1374_fillet_completeness_evidence.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1382_046_step_inventory.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1382_circular_blind_step_semantics.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1382_framed_step_family_evidence.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1382_paired_ramp_semantics.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1390_sheet_registration.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1392_recognisers_048.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1395_degenerate_iso_region.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1396_layout_advisories.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1397_unverifiable_requirement_message.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1421_rectangular_blind_slot_completeness.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1421_rectangular_blind_slot_semantics.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1421_round_bottom_blind_slot_completeness.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1421_round_bottom_blind_slot_semantics.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1432_adoption.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1432_boundary_failures.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1432_oriented_slot_semantics.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1433_blend_semantics.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_boss_ownership.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_channel_ownership.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_cli_report_sidecar.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_generation_snapshot.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_nested_ownership.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_occurrence_ownership.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_pattern_ownership.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_plate_ownership.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_policy_dispositions.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_report_projection.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_report_writer.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_through_step_ownership.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1438_turned_step_ownership.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1450_boss_blend_ownership.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1466_dimension_options.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1466_semantic_sides.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1471_boundary_failures.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1471_evidence_schema.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1471_groove_profile.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1471_section_recess_contract.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1471_section_recess_pockets.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1485_curved_pockets.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1485_quiddity_024_boundary.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1485_rounded_pockets.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1504_angle_patterns.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1504_angular_references.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1504_angular_rendering.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1504_canonical_angles.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1504_profile_angles.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1505_diameter_coverage.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1505_short_axial_chains.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1511_turned_boss_heights.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1515_first_angle.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1516_dimension_text.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1517_through_indicator.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1518_explicit_rear.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_1524_tolerance_magnitude.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_367_leader_ink.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_443_grm03_axial_coverage.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_563_placement_intent.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_676_polygonal_boss.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_676_polygonal_boss_declare.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_798_floor_cardinality.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_798_material_field.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_798_silhouette_lint.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_827_real_part_canary.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_883_location_identity.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_909_sloped_profile.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_915_dense_case.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_916_pocket_leader.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_917_open_channel.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_924_zero_length_shoulders.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_issue_958_cross_solid_recognition.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_layout.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_layout_hypothesis.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_layout_property.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_leader_footprint.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_lint_box_cache.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_lint_ink_overlap.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_lint_reconciliation.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_lint_structural.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_linting.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_location_vocabulary.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_note_verb.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_object_aspects.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_occupancy_boxes.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_overall_height_coverage.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_parameter_id.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_part_model.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_pitch_dim_footprint.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_pmi.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_pmi_datum_lowering.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_pmi_gtol_lowering.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_pmi_part21.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_pocket_pattern.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_pocket_pattern_recognition.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_principal_profile_classifier.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_private_test_attr_reads.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_private_test_imports.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_quality_components.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_recogniser_adoption.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_recogniser_capabilities.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_recogniser_contract.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_recognition_result.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_refactor_golden.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_render_seam.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_repack_geometry_seam.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_score.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_script_detail_parity.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_shared_box_memo.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_sheet_gdt.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_sheet_notes.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_sheet_of.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_sheet_section.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_sheet_tables.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_slanted_blind_step.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_slot_completeness.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_slot_pattern.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_slot_pattern_recognition.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_soft_deprecation.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_solve_trace.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_step_analysis_evaluation.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_strip_layout.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_suppression_ledger.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_suppression_marks.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_tolerances.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_turned_steps.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_version_bump_ci.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_view_plan.py +0 -0
- {draftwright-0.4.25 → draftwright-0.4.27}/tests/test_witness_label_reconciliation.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.27
|
|
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
|
|
@@ -694,6 +694,7 @@ Requires-Dist: pillow>=10
|
|
|
694
694
|
Requires-Dist: pypdfium2>=4
|
|
695
695
|
Requires-Dist: quiddity==0.2.6
|
|
696
696
|
Requires-Dist: reportlab>=4.0
|
|
697
|
+
Requires-Dist: rich>=10.11
|
|
697
698
|
Requires-Dist: steputils==0.1
|
|
698
699
|
Requires-Dist: svglib>=1.5
|
|
699
700
|
Requires-Dist: typer>=0.12
|
|
@@ -736,6 +737,10 @@ annotation placed by the engine.*
|
|
|
736
737
|
pip install draftwright
|
|
737
738
|
```
|
|
738
739
|
|
|
740
|
+
Already using a CAD project environment? Use a [separate drawing environment](docs/reference/isolated-execution.md)
|
|
741
|
+
and pass an exported STEP file between the two. The guide includes interpreter, dependency and
|
|
742
|
+
import checks for local Python and CAD MCP workflows.
|
|
743
|
+
|
|
739
744
|
### Command line
|
|
740
745
|
|
|
741
746
|
Point it at a STEP file — that's the whole workflow:
|
|
@@ -34,6 +34,10 @@ annotation placed by the engine.*
|
|
|
34
34
|
pip install draftwright
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
+
Already using a CAD project environment? Use a [separate drawing environment](docs/reference/isolated-execution.md)
|
|
38
|
+
and pass an exported STEP file between the two. The guide includes interpreter, dependency and
|
|
39
|
+
import checks for local Python and CAD MCP workflows.
|
|
40
|
+
|
|
37
41
|
### Command line
|
|
38
42
|
|
|
39
43
|
Point it at a STEP file — that's the whole workflow:
|
|
@@ -9,7 +9,10 @@ with an underscore.
|
|
|
9
9
|
Use `Sheet(part, projection="first")` or `build_drawing(part, projection="first")`
|
|
10
10
|
for first-angle layout and its matching projection symbol. The CLI equivalent is
|
|
11
11
|
`--projection first`. Explicit `"third"` selects third-angle layout and its symbol;
|
|
12
|
-
omitting `projection`
|
|
12
|
+
omitting `projection` uses third-angle layout and its symbol. Use
|
|
13
|
+
`projection_symbol=False` (CLI: `--no-projection-symbol`) to omit the symbol for an
|
|
14
|
+
embedded illustration; this does not change the projection convention or view layout.
|
|
15
|
+
The visibility choice also survives generated-script replay.
|
|
13
16
|
|
|
14
17
|
View names retain their physical viewing directions in the working part frame. Changing
|
|
15
18
|
convention changes sheet relationships, not which side of the part a name shows:
|
|
@@ -27,6 +30,58 @@ fails before projection; a whole-view pin must preserve the convention's relatio
|
|
|
27
30
|
|
|
28
31
|
## Dimension text style
|
|
29
32
|
|
|
33
|
+
### Title fields and notes at paper size
|
|
34
|
+
|
|
35
|
+
Keep title-block values concise and put longer engineering information in a `notes()` block.
|
|
36
|
+
`title_field_overflow` identifies text wider or taller than its title-block cell, even when the
|
|
37
|
+
text remains inside the page. This is a legibility warning, like overlapping annotations;
|
|
38
|
+
text outside the drawable page remains an `annotation_out_of_bounds` error. The full value
|
|
39
|
+
stays rendered; the diagnostic does not truncate it, shrink the font or invent an abbreviation.
|
|
40
|
+
`lint_summary()["passed"]` checks errors only, so inspect warnings and the legibility component
|
|
41
|
+
as well. A title warning does not prevent scale recovery from restoring missing measurements.
|
|
42
|
+
|
|
43
|
+
<!-- issue-1536-notes-example -->
|
|
44
|
+
```python
|
|
45
|
+
from build123d import Box
|
|
46
|
+
from draftwright import Sheet
|
|
47
|
+
|
|
48
|
+
sheet = Sheet(
|
|
49
|
+
Box(30, 20, 10), page="A4", scale=2,
|
|
50
|
+
title="FRAME - DFM REVIEW", number="REVIEW", material="SEE NOTES",
|
|
51
|
+
detail_view=False,
|
|
52
|
+
)
|
|
53
|
+
sheet.authored_dimensions()
|
|
54
|
+
envelope = sheet.envelope()
|
|
55
|
+
for parameter in envelope.dimension_ids():
|
|
56
|
+
sheet.dimension(envelope, parameter)
|
|
57
|
+
sheet.notes([
|
|
58
|
+
"QUOTATION / DFM REVIEW - NOT RELEASED",
|
|
59
|
+
"Material: TITANIUM - GRADE TBD",
|
|
60
|
+
"Hinge fit and pin retention: engineering decision required",
|
|
61
|
+
], prefer="tr")
|
|
62
|
+
drawing = sheet.build()
|
|
63
|
+
for issue in drawing.lint():
|
|
64
|
+
print(issue.severity, issue.code, issue.message)
|
|
65
|
+
```
|
|
66
|
+
<!-- /issue-1536-notes-example -->
|
|
67
|
+
|
|
68
|
+
`page` and `scale` control the sheet and model size. The current annotation preset has a fixed
|
|
69
|
+
3 mm nominal paper font size; changing scale does not enlarge notes. `Sheet.notes()` and
|
|
70
|
+
`Sheet.table()` have no font-size option. `text_position` and `text_orientation` below control
|
|
71
|
+
dimension style, not note size. A smaller model scale makes notes larger relative to the part;
|
|
72
|
+
a smaller page changes how much of the page they occupy. Neither changes their printed size.
|
|
73
|
+
For the A2 frame trial, retain A2 and the requested scale unless the full package fits the new
|
|
74
|
+
constraints with its required measurements intact; the small box example is not proof that
|
|
75
|
+
the frame fits A4.
|
|
76
|
+
|
|
77
|
+
`prefer="tr"` ranks available table positions near the top-right corner. The shared placement
|
|
78
|
+
solve still measures the whole notes block and checks all occupied regions. If it cannot fit,
|
|
79
|
+
`table_dropped` reports the failure. Split long prose into authored lines or choose an appropriate
|
|
80
|
+
page; do not remove engineering content merely to silence a diagnostic. General notes remain
|
|
81
|
+
uncredited text: they do not automatically satisfy missing dimensions or unsupported features.
|
|
82
|
+
|
|
83
|
+
### Dimension position and reading direction
|
|
84
|
+
|
|
30
85
|
Position and reading direction are independent drawing-wide settings:
|
|
31
86
|
|
|
32
87
|
```python
|
|
@@ -74,6 +129,20 @@ resolved wording, machining specifications and placement constraints agree; orig
|
|
|
74
129
|
owners and measurement identities remain separate. Removing one owner of a shared callout
|
|
75
130
|
rebuilds the survivors through the placement solver.
|
|
76
131
|
|
|
132
|
+
## Feature schedules
|
|
133
|
+
|
|
134
|
+
`sheet.schedule([(feature, ("bore.diameter", "location"))], name="holes")` declares a measured
|
|
135
|
+
table through the same IR/compiler as ordinary dimensions. Features may be fluent handles or
|
|
136
|
+
exact owned IR objects. Values, tolerances, units and through/blind wording come from the
|
|
137
|
+
compiler. `location` expands the addressable member coordinates; explicit canonical IDs select
|
|
138
|
+
individual components. Use `prefer="tr"`, `"tl"`, `"br"` or `"bl"` to rank the existing table
|
|
139
|
+
placement candidates.
|
|
140
|
+
|
|
141
|
+
Schedules establish authored dimension intent. Add `sheet.dimension(...)` declarations when a
|
|
142
|
+
measurement should also appear beside a view. Ordinary `table(...)` text has no measurement
|
|
143
|
+
authority. See [shared drawing documents](document.md#feature-schedules) for an executable
|
|
144
|
+
recipe, verified cell evidence and the document report contract.
|
|
145
|
+
|
|
77
146
|
## Grooves on coaxial bodies
|
|
78
147
|
|
|
79
148
|
When different turned bodies share an axis line, give their steps distinct `profile_group`
|
|
@@ -304,17 +373,84 @@ View declarations are semantic constraints. They name projections, relationships
|
|
|
304
373
|
anchors; the layout solve owns the resulting page positions. Authored views must be paired with
|
|
305
374
|
authored dimensions so a deliberately omitted view cannot strand planner-selected annotations:
|
|
306
375
|
|
|
376
|
+
This runnable example includes the part, feature declarations, dimension discovery,
|
|
377
|
+
three principal views and section A–A. The bore's location dimensions are deliberately
|
|
378
|
+
omitted, and lint keeps those omissions visible.
|
|
379
|
+
|
|
380
|
+
<!-- example: authored-section -->
|
|
381
|
+
```python
|
|
382
|
+
from build123d import Box, Cylinder, Pos
|
|
383
|
+
from draftwright import Sheet
|
|
384
|
+
|
|
385
|
+
bore_tool = Pos(12, 0, 0) * Cylinder(3, 12)
|
|
386
|
+
part = Box(60, 40, 12) - bore_tool
|
|
387
|
+
sheet = Sheet(part, page="A3", scale=1, projection="third")
|
|
388
|
+
sheet.authored_dimensions().authored_views()
|
|
389
|
+
|
|
390
|
+
envelope = sheet.envelope(part)
|
|
391
|
+
for parameter_id in envelope.dimension_ids():
|
|
392
|
+
sheet.dimension(envelope, parameter_id)
|
|
393
|
+
bore = sheet.hole(bore_tool)
|
|
394
|
+
print(bore.dimension_ids()) # discover this handle's Sheet measurement IDs
|
|
395
|
+
sheet.dimension(bore, "bore.diameter")
|
|
396
|
+
|
|
397
|
+
for name in ("front", "plan", "side"):
|
|
398
|
+
sheet.view(name)
|
|
399
|
+
sheet.section_view("A", through=bore) # or at=0 for an explicit model-space Y plane
|
|
400
|
+
|
|
401
|
+
drawing = sheet.build()
|
|
402
|
+
issues = drawing.lint()
|
|
403
|
+
for issue in issues:
|
|
404
|
+
print(issue.severity, issue.code, issue.message)
|
|
405
|
+
# drawing.export("build/section", formats=("pdf", "svg"))
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
On a Sheet handle, `dimension_ids()` lists dotted measurement IDs; use
|
|
409
|
+
`sheet.dimension(bore, "bore.diameter")`. On a built Drawing, the second argument to
|
|
410
|
+
`drawing.dimension(envelope_feature, "length", role="width")` is a parameter kind,
|
|
411
|
+
with `role=` distinguishing measurements of the same kind. Hole diameter and depth
|
|
412
|
+
are callout content: use `drawing.callout(bore_feature)` for those, not
|
|
413
|
+
`drawing.dimension(...)`. These are different vocabularies.
|
|
414
|
+
|
|
415
|
+
#### Augmenting automatic views
|
|
416
|
+
|
|
417
|
+
`view()` and `section_view()` specify complete authored sets. `add_view()` and
|
|
418
|
+
`add_section_view()` instead augment an explicitly automatic set. Choose the source
|
|
419
|
+
before adding views; an authored set cannot be switched to automatic in place.
|
|
420
|
+
|
|
421
|
+
This separate, runnable example keeps automatic principal and derived views and
|
|
422
|
+
adds a section at model-space Y=0. Its dimensions are still explicitly authored:
|
|
423
|
+
|
|
424
|
+
<!-- example: automatic-section -->
|
|
307
425
|
```python
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
426
|
+
from build123d import Box
|
|
427
|
+
from draftwright import Sheet
|
|
428
|
+
|
|
429
|
+
part = Box(60, 40, 12)
|
|
430
|
+
sheet = Sheet(part, page="A3", scale=1).authored_dimensions()
|
|
431
|
+
envelope = sheet.envelope(part)
|
|
432
|
+
for parameter_id in envelope.dimension_ids():
|
|
433
|
+
sheet.dimension(envelope, parameter_id)
|
|
434
|
+
sheet.auto_views()
|
|
435
|
+
sheet.add_section_view("A", at=0)
|
|
436
|
+
drawing = sheet.build()
|
|
437
|
+
issues = drawing.lint()
|
|
438
|
+
for issue in issues:
|
|
439
|
+
print(issue.severity, issue.code, issue.message)
|
|
316
440
|
```
|
|
317
441
|
|
|
442
|
+
`auto_views()` emits `SoftDeprecationWarning`: it remains supported and has no removal
|
|
443
|
+
date. The notice recommends the editable authored surface; it does not mean the
|
|
444
|
+
augmentation example is invalid. Automatic dimensions remain supported too, but they
|
|
445
|
+
cannot be paired with a complete authored view set.
|
|
446
|
+
|
|
447
|
+
`Sheet.section()` is deprecated with removal targeted at 0.6.0. For an authored
|
|
448
|
+
workflow replace it with `section_view("A", through=feature)` or `section_view("A", at=y)`;
|
|
449
|
+
for automatic augmentation use `auto_views()` followed by `add_section_view(...)`.
|
|
450
|
+
`Drawing.section()` is a separate automatic post-build operation and may add no section
|
|
451
|
+
when the geometry does not warrant one.
|
|
452
|
+
|
|
453
|
+
|
|
318
454
|
Rear views are explicitly requested. `s.view("rear")` includes rear in an authored
|
|
319
455
|
view set; `s.auto_views().add_view("rear")` adds it to the automatic baseline.
|
|
320
456
|
Rear looks toward the part from +Y with Z upward, so increasing world X runs left
|
|
@@ -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.27"
|
|
8
8
|
description = "Automated technical-drawing generation for build123d"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { file = "LICENSE" }
|
|
@@ -38,6 +38,7 @@ dependencies = [
|
|
|
38
38
|
"antlr4-python3-runtime<4.10",
|
|
39
39
|
"svglib>=1.5",
|
|
40
40
|
"typer>=0.12",
|
|
41
|
+
"rich>=10.11",
|
|
41
42
|
# PEP 702 @deprecated: stdlib `warnings.deprecated` lands in 3.13; backport for 3.10–3.12.
|
|
42
43
|
"typing_extensions>=4.5 ; python_full_version < '3.13'",
|
|
43
44
|
]
|
|
@@ -90,7 +91,7 @@ timeout = 300
|
|
|
90
91
|
# (minutes each), deselected by default. `smoke` is a curated, build-light subset
|
|
91
92
|
# (~30 s) for a quick local "did I break something obvious" check — run it with
|
|
92
93
|
# `uv run pytest -m smoke`. The default run is the full fast tier (`-m 'not slow'`,
|
|
93
|
-
# runtime depends on worker count). CI runs
|
|
94
|
+
# runtime depends on worker count). CI runs bounded real-part canaries before merge,
|
|
94
95
|
# the full slow tier after merge, and the fast tier across its compatibility matrix.
|
|
95
96
|
markers = [
|
|
96
97
|
"slow: end-to-end integration builds, including CTC fixtures (deselected by default)",
|
|
@@ -29,9 +29,9 @@ verbs existed then, and the dotted parameter ids in Step 2 are new in 0.4.0.)
|
|
|
29
29
|
everything automatically** (placement is constraint-based; you never compute page
|
|
30
30
|
coordinates). When the first pass isn't perfect, you drive a **build → critique
|
|
31
31
|
→ fix** loop (Step "Lint → critique → fix" below), not a hand-layout edit. The
|
|
32
|
-
rationale lives in `docs/adr/`:
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
rationale lives in the five current records in `docs/adr/`: ADR 1 (compiler pipeline),
|
|
33
|
+
ADR 2 (layout and view planning), ADR 3 (recognition), ADR 4 (declared intent), and
|
|
34
|
+
ADR 5 (trust and honest failure). Edit through the domain API; treat `Placeable`/page mechanics as
|
|
35
35
|
internals.
|
|
36
36
|
|
|
37
37
|
---
|
|
@@ -145,19 +145,26 @@ rather than the bare family role (`"width"`): the bare spelling is deprecated,
|
|
|
145
145
|
because it is what let a single call silently declare two dimensions.
|
|
146
146
|
|
|
147
147
|
`place_dim(p1, p2, side, view, …)` still exists for raw page coordinates, but it is
|
|
148
|
-
the **escape hatch of last resort** (ADR
|
|
148
|
+
the **escape hatch of last resort** (ADR 4) and is deprecated: it bypasses the
|
|
149
149
|
layout solve, so nothing re-flows around it.
|
|
150
150
|
|
|
151
|
-
**Add a
|
|
152
|
-
|
|
153
|
-
|
|
151
|
+
**Add a callout on a hole the auto-pass missed** — inspect its semantic requirement
|
|
152
|
+
finding first. Equal diameters can belong to different axes, blind depths, threads
|
|
153
|
+
or fits; a diameter-total warning never authorises increasing a callout count.
|
|
154
154
|
|
|
155
155
|
```python
|
|
156
|
-
for
|
|
157
|
-
if
|
|
158
|
-
|
|
156
|
+
for issue in dwg.lint():
|
|
157
|
+
if issue.code.startswith("hole_requirement_"):
|
|
158
|
+
print(issue.message)
|
|
159
|
+
if issue.suggestion:
|
|
160
|
+
print(issue.suggestion)
|
|
159
161
|
```
|
|
160
162
|
|
|
163
|
+
For a verified missing bore on an automatic model, the suggestion targets the exact
|
|
164
|
+
feature with `dwg.callout(...)` through the shared solve. It applies to that Drawing;
|
|
165
|
+
re-run lint after rebuilding. Authored omissions, unverified ownership and conflicting
|
|
166
|
+
counts require inspection of the declared operation rather than an automatic count edit.
|
|
167
|
+
|
|
161
168
|
**Free text** at a chosen point is `note()` — a domain verb, not an escape hatch:
|
|
162
169
|
|
|
163
170
|
```python
|
|
@@ -183,24 +190,56 @@ warn from 0.4.0. See `docs/deprecations.md`.
|
|
|
183
190
|
`make_drawing(...)` is `build_drawing(...).export(formats=("svg", "dxf"))`, unpacked to a
|
|
184
191
|
tuple — not a bare `.export()`, which is the deprecated shape above.
|
|
185
192
|
|
|
186
|
-
**
|
|
187
|
-
|
|
193
|
+
**Authored section views** use `section_view()` alongside an explicit dimension and
|
|
194
|
+
view set. This complete example declares the bore diameter and overall extents;
|
|
195
|
+
it deliberately leaves the bore's location dimensions unrequested:
|
|
188
196
|
|
|
197
|
+
<!-- example: authored-section -->
|
|
189
198
|
```python
|
|
199
|
+
from build123d import Box, Cylinder, Pos
|
|
190
200
|
from draftwright import Sheet
|
|
191
201
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
"
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
+
bore_tool = Pos(12, 0, 0) * Cylinder(3, 12)
|
|
203
|
+
part = Box(60, 40, 12) - bore_tool
|
|
204
|
+
sheet = Sheet(part, page="A3", scale=1, projection="third")
|
|
205
|
+
sheet.authored_dimensions().authored_views()
|
|
206
|
+
|
|
207
|
+
envelope = sheet.envelope(part)
|
|
208
|
+
for parameter_id in envelope.dimension_ids():
|
|
209
|
+
sheet.dimension(envelope, parameter_id)
|
|
210
|
+
bore = sheet.hole(bore_tool)
|
|
211
|
+
print(bore.dimension_ids()) # discover this handle's Sheet measurement IDs
|
|
212
|
+
sheet.dimension(bore, "bore.diameter")
|
|
213
|
+
|
|
214
|
+
for name in ("front", "plan", "side"):
|
|
215
|
+
sheet.view(name)
|
|
216
|
+
sheet.section_view("A", through=bore) # or at=0 for an explicit model-space Y plane
|
|
217
|
+
|
|
218
|
+
drawing = sheet.build()
|
|
219
|
+
issues = drawing.lint()
|
|
220
|
+
for issue in issues:
|
|
221
|
+
print(issue.severity, issue.code, issue.message)
|
|
222
|
+
# drawing.export("build/section", formats=("pdf", "svg"))
|
|
202
223
|
```
|
|
203
224
|
|
|
225
|
+
`dimension_ids()` lists the Sheet handle's dotted IDs: use `"bore.diameter"` here.
|
|
226
|
+
Drawing.dimension instead takes a kind and optional role, such as `"length"` with
|
|
227
|
+
`role="width"` for an envelope. Hole diameter/depth use Drawing.callout, not
|
|
228
|
+
Drawing.dimension. Inspect `issues`: authored omissions
|
|
229
|
+
remain visible, so a successfully built section does not prove a complete drawing.
|
|
230
|
+
|
|
231
|
+
`view()` and `section_view()` define complete authored principal and derived sets.
|
|
232
|
+
To augment automatic views instead, start a new Sheet, explicitly select
|
|
233
|
+
`auto_views()`, and use `add_section_view("A", through=...)` or `at=...`.
|
|
234
|
+
That mode remains supported; `auto_views()` emits a soft-deprecation notice with
|
|
235
|
+
no removal date. Do not switch an already-authored view set to `auto_views()`.
|
|
236
|
+
See the runnable augmentation example in `docs/reference/sheet.md`.
|
|
237
|
+
|
|
238
|
+
`Sheet.section()` is deprecated with removal targeted at 0.6.0. Migrate it to the
|
|
239
|
+
method for your view source above. `Drawing.section()` remains the automatic
|
|
240
|
+
post-build section operation: it may return no section when the geometry does not
|
|
241
|
+
warrant one. It does not replace an explicit authored section request.
|
|
242
|
+
|
|
204
243
|
Arbitrary **auxiliary** views have no public verb: `add_view()` was the way to
|
|
205
244
|
project one and is deprecated, so a custom viewing direction is not currently part
|
|
206
245
|
of the supported surface.
|
|
@@ -311,7 +350,7 @@ for i in dwg.lint():
|
|
|
311
350
|
dwg.repair()
|
|
312
351
|
|
|
313
352
|
# Pin a deliberate placement so repair won't move it (the constraint solver will
|
|
314
|
-
# honour it too as it lands — ADR
|
|
353
|
+
# honour it too as it lands — ADR 2):
|
|
315
354
|
dwg.pin(name) # name from dwg.annotations(); dwg.unpin(name) to release
|
|
316
355
|
```
|
|
317
356
|
|
|
@@ -27,6 +27,9 @@ _LAZY = {
|
|
|
27
27
|
"ScaleIncompatibilityError": "draftwright.builder",
|
|
28
28
|
"make_drawing": "draftwright.builder",
|
|
29
29
|
"Drawing": "draftwright.drawing",
|
|
30
|
+
"BuildEvent": "draftwright.progress",
|
|
31
|
+
"BuildCancelled": "draftwright.progress",
|
|
32
|
+
"observe_build": "draftwright.progress",
|
|
30
33
|
"FeatureInfo": "draftwright.drawing",
|
|
31
34
|
"ReportUnavailableError": "draftwright.reporting",
|
|
32
35
|
"INSPECTION_SCHEMA": "draftwright.inspection",
|
|
@@ -34,6 +37,9 @@ _LAZY = {
|
|
|
34
37
|
"InspectionUnavailableError": "draftwright.inspection",
|
|
35
38
|
"inspect_step": "draftwright.inspection",
|
|
36
39
|
"Sheet": "draftwright.sheet",
|
|
40
|
+
"Document": "draftwright.document",
|
|
41
|
+
"DocumentResult": "draftwright.document",
|
|
42
|
+
"DocumentBuildError": "draftwright.document",
|
|
37
43
|
"lint_feature_coverage": "draftwright.linting",
|
|
38
44
|
"PmiExtractionReport": "draftwright.pmi",
|
|
39
45
|
"PmiRecord": "draftwright.pmi",
|
|
@@ -89,6 +95,7 @@ if TYPE_CHECKING: # static analysers / IDEs — no runtime import, no kernel co
|
|
|
89
95
|
from draftwright._warnings import ScaleCompletenessWarning, SoftDeprecationWarning
|
|
90
96
|
from draftwright.builder import ScaleIncompatibilityError, build_drawing, make_drawing
|
|
91
97
|
from draftwright.compose import choose_scale
|
|
98
|
+
from draftwright.document import Document, DocumentBuildError, DocumentResult
|
|
92
99
|
from draftwright.drawing import Drawing, FeatureInfo
|
|
93
100
|
from draftwright.inspection import (
|
|
94
101
|
INSPECTION_SCHEMA,
|
|
@@ -104,6 +111,7 @@ if TYPE_CHECKING: # static analysers / IDEs — no runtime import, no kernel co
|
|
|
104
111
|
extract_pmi,
|
|
105
112
|
extract_pmi_report,
|
|
106
113
|
)
|
|
114
|
+
from draftwright.progress import BuildCancelled, BuildEvent, observe_build
|
|
107
115
|
from draftwright.reporting import ReportUnavailableError
|
|
108
116
|
from draftwright.sheet import Sheet
|
|
109
117
|
from draftwright.view_plan import ViewConstraints, ViewPlanIncomplete, ViewSpec
|
|
@@ -117,9 +125,15 @@ def __dir__():
|
|
|
117
125
|
|
|
118
126
|
|
|
119
127
|
__all__ = [
|
|
128
|
+
"BuildEvent",
|
|
129
|
+
"BuildCancelled",
|
|
130
|
+
"observe_build",
|
|
120
131
|
"INSPECTION_SCHEMA",
|
|
121
132
|
"INSPECTION_SCHEMA_VERSION",
|
|
122
133
|
"Drawing",
|
|
134
|
+
"Document",
|
|
135
|
+
"DocumentResult",
|
|
136
|
+
"DocumentBuildError",
|
|
123
137
|
"SoftDeprecationWarning",
|
|
124
138
|
"FeatureInfo",
|
|
125
139
|
"InspectionUnavailableError",
|
|
@@ -20,7 +20,6 @@ import re
|
|
|
20
20
|
from bisect import bisect_left, bisect_right
|
|
21
21
|
from collections.abc import Callable
|
|
22
22
|
from dataclasses import dataclass
|
|
23
|
-
from decimal import Decimal
|
|
24
23
|
from pathlib import Path
|
|
25
24
|
from types import SimpleNamespace
|
|
26
25
|
from typing import TYPE_CHECKING, Literal
|
|
@@ -63,6 +62,7 @@ from draftwright._geometry import ( # noqa: F401
|
|
|
63
62
|
HoleRef,
|
|
64
63
|
_axis_letter,
|
|
65
64
|
_fmt,
|
|
65
|
+
_fmt_tolerance,
|
|
66
66
|
_xyz,
|
|
67
67
|
)
|
|
68
68
|
from draftwright.fits import FitClass
|
|
@@ -110,6 +110,7 @@ def place_annotation(
|
|
|
110
110
|
feature=None,
|
|
111
111
|
measurement=None,
|
|
112
112
|
satisfaction=None,
|
|
113
|
+
cells=(),
|
|
113
114
|
):
|
|
114
115
|
"""The annotation-placement primitive (#817): register *obj* under *name* — replacing any
|
|
115
116
|
prior object of that name (dropped from the render list *items*) so a name maps to one
|
|
@@ -126,7 +127,7 @@ def place_annotation(
|
|
|
126
127
|
items.remove(displaced)
|
|
127
128
|
annotate(obj, name)
|
|
128
129
|
items.append(obj)
|
|
129
|
-
registry.add(obj, name, view, feature, measurement, satisfaction)
|
|
130
|
+
registry.add(obj, name, view, feature, measurement, satisfaction, cells=cells)
|
|
130
131
|
return obj
|
|
131
132
|
|
|
132
133
|
|
|
@@ -357,15 +358,7 @@ def _tol_suffix(tolerance, draft) -> str:
|
|
|
357
358
|
if isinstance(tolerance, FitClass):
|
|
358
359
|
return tolerance.suffix()
|
|
359
360
|
|
|
360
|
-
|
|
361
|
-
decimal = Decimal(str(value))
|
|
362
|
-
precision = max(draft.decimal_precision, -int(decimal.as_tuple().exponent))
|
|
363
|
-
return f"{decimal:.{precision}f}"
|
|
364
|
-
|
|
365
|
-
if isinstance(tolerance, (int, float)):
|
|
366
|
-
return f" ±{magnitude(tolerance)}"
|
|
367
|
-
lo, hi = tolerance
|
|
368
|
-
return f" +{magnitude(hi)} -{magnitude(lo)}"
|
|
361
|
+
return _fmt_tolerance(tolerance, draft.decimal_precision)
|
|
369
362
|
|
|
370
363
|
|
|
371
364
|
def _tag_sequence(n):
|
|
@@ -1267,9 +1260,10 @@ class Analysis:
|
|
|
1267
1260
|
# Draw a sheet border/frame (#767). When True, `margin` is already the reserved content
|
|
1268
1261
|
# margin (`_content_margin(True)`), so content clears the frame drawn at `_MARGIN`.
|
|
1269
1262
|
frame: bool = False
|
|
1270
|
-
#
|
|
1263
|
+
# Requested convention; None resolves to third-angle. Symbol visibility is independent.
|
|
1271
1264
|
projection: str | None = None
|
|
1272
1265
|
projection_convention: str = "third"
|
|
1266
|
+
projection_symbol: bool = True
|
|
1273
1267
|
text_position: str = "inline"
|
|
1274
1268
|
text_orientation: str = "aligned"
|
|
1275
1269
|
# Draw the ISO 5457 zone-grid border ruler (#768). Implies a frame (the ticks sit on it).
|
|
@@ -1419,6 +1413,13 @@ def _make_title_block(dwg, a: Analysis):
|
|
|
1419
1413
|
)
|
|
1420
1414
|
)
|
|
1421
1415
|
tb.pdf_text_specs = tuple(specs)
|
|
1416
|
+
# Keep the exact rendered field inputs for structural cell-overflow checks. Cell geometry
|
|
1417
|
+
# remains owned by TitleBlock.cell_bbox(); it is not copied into a second layout model.
|
|
1418
|
+
tb.title_field_specs = tuple(
|
|
1419
|
+
(field, value, dwg.draft.font_size, PLEX_SANS_CONDENSED)
|
|
1420
|
+
for field, value in fields
|
|
1421
|
+
if value
|
|
1422
|
+
)
|
|
1422
1423
|
return tb, cell
|
|
1423
1424
|
|
|
1424
1425
|
|
|
@@ -1481,11 +1482,15 @@ def _add_projection_symbol(dwg, a: Analysis):
|
|
|
1481
1482
|
just above the drawn title block (deterministic empty space — the block reserves _TB_H but
|
|
1482
1483
|
draws shorter). Registered ``projection_symbol`` with an ``is_projection_symbol`` identity
|
|
1483
1484
|
rider. Unlike the page-spanning frame it is NOT lint-exempt: it's a small, well-placed glyph,
|
|
1484
|
-
so lint covers it and a future mispositioning is caught.
|
|
1485
|
+
so lint covers it and a future mispositioning is caught. Suppressed only by
|
|
1486
|
+
``projection_symbol=False``."""
|
|
1487
|
+
if not a.projection_symbol:
|
|
1488
|
+
return
|
|
1489
|
+
|
|
1485
1490
|
from build123d_drafting import ProjectionSymbol
|
|
1486
1491
|
|
|
1487
1492
|
sym = ProjectionSymbol(
|
|
1488
|
-
a.
|
|
1493
|
+
a.projection_convention,
|
|
1489
1494
|
draft=draft_preset(
|
|
1490
1495
|
font_size=dwg.draft.font_size,
|
|
1491
1496
|
decimal_precision=dwg.draft.decimal_precision,
|
|
@@ -1496,7 +1501,8 @@ def _add_projection_symbol(dwg, a: Analysis):
|
|
|
1496
1501
|
bx, by = (b.min.X + b.max.X) / 2, (b.min.Y + b.max.Y) / 2
|
|
1497
1502
|
w, h = b.max.X - b.min.X, b.max.Y - b.min.Y
|
|
1498
1503
|
# Right side of the title-block column, near the top of its reserved band.
|
|
1499
|
-
|
|
1504
|
+
# Sheet frames reserve an inner content margin; keep furniture inside it too.
|
|
1505
|
+
cx = a.PAGE_W - max(_TB_CLEAR + 3, a.margin) - w / 2
|
|
1500
1506
|
cy = _TB_CLEAR + _TB_H - h / 2 - 2
|
|
1501
1507
|
sym = sym.locate(Location((cx - bx, cy - by, 0)))
|
|
1502
1508
|
sym.is_projection_symbol = True
|
|
@@ -588,6 +588,29 @@ def _fmt(v: float, decimals: int | None = None) -> str:
|
|
|
588
588
|
return str(r) if abs(v - r) < 1e-6 else f"{v:.1f}"
|
|
589
589
|
|
|
590
590
|
|
|
591
|
+
def _fmt_tolerance(tolerance, decimal_precision: int = 1) -> str:
|
|
592
|
+
"""Shared numeric tolerance suffix, preserving every authored deviation digit."""
|
|
593
|
+
if tolerance is None:
|
|
594
|
+
return ""
|
|
595
|
+
|
|
596
|
+
def magnitude(value):
|
|
597
|
+
decimal = Decimal(str(value))
|
|
598
|
+
precision = max(decimal_precision, -int(decimal.as_tuple().exponent))
|
|
599
|
+
return f"{decimal:.{precision}f}"
|
|
600
|
+
|
|
601
|
+
if isinstance(tolerance, (int, float)):
|
|
602
|
+
return f" ±{magnitude(tolerance)}"
|
|
603
|
+
lo, hi = tolerance
|
|
604
|
+
return f" +{magnitude(hi)} -{magnitude(lo)}"
|
|
605
|
+
|
|
606
|
+
|
|
607
|
+
def _fmt_chamfer(leg_text, leg, other_leg, angle) -> str:
|
|
608
|
+
"""Shared chamfer form: equal 45-degree legs use C, asymmetric legs state the angle."""
|
|
609
|
+
if abs(leg - other_leg) < 0.05 and abs(angle - 45.0) < 0.5:
|
|
610
|
+
return f"C{leg_text}"
|
|
611
|
+
return f"{leg_text} × {_fmt(angle)}°"
|
|
612
|
+
|
|
613
|
+
|
|
591
614
|
def _fmt_angle(value, decimals=None, tolerance=None) -> str:
|
|
592
615
|
"""Complete angular text shared by footprint sizing and compilation.
|
|
593
616
|
|
|
@@ -57,13 +57,16 @@ from draftwright.compose import (
|
|
|
57
57
|
_build_zones,
|
|
58
58
|
_est_hole_table_sizes,
|
|
59
59
|
_est_planned_bore_callout_width,
|
|
60
|
+
_est_table_size,
|
|
60
61
|
_layout_geometry,
|
|
61
62
|
_measure_strips,
|
|
62
63
|
choose_scale,
|
|
63
64
|
)
|
|
65
|
+
from draftwright.model.compiled import compile_dimensions
|
|
64
66
|
from draftwright.model.detect import _build_part_model_from_recognition
|
|
65
67
|
from draftwright.model.ir import Datum, GrooveFeature, PartModel, StepFeature, StepLevelFeature
|
|
66
|
-
from draftwright.model.planner import plan_dimensions
|
|
68
|
+
from draftwright.model.planner import annotation_groups, plan_dimensions
|
|
69
|
+
from draftwright.progress import observed_stage
|
|
67
70
|
from draftwright.recognition_cache import _result_from_evidence
|
|
68
71
|
from draftwright.recognition_frame import (
|
|
69
72
|
FramedDetection,
|
|
@@ -84,6 +87,7 @@ _log = logging.getLogger(__name__)
|
|
|
84
87
|
_ScalePick = tuple[float, float, float, float]
|
|
85
88
|
|
|
86
89
|
|
|
90
|
+
@observed_stage("recognition")
|
|
87
91
|
def _raw_recognition(
|
|
88
92
|
part,
|
|
89
93
|
*,
|
|
@@ -777,6 +781,7 @@ def _analyse(
|
|
|
777
781
|
company="",
|
|
778
782
|
frame: bool = False,
|
|
779
783
|
projection: str | None = None,
|
|
784
|
+
projection_symbol: bool = True,
|
|
780
785
|
text_position: str = "inline",
|
|
781
786
|
text_orientation: str = "aligned",
|
|
782
787
|
zones: bool = False,
|
|
@@ -787,11 +792,22 @@ def _analyse(
|
|
|
787
792
|
_include_iso: bool = True,
|
|
788
793
|
_view_constraints=None,
|
|
789
794
|
_framed_recognition: bool = False,
|
|
795
|
+
_document_input=None,
|
|
790
796
|
) -> Analysis:
|
|
791
797
|
"""Load STEP or use a build123d Shape, analyse geometry, compute layout.
|
|
792
798
|
|
|
793
799
|
Returns an :class:`Analysis`.
|
|
794
800
|
"""
|
|
801
|
+
if _document_input is not None:
|
|
802
|
+
if model is None or _framed_recognition:
|
|
803
|
+
raise ValueError("document members require their sealed raw model")
|
|
804
|
+
_document_input.validate(
|
|
805
|
+
step_file, model.features if isinstance(model, PartModel) else model
|
|
806
|
+
)
|
|
807
|
+
if _reuse is None:
|
|
808
|
+
_reuse = _document_input.analysis
|
|
809
|
+
elif _reuse.part is not _document_input.analysis.part:
|
|
810
|
+
raise ValueError("document analysis reuse names a foreign working solid")
|
|
795
811
|
convention = projection or "third"
|
|
796
812
|
# The zone-grid ruler (#768) draws its ticks on the frame, so it implies one.
|
|
797
813
|
frame = frame or zones
|
|
@@ -1099,6 +1115,11 @@ def _analyse(
|
|
|
1099
1115
|
if ownership_builder is not None
|
|
1100
1116
|
else None
|
|
1101
1117
|
)
|
|
1118
|
+
if _document_input is not None:
|
|
1119
|
+
# Declared sizing still reads only the member's authored model. Critique receives
|
|
1120
|
+
# the original conversion authority rather than acquiring another recognition run.
|
|
1121
|
+
recognition_evidence = _document_input.analysis.recognition_evidence
|
|
1122
|
+
recognition_ownership = _document_input.analysis.recognition_ownership
|
|
1102
1123
|
# Dimension feasibility and annotation footprints consume the authored set.
|
|
1103
1124
|
# Derived-view dependencies still use sizing_model below; omitting an unrelated
|
|
1104
1125
|
# envelope extent must not force its view back onto an authored sheet.
|
|
@@ -1116,6 +1137,12 @@ def _analyse(
|
|
|
1116
1137
|
strip_sizing_model,
|
|
1117
1138
|
planned_views=third_angle_view_names() if _views is None else _views,
|
|
1118
1139
|
)
|
|
1140
|
+
schedule_tables = (
|
|
1141
|
+
compile_dimensions(strip_sizing_model, groups=sizing_groups).schedules
|
|
1142
|
+
if strip_sizing_model.schedules
|
|
1143
|
+
else ()
|
|
1144
|
+
)
|
|
1145
|
+
sizing_groups = annotation_groups(strip_sizing_model, sizing_groups)
|
|
1119
1146
|
bore_callout_width = _est_planned_bore_callout_width(
|
|
1120
1147
|
sizing_groups, _draft_est, font_size=_FONT_SIZE, pad_around_text=_pad_around_text
|
|
1121
1148
|
)
|
|
@@ -1132,7 +1159,17 @@ def _analyse(
|
|
|
1132
1159
|
layout_table_sizes = _est_hole_table_sizes(
|
|
1133
1160
|
sizing_model, bb, font_size=_FONT_SIZE, pad_around_text=_pad_around_text
|
|
1134
1161
|
)
|
|
1135
|
-
layout_required_tables = tuple(_required_tables)
|
|
1162
|
+
layout_required_tables = tuple(_required_tables) + tuple(
|
|
1163
|
+
(
|
|
1164
|
+
_est_table_size(
|
|
1165
|
+
tuple(tuple(cell.text for cell in row) for row in schedule.rows),
|
|
1166
|
+
font_size=_FONT_SIZE,
|
|
1167
|
+
pad_around_text=_pad_around_text,
|
|
1168
|
+
),
|
|
1169
|
+
schedule.prefer,
|
|
1170
|
+
)
|
|
1171
|
+
for schedule in schedule_tables
|
|
1172
|
+
)
|
|
1136
1173
|
planned_iso_scale = _planned_iso_scale(_view_constraints)
|
|
1137
1174
|
|
|
1138
1175
|
# Choose scale/page, iterating so the reserved step corridor matches the
|
|
@@ -1406,6 +1443,7 @@ def _analyse(
|
|
|
1406
1443
|
company=company,
|
|
1407
1444
|
frame=frame,
|
|
1408
1445
|
projection=projection,
|
|
1446
|
+
projection_symbol=projection_symbol,
|
|
1409
1447
|
text_position=text_position,
|
|
1410
1448
|
text_orientation=text_orientation,
|
|
1411
1449
|
projection_convention=convention,
|