draftwright 0.4.1__tar.gz → 0.4.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {draftwright-0.4.1 → draftwright-0.4.3}/.gitignore +1 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/CHANGELOG.md +91 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/PKG-INFO +7 -1
- {draftwright-0.4.1 → draftwright-0.4.3}/README.md +3 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/pyproject.toml +11 -1
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/__init__.py +13 -1
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/_core.py +14 -1
- draftwright-0.4.3/src/draftwright/_pmi_part21.py +421 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/analysis.py +22 -8
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/annotations/_common.py +12 -2
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/annotations/from_model.py +343 -110
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/annotations/orchestrator.py +28 -2
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/audit.py +14 -7
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/builder.py +10 -3
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/cli.py +11 -10
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/compose.py +9 -6
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/drawing.py +61 -7
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/export.py +57 -1
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/linting/__init__.py +14 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/linting/coverage.py +37 -1
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/linting/issues.py +4 -0
- draftwright-0.4.3/src/draftwright/linting/pmi_coverage.py +210 -0
- draftwright-0.4.3/src/draftwright/linting/polygonal_stock_coverage.py +114 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/model/__init__.py +12 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/model/compiled.py +140 -46
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/model/declare.py +89 -3
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/model/detect.py +127 -17
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/model/ir.py +257 -6
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/model/planner.py +1 -0
- draftwright-0.4.3/src/draftwright/pmi.py +1187 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/__init__.py +10 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/pads.py +17 -7
- draftwright-0.4.3/src/draftwright/recognition/polygonal_bosses.py +342 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/result.py +10 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/slots.py +113 -23
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/sheet.py +71 -6
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/sheet_emit.py +391 -40
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/grooved_shaft.json +19 -1
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_add_dimension.py +42 -1
- draftwright-0.4.3/tests/test_api_docs.py +31 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_audit_differential.py +28 -3
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_compiled_plan_boundary.py +2 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_declare.py +16 -0
- draftwright-0.4.3/tests/test_export_dxf_curves.py +135 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_gdt_placement.py +96 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_import_boundaries.py +2 -0
- draftwright-0.4.3/tests/test_issue_1000_envelope_reuse.py +90 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_issue_1058_wheel_profile.py +281 -1
- draftwright-0.4.3/tests/test_issue_1073_cross_body_patterns.py +95 -0
- draftwright-0.4.3/tests/test_issue_1082_polygonal_stock.py +232 -0
- draftwright-0.4.3/tests/test_issue_676_polygonal_boss.py +285 -0
- draftwright-0.4.3/tests/test_issue_676_polygonal_boss_declare.py +328 -0
- draftwright-0.4.3/tests/test_issue_955_height_contingency.py +195 -0
- draftwright-0.4.3/tests/test_issue_958_cross_solid_recognition.py +150 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_make_drawing.py +86 -7
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_parameter_id.py +54 -0
- draftwright-0.4.3/tests/test_pmi.py +1451 -0
- draftwright-0.4.3/tests/test_pmi_datum_lowering.py +463 -0
- draftwright-0.4.3/tests/test_pmi_gtol_lowering.py +244 -0
- draftwright-0.4.3/tests/test_pmi_part21.py +473 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_recogniser_contract.py +11 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_recognition_manifest.py +15 -1
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_recognition_result.py +6 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_render_seam.py +20 -2
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_sheet_emit.py +581 -35
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_sheet_identity_invariant.py +2 -0
- draftwright-0.4.3/tests/test_workflows.py +78 -0
- draftwright-0.4.1/src/draftwright/pmi.py +0 -363
- draftwright-0.4.1/tests/test_pmi.py +0 -248
- {draftwright-0.4.1 → draftwright-0.4.3}/LICENSE +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/docs/adr/README.md +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/skills/SKILL.md +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/_geometry.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/_warnings.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/annotate.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/annotations/__init__.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/annotations/balloons.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/annotations/holes.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/annotations/sections.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/fits.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/fonts/IBMPlexMono-Regular.ttf +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/fonts/IBMPlexSansCondensed-Regular.ttf +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/fonts/LICENSE-IBMPlexMono-OFL.txt +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/fonts/LICENSE-IBMPlexSansCondensed-OFL.txt +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/fonts/__init__.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/intents.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/layout.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/linting/channel_coverage.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/linting/flat_coverage.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/linting/profiled_bore_coverage.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/linting/slot_coverage.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/linting/structural.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/linting/suggest.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/make_drawing.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/model/callout.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/projection.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/py.typed +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/_features.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/_record.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/chamfers.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/countersinks.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/fillets.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/flats.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/grooves.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/levels.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/plates.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/profiled_bores.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/recognition/turned.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/registry.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/repair.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/src/draftwright/score.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/_kernel.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/_layout_sig.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/conftest.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/grm03_thumbwheel_drive_screw.step +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/if_step_flat_across_cylinder.step +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/issue_1058_wheel_rh.step +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/issue_909_basic_part_design_017_body.step +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/issue_915_case_study_2.step +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/nist_ctc_01_asme1_ap203.stp +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/nist_ctc_01_asme1_ap242.stp +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/nist_ctc_02_asme1_ap203.stp +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/nist_ctc_02_asme1_ap242.stp +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/nist_ctc_03_asme1_ap203.stp +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/nist_ctc_03_asme1_ap242.stp +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/nist_ctc_04_asme1_ap203.stp +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/nist_ctc_04_asme1_ap242.stp +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/nist_ctc_05_asme1_ap203.stp +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/nist_ctc_05_asme1_ap242.stp +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/fixtures/tuner_jig_blind_obround_pockets.step +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/bracket_section.json +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/centered_rebate.json +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/chamfered.json +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/filleted.json +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/flange_dense.json +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/grid_plate.json +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/hex_bar.json +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/holed_slot.json +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/pocketed.json +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/prismatic_ladder.json +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/scattered_plate.json +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/side_drilled.json +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/refactor_golden/turned_stepped.json +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_agents_guide.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_architecture_docs.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_balloon_ring_standoff.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_carve_free_position_callers.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_counting_calls.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_declared_recognition_gate.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_dense_sheet_canary.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_deprecation_dates.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_detect_once.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_detect_registry.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_dimension_role_vocabulary.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_drawing_encapsulation.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_e2e_slice.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_e2e_standards.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_export_dxf_zoom.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_fillets_adjacency.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_fits.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_flat_completeness.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_flat_stock_identity.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_flat_stock_opposition.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_grid_lattice_convention.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_issue_885_prismatic_coverage.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_issue_909_sloped_profile.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_issue_915_dense_case.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_issue_916_pocket_leader.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_issue_917_open_channel.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_label_provenance.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_layout.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_layout_cleanliness.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_layout_hypothesis.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_layout_property.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_lint_box_cache.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_lint_reconciliation.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_lint_structural.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_linting.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_location_vocabulary.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_note_verb.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_object_aspects.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_occupancy_boxes.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_part_model.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_pitch_dim_footprint.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_pocket_pattern.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_pocket_pattern_recognition.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_principal_profile_classifier.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_private_test_attr_reads.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_private_test_imports.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_recognition.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_refactor_golden.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_registry.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_score.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_script_detail_parity.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_sheet_gdt.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_sheet_notes.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_sheet_of.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_sheet_section.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_sheet_tables.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_slanted_blind_step.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_slot_completeness.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_slot_pattern.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_slot_pattern_recognition.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_soft_deprecation.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_solve_trace.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_strip_layout.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_suppression_ledger.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_suppression_marks.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_tolerances.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_turned_steps.py +0 -0
- {draftwright-0.4.1 → draftwright-0.4.3}/tests/test_witness_label_reconciliation.py +0 -0
|
@@ -2,6 +2,97 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## v0.4.3 — 2026-08-09
|
|
6
|
+
|
|
7
|
+
**A trust and validation-throughput patch release.** Whole-part hexagonal stock now receives its
|
|
8
|
+
manufacturing definition, assembly recognition no longer combines evidence across bodies, and
|
|
9
|
+
performance validation is both more stable and faster to run.
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **Whole-part regular hexagonal stock is recognised independently of an attached boss and
|
|
14
|
+
dimensioned as `HEX … A/F` plus its axial length** (#1082). In-plane rotation preserves the
|
|
15
|
+
geometric across-flats size instead of substituting an orientation-dependent bounding-box
|
|
16
|
+
width. Automatic and declared paths share the same compiler and placement machinery, while
|
|
17
|
+
completeness lint distinguishes placed, authored-suppressed, dropped, missing, and ambiguous
|
|
18
|
+
outcomes.
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
|
|
22
|
+
- **Slot and pocket patterns cannot group members from separate assembly bodies** (#1073).
|
|
23
|
+
Recognition carries solid ownership through grouping and fails closed when ownership is
|
|
24
|
+
unavailable, preventing plausible-looking phantom patterns across disconnected parts.
|
|
25
|
+
|
|
26
|
+
- **The annotation-obstacle performance guard uses deterministic work-count evidence instead of
|
|
27
|
+
a wall-clock threshold** (#1071). The regression test remains load-bearing under mutation but
|
|
28
|
+
no longer flakes because of machine load or suite ordering.
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
|
|
32
|
+
- **The post-merge slow tier distributes individual tests across workers** (#1108), using
|
|
33
|
+
`pytest-xdist`'s load scheduling after local benchmark evidence showed a material speed-up
|
|
34
|
+
without weakening fixture coverage. Hosted slow validation remains the single post-merge gate.
|
|
35
|
+
|
|
36
|
+
## v0.4.2 — 2026-08-09
|
|
37
|
+
|
|
38
|
+
**The trustworthy manufacturing drawings release.** AP242 PMI is now accounted for from its
|
|
39
|
+
source records through lowering and rendering, imported datum faces retain an auditable topology
|
|
40
|
+
identity, and several drawing paths that previously omitted, invented, or stalled on defining
|
|
41
|
+
geometry now fail closed or produce the required annotation.
|
|
42
|
+
|
|
43
|
+
### Added
|
|
44
|
+
|
|
45
|
+
- **AP242 geometric tolerances and datum features survive as source-backed manufacturing
|
|
46
|
+
requirements** (#62/#675/#1094/#1095/#1099/#1100). The importer recovers range-encoded
|
|
47
|
+
dimensional tolerances, tolerance characteristics, magnitudes, datum chains, and supported
|
|
48
|
+
all-around/all-over modifiers. Datum representation-item faces are resolved to imported
|
|
49
|
+
topology through OCCT's exact transfer relationship rather than geometric resemblance, so the
|
|
50
|
+
NIST CTC-01 datum definitions `A`, `B`, and `C` lower and render without guessing.
|
|
51
|
+
|
|
52
|
+
- **PMI completeness lint reconciles every AP242 source record through extraction, projection,
|
|
53
|
+
lowering, and rendering** (#623). Unsupported or incomplete requirements remain explicit with
|
|
54
|
+
source-specific outcomes instead of allowing a partial PMI transcription to report clean.
|
|
55
|
+
|
|
56
|
+
- **Hexagonal and other regular polygonal bosses are recognised and dimensioned by their
|
|
57
|
+
across-flats size** (#676). Automatic and declared paths share the same feature model, and
|
|
58
|
+
mutation tests reject incomplete, unequal, non-planar, and ambiguous face sets.
|
|
59
|
+
|
|
60
|
+
- **Generated `Sheet` scripts preserve references to named source objects where correspondence
|
|
61
|
+
is proven** (#1041). The `--script` path emits declarations such as
|
|
62
|
+
`sheet.hole(features.tap)` instead of copying detected numbers; ambiguous, stale, non-shape, or
|
|
63
|
+
unused mappings fail closed.
|
|
64
|
+
|
|
65
|
+
- **A curated API reference is published at
|
|
66
|
+
<https://pzfreo.github.io/draftwright/>** (#846), covering the supported entry points,
|
|
67
|
+
`Sheet` declaration surface and fluent handles, `Drawing` results, and feature constructors.
|
|
68
|
+
|
|
69
|
+
### Fixed
|
|
70
|
+
|
|
71
|
+
- **Recognition no longer combines faces from different solids into phantom slots or pads**
|
|
72
|
+
(#958). Each physical solid is recognised independently before the results are combined.
|
|
73
|
+
|
|
74
|
+
- **`Sheet.from_part(...).envelope()` reuses the detected whole-part envelope** (#1000) instead
|
|
75
|
+
of appending a duplicate feature whose dimensions were then silently deduplicated on the page.
|
|
76
|
+
|
|
77
|
+
- **Crowded Z-turned step chains recover the independently approved overall height when the
|
|
78
|
+
chain cannot be placed** (#955), and placed step lengths retain measurement identity for
|
|
79
|
+
differential audit (#1004).
|
|
80
|
+
|
|
81
|
+
- **All-over GD&T leaders and complex STEP B-spline paths have bounded, export-safe DXF
|
|
82
|
+
conversion** (#1097/#1070). All-over scope now reaches the existing export-safe leader
|
|
83
|
+
representation, while spline conversion reads OCCT knots, poles, and weights through its
|
|
84
|
+
indexed API instead of expensive sequence wrappers; visible curve geometry is preserved.
|
|
85
|
+
|
|
86
|
+
### Changed
|
|
87
|
+
|
|
88
|
+
- **Hosted CI retains every supported Python version and both dependency/kernel generations on
|
|
89
|
+
macOS and Windows with a smaller compatibility matrix** (#1103). PRs still require lint,
|
|
90
|
+
coverage, Codecov, and the compatibility gates; the slow standards tier runs once after merge.
|
|
91
|
+
|
|
92
|
+
- **The pinned wheel fixture now records mutation-gated evidence for a repeating 13-fold radial
|
|
93
|
+
profile without claiming gear semantics** (#1085). Runtime recognition remains fail-closed
|
|
94
|
+
until a separate feature contract has independently sufficient evidence.
|
|
95
|
+
|
|
5
96
|
## v0.4.1 — 2026-08-07
|
|
6
97
|
|
|
7
98
|
**The recognition trust release.** Automatic drawings now fail closed on unsupported inner
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: draftwright
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.3
|
|
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
|
|
7
7
|
Project-URL: Issues, https://github.com/pzfreo/draftwright/issues
|
|
8
8
|
Project-URL: Changelog, https://github.com/pzfreo/draftwright/blob/main/CHANGELOG.md
|
|
9
|
+
Project-URL: Documentation, https://pzfreo.github.io/draftwright/
|
|
9
10
|
Author-email: Paul Fremantle <pzfreo@gmail.com>
|
|
10
11
|
License: GNU AFFERO GENERAL PUBLIC LICENSE
|
|
11
12
|
Version 3, 19 November 2007
|
|
@@ -682,6 +683,7 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
682
683
|
Classifier: Programming Language :: Python :: 3.14
|
|
683
684
|
Classifier: Topic :: Scientific/Engineering
|
|
684
685
|
Requires-Python: <3.15,>=3.10
|
|
686
|
+
Requires-Dist: antlr4-python3-runtime<4.10
|
|
685
687
|
Requires-Dist: build123d-drafting-helpers>=0.14.1
|
|
686
688
|
Requires-Dist: build123d<0.11,>=0.9.0; python_full_version < '3.13'
|
|
687
689
|
Requires-Dist: build123d<0.12,>=0.11; python_full_version >= '3.13'
|
|
@@ -689,6 +691,7 @@ Requires-Dist: numpy>=1.24
|
|
|
689
691
|
Requires-Dist: pillow>=10
|
|
690
692
|
Requires-Dist: pypdfium2>=4
|
|
691
693
|
Requires-Dist: reportlab>=4.0
|
|
694
|
+
Requires-Dist: steputils==0.1
|
|
692
695
|
Requires-Dist: svglib>=1.5
|
|
693
696
|
Requires-Dist: typer>=0.12
|
|
694
697
|
Requires-Dist: typing-extensions>=4.5; python_full_version < '3.13'
|
|
@@ -705,6 +708,9 @@ Description-Content-Type: text/markdown
|
|
|
705
708
|
[](LICENSE)
|
|
706
709
|
[](https://github.com/astral-sh/ruff)
|
|
707
710
|
|
|
711
|
+
**[API reference](https://pzfreo.github.io/draftwright/)** ·
|
|
712
|
+
**[Examples and source](https://github.com/pzfreo/draftwright#readme)**
|
|
713
|
+
|
|
708
714
|
Automated technical-drawing generation for [build123d](https://github.com/gumyr/build123d).
|
|
709
715
|
Point it at a solid (or a STEP file) and get a fully-annotated multi-view engineering
|
|
710
716
|
drawing — orthographic views, dimensions, section A–A, ISO hatching, title block — ready
|
|
@@ -9,6 +9,9 @@
|
|
|
9
9
|
[](LICENSE)
|
|
10
10
|
[](https://github.com/astral-sh/ruff)
|
|
11
11
|
|
|
12
|
+
**[API reference](https://pzfreo.github.io/draftwright/)** ·
|
|
13
|
+
**[Examples and source](https://github.com/pzfreo/draftwright#readme)**
|
|
14
|
+
|
|
12
15
|
Automated technical-drawing generation for [build123d](https://github.com/gumyr/build123d).
|
|
13
16
|
Point it at a solid (or a STEP file) and get a fully-annotated multi-view engineering
|
|
14
17
|
drawing — orthographic views, dimensions, section A–A, ISO hatching, title block — ready
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "draftwright"
|
|
7
|
-
version = "0.4.
|
|
7
|
+
version = "0.4.3"
|
|
8
8
|
description = "Automated technical-drawing generation for build123d"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { file = "LICENSE" }
|
|
@@ -25,6 +25,11 @@ dependencies = [
|
|
|
25
25
|
"pillow>=10",
|
|
26
26
|
"pypdfium2>=4",
|
|
27
27
|
"reportlab>=4.0",
|
|
28
|
+
# Structured ISO 10303-21 access for AP242 facts that OCCT's XCAF transfer drops (#62).
|
|
29
|
+
# STEPutils 0.1 is the only release; isolate it behind _pmi_part21 and pin its README's
|
|
30
|
+
# ANTLR compatibility constraint explicitly because the package metadata omits the cap.
|
|
31
|
+
"steputils==0.1",
|
|
32
|
+
"antlr4-python3-runtime<4.10",
|
|
28
33
|
"svglib>=1.5",
|
|
29
34
|
"typer>=0.12",
|
|
30
35
|
# PEP 702 @deprecated: stdlib `warnings.deprecated` lands in 3.13; backport for 3.10–3.12.
|
|
@@ -53,6 +58,7 @@ Homepage = "https://github.com/pzfreo/draftwright"
|
|
|
53
58
|
Repository = "https://github.com/pzfreo/draftwright"
|
|
54
59
|
Issues = "https://github.com/pzfreo/draftwright/issues"
|
|
55
60
|
Changelog = "https://github.com/pzfreo/draftwright/blob/main/CHANGELOG.md"
|
|
61
|
+
Documentation = "https://pzfreo.github.io/draftwright/"
|
|
56
62
|
|
|
57
63
|
[tool.hatch.build.targets.wheel]
|
|
58
64
|
packages = ["src/draftwright"]
|
|
@@ -144,6 +150,10 @@ select = ["E", "F", "I", "UP"]
|
|
|
144
150
|
ignore = ["E501"]
|
|
145
151
|
|
|
146
152
|
[dependency-groups]
|
|
153
|
+
docs = [
|
|
154
|
+
"mkdocs>=1.6,<2",
|
|
155
|
+
"mkdocstrings[python]>=0.30,<1",
|
|
156
|
+
]
|
|
147
157
|
dev = [
|
|
148
158
|
"codespell>=2.3.0",
|
|
149
159
|
"hypothesis>=6",
|
|
@@ -29,8 +29,11 @@ _LAZY = {
|
|
|
29
29
|
"FeatureInfo": "draftwright.drawing",
|
|
30
30
|
"Sheet": "draftwright.sheet",
|
|
31
31
|
"lint_feature_coverage": "draftwright.linting",
|
|
32
|
+
"PmiExtractionReport": "draftwright.pmi",
|
|
32
33
|
"PmiRecord": "draftwright.pmi",
|
|
34
|
+
"PmiSourceEntity": "draftwright.pmi",
|
|
33
35
|
"extract_pmi": "draftwright.pmi",
|
|
36
|
+
"extract_pmi_report": "draftwright.pmi",
|
|
34
37
|
"choose_scale": "draftwright.compose",
|
|
35
38
|
# A warning category users are told to filter must be importable without reaching into a
|
|
36
39
|
# private module (#1043 review) — and without paying for the CAD kernel. It lives in the
|
|
@@ -78,7 +81,13 @@ if TYPE_CHECKING: # static analysers / IDEs — no runtime import, no kernel co
|
|
|
78
81
|
from draftwright.compose import choose_scale
|
|
79
82
|
from draftwright.drawing import Drawing, FeatureInfo
|
|
80
83
|
from draftwright.linting import lint_feature_coverage
|
|
81
|
-
from draftwright.pmi import
|
|
84
|
+
from draftwright.pmi import (
|
|
85
|
+
PmiExtractionReport,
|
|
86
|
+
PmiRecord,
|
|
87
|
+
PmiSourceEntity,
|
|
88
|
+
extract_pmi,
|
|
89
|
+
extract_pmi_report,
|
|
90
|
+
)
|
|
82
91
|
from draftwright.sheet import Sheet
|
|
83
92
|
|
|
84
93
|
|
|
@@ -93,11 +102,14 @@ __all__ = [
|
|
|
93
102
|
"Drawing",
|
|
94
103
|
"SoftDeprecationWarning",
|
|
95
104
|
"FeatureInfo",
|
|
105
|
+
"PmiExtractionReport",
|
|
96
106
|
"PmiRecord",
|
|
107
|
+
"PmiSourceEntity",
|
|
97
108
|
"Sheet",
|
|
98
109
|
"build_drawing",
|
|
99
110
|
"choose_scale",
|
|
100
111
|
"extract_pmi",
|
|
112
|
+
"extract_pmi_report",
|
|
101
113
|
"lint_feature_coverage",
|
|
102
114
|
"make_drawing",
|
|
103
115
|
]
|
|
@@ -1015,8 +1015,16 @@ class Analysis:
|
|
|
1015
1015
|
tolerance: str
|
|
1016
1016
|
drawn_by: str
|
|
1017
1017
|
out: str
|
|
1018
|
-
|
|
1018
|
+
# Canonical AP242 source census + extraction outcomes for a STEP input, including off mode
|
|
1019
|
+
# (which inventories but does not lower records); None for an in-memory Shape. Typed as
|
|
1020
|
+
# object to keep the rank-1 core from importing rank-2 pmi; the compatibility `pmi` property
|
|
1021
|
+
# below is its records projection.
|
|
1022
|
+
pmi_report: object | None
|
|
1019
1023
|
pmi_mode: str
|
|
1024
|
+
# True when the caller omitted `pmi` and the public default selected off. Kept separate
|
|
1025
|
+
# from the effective mode so the ignored-PMI diagnostic can distinguish that default from
|
|
1026
|
+
# an explicit opt-out without widening the three-mode renderer contract (#623).
|
|
1027
|
+
pmi_defaulted: bool
|
|
1020
1028
|
# Standing ISO 7200 title-block fields (#766) — defaulted, so they sit after the
|
|
1021
1029
|
# non-default fields above. Defaults preserve the prior output: revision "A", the rest
|
|
1022
1030
|
# blank (the TitleBlock helper's own defaults).
|
|
@@ -1040,6 +1048,11 @@ class Analysis:
|
|
|
1040
1048
|
# back to build_model(a).
|
|
1041
1049
|
model: object | None = None
|
|
1042
1050
|
|
|
1051
|
+
@property
|
|
1052
|
+
def pmi(self) -> list:
|
|
1053
|
+
"""Successful PMI records, derived from the canonical extraction report."""
|
|
1054
|
+
return list(getattr(self.pmi_report, "records", ()))
|
|
1055
|
+
|
|
1043
1056
|
|
|
1044
1057
|
_greedy_strip_ys = _greedy_strip_1d
|
|
1045
1058
|
|