← back to pin list10. DXF export layer table
kerfmaster pin list · UI / workflow decisions
intentmixeddeferred d14What we want to build. Never claimed the present, so it cannot be stale — and must never be read as a description of the code.
Content last changed 2026-08-02 — computed from the item itself, not typed.
Contract — Report stage
This contract describes a stage we intend to build — it is NOT a description of the code.
takes healed-geometry
makes delivery
fails if A healed entity that lands on no layer, or on a layer a customer's CAD hides.
Contract last changed 2026-08-06 — computed, not typed. Dated separately from the text above, so neither date can speak for the other.
⚠ Known defects
This item's subject has a known defect in the code. Source: cadmaster/defects.json → cadmaster/KNOWN_DEFECTS.md, not this page — the text below is generated from the register so the two can never disagree.
- D14 — The DXF parser reads BLOCK-definition geometry at block-local coordinates, ignores the INSERT that places it, and reports nothing skipped (DEFERRED)
dxf_io.parse walks the whole group-code stream and dispatches on six entity types -- POLYLINE, LWPOLYLINE, LINE, ARC, CIRCLE, SPLINE (dxf_io.py:113-244). It does not track SECTION, so a LINE sitting in the BLOCKS section is picked up exactly as if it were in ENTITIES, at its block-local coordinates. The INSERT that positions, scales and rotates that block is not an entity it knows, so it falls through the loop's trailing `i += 1` and is discarded. Every other entity type does the same: ELLIPSE, HATCH, SOLID, TEXT, MTEXT, DIMENSION, LEADER, 3DFACE, POINT, ATTRIB. There is no count of what was skipped and no warning.
Cost today: None measurable on any file cut so far -- every DXF we hold uses LWPOLYLINE only. The exposure is entirely on files we have not yet been given, which is precisely what the input survey exists to find out.
Verified: 2026-08-04. Probe written and run (cadmaster/probe_entities.py). CONTROL: the novi customer file parses unchanged at 91 polylines / 0 lines / 0 arcs / 0 circles / 0 splines, so this is a gap in coverage, not a regression. Entity list read off the code's own branches, not assumed. NOT YET RAISED WITH ARISTIDE OR JORDAN, and no fix attempted -- the phase rule says define first, and the first question is which of these entity types actually arrive from their customers, which only they can answer. DEFERRED by Jordan 2026-08-04, in his words: "Write it down as out of scope for now, but let's revisit this as part of our beta testing once the interface has been written." So this is closed to work and open on the record -- nobody should now go and fix it, and it must not be re-raised from the numbers. The revisit trigger is beta testing with real customer files arriving through an interface, which is also the only way to learn which of these entity types actually turn up. Written up for a reader on pin 14f, including a plainer explanation of the block/INSERT example, which Jordan reported was not clear the first time.
When we export the healed DXF, some CADs won’t render entities that reference a layer the file never formally defines. So the exported DXF needs a proper TABLES section declaring our layers (HEALED, and later QC_FLAGS / QC_FIX / CUT / ENGRAVE).
Why
Suspected cause of a report that a tiny hook arc didn’t show in the customer’s CAD: the entity was on a layer their CAD didn’t know, so it was dropped from the view. Declaring the layer table fixes that.
Built
The TABLES section with a LAYER table ships — dxf_r2000.py:180-184, which declares layer 0 plus every layer the caller passes. The healed DXF declares HEALED (emit.py:48). The review DXF declares HEALED, ORIGINAL, CM_BRIDGE_OK, CM_BRIDGE_ADJUST, CM_SPACING_FLAG, CM_NOTES with their colours (emit.py:74-75).
Still open
- QC_FLAGS, QC_FIX and ENGRAVE do not exist anywhere in the code — the only trace of them is a comment at
qc.py:17. They arrive with QC steps 2/3 and the cut-vs-engrave rule (item 8). - Confirm the hook-arc case is actually a layer-table issue (reproduce in their CAD).
- Settle the exact layer names + colours, tied to the layering scheme (item 6).