Repository navigation
Open
Labels
area:objectsCommon object formats and non-graphical objects (§20.1 to §20.3, §20.4 objects, §28)Common object formats and non-graphical objects (§20.1 to §20.3, §20.4 objects, §28)priority:P2Quality and completenessQuality and completenesstype:specImplements or verifies a numbered section of ODA spec v5.4.1Implements or verifies a numbered section of ODA spec v5.4.1
Description
Spec: ODA Open Design Specification for .dwg files v5.4.1, §20.4.44, §20.4.45, §20.4.71, §20.4.72, §20.4.74, §20.4.76, §20.4.77, §20.4.79, §20.4.83, §20.4.89, §20.4.90, §20.4.92, §20.4.93, §20.4.94, §20.4.95, §20.4.104.
Sections and their state on main (2026-10-21)
| Section | State | Code | Note |
|---|---|---|---|
| §20.4.44 DICTIONARY (42) (p. 147) | closes |
src/objects/dictionary.rs | |
| §20.4.45 DICTIONARYWDFLT (p. 148) | decoder |
src/objects/dictionary.rs | |
| §20.4.71 AcDbAnnotScaleObjectContextData (p. 184) | missing |
- | |
| §20.4.72 GROUP (72) (p. 184) | closes |
src/objects/acad_group.rs | |
| §20.4.74 DICTIONARYVAR (p. 187) | closes |
src/objects/dictionary_var.rs | #76. |
| §20.4.76 FIELD (p. 192) | missing |
- | |
| §20.4.77 FIELDLIST (p. 193) | missing |
- | |
| §20.4.79 IDBUFFER (p. 196) | missing |
- | |
| §20.4.83 LAYER_INDEX (p. 201) | missing |
- | |
| §20.4.89 AcDbObjectContextData (p. 211) | missing |
- | |
| §20.4.90 PROXY (p. 211) | partial |
src/objects/proxy_object.rs, src/objects/proxy_entity.rs | Carried as opaque bytes. |
| §20.4.92 SCALE (p. 213) | closes |
src/objects/acad_scale.rs | |
| §20.4.93 SORTENTSTABLE (p. 213) | missing |
- | |
| §20.4.94 SPATIAL_FILTER (p. 214) | missing |
- | |
| §20.4.95 SPATIAL_INDEX (p. 216) | missing |
- | |
| §20.4.104 XRECORD (p. 238) | partial |
src/objects/xrecord.rs | Skipped as unmatched across the corpus (README). |
closes comes from the boundary checks on the local 19-file corpus (STATUS.md, 2026-08-30). It is re-measured on the public corpus in CI by the 0.2.0 measurement epic, and no section is complete until its values equal AutoCAD's own DXF export.
Acceptance, for every section above
- Every field of its prescription is read, with every version branch the section names
- Where the section prints an example, its bytes are a committed fixture and decode to the values printed
- The field list ends on the record's exact data-stream boundary (and string/handle-stream boundaries on R2007+) on every corpus record of the type, on every release band
- Every value equals AutoCAD's DXF export of the same drawing, matched by handle (DXF group 5), with the scorer from the oracle epic
- The corpus holds at least one record of the type on each release band, R13 to R2018; a band without one is recorded on the corpus epic, not assumed
- Its row in docs/spec-coverage.md moves to
complete, with the evidence linked
Subtasks
- §20.4.44 DICTIONARY (42)
- R13
- R14
- R2000
- R2004
- R2007
- R2010
- R2013
- R2018
- §20.4.45 DICTIONARYWDFLT
- R13
- R14
- R2000
- R2004
- R2007
- R2010
- R2013
- R2018
- §20.4.71 AcDbAnnotScaleObjectContextData (no decoder yet)
- R13
- R14
- R2000
- R2004
- R2007
- R2010
- R2013
- R2018
- §20.4.72 GROUP (72)
- R13
- R14
- R2000
- R2004
- R2007
- R2010
- R2013
- R2018
- §20.4.74 DICTIONARYVAR
- R13
- R14
- R2000
- R2004
- R2007
- R2010
- R2013
- R2018
- §20.4.76 FIELD (no decoder yet)
- R13
- R14
- R2000
- R2004
- R2007
- R2010
- R2013
- R2018
- §20.4.77 FIELDLIST (no decoder yet)
- R13
- R14
- R2000
- R2004
- R2007
- R2010
- R2013
- R2018
- §20.4.79 IDBUFFER (no decoder yet)
- R13
- R14
- R2000
- R2004
- R2007
- R2010
- R2013
- R2018
- §20.4.83 LAYER_INDEX (no decoder yet)
- R13
- R14
- R2000
- R2004
- R2007
- R2010
- R2013
- R2018
- §20.4.89 AcDbObjectContextData (no decoder yet)
- R13
- R14
- R2000
- R2004
- R2007
- R2010
- R2013
- R2018
- §20.4.90 PROXY
- R13
- R14
- R2000
- R2004
- R2007
- R2010
- R2013
- R2018
- §20.4.92 SCALE
- R13
- R14
- R2000
- R2004
- R2007
- R2010
- R2013
- R2018
- §20.4.93 SORTENTSTABLE (no decoder yet)
- R13
- R14
- R2000
- R2004
- R2007
- R2010
- R2013
- R2018
- §20.4.94 SPATIAL_FILTER (no decoder yet)
- R13
- R14
- R2000
- R2004
- R2007
- R2010
- R2013
- R2018
- §20.4.95 SPATIAL_INDEX (no decoder yet)
- R13
- R14
- R2000
- R2004
- R2007
- R2010
- R2013
- R2018
- §20.4.104 XRECORD
- R13
- R14
- R2000
- R2004
- R2007
- R2010
- R2013
- R2018
A subtask becomes its own issue when someone picks it up; that issue quotes the section's field list and names the corpus records it is measured on.
Parent: #138
Metadata
Metadata
Assignees
Labels
area:objectsCommon object formats and non-graphical objects (§20.1 to §20.3, §20.4 objects, §28)Common object formats and non-graphical objects (§20.1 to §20.3, §20.4 objects, §28)priority:P2Quality and completenessQuality and completenesstype:specImplements or verifies a numbered section of ODA spec v5.4.1Implements or verifies a numbered section of ODA spec v5.4.1
Activity
DrunkOnJava commentedon Oct 21, 2026
For §20.4.104 XRECORD: a probe,
examples/probe_xrecord.rs, was written in a local worktree but never committed. It measures the field list (BL num_databytes, the bytes, thenBS cloning_flagson R2000+) against each record's boundary, and walks the DXF-style group-code chunks inside the body. It is preserved atrefs/archive/2026-10-21/xrecord-material-probes(commit d6ac794, not rebuilt against currentmain).DrunkOnJava commentedon Oct 26, 2026
§20.4.104 XRECORD, measured 2026-10-26 with
examples/probe_xrecord.rs(#222)The field list
src/objects/xrecord.rsalready reads (BL numdatabytes, the databytes,BS cloning flagon R2000+ only) closes at delta 0 on all 1117 XRECORD records of the 19-file corpus, and every body walks clean asRSgroup-code/value pairs:What is derivable from it:
coverage_report's largest unhandled kind,XRECORD (custom class) → 345, is exactly the 115 records of each R14 file: on R14, XRECORD has a class-map type code (§20.4.104 types it(varies)), andentities/dispatch.rsroutes only the fixed code0x4Ftoobjects::xrecord. Sending theXRECORDclass name to the same decoder should move those 345 from skipped to decoded, and with it §20.4.104 can go tocloses.docs/data/spec-coverage.tsvin that PR: "Skipped as unmatched across the corpus" is true only of R14; R2000 to R2018 XRECORDs already decode.RSlength, then theRCcodepage, where §20.4.104 printsRC:arc_R14.dwghandle0x2ABholds102="EXTNAMES" 1="*MODEL_SPACE" 2="*Model_Space"in 47 bytes, 3 × (2 + 2 + 1) + 32; anRClength gives 44. Only matters once the body is decoded into typed pairs.Reproduce:
cargo run --release --example probe_xrecord -- ../../samples/*.dwg(XR_CODES=1for the group codes each file uses).fix(objects): route the R14 XRECORD class to the §20.4.104 decoder (#149
fix(objects): route the R14 XRECORD class to the §20.4.104 decoder (#149
fix(objects): escape the matrix shape in the SPATIAL_FILTER module do…
fix(examples): compare SPATIAL_FILTER's back clip distance with DXF g…
feat(objects): route the class-numbered ACDBPLACEHOLDER of R14 and R2…
feat(objects): decode SORTENTSTABLE from §20.4.93 (#149) (#307)
feat(objects): decode SPATIAL_FILTER from §20.4.94 (#149) (#308)
feat(dxf): score SORTENTSTABLE in the value oracle (§20.4.93)
feat(dxf): score SORTENTSTABLE in the value oracle (§20.4.93)
feat(dxf): score SORTENTSTABLE in the value oracle (§20.4.93) (#351)
DrunkOnJava commentedon Oct 27, 2026
Status (main 2bab7b2;
docs/spec-coverage.mdand CI run 40503137263). Against the 2026-10-21 table in the body:missingis nowcloses(feat(objects): decode SORTENTSTABLE from §20.4.93 (#149) #307): all 27 records decode, R14 to R2018, and the oracle scores 18 records, 66 values equal, 0 different (feat(dxf): score SORTENTSTABLE in the value oracle (§20.4.93) #351).missingis nowcloses(feat(objects): decode SPATIAL_FILTER from §20.4.94 (#149) #308): the one record of each release closes and 234 values equal the export on the 6 records with a twin. The oracle scorer is queued (PR feat(dxf): score SPATIAL_FILTER in the value oracle (§20.4.94) #352).partialis nowcloses(fix(objects): route the R14 XRECORD class to the §20.4.104 decoder (#149) #254, feat(objects): probe XRECORD on every release band and MATERIAL's data-field budget #222): R14 gives XRECORD a class number and is routed by name, so all 1,154 R14 records decode and none in the corpus is skipped or errors. Oracle: 1,237 records, 1,237 values equal, 54,466 DXF groups not decoded (the body is carried as bytes).decoder, though the oracle scores 42 records with 0 different.Still
missing: §20.4.71 AcDbAnnotScaleObjectContextData, §20.4.76 FIELD, §20.4.77 FIELDLIST, §20.4.79 IDBUFFER, §20.4.83 LAYER_INDEX, §20.4.89 AcDbObjectContextData and §20.4.95 SPATIAL_INDEX; §20.4.90 PROXY ispartial(carried as bytes).