Skip to content

§20 family: Dictionaries and non-graphical objects (§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 to §20.4.95, §20.4.104) #149

Open

Description

@DrunkOnJava

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

Activity

  1. added
    type:specImplements or verifies a numbered section of ODA spec v5.4.1
    area:objectsCommon object formats and non-graphical objects (§20.1 to §20.3, §20.4 objects, §28)
    priority:P2Quality and completeness
    on Oct 21, 2026
  2. DrunkOnJava commented on Oct 21, 2026

    @DrunkOnJava
    OwnerAuthor

    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, then BS cloning_flags on R2000+) against each record's boundary, and walks the DXF-style group-code chunks inside the body. It is preserved at refs/archive/2026-10-21/xrecord-material-probes (commit d6ac794, not rebuilt against current main).

  3. DrunkOnJava commented on Oct 26, 2026

    @DrunkOnJava
    OwnerAuthor

    §20.4.104 XRECORD, measured 2026-10-26 with examples/probe_xrecord.rs (#222)

    The field list src/objects/xrecord.rs already reads (BL numdatabytes, the databytes, BS cloning flag on R2000+ only) closes at delta 0 on all 1117 XRECORD records of the 19-file corpus, and every body walks clean as RS group-code/value pairs:

    Band Records per file Close Arrive as a class
    R14 115 115 115
    R2000 57 57 0
    R2004 53 53 0
    R2007 47 47 0
    R2010 46 46 0
    R2013 22 22 0
    R2018 97 97 0

    What is derivable from it:

    • R14 needs only a dispatch arm. 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)), and entities/dispatch.rs routes only the fixed code 0x4F to objects::xrecord. Sending the XRECORD class name to the same decoder should move those 345 from skipped to decoded, and with it §20.4.104 can go to closes.
    • Correct the §20.4.104 note in docs/data/spec-coverage.tsv in that PR: "Skipped as unmatched across the corpus" is true only of R14; R2000 to R2018 XRECORDs already decode.
    • Body strings on R13 to R2004 take an RS length, then the RC codepage, where §20.4.104 prints RC: arc_R14.dwg handle 0x2AB holds 102="EXTNAMES" 1="*MODEL_SPACE" 2="*Model_Space" in 47 bytes, 3 × (2 + 2 + 1) + 32; an RC length gives 44. Only matters once the body is decoded into typed pairs.

    Reproduce: cargo run --release --example probe_xrecord -- ../../samples/*.dwg (XR_CODES=1 for the group codes each file uses).

  4. DrunkOnJava commented on Oct 27, 2026

    @DrunkOnJava
    OwnerAuthor

    Status (main 2bab7b2; docs/spec-coverage.md and CI run 40503137263). Against the 2026-10-21 table in the body:

    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 is partial (carried as bytes).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:objectsCommon object formats and non-graphical objects (§20.1 to §20.3, §20.4 objects, §28)priority:P2Quality and completenesstype:specImplements or verifies a numbered section of ODA spec v5.4.1

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions