draftwright 0.5.0rc7__tar.gz → 0.5.0rc9__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.5.0rc7 → draftwright-0.5.0rc9}/PKG-INFO +1 -1
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/pyproject.toml +1 -1
- draftwright-0.5.0rc9/src/draftwright/_pmi_linear_geometry.py +145 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/_pmi_support_blockers.py +17 -0
- draftwright-0.5.0rc9/src/draftwright/_pmi_topology.py +481 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/analysis.py +30 -1
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_common.py +27 -26
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_gdt.py +96 -50
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_placement_geometry.py +25 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_placement_occupancy.py +44 -2
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_pmi_dimensions.py +33 -17
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_step_lengths.py +19 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/orchestrator.py +3 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/build_policy.py +15 -7
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/builder.py +50 -8
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/compose.py +21 -4
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/drawing.py +10 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/coverage.py +113 -44
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/turned_step_coverage.py +10 -4
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/callout.py +3 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/compiled.py +51 -1
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/declare.py +2 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/detect.py +7 -1
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/dimension_intent.py +6 -1
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/ir.py +6 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/ir_foundation.py +50 -5
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/planner.py +485 -2
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/pmi_lowering.py +282 -108
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/pmi.py +49 -48
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/reporting.py +92 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/sheet.py +11 -7
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/sheet_emit.py +33 -12
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/sheet_feature_lines.py +9 -2
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_complexity_baseline.json +3 -4
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_function_length_baseline.json +2 -2
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_tier_manifest.py +1 -0
- draftwright-0.5.0rc9/tests/test_authored_pmi_precedence.py +866 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_dimension_intent_contract.py +3 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_gdt_ink_shared.py +26 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_gdt_placement.py +87 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_hole_table.py +0 -1
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1146_scale_completeness.py +17 -1
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1155_grm04_sheet_use.py +3 -3
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1209_linear_pmi_witnesses.py +141 -1
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1338_scale_before_page_escalation.py +6 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1516_dimension_text.py +12 -2
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_563_placement_intent.py +21 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pmi.py +277 -1
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pmi_gtol_lowering.py +8 -2
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_strip_layout.py +141 -0
- draftwright-0.5.0rc7/src/draftwright/_pmi_linear_geometry.py +0 -71
- draftwright-0.5.0rc7/src/draftwright/_pmi_topology.py +0 -222
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/.gitignore +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/CHANGELOG.md +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/LICENSE +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/README.md +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/docs/adr/README.md +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/docs/reference/recogniser-capabilities.md +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/docs/reference/sheet.md +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/docs/research/1062-repeating-radial-profile-evidence.md +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/skills/SKILL.md +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/__init__.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/_build_profile.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/_core.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/_geometry.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/_pmi_datum_geometry.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/_pmi_part21.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/_pmi_schema.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/_warnings.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/angular_geometry.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotate.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotation_layout_profile.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/__init__.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_axial_render.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_circular_recesses.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_diameters.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_dimension_ink.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_dimension_ink_repair.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_edge_callouts.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_envelope.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_height_ladder.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_hole_leader_placement.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_leader_candidates.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_leader_commit.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_leader_fixed_ink.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_locations.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_machined_leaders.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_patterns.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_pocket_pad.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_polygonal_prisms.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_sheet_furniture.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_slots.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_strip_postsolve.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/_thin_profiles.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/angular.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/balloons.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/drawing_port.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/from_model.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/gears.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/hole_leader_candidates.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/hole_locations.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/holes.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/leaders.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/routed.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/sections.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/annotations/solve_trace.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/audit.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/auxiliary_layout.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/blend_contract.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/build_once.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/build_options.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/cli.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/contract_values.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/document.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/document_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/document_input.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/drawing_diagnostics.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/drawing_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/drawing_export.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/drawing_state.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/drawing_tables.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/evaluation/__init__.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/evaluation/_double_d_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/evaluation/_edge_profile_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/evaluation/_flat_polygonal_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/evaluation/_groove_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/evaluation/_hole_family_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/evaluation/_pocket_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/evaluation/_prismatic_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/evaluation/_turned_step_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/evaluation/step_analysis.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/explicit_scale.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/export.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/family_table.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/feature_identity.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/fits.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/fonts/IBMPlexMono-Regular.ttf +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/fonts/IBMPlexSansCondensed-Regular.ttf +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/fonts/LICENSE-IBMPlexMono-OFL.txt +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/fonts/LICENSE-IBMPlexSansCondensed-OFL.txt +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/fonts/__init__.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/inspection.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/inspection_contract.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/intent_drain.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/intent_routing.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/intents.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/layout.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/layout_safety.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/layout_scheme.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/layout_selection.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/leader_policy.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/__init__.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/_coverage_common.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/_parameter_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/_registry.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/angled_step_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/angular.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/blend_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/boss_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/chamfer_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/channel_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/circular_blind_step_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/envelope_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/fillet_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/flat_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/gear_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/groove_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/gusset_rib_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/hole_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/ink_overlap.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/issues.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/orchestration.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/oriented_slot_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/pad_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/paired_ramp_step_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/passage_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/plate_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/pmi_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/pocket_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/pocket_pattern_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/polygonal_boss_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/polygonal_stock_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/prismatic_pocket_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/profiled_bore_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/quality.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/rectangular_blind_slot_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/requirements.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/round_bottom_blind_slot_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/schedule_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/section_recess_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/slot_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/structural.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/suggest.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/linting/through_step_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/location_contract.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/make_drawing.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/measurement_support.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/__init__.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/detect_inventory.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/detect_ownership.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/manufacturing_schedule.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/model/oriented_slot_geometry.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/obligations.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/oriented_slot_contract.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/pdf_text.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/plate_correspondence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/profile_angles.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/progress.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/projection.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/py.typed +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/recogniser_contract.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/recogniser_policy.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/recogniser_schema.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/recognition/__init__.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/recognition_cache.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/recognition_frame.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/recognition_ownership.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/registry.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/repair.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/replay_assessment.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/score.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/section_recess_contract.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/sheet_features.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/sheet_layout_controls.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/sheet_metadata.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/sheet_object_source.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/sheet_views.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/src/draftwright/view_plan.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_burden_report.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_corpus_cover.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_drawing_helpers.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_evidence_contract.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_issue_module_baseline.txt +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_kernel.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_layout_helpers.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_layout_sig.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_mutation_corpus.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_pad_rendering_fixtures.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_parts.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_pattern_contract.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_recogniser_public_contract.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_section_recess_cases.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/_unit_manifest.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/conftest.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/annotation-layout-corpus-v1.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/annotation-layout-corpus-v2.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/annotation-layout-holdout-ftc09-v1.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/annotation-layout-holdout-v1.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/ap242_single_cylinder_diameter.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/README.md +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/ambiguous-open-semicircle.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/blind-hole.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/chamfer-asymmetric.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/chamfer-compound.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/chamfer-overlap.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/chamfer-plain.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/chamfer-planar-x.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/chamfer-planar-y.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/chamfer-planar-z.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/chamfer-topology-a.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/chamfer-topology-b.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/chamfer-turned.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-chamfers-v1.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-countersinks-v1.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-double-d-bores-v1.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-fillets-v1.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-flats-v1.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-grooves-v1.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-hole-patterns-v1.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-plates-v1.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-pocket-patterns-v1.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-pockets-v1.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-polygonal-bosses-v1.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-polygonal-stock-v1.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-rectangular-pads-v1.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-turned-steps-v1.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/corpus-v1.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/countersink-deburr.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/countersink-external-cone.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/countersink-mixed-pair.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/countersink-single.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/countersink-topology-a.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/countersink-topology-b.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/double-d-axis-x.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/double-d-axis-y.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/double-d-blind.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/double-d-coaxial-compound.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/double-d-opposed-blind.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/double-d-roll-30.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/double-d-round-bore.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/double-d-single-z.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/double-d-topology-a.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/double-d-topology-b.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/fillet-compound.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/fillet-overlap.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/fillet-plain.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/fillet-planar-x.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/fillet-planar-y.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/fillet-planar-z.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/fillet-repeated.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/fillet-topology-a.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/fillet-topology-b.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/fillet-turned.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/flat-coaxial.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/flat-double-d.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/flat-lone-d.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/flat-nonround.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/flat-slanted-double-d.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/flat-topology-a.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/flat-topology-b.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/groove-compound.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/groove-lone-x.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/groove-lone-y.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/groove-lone-z.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/groove-monotonic-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/groove-narrow.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/groove-topology-a.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/groove-topology-b.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-compound-equal.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-detached-body-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-full-span-ledge-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-nested-staircase-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-topology-a.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-topology-b.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-x-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-x-positive.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-y-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-y-positive.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-z-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pad-z-positive.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pattern-ambiguous.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pattern-grid.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pattern-topology-a.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pattern-topology-b.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plain-block.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-compound-equal.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-cross-topology-a.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-cross-topology-b.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-detached-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-rotational-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-single-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-t-xz.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-t-yz.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-thick-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-u-additive.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/plate-u-cut.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-compound.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-edge-anchored.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-lone.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-opposed.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-pattern-ambiguous.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-pattern-grid.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-pattern-linear.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-pattern-pair.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-pattern-topology-a.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-pattern-topology-b.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-prismatic-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-side.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-through-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-topology-a.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-topology-b.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/pocket-two-equal.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-compound-equal.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-detached-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-in-plane-rotated.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-other-protrusions-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-recess-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-stock-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-topology-a.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-topology-b.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-x.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-y.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-boss-z.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-compound-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-cylinder-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-irregular-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-octagon-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-recess-negative.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-roll17.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-topology-a.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-topology-b.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-translated.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-x.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/polygonal-stock-y.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/topology-a.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/topology-b.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/turned-step-axis-x.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/turned-step-axis-y.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/turned-step-axis-z.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/turned-step-compound.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/turned-step-repeated-lengths.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/turned-step-through-bore.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/turned-step-topology-a.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/turned-step-topology-b.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/evaluation/turned-step-translated-blind-bore.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/grm03_edge_face_finish_ap242.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/grm03_specify_pmi_ap242.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/grm03_thumbwheel_drive_screw.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/grm03_thumbwheel_drive_screw_ap242_pmi.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/grm04_drive_plate.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/if_step_flat_across_cylinder.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/issue_1058_wheel_rh.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/issue_1247_angled_blind_step.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/issue_1595_whistle_key_frame.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/issue_1595_whistle_key_lever.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/issue_909_basic_part_design_017_body.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/issue_915_case_study_2.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ctc_01_asme1_ap203.stp +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ctc_01_asme1_ap242.stp +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ctc_02_asme1_ap203.stp +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ctc_02_asme1_ap242.stp +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ctc_03_asme1_ap203.stp +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ctc_03_asme1_ap242.stp +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ctc_04_asme1_ap203.stp +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ctc_04_asme1_ap242.stp +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ctc_05_asme1_ap203.stp +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ctc_05_asme1_ap242.stp +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/nist_ftc_09_asme1_ap242-e1.stp +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/tuner_jig_blind_obround_pockets.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/fixtures/whistle_frame_reference.step +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/bracket_section.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/centered_rebate.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/chamfered.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/filleted.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/flange_dense.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/grid_plate.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/grooved_shaft.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/hex_bar.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/holed_slot.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/pocketed.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/prismatic_ladder.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/scattered_plate.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/side_drilled.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/refactor_golden/turned_stepped.json +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_add_dimension.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_adr0018_view_routing.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_adr0018_view_selection.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_adr_corpus.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_agent_improvement_canary_issue_1716.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_agents_guide.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_analysis_geometry.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_angle_patterns.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_angular_references.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_angular_rendering.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_annotation_box_composition.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_annotation_box_corpus.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_annotation_layout_product.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_annotation_scheme_compare_script.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_annotation_scheme_corpus_script.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_annotation_scheme_shadow_script.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_api_docs.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_architecture_docs.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_arrangement_gate.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_assessment_comparison_issue_1712.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_audit_differential.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_auxiliary_layout.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_axial_dimensions.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_balloon_ring_standoff.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_blind_slot_completeness.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_blind_slot_semantics.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_boss_ownership.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_build_drawing_entrypoints.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_build_profile_harness.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_burden_report.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_candidate_evidence_issue_1726.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_candidate_preview_sheet_holdout.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_canonical_angles.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_carve_free_position_callers.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_channel_ownership.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_circular_blind_step_semantics.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_cli_behavior.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_cli_report_sidecar.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_clone_budget.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_compiled_plan_boundary.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_compose_then_pack.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_contract_values.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_corpus_cover.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_counting_calls.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_coverage_mode.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_declaration_identity_issue_1710.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_declaration_report_issue_1710.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_declare.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_declared_recognition_gate.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_declared_report_issue_1688.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_deferred_edits.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_dense_sheet_canary.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_deprecation_dates.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_depth_estimators.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_derived_view_integration.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_derived_view_planning.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_detail_views.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_detect_once.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_detect_registry.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_diameter_deduplication.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_diameter_leaders.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_dimension_lane_canary_issue_1757.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_dimension_role_vocabulary.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_document_build.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_document_claim_authority.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_document_claims.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_document_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_document_report.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_document_report_authority.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_drawing_encapsulation.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_drawing_operations.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_drawing_state.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_dynamic_corridors.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_e2e_slice.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_e2e_standards.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_edge_profile_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_envelope_view_route_issue_1813.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_equivalent_dimension_presentations_issue_1759.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_export_dxf_curves.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_export_dxf_zoom.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_export_formats.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_export_reproducible.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_export_shape.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_external_recognition_boundary.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_family_table.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_feature_edit_corridors.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_feature_edit_replay.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_feature_edit_verbs.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_feature_leader_candidate_regions.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_feature_provenance.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_feature_queries.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_fillets_adjacency.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_fit_calculations.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_fits.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_flat_callout_precision.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_flat_completeness.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_flat_stock_identity.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_flat_stock_opposition.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_format_selector.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_formatting.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_framed_step_family_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_geometry_graph_spike.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_grid_lattice_convention.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_groove_completeness_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_groove_profile.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_gusset_rib_semantics.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_hole_annotations.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_hole_pattern_callouts.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_import_boundaries.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_inspection_contract.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_interior_label_placement.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_ir_foundation.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_iso_detail_growth.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_iso_layout.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_iso_nts_caption_placement.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_isometric_orientation.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_isometric_placement.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1000_envelope_reuse.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1006_measurement_comparison.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1058_wheel_profile.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1073_cross_body_patterns.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1082_polygonal_stock.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1086_declared_gears.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1116_ap242_hole_tolerance_lowering.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1126_requesting_less_never_scores_better.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1130_view_planning_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1132_turned_profile_span_is_reported.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1142_hole_leader_labels.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1143_hole_completeness.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1144_transactional_hole_table.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1147_legibility_pair_aggregation.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1153_contradictory_dimensions.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1154_one_owner_per_measurement.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1157_no_implicit_general_tolerance.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1166_cross_pass_feature_leaders.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1176_quality_fidelity.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1177_angular_dimensions.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1187_unroutable_leaders.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1188_per_view_assignment.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1190_section_decision.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1196_deterministic_view_names.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1202_observed_drawing_consumer.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1204_multiscale_view_issues.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1215_envelope_tolerance.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1215_no_approved_tolerance_is_dropped.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1216_callout_reservation_measures_ink.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1216_pairwise_across_scale_groups.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1217_claimed_representations.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1217_the_facility_is_shared.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1219_location_claims_its_own_axis.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1229_ledger_member_keying.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1240_iso_above_strip_visibility.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1245_passage_disposition.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1246_prismatic_pocket_disposition.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1247_angled_step_disposition.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1254_turned_chamfers.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1260_view_constraints.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1262_automatic_turned_views.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1276_turned_leader_targets.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1281_turned_fillets.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1296_cylindrical_diameter_pmi.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1298_manufacturing_requirements.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1299_page_escalation.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1308_machined_leader_analytics.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1312_engine_costs.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1325_nominal_agreement.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1332_overlap_remedy.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1333_bounded_ink_repair.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1334_prevent_ink.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1336_grm03_ap242_pmi_fixture.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1349_precision_display.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1350_detected_takeover.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1351_structured_note_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1352_searchable_pdf_text.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1353_cnc_authoritative_workflow.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1357_framed_activation.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1357_framed_boundary.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1357_plural_turned_profiles.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1357_pmi_frame.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1360_thread_depth.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1369_hole_completeness_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1370_countersink_completeness_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1370_double_d_completeness_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1370_hole_pattern_completeness_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1371_flat_completeness_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1371_polygonal_stock_completeness_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1373_plate_completeness_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1374_chamfer_completeness_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1374_fillet_completeness_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1374_turned_step_completeness_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1378_diameter_leader_targets.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1392_recognisers_048.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1395_degenerate_iso_region.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1396_layout_advisories.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1397_unverifiable_requirement_message.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1432_adoption.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1432_boundary_failures.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1432_oriented_slot_semantics.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1433_blend_semantics.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1450_boss_blend_ownership.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1460_step_inspection.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1466_dimension_options.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1466_semantic_sides.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1479_radius_leader_targets.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1485_curved_pockets.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1485_quiddity_024_boundary.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1485_rounded_pockets.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1505_diameter_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1505_short_axial_chains.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1511_turned_boss_heights.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1514_projection_safeguard.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1515_first_angle.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1517_through_indicator.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1518_explicit_rear.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1524_tolerance_magnitude.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1530_section_provenance.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1531_semantic_hole_counts.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1532_authored_section_examples.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1533_review_diagnostics.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1534_build_progress.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1536_title_overflow.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1543_feature_schedules.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1543_schedule_requirements.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1544_frame_document_canary.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1555_turned_recognition_format_invariance.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1560_envelope_axes.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1563_sheet_pmi_reconciliation.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1585_title_block_date.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1593_title_block_keepout.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1596_bolt_circle_corroboration.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1598_hex_pockets.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1604_internal_section.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1612_frame_sergio_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1612_sheet_margins.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_1613_circular_channel.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_367_leader_ink.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_443_grm03_axial_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_676_polygonal_boss.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_676_polygonal_boss_declare.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_740_leader_assignment.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_798_floor_cardinality.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_798_material_field.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_798_silhouette_lint.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_827_real_part_canary.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_883_location_identity.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_885_prismatic_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_909_sloped_profile.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_915_dense_case.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_916_pocket_leader.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_917_open_channel.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_924_zero_length_shoulders.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_955_height_contingency.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_issue_958_cross_solid_recognition.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_label_provenance.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout_cleanliness.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout_constants.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout_evidence_issue_1711.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout_generalisation.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout_hypothesis.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout_override_lane_issue_1757.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout_override_side_issue_1757.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout_property.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout_safety.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_layout_scheme.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_leader_footprint.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_leader_region_policy.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_lint_box_cache.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_lint_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_lint_coverage_common.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_lint_ink_overlap.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_lint_reconciliation.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_lint_structural.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_lint_suggestions.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_lint_summary.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_linting.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_location_dimensions.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_location_vocabulary.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_machined_feature_callouts.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_make_drawing_entrypoints.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_manufacturing_pmi_lowering.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_manufacturing_schedule.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_nested_recognition_ownership.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_nominal_step_pmi.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_note_verb.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_object_aspects.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_occupancy_boxes.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_occurrence_recognition_ownership.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_overall_height_coverage.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pad_completeness_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pad_rendering.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_paired_ramp_semantics.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_parameter_id.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pareto_loop_canary_issue_1753.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_part_classification.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_part_model.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pattern_contract.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pattern_ownership.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pitch_dim_footprint.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_place_dimension.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_plate_ownership.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pmi_common_labels.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pmi_datum_lowering.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pmi_manufacturing_finish.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pmi_part21.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pmi_records.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pocket_completeness_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pocket_pattern.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pocket_pattern_completeness_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pocket_pattern_recognition.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_polygonal_boss_completeness_evidence.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_pre_render_profile_choice.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_principal_profile_classifier.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_prismatic_boss_diameter.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_prismatic_classification.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_prismatic_dimensions.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_private_test_attr_reads.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_private_test_imports.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_profile_angles.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_projection_symbol_default.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_quality_components.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_quiddity_lifecycle_boundary.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_real_part_fixtures.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_recogniser_adoption.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_recogniser_capabilities.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_recogniser_contract.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_recogniser_policy.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_recogniser_step_inventory.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_recognition_boundary_failures.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_recognition_evidence_schema.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_recognition_policy_dispositions.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_recognition_result.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_refactor_golden.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_registry.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_remaining_ink_overlaps.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_render_seam.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_repack_geometry_seam.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_repair.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_replay_assessment_issue_1715.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_report_projection.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_report_status_reasons_issue_1618.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_report_writer.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_requirement_applicability.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_requirement_carriers.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_requirement_catalog.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_requirement_catalog_families.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_requirement_dimension_sharing.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_scale_policy.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_scale_selection.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_score.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_script_detail_parity.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_section_hatching.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_section_recess_contract.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_section_recess_pockets.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_shared_box_memo.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_shared_drawing_cache.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_sheet_emit.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_sheet_fallback_issue_1797.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_sheet_furniture.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_sheet_gdt.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_sheet_generation_snapshot.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_sheet_identity_invariant.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_sheet_notes.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_sheet_of.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_sheet_section.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_sheet_tables.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_slanted_blind_step.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_slot_completeness.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_slot_pattern.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_slot_pattern_recognition.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_slot_recognition.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_soft_deprecation.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_solve_trace.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_source_shape.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_step_analysis_evaluation.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_step_profile_grouping.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_strip_zones.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_suite_shape.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_suppression_ledger.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_suppression_marks.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_through_step_ownership.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_through_step_semantics.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_tier_manifest.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_title_block_units_format.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_tolerances.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_turned_diameters.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_turned_lengths.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_turned_step_ownership.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_turned_steps.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_two_pass_layout.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_typ_dimensions.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_typed_remediation_projection_issue_1759.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_version_bump_ci.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_view_blocks.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_view_coordinates.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_view_plan.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_witness_label_reconciliation.py +0 -0
- {draftwright-0.5.0rc7 → draftwright-0.5.0rc9}/tests/test_workflows.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: draftwright
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.0rc9
|
|
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
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"""Prove authored PMI linear reference stations before dimension lowering."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import math
|
|
6
|
+
|
|
7
|
+
from draftwright._pmi_topology import (
|
|
8
|
+
_is_mixed_planar_bore,
|
|
9
|
+
_parallel_planar_reference_witness,
|
|
10
|
+
_planar_bore_axis_witness,
|
|
11
|
+
)
|
|
12
|
+
from draftwright.model.ir import _linear_projection_view
|
|
13
|
+
|
|
14
|
+
_LINEAR_AXIS_ABS_TOL = 0.005
|
|
15
|
+
_LINEAR_AXIS_REL_TOL = 1e-3
|
|
16
|
+
_LINEAR_VALUE_ABS_TOL = 0.01
|
|
17
|
+
_LINEAR_VALUE_REL_TOL = 5e-4
|
|
18
|
+
_LINEAR_OBLIQUE_VALUE_ABS_TOL = 0.05
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _proved_planar_linear(groups, stations, nominal, kind, frame, shape_bbox):
|
|
22
|
+
"""Resolve the normal span and a face-supported projected witness together."""
|
|
23
|
+
axis, view, witness = _parallel_planar_reference_witness(groups, frame, shape_bbox)
|
|
24
|
+
if witness is None:
|
|
25
|
+
return (
|
|
26
|
+
tuple(point for point in stations if point is not None),
|
|
27
|
+
"?",
|
|
28
|
+
None,
|
|
29
|
+
("parallel planar source faces have no proven shared witness",),
|
|
30
|
+
)
|
|
31
|
+
if axis is None and kind == "linear" and _is_mixed_planar_bore(groups):
|
|
32
|
+
bore_support = _planar_bore_axis_witness(groups, frame, shape_bbox)
|
|
33
|
+
if bore_support is None:
|
|
34
|
+
points, dominant, reasons = _dimension_reference_stations(
|
|
35
|
+
tuple(stations), nominal, kind
|
|
36
|
+
)
|
|
37
|
+
return (
|
|
38
|
+
points,
|
|
39
|
+
dominant,
|
|
40
|
+
None,
|
|
41
|
+
(
|
|
42
|
+
*reasons,
|
|
43
|
+
"plane-to-bore location has no proven face-supported axis witness",
|
|
44
|
+
),
|
|
45
|
+
)
|
|
46
|
+
stations, axis, view = bore_support
|
|
47
|
+
if witness:
|
|
48
|
+
stations = tuple(
|
|
49
|
+
tuple(
|
|
50
|
+
next((value for index, value in witness if index == i), point[i]) for i in range(3)
|
|
51
|
+
)
|
|
52
|
+
if point is not None
|
|
53
|
+
else None
|
|
54
|
+
for point in stations
|
|
55
|
+
)
|
|
56
|
+
points, dominant, reasons = _dimension_reference_stations(
|
|
57
|
+
tuple(stations), nominal, kind, plane_axis=axis
|
|
58
|
+
)
|
|
59
|
+
return points, dominant, view, reasons
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _linear_reference_stations(
|
|
63
|
+
stations: tuple[tuple[float, float, float] | None, ...],
|
|
64
|
+
nominal: float,
|
|
65
|
+
*,
|
|
66
|
+
plane_axis: str | None = None,
|
|
67
|
+
) -> tuple[tuple[tuple[float, float, float], ...], str, tuple[str, ...]]:
|
|
68
|
+
"""Prove a truthful principal-axis span from the two authored reference groups.
|
|
69
|
+
|
|
70
|
+
A merged bbox answers how large the referenced faces are, not which direction relates
|
|
71
|
+
them. Circular end faces in GRM-03 are wider than their axial separation, which made
|
|
72
|
+
short X dimensions render across Y. Conversely, CTC-04 includes a genuinely oblique
|
|
73
|
+
relationship and one dimension whose second group XCAF does not transfer. Those must
|
|
74
|
+
remain explicit omissions rather than being guessed from the nominal value (#1209).
|
|
75
|
+
"""
|
|
76
|
+
measurable = tuple(station for station in stations if station is not None)
|
|
77
|
+
if len(stations) != 2 or len(measurable) != 2:
|
|
78
|
+
return (
|
|
79
|
+
measurable,
|
|
80
|
+
"?",
|
|
81
|
+
("linear dimension needs two measurable authored reference groups",),
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
first, second = measurable
|
|
85
|
+
delta = tuple(second[index] - first[index] for index in range(3))
|
|
86
|
+
magnitudes = tuple(abs(value) for value in delta)
|
|
87
|
+
axis_index = (
|
|
88
|
+
"XYZ".index(plane_axis)
|
|
89
|
+
if plane_axis is not None
|
|
90
|
+
else max(range(3), key=magnitudes.__getitem__)
|
|
91
|
+
)
|
|
92
|
+
primary = magnitudes[axis_index]
|
|
93
|
+
if primary <= 1e-9:
|
|
94
|
+
return measurable, "?", ("linear reference groups occupy the same station",)
|
|
95
|
+
|
|
96
|
+
transverse = max(value for index, value in enumerate(magnitudes) if index != axis_index)
|
|
97
|
+
direction_tol = max(_LINEAR_AXIS_ABS_TOL, primary * _LINEAR_AXIS_REL_TOL)
|
|
98
|
+
# Parallel planar supports establish their distance along the plane normal.
|
|
99
|
+
# Their finite face centres can be offset arbitrarily within either plane.
|
|
100
|
+
oblique = plane_axis is None and transverse > direction_tol
|
|
101
|
+
if oblique and _linear_projection_view(measurable) is None:
|
|
102
|
+
return (
|
|
103
|
+
measurable,
|
|
104
|
+
"?",
|
|
105
|
+
(
|
|
106
|
+
"linear reference relationship does not lie in a principal projection plane "
|
|
107
|
+
f"(delta=({delta[0]:.6g}, {delta[1]:.6g}, {delta[2]:.6g}) mm)",
|
|
108
|
+
),
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
axis = "?" if oblique else "XYZ"[axis_index]
|
|
112
|
+
span = math.hypot(*delta) if oblique else primary
|
|
113
|
+
value_tol = max(
|
|
114
|
+
_LINEAR_OBLIQUE_VALUE_ABS_TOL if oblique else _LINEAR_VALUE_ABS_TOL,
|
|
115
|
+
abs(nominal) * _LINEAR_VALUE_REL_TOL,
|
|
116
|
+
)
|
|
117
|
+
if abs(span - nominal) > value_tol:
|
|
118
|
+
return (
|
|
119
|
+
measurable,
|
|
120
|
+
axis,
|
|
121
|
+
(
|
|
122
|
+
f"linear reference-station span {span:.6g} mm differs from nominal "
|
|
123
|
+
f"{nominal:.6g} mm",
|
|
124
|
+
),
|
|
125
|
+
)
|
|
126
|
+
return measurable, axis, ()
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def _dimension_reference_stations(
|
|
130
|
+
stations: tuple[tuple[float, float, float] | None, ...],
|
|
131
|
+
nominal: float,
|
|
132
|
+
kind: str,
|
|
133
|
+
*,
|
|
134
|
+
plane_axis: str | None = None,
|
|
135
|
+
) -> tuple[tuple[tuple[float, float, float], ...], str, tuple[str, ...]]:
|
|
136
|
+
"""Apply the dimension kind's wording to the shared station proof."""
|
|
137
|
+
points, axis, reasons = _linear_reference_stations(stations, nominal, plane_axis=plane_axis)
|
|
138
|
+
if kind == "thickness":
|
|
139
|
+
reasons = tuple(
|
|
140
|
+
reason.replace("linear dimension", "thickness dimension").replace(
|
|
141
|
+
"linear reference", "thickness reference"
|
|
142
|
+
)
|
|
143
|
+
for reason in reasons
|
|
144
|
+
)
|
|
145
|
+
return points, axis, reasons
|
|
@@ -141,6 +141,23 @@ def _is_direct_xcaf_angular_failure(reason: str) -> bool:
|
|
|
141
141
|
return reason.startswith(prefixes)
|
|
142
142
|
|
|
143
143
|
|
|
144
|
+
def _direct_xcaf_support_is_incomplete(record) -> bool:
|
|
145
|
+
"""Whether direct XCAF failed to supply all support geometry, independent of rendering."""
|
|
146
|
+
reasons = (*record.lowering_blockers, *record.rendering_blockers)
|
|
147
|
+
missing_groups = (
|
|
148
|
+
"linear dimension needs two measurable authored reference groups",
|
|
149
|
+
"thickness dimension needs two measurable authored reference groups",
|
|
150
|
+
"diameter dimension needs a measurable",
|
|
151
|
+
)
|
|
152
|
+
return any(
|
|
153
|
+
_is_direct_xcaf_reference_failure(reason)
|
|
154
|
+
or _is_direct_xcaf_diameter_failure(reason)
|
|
155
|
+
or _is_direct_xcaf_angular_failure(reason)
|
|
156
|
+
or reason.startswith(missing_groups)
|
|
157
|
+
for reason in reasons
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
|
|
144
161
|
def _without_direct_xcaf_angular_failures(reasons: tuple[str, ...]) -> tuple[str, ...]:
|
|
145
162
|
"""Drop angular XCAF failures superseded by exact Part21 member supports."""
|
|
146
163
|
return tuple(reason for reason in reasons if not _is_direct_xcaf_angular_failure(reason))
|
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
"""Exact Part21 support resolvers for imported AP242 PMI topology.
|
|
2
|
+
|
|
3
|
+
Native STEP transfer binders prove source items match the originally imported
|
|
4
|
+
B-rep; geometric likeness alone cannot establish source ownership.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from draftwright._pmi_datum_geometry import _frame_point, _frame_vector
|
|
10
|
+
from draftwright._pmi_support_blockers import _failure_reason
|
|
11
|
+
|
|
12
|
+
try:
|
|
13
|
+
from OCP.TopAbs import TopAbs_COMPOUND, TopAbs_EDGE, TopAbs_FACE
|
|
14
|
+
from OCP.TopExp import TopExp
|
|
15
|
+
from OCP.TopTools import TopTools_IndexedMapOfShape
|
|
16
|
+
except ImportError:
|
|
17
|
+
# The extractor reports unavailable OCP capability before using these resolvers.
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _parallel_planar_reference_support(groups, frame, shape_bbox) -> tuple[str | None, str | None]:
|
|
22
|
+
"""Find the common principal normal and any required witness view."""
|
|
23
|
+
axis, view, _witness = _parallel_planar_reference_witness(groups, frame, shape_bbox)
|
|
24
|
+
return axis, view
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _parallel_planar_reference_witness(groups, frame, shape_bbox):
|
|
28
|
+
"""Prove a view and, when its default midpoint misses, a shared face witness."""
|
|
29
|
+
from OCP.BRepAdaptor import BRepAdaptor_Surface
|
|
30
|
+
from OCP.GeomAbs import GeomAbs_Plane
|
|
31
|
+
from OCP.TopoDS import TopoDS
|
|
32
|
+
|
|
33
|
+
if len(groups) != 2 or not all(groups):
|
|
34
|
+
return None, None, ()
|
|
35
|
+
axes: list[int] = []
|
|
36
|
+
group_boxes = []
|
|
37
|
+
group_faces = []
|
|
38
|
+
for shapes in groups:
|
|
39
|
+
group_axis = None
|
|
40
|
+
group_station = None
|
|
41
|
+
boxes = []
|
|
42
|
+
for shape in shapes:
|
|
43
|
+
try:
|
|
44
|
+
if shape.ShapeType() != TopAbs_FACE:
|
|
45
|
+
return None, None, ()
|
|
46
|
+
surface = BRepAdaptor_Surface(TopoDS.Face_s(shape))
|
|
47
|
+
if surface.GetType() != GeomAbs_Plane:
|
|
48
|
+
return None, None, ()
|
|
49
|
+
direction = surface.Plane().Axis().Direction()
|
|
50
|
+
local = _frame_vector((direction.X(), direction.Y(), direction.Z()), frame)
|
|
51
|
+
axis_index = max(range(3), key=lambda index: abs(local[index]))
|
|
52
|
+
if abs(abs(local[axis_index]) - 1.0) > 1e-6:
|
|
53
|
+
return None, None, ()
|
|
54
|
+
if any(abs(local[index]) > 1e-6 for index in range(3) if index != axis_index):
|
|
55
|
+
return None, None, ()
|
|
56
|
+
box = shape_bbox(shape) if frame is None else shape_bbox(shape, frame)
|
|
57
|
+
boxes.append(box)
|
|
58
|
+
station = (box[axis_index] + box[axis_index + 3]) / 2
|
|
59
|
+
if box[axis_index + 3] - box[axis_index] > 1e-5:
|
|
60
|
+
return None, None, ()
|
|
61
|
+
except Exception:
|
|
62
|
+
return None, None, ()
|
|
63
|
+
if group_axis is not None and group_axis != axis_index:
|
|
64
|
+
return None, None, ()
|
|
65
|
+
if group_station is not None and abs(group_station - station) > 1e-5:
|
|
66
|
+
return None, None, ()
|
|
67
|
+
group_axis, group_station = axis_index, station
|
|
68
|
+
assert group_axis is not None # Each validated source group contains a face.
|
|
69
|
+
axes.append(group_axis)
|
|
70
|
+
group_boxes.append(boxes)
|
|
71
|
+
group_faces.append(shapes)
|
|
72
|
+
if axes[0] != axes[1]:
|
|
73
|
+
return None, None, ()
|
|
74
|
+
axis = "XYZ"[axes[0]]
|
|
75
|
+
if axis == "X":
|
|
76
|
+
return _principal_x_planar_witness(group_boxes, group_faces, frame)
|
|
77
|
+
view_axis, view = _supported_planar_view(axis, group_boxes)
|
|
78
|
+
return view_axis, view, ()
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _principal_x_planar_witness(group_boxes, group_faces, frame):
|
|
82
|
+
# A front projection only needs both planes represented at the same Z;
|
|
83
|
+
# parallel face patches may be offset in Y (#2184). The plan fallback,
|
|
84
|
+
# however, claims one shared Y/Z point and must prove it on both trims.
|
|
85
|
+
if _midpoint_witness_supported(group_boxes, 2):
|
|
86
|
+
return "X", None, ()
|
|
87
|
+
common = _common_x_face_witness(group_boxes, group_faces, frame)
|
|
88
|
+
if common is not None:
|
|
89
|
+
y, z = common
|
|
90
|
+
return "X", "plan", ((1, y), (2, z))
|
|
91
|
+
return None, None, None
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _common_x_face_witness(group_boxes, group_faces, frame):
|
|
95
|
+
"""Find a point in the interiors of both exact, trimmed X faces."""
|
|
96
|
+
candidates = [
|
|
97
|
+
(
|
|
98
|
+
(min(a[4], b[4]) - max(a[1], b[1])) * (min(a[5], b[5]) - max(a[2], b[2])),
|
|
99
|
+
max(a[1], b[1]),
|
|
100
|
+
max(a[2], b[2]),
|
|
101
|
+
min(a[4], b[4]),
|
|
102
|
+
min(a[5], b[5]),
|
|
103
|
+
a,
|
|
104
|
+
b,
|
|
105
|
+
group_faces[0][i],
|
|
106
|
+
group_faces[1][j],
|
|
107
|
+
)
|
|
108
|
+
for i, a in enumerate(group_boxes[0])
|
|
109
|
+
for j, b in enumerate(group_boxes[1])
|
|
110
|
+
if min(a[4], b[4]) >= max(a[1], b[1]) and min(a[5], b[5]) >= max(a[2], b[2])
|
|
111
|
+
]
|
|
112
|
+
for _area, y0, z0, y1, z1, a, b, first, second in sorted(
|
|
113
|
+
candidates, key=lambda item: (-item[0], item[1], item[2])
|
|
114
|
+
):
|
|
115
|
+
# Start at the overlap centre, then sample its interior deterministically.
|
|
116
|
+
# A bounding box may contain a face hole or a concavity; only OCC's
|
|
117
|
+
# trimmed-face classifier can establish a real common witness.
|
|
118
|
+
for y_fraction, z_fraction in ((0.5, 0.5),) + tuple(
|
|
119
|
+
(i / 10, j / 10) for i in range(1, 10) for j in range(1, 10)
|
|
120
|
+
):
|
|
121
|
+
y = y0 + (y1 - y0) * y_fraction
|
|
122
|
+
z = z0 + (z1 - z0) * z_fraction
|
|
123
|
+
if all(
|
|
124
|
+
_point_inside_x_face(face, (box[0] + box[3]) / 2, y, z, frame)
|
|
125
|
+
for face, box in ((first, a), (second, b))
|
|
126
|
+
):
|
|
127
|
+
return y, z
|
|
128
|
+
return None
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def _point_inside_x_face(face, x, y, z, frame):
|
|
132
|
+
from OCP.BRepClass import BRepClass_FaceClassifier
|
|
133
|
+
from OCP.gp import gp_Pnt
|
|
134
|
+
from OCP.TopAbs import TopAbs_IN
|
|
135
|
+
from OCP.TopoDS import TopoDS
|
|
136
|
+
|
|
137
|
+
local = (x, y, z)
|
|
138
|
+
world = local if frame is None else frame.to_world(local)
|
|
139
|
+
classifier = BRepClass_FaceClassifier()
|
|
140
|
+
try:
|
|
141
|
+
classifier.Perform(TopoDS.Face_s(face), gp_Pnt(*world), 1e-7)
|
|
142
|
+
return classifier.State() == TopAbs_IN
|
|
143
|
+
except Exception:
|
|
144
|
+
return False
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def _planar_bore_axis_witness(groups, frame, shape_bbox):
|
|
148
|
+
"""Prove a location from one principal plane to one finite Z-bore axis.
|
|
149
|
+
|
|
150
|
+
A cylindrical face's bbox centre is its axial *height*, not the location
|
|
151
|
+
station. The plane must actually contain the axis-aligned witness point;
|
|
152
|
+
a bounding-box overlap alone would invent a witness through a trimmed face.
|
|
153
|
+
"""
|
|
154
|
+
from OCP.BRepAdaptor import BRepAdaptor_Surface
|
|
155
|
+
from OCP.BRepClass import BRepClass_FaceClassifier
|
|
156
|
+
from OCP.GeomAbs import GeomAbs_Cylinder, GeomAbs_Plane
|
|
157
|
+
from OCP.gp import gp_Pnt
|
|
158
|
+
from OCP.TopAbs import TopAbs_IN, TopAbs_ON
|
|
159
|
+
from OCP.TopoDS import TopoDS
|
|
160
|
+
|
|
161
|
+
if len(groups) != 2 or any(len(group) != 1 for group in groups):
|
|
162
|
+
return None
|
|
163
|
+
try:
|
|
164
|
+
faces = tuple(TopoDS.Face_s(group[0]) for group in groups)
|
|
165
|
+
surfaces = tuple(BRepAdaptor_Surface(face) for face in faces)
|
|
166
|
+
kinds = tuple(surface.GetType() for surface in surfaces)
|
|
167
|
+
if kinds not in ((GeomAbs_Plane, GeomAbs_Cylinder), (GeomAbs_Cylinder, GeomAbs_Plane)):
|
|
168
|
+
return None
|
|
169
|
+
plane_i = kinds.index(GeomAbs_Plane)
|
|
170
|
+
bore_i = 1 - plane_i
|
|
171
|
+
normal = surfaces[plane_i].Plane().Axis().Direction()
|
|
172
|
+
normal = _frame_vector((normal.X(), normal.Y(), normal.Z()), frame)
|
|
173
|
+
axis = max(range(3), key=lambda index: abs(normal[index]))
|
|
174
|
+
if axis not in (0, 1) or abs(abs(normal[axis]) - 1) > 1e-6:
|
|
175
|
+
return None
|
|
176
|
+
bore = surfaces[bore_i].Cylinder().Axis()
|
|
177
|
+
direction = bore.Direction()
|
|
178
|
+
direction = _frame_vector((direction.X(), direction.Y(), direction.Z()), frame)
|
|
179
|
+
if abs(abs(direction[2]) - 1) > 1e-6 or max(abs(value) for value in direction[:2]) > 1e-6:
|
|
180
|
+
return None
|
|
181
|
+
point = bore.Location()
|
|
182
|
+
centre = _frame_point((point.X(), point.Y(), point.Z()), frame)
|
|
183
|
+
boxes = tuple(
|
|
184
|
+
shape_bbox(group[0]) if frame is None else shape_bbox(group[0], frame)
|
|
185
|
+
for group in groups
|
|
186
|
+
)
|
|
187
|
+
plane_box, bore_box = boxes[plane_i], boxes[bore_i]
|
|
188
|
+
z0 = max(plane_box[2], bore_box[2])
|
|
189
|
+
z1 = min(plane_box[5], bore_box[5])
|
|
190
|
+
if z1 - z0 <= 1e-6:
|
|
191
|
+
return None
|
|
192
|
+
station = (plane_box[axis] + plane_box[axis + 3]) / 2
|
|
193
|
+
if plane_box[axis + 3] - plane_box[axis] > 1e-5:
|
|
194
|
+
return None
|
|
195
|
+
witness = list(centre)
|
|
196
|
+
witness[axis] = station
|
|
197
|
+
witness[2] = (z0 + z1) / 2
|
|
198
|
+
world = witness if frame is None else frame.to_world(tuple(witness))
|
|
199
|
+
classifier = BRepClass_FaceClassifier()
|
|
200
|
+
classifier.Perform(faces[plane_i], gp_Pnt(*world), 1e-7)
|
|
201
|
+
if classifier.State() not in (TopAbs_IN, TopAbs_ON):
|
|
202
|
+
return None
|
|
203
|
+
points = [tuple(witness), tuple(witness)]
|
|
204
|
+
bore_point = list(witness)
|
|
205
|
+
bore_point[axis] = centre[axis]
|
|
206
|
+
points[bore_i] = tuple(bore_point)
|
|
207
|
+
return tuple(points), "XYZ"[axis], "plan"
|
|
208
|
+
except Exception:
|
|
209
|
+
return None
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def _is_mixed_planar_bore(groups):
|
|
213
|
+
"""Recognise the mixed support even when its location proof fails."""
|
|
214
|
+
from OCP.BRepAdaptor import BRepAdaptor_Surface
|
|
215
|
+
from OCP.GeomAbs import GeomAbs_Cylinder, GeomAbs_Plane
|
|
216
|
+
from OCP.TopoDS import TopoDS
|
|
217
|
+
|
|
218
|
+
if len(groups) != 2 or any(len(group) != 1 for group in groups):
|
|
219
|
+
return False
|
|
220
|
+
try:
|
|
221
|
+
kinds = tuple(BRepAdaptor_Surface(TopoDS.Face_s(group[0])).GetType() for group in groups)
|
|
222
|
+
return kinds in ((GeomAbs_Plane, GeomAbs_Cylinder), (GeomAbs_Cylinder, GeomAbs_Plane))
|
|
223
|
+
except Exception:
|
|
224
|
+
return False
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def _common_principal_cylinder_axis(references):
|
|
228
|
+
"""Return a shared principal axis only when every exact cylinder proves it."""
|
|
229
|
+
axes = []
|
|
230
|
+
for reference in references:
|
|
231
|
+
vector = reference.axis_direction
|
|
232
|
+
axis = max(range(3), key=lambda index: abs(vector[index]))
|
|
233
|
+
if abs(abs(vector[axis]) - 1.0) > 1e-6 or any(
|
|
234
|
+
abs(vector[index]) > 1e-6 for index in range(3) if index != axis
|
|
235
|
+
):
|
|
236
|
+
return ""
|
|
237
|
+
axes.append("XYZ"[axis])
|
|
238
|
+
return axes[0] if axes and len(set(axes)) == 1 else ""
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def _optional_cylinder_support(probe):
|
|
242
|
+
"""Keep an optional axis probe from erasing otherwise valid source PMI."""
|
|
243
|
+
try:
|
|
244
|
+
references, reasons = probe()
|
|
245
|
+
return references if not reasons else ()
|
|
246
|
+
except Exception:
|
|
247
|
+
return ()
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def _supported_planar_view(axis: str, group_boxes) -> tuple[str | None, str | None]:
|
|
251
|
+
"""Select only projection views whose shared witness touches both groups."""
|
|
252
|
+
if axis in {"X", "Z"}:
|
|
253
|
+
return (
|
|
254
|
+
(axis, None)
|
|
255
|
+
if _midpoint_witness_supported(group_boxes, 2 if axis == "X" else 0)
|
|
256
|
+
else (None, None)
|
|
257
|
+
)
|
|
258
|
+
side = _midpoint_witness_supported(group_boxes, 2)
|
|
259
|
+
plan = _midpoint_witness_supported(group_boxes, 0)
|
|
260
|
+
if side and plan:
|
|
261
|
+
return axis, None
|
|
262
|
+
if side or plan:
|
|
263
|
+
return axis, "side" if side else "plan"
|
|
264
|
+
return None, None
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
def _midpoint_witness_supported(group_boxes, index: int) -> bool:
|
|
268
|
+
"""Require a projected face in each group at the renderer's bbox midpoint."""
|
|
269
|
+
all_boxes = [box for boxes in group_boxes for box in boxes]
|
|
270
|
+
midpoint = (
|
|
271
|
+
min(box[index] for box in all_boxes) + max(box[index + 3] for box in all_boxes)
|
|
272
|
+
) / 2
|
|
273
|
+
return all(
|
|
274
|
+
any(box[index] - 1e-6 <= midpoint <= box[index + 3] + 1e-6 for box in boxes)
|
|
275
|
+
for boxes in group_boxes
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
class _DatumTopologyResolver:
|
|
280
|
+
"""Resolve Part21 face labels through OCCT's native transfer binders.
|
|
281
|
+
|
|
282
|
+
``TransferOne(rank)`` stays inside C++, avoiding the OCP wrapper's loss of pointer
|
|
283
|
+
identity when a STEP entity is returned to Python. It reuses the existing transfer
|
|
284
|
+
binder. ``FindIndex`` then proves that result is ``IsSame`` to a face in the original
|
|
285
|
+
imported topology; no geometric comparison participates in correspondence.
|
|
286
|
+
"""
|
|
287
|
+
|
|
288
|
+
_dynamic_type = "StepShape_AdvancedFace"
|
|
289
|
+
_part21_noun = "advanced face"
|
|
290
|
+
_shape_noun = "face"
|
|
291
|
+
_exclusive_claims = True
|
|
292
|
+
|
|
293
|
+
def _expected_shape_type(self):
|
|
294
|
+
return TopAbs_FACE
|
|
295
|
+
|
|
296
|
+
def __init__(self, step_reader, imported_faces):
|
|
297
|
+
self._reader = step_reader
|
|
298
|
+
self._model = step_reader.StepModel()
|
|
299
|
+
self._imported_faces = imported_faces
|
|
300
|
+
self._items: dict[str, tuple[object, int]] = {}
|
|
301
|
+
self._definitions: dict[str, tuple[object, ...]] = {}
|
|
302
|
+
self._claims: dict[int, str] = {}
|
|
303
|
+
|
|
304
|
+
def _transfer_face(self, item_id: str):
|
|
305
|
+
cached = self._items.get(item_id)
|
|
306
|
+
if cached is not None:
|
|
307
|
+
return cached, ""
|
|
308
|
+
rank = self._model.NextNumberForLabel(item_id, 0, True)
|
|
309
|
+
if rank <= 0:
|
|
310
|
+
return None, f"Part21 representation item {item_id} is unavailable"
|
|
311
|
+
entity = self._model.Value(rank)
|
|
312
|
+
if entity.DynamicType().Name() != self._dynamic_type:
|
|
313
|
+
return None, f"Part21 representation item {item_id} is not an {self._part21_noun}"
|
|
314
|
+
before = self._reader.NbShapes()
|
|
315
|
+
try:
|
|
316
|
+
transferred = self._reader.TransferOne(rank)
|
|
317
|
+
except Exception as exc:
|
|
318
|
+
return None, (
|
|
319
|
+
f"Part21 representation item {item_id} could not be transferred "
|
|
320
|
+
f"({_failure_reason(exc)})"
|
|
321
|
+
)
|
|
322
|
+
after = self._reader.NbShapes()
|
|
323
|
+
if not transferred or after != before + 1:
|
|
324
|
+
return None, f"Part21 representation item {item_id} could not be transferred"
|
|
325
|
+
shape = self._reader.Shape(after)
|
|
326
|
+
if shape is None or shape.IsNull() or shape.ShapeType() != self._expected_shape_type():
|
|
327
|
+
return None, (
|
|
328
|
+
f"Part21 representation item {item_id} did not transfer to one {self._shape_noun}"
|
|
329
|
+
)
|
|
330
|
+
face_index = self._imported_faces.FindIndex(shape)
|
|
331
|
+
if face_index <= 0:
|
|
332
|
+
return None, (
|
|
333
|
+
f"Part21 representation item {item_id} is not a {self._shape_noun} in the "
|
|
334
|
+
"imported topology"
|
|
335
|
+
)
|
|
336
|
+
result = (shape, face_index)
|
|
337
|
+
self._items[item_id] = result
|
|
338
|
+
return result, ""
|
|
339
|
+
|
|
340
|
+
def resolve(
|
|
341
|
+
self,
|
|
342
|
+
definition_id: str,
|
|
343
|
+
item_ids: tuple[str, ...],
|
|
344
|
+
*,
|
|
345
|
+
noun: str = "datum feature",
|
|
346
|
+
):
|
|
347
|
+
"""Return exact imported faces, or reasons that make the definition unsafe."""
|
|
348
|
+
cached = self._definitions.get(definition_id)
|
|
349
|
+
if cached is not None:
|
|
350
|
+
return cached, ()
|
|
351
|
+
if not item_ids:
|
|
352
|
+
return (), (f"{noun} has no Part21 representation items",)
|
|
353
|
+
|
|
354
|
+
resolved = []
|
|
355
|
+
reasons: list[str] = []
|
|
356
|
+
for item_id in item_ids:
|
|
357
|
+
result, reason = self._transfer_face(item_id)
|
|
358
|
+
if reason:
|
|
359
|
+
reasons.append(reason)
|
|
360
|
+
elif result is not None:
|
|
361
|
+
resolved.append(result)
|
|
362
|
+
if reasons:
|
|
363
|
+
return (), tuple(dict.fromkeys(reasons))
|
|
364
|
+
|
|
365
|
+
indices = [face_index for _shape, face_index in resolved]
|
|
366
|
+
if len(set(indices)) != len(indices):
|
|
367
|
+
return (), (
|
|
368
|
+
f"{noun} representation items resolve to the same imported {self._shape_noun}",
|
|
369
|
+
)
|
|
370
|
+
if self._exclusive_claims:
|
|
371
|
+
for face_index in indices:
|
|
372
|
+
owner = self._claims.get(face_index)
|
|
373
|
+
if owner is not None and owner != definition_id:
|
|
374
|
+
reasons.append(
|
|
375
|
+
f"one imported {self._shape_noun} is already claimed by {noun} {owner}"
|
|
376
|
+
)
|
|
377
|
+
if reasons:
|
|
378
|
+
return (), tuple(dict.fromkeys(reasons))
|
|
379
|
+
|
|
380
|
+
shapes = tuple(shape for shape, _face_index in resolved)
|
|
381
|
+
if self._exclusive_claims:
|
|
382
|
+
for face_index in indices:
|
|
383
|
+
self._claims[face_index] = definition_id
|
|
384
|
+
self._definitions[definition_id] = shapes
|
|
385
|
+
return shapes, ()
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
class _SurfaceLabelTopologyResolver(_DatumTopologyResolver):
|
|
389
|
+
"""Resolve surface-label edge items through the same identity-proof boundary."""
|
|
390
|
+
|
|
391
|
+
_dynamic_type = "StepShape_EdgeCurve"
|
|
392
|
+
_part21_noun = "edge curve"
|
|
393
|
+
_shape_noun = "edge"
|
|
394
|
+
_exclusive_claims = False
|
|
395
|
+
|
|
396
|
+
def _expected_shape_type(self):
|
|
397
|
+
return TopAbs_EDGE
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
class _CommonLabelTopologyResolver(_DatumTopologyResolver):
|
|
401
|
+
"""Resolve common-label face items without claiming them away from other PMI."""
|
|
402
|
+
|
|
403
|
+
_exclusive_claims = False
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
class _DimensionSupportResolver:
|
|
407
|
+
"""Transfer exact dimension supports and prove B-rep items belong to the imported part."""
|
|
408
|
+
|
|
409
|
+
def __init__(self, step_reader):
|
|
410
|
+
self._reader = step_reader
|
|
411
|
+
self._model = step_reader.StepModel()
|
|
412
|
+
self._faces = TopTools_IndexedMapOfShape()
|
|
413
|
+
self._edges = TopTools_IndexedMapOfShape()
|
|
414
|
+
TopExp.MapShapes_s(step_reader.OneShape(), TopAbs_FACE, self._faces)
|
|
415
|
+
TopExp.MapShapes_s(step_reader.OneShape(), TopAbs_EDGE, self._edges)
|
|
416
|
+
self._items: dict[str, object] = {}
|
|
417
|
+
self._groups: dict[str, tuple[tuple[str, ...], tuple[object, ...]]] = {}
|
|
418
|
+
|
|
419
|
+
def _transfer(self, item_id: str):
|
|
420
|
+
cached = self._items.get(item_id)
|
|
421
|
+
if cached is not None:
|
|
422
|
+
return cached, ""
|
|
423
|
+
rank = self._model.NextNumberForLabel(item_id, 0, True)
|
|
424
|
+
if rank <= 0:
|
|
425
|
+
return None, f"Part21 dimension support item {item_id} is unavailable"
|
|
426
|
+
entity = self._model.Value(rank)
|
|
427
|
+
dynamic_type = entity.DynamicType().Name()
|
|
428
|
+
expected = {
|
|
429
|
+
"StepShape_AdvancedFace": (TopAbs_FACE, self._faces, "face"),
|
|
430
|
+
"StepShape_EdgeCurve": (TopAbs_EDGE, self._edges, "edge"),
|
|
431
|
+
"StepShape_GeometricCurveSet": (TopAbs_COMPOUND, None, "geometric curve set"),
|
|
432
|
+
}.get(dynamic_type)
|
|
433
|
+
if expected is None:
|
|
434
|
+
return None, (
|
|
435
|
+
f"Part21 dimension support item {item_id} has unsupported type {dynamic_type}"
|
|
436
|
+
)
|
|
437
|
+
before = self._reader.NbShapes()
|
|
438
|
+
try:
|
|
439
|
+
transferred = self._reader.TransferOne(rank)
|
|
440
|
+
except Exception as exc:
|
|
441
|
+
return None, (
|
|
442
|
+
f"Part21 dimension support item {item_id} could not be transferred "
|
|
443
|
+
f"({_failure_reason(exc)})"
|
|
444
|
+
)
|
|
445
|
+
after = self._reader.NbShapes()
|
|
446
|
+
if not transferred or after != before + 1:
|
|
447
|
+
return None, f"Part21 dimension support item {item_id} could not be transferred"
|
|
448
|
+
shape = self._reader.Shape(after)
|
|
449
|
+
expected_type, imported, noun = expected
|
|
450
|
+
if shape is None or shape.IsNull() or shape.ShapeType() != expected_type:
|
|
451
|
+
return None, f"Part21 dimension support item {item_id} did not transfer to one {noun}"
|
|
452
|
+
# Faces and edge curves are topology claims, so identity with the imported solid is
|
|
453
|
+
# mandatory. A geometric-curve-set is authored construction geometry rather than a
|
|
454
|
+
# B-rep subshape; its exact Part21 identity and successful transfer are the evidence.
|
|
455
|
+
if imported is not None and imported.FindIndex(shape) <= 0:
|
|
456
|
+
return None, f"Part21 dimension support item {item_id} is not in the imported topology"
|
|
457
|
+
self._items[item_id] = shape
|
|
458
|
+
return shape, ""
|
|
459
|
+
|
|
460
|
+
def resolve_group(self, aspect_id: str, item_ids: tuple[str, ...]):
|
|
461
|
+
cached = self._groups.get(aspect_id)
|
|
462
|
+
if cached is not None:
|
|
463
|
+
cached_item_ids, cached_shapes = cached
|
|
464
|
+
if cached_item_ids != item_ids:
|
|
465
|
+
return (), (f"dimension support group {aspect_id} has conflicting Part21 items",)
|
|
466
|
+
return cached_shapes, ()
|
|
467
|
+
if not item_ids:
|
|
468
|
+
return (), (f"dimension support group {aspect_id} has no Part21 items",)
|
|
469
|
+
shapes = []
|
|
470
|
+
reasons = []
|
|
471
|
+
for item_id in item_ids:
|
|
472
|
+
shape, reason = self._transfer(item_id)
|
|
473
|
+
if reason:
|
|
474
|
+
reasons.append(reason)
|
|
475
|
+
elif shape is not None:
|
|
476
|
+
shapes.append(shape)
|
|
477
|
+
if reasons:
|
|
478
|
+
return (), tuple(dict.fromkeys(reasons))
|
|
479
|
+
result = tuple(shapes)
|
|
480
|
+
self._groups[aspect_id] = (item_ids, result)
|
|
481
|
+
return result, ()
|