diff --git a/docs/data/spec-coverage.tsv b/docs/data/spec-coverage.tsv index cfc7cd3..3397d0e 100644 --- a/docs/data/spec-coverage.tsv +++ b/docs/data/spec-coverage.tsv @@ -11,7 +11,7 @@ 6 R2010 file format organization 67 closes src/section_map.rs #124 Same organization as R2004 (§6). 7 R2013 file format organization 68 closes src/section_map.rs #124 R2004 organization plus the §7 changes. 8 R2018 file format organization 69 closes src/section_map.rs #153 Four R2018 drawings in the public corpus (ACadSharp; AutoCAD 2023 and 2025). -9 AcDb:Header (header variables) 70 closes src/header_vars.rs, src/header_table.rs #126 One table (src/header_table.rs) drives R14 to R2018: 311 slots on R2018, each under its AutoCAD name or named UNKNOWN__. All 52 corpus sections pass both sentinels, the size, the CRC and every stream boundary, the string and handle streams of R2007 to R2018 included (examples/probe_header_vars.rs, ARCHITECTURE §7s). Against AutoCAD's DXF export of the same drawing, on R2000 to R2018 (42 twins) and on the AC1015 export of the R14 drawings: 11,544 variables agree, 316 more hold a stated relation, 0 disagree. Not `complete`: R13 (AC1012) has no file and no AC1014 export exists. DXF-only: $MEASUREMENT (AcDb:Template, §22), $DWGCODEPAGE (file header), local $TDCREATE and $TDUPDATE (not stored; the DWG holds universal time), $ACADMAINTVER and $LASTSAVEDBY. The spec's R14 header dump decodes in full (examples/spec_examples.rs, #107). dwg-to-dxf writes the decoded header under AutoCAD's names (src/dxf_header.rs): 9,224 variables agree with AutoCAD's export on the 42 drawings of AC1015 to AC1032 that have one, 0 disagree, none is written that the export omits (examples/probe_dxf_header.rs). +9 AcDb:Header (header variables) 70 closes src/header_vars.rs, src/header_table.rs #127 One table (src/header_table.rs) drives R14 to R2018: 311 slots on R2018, each under its AutoCAD name or named UNKNOWN__. All 52 corpus sections pass both sentinels, the size, the CRC and every stream boundary, the string and handle streams of R2007 to R2018 included (examples/probe_header_vars.rs, ARCHITECTURE §7s). Against AutoCAD's DXF export of the same drawing, on R2000 to R2018 (42 twins) and on the AC1015 export of the R14 drawings: 11,544 variables agree, 316 more hold a stated relation, 0 disagree. Per release (run 40532346172 on main e7c53e1, header-probe.log of artifact corpus-measurement): R14, R2000, R2004, R2007, R2010 and R2013 close on 8 of 8 drawings each and R2018 on 4 of 4 (2 with a twin), with 0 disagree on every one; that is the evidence behind closing #128 (R2000), #129 (R2004, R2007) and #130 (R2010 to R2018). Not `complete`: R13 (AC1012) has no file and no AC1014 export exists, which #127 tracks. DXF-only: $MEASUREMENT (AcDb:Template, §22), $DWGCODEPAGE (file header), local $TDCREATE and $TDUPDATE (not stored; the DWG holds universal time), $ACADMAINTVER and $LASTSAVEDBY. The spec's R14 header dump decodes in full (examples/spec_examples.rs, #107). dwg-to-dxf writes the decoded header under AutoCAD's names (src/dxf_header.rs): 9,583 variables are written on the 42 drawings of AC1015 to AC1032 that have an export, 9,410 agree with AutoCAD's, 173 more hold a stated relation, 0 disagree, none is written that the export omits (examples/probe_dxf_header.rs, run 40532346172, dxf-header-probe.log). 10 AcDb:Classes 84 closes src/classes.rs #137 §10.1 R13-R15 and §10.2 R18+; the R2018 record layout fixed in #37. 11 Padding (R13C3 and later) 86 missing #120 12 Data section "" (unnamed) 87 missing #135 @@ -27,9 +27,9 @@ 20.3 Object types 104 closes src/object_type.rs #139 20.4.1 Common Entity Data 106 closes src/common_entity.rs #139 Graphics-preview block (ARCHITECTURE §7f). 20.4.2 Common Entity Handle Data 107 closes src/common_entity.rs #139 -20.4.3 TEXT (1) 108 partial src/entities/text.rs #140 Closes on all 224 TEXT records of the public corpus, R14 to R2018 (no R13 file), with the section's R13-R14 and R2000+ branches as printed; oblique, rotation and width factor are RD (#62). Values equal the DXF twin on R2000 to R2018 (#226, ARCHITECTURE.md §7v). 29 records each on ACadSharp's R14, R2000 and R2004 saves and 4 on export_sample.dwg (R2018) error (#226). DXF oracle (examples/dxf_oracle): 174 records R2000-R2018, every decoded value equals AutoCAD's (870 equal, 1740 by the DXF default, 0 with no DXF group); 708 DXF groups not decoded. The spec's own example (§20.4.3.1) closes on the record's boundary (#107). -20.4.4 ATTRIB (2) 109 partial src/entities/attrib.rs #140 Closes on all 28 ATTRIB records of the public corpus, R14 to R2018. Values equal the DXF twin on R2000 to R2018 (#226, ARCHITECTURE.md §7v). DXF oracle (examples/dxf_oracle): 24 records R2000-R2018, every decoded value equals AutoCAD's (209 equal, 257 by the DXF default, 35 with no DXF group); 81 DXF groups not decoded. The spec's own example (§20.4.4.1) closes on the record's boundary (#107). -20.4.5 ATTDEF (3) 110 partial src/entities/attdef.rs #140 Closes on all 35 ATTDEF records of the public corpus, R14 to R2018; the prompt follows the ATTRIB fields, as printed. Values equal the DXF twin on R2000 to R2018 (#226, ARCHITECTURE.md §7v). DXF oracle (examples/dxf_oracle): 30 records R2000-R2018, every decoded value equals AutoCAD's (304 equal, 318 by the DXF default, 44 with no DXF group); 96 DXF groups not decoded. The spec's own example (§20.4.5.1) closes on the record's boundary (#107). +20.4.3 TEXT (1) 108 closes src/entities/text.rs #140 Closes on all 224 TEXT records of the public corpus, R14 to R2018 (no R13 file), with the section's R13-R14 and R2000+ branches as printed; oblique, rotation and width factor are RD (#62). Values equal the DXF twin on R2000 to R2018 (#226, ARCHITECTURE.md §7v). The records that errored on ACadSharp's R14, R2000 and R2004 saves and on export_sample.dwg (R2018) close since #258; no record of any kind errors on the 52 drawings (run 40532346172 on main e7c53e1, corpus-results.json: errored 0, `errors` empty). DXF oracle (examples/dxf_oracle): 174 records R2000-R2018, every decoded value equals AutoCAD's (870 equal, 1740 by the DXF default, 0 with no DXF group); 708 DXF groups not decoded. The spec's own example (§20.4.3.1) closes on the record's boundary (#107). +20.4.4 ATTRIB (2) 109 closes src/entities/attrib.rs #140 Closes on all 28 ATTRIB records of the public corpus, R14 to R2018: no record of any kind errors on the 52 drawings (run 40532346172 on main e7c53e1, corpus-results.json: errored 0, `errors` empty). Values equal the DXF twin on R2000 to R2018 (#226, ARCHITECTURE.md §7v). DXF oracle (examples/dxf_oracle): 24 records R2000-R2018, every decoded value equals AutoCAD's (209 equal, 257 by the DXF default, 35 with no DXF group); 81 DXF groups not decoded. The spec's own example (§20.4.4.1) closes on the record's boundary (#107). +20.4.5 ATTDEF (3) 110 closes src/entities/attdef.rs #140 Closes on all 35 ATTDEF records of the public corpus, R14 to R2018 (no record of any kind errors on the 52 drawings (run 40532346172 on main e7c53e1, corpus-results.json: errored 0, `errors` empty)); the prompt follows the ATTRIB fields, as printed. Values equal the DXF twin on R2000 to R2018 (#226, ARCHITECTURE.md §7v). DXF oracle (examples/dxf_oracle): 30 records R2000-R2018, every decoded value equals AutoCAD's (304 equal, 318 by the DXF default, 44 with no DXF group); 96 DXF groups not decoded. The spec's own example (§20.4.5.1) closes on the record's boundary (#107). 20.4.6 BLOCK (4) 111 closes src/entities/block.rs #141 DXF oracle (examples/dxf_oracle): 264 records R2000-R2018, 3 values disagree (#243) (261 equal, 0 by the DXF default, 0 with no DXF group); 2274 DXF groups not decoded. The spec's own example (§20.4.6.1) closes on the record's boundary (#107). 20.4.7 ENDBLK (5) 111 closes src/entities/endblk.rs #141 DXF oracle (examples/dxf_oracle): 278 records paired on every release that holds them; the decoder surfaces no field to compare; 705 DXF groups not decoded. The spec's own example (§20.4.7.1) closes on the record's boundary (#107). 20.4.8 SEQEND (6) 112 closes src/entities/seqend.rs #141 DXF oracle (examples/dxf_oracle): 24 records paired on every release that holds them; the decoder surfaces no field to compare; 48 DXF groups not decoded. The spec's own example (§20.4.8.1) closes on the record's boundary (#107). @@ -70,7 +70,7 @@ 20.4.43 XLINE (41) 147 closes src/entities/xline.rs #143 DXF oracle (examples/dxf_oracle): 6 records R2000-R2018, every decoded value equals AutoCAD's (36 equal, 0 by the DXF default, 0 with no DXF group); 12 DXF groups not decoded. The spec's own example (§20.4.43.1) closes on the record's boundary (#107). 20.4.44 DICTIONARY (42) 147 closes src/objects/dictionary.rs #149 DXF oracle (examples/dxf_oracle): 1093 records R2000-R2018, every decoded value equals AutoCAD's (7541 equal, 682 by the DXF default, 12 with no DXF group); 6755 DXF groups not decoded. The spec's own example (§20.4.44.1) closes on the record's boundary (#107). 20.4.45 DICTIONARYWDFLT 148 decoder src/objects/dictionary.rs #149 DXF oracle (examples/dxf_oracle): 42 records R2000-R2018, every decoded value equals AutoCAD's (126 equal, 42 by the DXF default, 0 with no DXF group); 168 DXF groups not decoded. -20.4.46 MTEXT (44) 148 partial src/entities/mtext.rs #140 Closes on all 257 MTEXT records of the public corpus, R14 to R2018 (no R13 file), with the R2000+ line spacing and the R2004+ background block read as printed; R2018 tail and ATTRIB's embedded MTEXT (ARCHITECTURE §7g). Values equal the DXF twin on R2000 to R2018 (#226, ARCHITECTURE.md §7t). 36 records each on ACadSharp's R14 and R2004 saves error (#226). DXF oracle (examples/dxf_oracle): 210 records R2000-R2018, every decoded value equals AutoCAD's (2348 equal, 630 by the DXF default, 942 with no DXF group); 1598 DXF groups not decoded. The spec's own example (§20.4.46.1) closes on the record's boundary (#107). +20.4.46 MTEXT (44) 148 closes src/entities/mtext.rs #140 Closes on all 257 MTEXT records of the public corpus, R14 to R2018 (no R13 file), with the R2000+ line spacing and the R2004+ background block read as printed; R2018 tail and ATTRIB's embedded MTEXT (ARCHITECTURE §7g). Values equal the DXF twin on R2000 to R2018 (#226, ARCHITECTURE.md §7t). The 72 records that errored on ACadSharp's R14 and R2004 saves close since #261; no record of any kind errors on the 52 drawings (run 40532346172 on main e7c53e1, corpus-results.json: errored 0, `errors` empty). DXF oracle (examples/dxf_oracle): 210 records R2000-R2018, every decoded value equals AutoCAD's (2348 equal, 630 by the DXF default, 942 with no DXF group); 1598 DXF groups not decoded. The spec's own example (§20.4.46.1) closes on the record's boundary (#107). 20.4.47 LEADER (45) 150 closes src/entities/leader.rs #147 Closes on all 7 records of the public corpus (R14 to R2018; no R13 file) once the R14+ end point projection is read. Measured departure: from R2010 the box height and width are not written. Values equal the DXF twin on R2000 to R2018 (#71, ARCHITECTURE.md §7ab). DXF oracle (examples/dxf_oracle): 6 records R2000-R2018, every decoded value equals AutoCAD's (78 equal, 18 by the DXF default, 60 with no DXF group); 42 DXF groups not decoded. The spec's own example (§20.4.47.1) closes on the record's boundary (#107). 20.4.48 MLEADER 152 closes src/entities/mleader.rs #147 Closes on all 105 MULTILEADER records of the public corpus, R14 to R2018 (no R13 file), with the R2010+ and -R2007 branches of §20.4.48 and §20.4.86 as printed. Every value the probe compared equals the DXF twin on R2000 to R2018, colours from R2004 on (#229, ARCHITECTURE.md §7ai). The R2010+ MC and B after the annotative flag stay unnamed (§7g). DXF oracle (examples/dxf_oracle): 90 records R2000-R2018, 3 values disagree (#381) (8532 equal, 0 by the DXF default, 495 with no DXF group); 1686 DXF groups not decoded. 20.4.49 TOLERANCE (46) 155 closes src/entities/tolerance.rs #140 Closes on all 21 TOLERANCE records of the public corpus, R14 to R2018 (no R13 file), with the unknown short, height and dimgap R13-R14 only as printed. Values equal the DXF twin on R2000 to R2018 (#226, ARCHITECTURE.md §7m). DXF oracle (examples/dxf_oracle): 18 records R2000-R2018, every decoded value equals AutoCAD's (72 equal, 54 by the DXF default, 54 with no DXF group); 54 DXF groups not decoded. The spec's own example (§20.4.49.1) closes on the record's boundary (#107). @@ -84,7 +84,7 @@ 20.4.57 LINETYPE CONTROL (56) 164 closes src/objects/control.rs #148 DXF oracle (examples/dxf_oracle): 42 records R2000-R2018, every decoded value equals AutoCAD's (42 equal, 0 by the DXF default, 0 with no DXF group); 84 DXF groups not decoded. The spec's own example (§20.4.57.1) closes on the record's boundary (#107). 20.4.58 LTYPE (57) 165 partial src/tables/ltype.rs #148 DXF oracle (examples/dxf_oracle): 156 records R2000-R2018, 4 values disagree (#242) (1292 equal, 0 by the DXF default, 312 with no DXF group); 202 DXF groups not decoded. 20.4.59 VIEW CONTROL (60) 167 closes src/objects/control.rs #148 DXF oracle (examples/dxf_oracle): 42 records R2000-R2018, 6 values disagree (#241) (36 equal, 0 by the DXF default, 0 with no DXF group); 84 DXF groups not decoded. The spec's own example (§20.4.59.1) closes on the record's boundary (#107). -20.4.60 VIEW (61) 167 partial src/tables/view.rs #148 DXF oracle (examples/dxf_oracle): 6 records R2000-R2018, every decoded value equals AutoCAD's (120 equal, 0 by the DXF default, 12 with no DXF group); 86 DXF groups not decoded. The spec's own example (§20.4.60.1) closes on the record's boundary (#107). +20.4.60 VIEW (61) 167 closes src/tables/view.rs #148 Closes on every VIEW record of the 52 drawings: the pre-R2007 records that errored on ACadSharp's R14, R2000 and R2004 saves read as the section prints them (#263; the view mode is group 71, #284), and no record of any kind errors on the 52 drawings (run 40532346172 on main e7c53e1, corpus-results.json: errored 0, `errors` empty). DXF oracle (examples/dxf_oracle): 6 records R2000-R2018, every decoded value equals AutoCAD's (120 equal, 0 by the DXF default, 12 with no DXF group); 86 DXF groups not decoded. The spec's own example (§20.4.60.1) closes on the record's boundary (#107). 20.4.61 UCS CONTROL (62) 169 closes src/objects/control.rs #148 DXF oracle (examples/dxf_oracle): 42 records R2000-R2018, every decoded value equals AutoCAD's (42 equal, 0 by the DXF default, 0 with no DXF group); 84 DXF groups not decoded. The spec's own example (§20.4.61.1) closes on the record's boundary (#107). 20.4.62 UCS (63) 170 closes src/tables/ucs.rs #148 The spec's own example (§20.4.62.1) closes on the record's boundary (#107). 20.4.63 TABLE (VPORT) (64) 172 closes src/objects/control.rs #148 DXF oracle (examples/dxf_oracle): 42 records R2000-R2018, every decoded value equals AutoCAD's (42 equal, 0 by the DXF default, 0 with no DXF group); 99 DXF groups not decoded. The spec's own example (§20.4.63.1) closes on the record's boundary (#107). @@ -92,14 +92,14 @@ 20.4.65 TABLE (APPID) (66) 175 closes src/objects/control.rs #148 DXF oracle (examples/dxf_oracle): 42 records R2000-R2018, 4 values disagree (#241) (38 equal, 0 by the DXF default, 0 with no DXF group); 84 DXF groups not decoded. The spec's own example (§20.4.65.1) closes on the record's boundary (#107). 20.4.66 APPID (67) 176 closes src/tables/appid.rs #148 DXF oracle (examples/dxf_oracle): 341 records R2000-R2018, every decoded value equals AutoCAD's (682 equal, 341 by the DXF default, 682 with no DXF group); 341 DXF groups not decoded. The spec's own example (§20.4.66.1) closes on the record's boundary (#107). 20.4.67 DIMSTYLE CONTROL (68) 177 closes src/objects/control.rs #148 DXF oracle (examples/dxf_oracle): 42 records R2000-R2018, every decoded value equals AutoCAD's (84 equal, 0 by the DXF default, 0 with no DXF group); 135 DXF groups not decoded. The spec's own example (§20.4.67.1) closes on the record's boundary (#107). -20.4.68 DIMSTYLE (69) 178 partial src/tables/dimstyle.rs #148 R13/R14 block measured on all 20 R14 records of the public corpus (#74, ARCHITECTURE §7z); 3 records each on ACadSharp's R2007 and R2010 saves error (#228). DXF oracle (examples/dxf_oracle): 108 records R2000-R2018, every decoded value equals AutoCAD's (699 equal, 1137 by the DXF default, 216 with no DXF group); 1159 DXF groups not decoded. The spec's own example (§20.4.68.1) closes on the record's boundary (#107). +20.4.68 DIMSTYLE (69) 178 closes src/tables/dimstyle.rs #148 R13/R14 block measured on all 20 R14 records of the public corpus (#74, ARCHITECTURE §7z); The 3 records each on ACadSharp's R2007 and R2010 saves that errored close since #293 (the BL reactor count of the R2007+ entry prefix); no record of any kind errors on the 52 drawings (run 40532346172 on main e7c53e1, corpus-results.json: errored 0, `errors` empty). DXF oracle (examples/dxf_oracle): 108 records R2000-R2018, every decoded value equals AutoCAD's (699 equal, 1137 by the DXF default, 216 with no DXF group); 1159 DXF groups not decoded. The spec's own example (§20.4.68.1) closes on the record's boundary (#107). 20.4.69 VIEWPORT ENTITY CONTROL (70) 182 decoder src/objects/control.rs #146 The spec's own example (§20.4.69.1) closes on the record's boundary (#107). 20.4.70 VIEWPORT ENTITY HEADER (71) 183 missing #146 The spec's own example (§20.4.70.1) has no decoder to run (#107). 20.4.71 AcDbAnnotScaleObjectContextData 184 missing #149 20.4.72 GROUP (72) 184 closes src/objects/acad_group.rs #149 The spec's own example (§20.4.72.1) closes on the record's boundary (#107). 20.4.73 MLINESTYLE (73) 185 closes src/objects/acad_mlinestyle.rs #147 All 10 corpus records, four release bands (ARCHITECTURE §7d.3). DXF oracle (examples/dxf_oracle): 42 records R2000-R2018, every decoded value equals AutoCAD's (462 equal, 0 by the DXF default, 84 with no DXF group); 168 DXF groups not decoded. The spec's own example (§20.4.73.1) closes on the record's boundary (#107). 20.4.74 DICTIONARYVAR 187 closes src/objects/dictionary_var.rs #149 #76. DXF oracle (examples/dxf_oracle): 258 records R2000-R2018, every decoded value equals AutoCAD's (516 equal, 0 by the DXF default, 0 with no DXF group); 516 DXF groups not decoded. The spec's own example (§20.4.74.1) is a class-numbered record with no class table printed, so only its walk and CRC are checked (#107). -20.4.75 HATCH 188 partial src/entities/hatch.rs #147 Gradient block unconditional (ARCHITECTURE §7g); a spline edge with no fit points stores no tangents (§7y, #228). The 8 R14 records are never routed (#229). DXF oracle (examples/dxf_oracle): 48 records R2000-R2018, every decoded value equals AutoCAD's (23360 equal, 0 by the DXF default, 20 with no DXF group); 454 DXF groups not decoded. The spec's own example (§20.4.75.1) is a class-numbered record with no class table printed, so only its walk and CRC are checked (#107). +20.4.75 HATCH 188 closes src/entities/hatch.rs #147 Gradient block unconditional (ARCHITECTURE §7g); a spline edge with no fit points stores no tangents (§7y, #228). The R14 class name is routed (#264): all 8 R14 HATCH records decode and close and equal the R2000 saves of the same drawings. No HATCH record of the 52 drawings is skipped or errors (run 40532346172 on main e7c53e1: errored 0, HATCH absent from the skip histogram). The DXF oracle does not score HATCH yet: 48 paired records. DXF oracle (examples/dxf_oracle): 48 records R2000-R2018, every decoded value equals AutoCAD's (23360 equal, 0 by the DXF default, 20 with no DXF group); 454 DXF groups not decoded. The spec's own example (§20.4.75.1) is a class-numbered record with no class table printed, so only its walk and CRC are checked (#107). 20.4.76 FIELD 192 missing #149 20.4.77 FIELDLIST 193 missing #149 20.4.78 GEODATA 194 closes src/entities/geodata.rs #150 Routed by class name; geoloc.dwg's record (object version 3) closes and all 77 values equal its DXF twin. The north direction is a 2RD, not 3RD (ARCHITECTURE §7aa). Object version 1 and the R2007-and-earlier civil block are unmeasured. @@ -130,7 +130,7 @@ 20.4.103 TABLEGEOMETRY 238 closes src/objects/table_geometry.rs #151 Closes on all 14 TABLEGEOMETRY records of the corpus, R14 to R2018 (two tables per release). Against AutoCAD's DXF export every value of the 12 R2000 to R2018 records equals it, 3462 in all, 0 differ (examples/probe_tablegeometry); the objects of the second table were created while saving and have other handles in the DXF, so they are paired in file order. R14 has no DXF twin. The cells' unknown handles (group 330) are not decoded. The spec's `BD 95 Unknown (0)` is read as a `BL`, the DXF's type. No R13 file is in the corpus. 20.4.104 XRECORD 238 closes src/objects/xrecord.rs #149 Closes on every XRECORD of the public corpus, R14 to R2018 (no R13 file). R14 gives XRECORD a class number from AcDb:Classes rather than the fixed code 0x4F, and is routed by class name (#149). The body is carried as bytes, not yet typed into group-code pairs. DXF oracle (examples/dxf_oracle): 1237 records R2000-R2018, every decoded value equals AutoCAD's (1237 equal, 0 by the DXF default, 1237 with no DXF group); 54466 DXF groups not decoded. The spec's own example (§20.4.104.1) is a class-numbered record with no class table printed, so only its walk and CRC are checked (#107). 21 AcDb:ObjFreeSpace 241 missing #133 -22 AcDb:Template 242 missing #133 Named, not decoded. +22 AcDb:Template 242 partial src/dxf_header.rs #133 Read for one field: `dxf_header::measurement` takes the `UInt16` after the description as `$MEASUREMENT`, and `dwg-to-dxf` writes it into the DXF HEADER (#320). Measured departure: from R2007 the description length counts UTF-16 units where §22 counts bytes; AutoCAD writes it empty (0) up to R2004 and as one unit with two bytes from R2007, and every R2007 to R2018 corpus file agrees (src/dxf_header.rs). examples/probe_dxf_header.rs pairs every variable the writer emits with AutoCAD's export of the same drawing: 0 disagree, 0 extra over the 42 drawings that have one (run 40532346172 on main e7c53e1, dxf-header-probe.log). The description text and the section's other fields are not exposed. Not measured: R14 and R2000, whose template is §3.2.4's, which is not read (§3). 23 AcDb:Handles (object map) 243 closes src/handle_map.rs #137 Every map entry resolves on the R2018 file (STATUS.md). 24 AcDb:AcDsPrototype_1b (DataStorage) 244 missing #136 §24.1 file header, §24.2 segments (seven subtypes), §24.3 default contents. The ACIS SAB payloads live here (#54, #68). 25 Unknown section 255 missing #135 diff --git a/docs/spec-coverage.md b/docs/spec-coverage.md index 364b24b..6427e1f 100644 --- a/docs/spec-coverage.md +++ b/docs/spec-coverage.md @@ -18,8 +18,8 @@ One row for every section of the *Open Design Specification for .dwg files* v5.4 ## Summary -- All sections: 0 `complete`, 98 `closes`, 6 `decoder`, 12 `partial`, 22 `missing`. -- The 104 object prescriptions of §20.4: 0 `complete`, 78 `closes`, 6 `decoder`, 9 `partial`, 11 `missing`. +- All sections: 0 `complete`, 105 `closes`, 6 `decoder`, 6 `partial`, 21 `missing`. +- The 104 object prescriptions of §20.4: 0 `complete`, 85 `closes`, 6 `decoder`, 2 `partial`, 11 `missing`. ## Sections @@ -37,7 +37,7 @@ One row for every section of the *Open Design Specification for .dwg files* v5.4 | §6 | R2010 file format organization | 67 | `closes` | src/section_map.rs | #124 | Same organization as R2004 (§6). | | §7 | R2013 file format organization | 68 | `closes` | src/section_map.rs | #124 | R2004 organization plus the §7 changes. | | §8 | R2018 file format organization | 69 | `closes` | src/section_map.rs | #153 | Four R2018 drawings in the public corpus (ACadSharp; AutoCAD 2023 and 2025). | -| §9 | AcDb:Header (header variables) | 70 | `closes` | src/header_vars.rs, src/header_table.rs | #126 | One table (src/header_table.rs) drives R14 to R2018: 311 slots on R2018, each under its AutoCAD name or named UNKNOWN__. All 52 corpus sections pass both sentinels, the size, the CRC and every stream boundary, the string and handle streams of R2007 to R2018 included (examples/probe_header_vars.rs, ARCHITECTURE §7s). Against AutoCAD's DXF export of the same drawing, on R2000 to R2018 (42 twins) and on the AC1015 export of the R14 drawings: 11,544 variables agree, 316 more hold a stated relation, 0 disagree. Not `complete`: R13 (AC1012) has no file and no AC1014 export exists. DXF-only: $MEASUREMENT (AcDb:Template, §22), $DWGCODEPAGE (file header), local $TDCREATE and $TDUPDATE (not stored; the DWG holds universal time), $ACADMAINTVER and $LASTSAVEDBY. The spec's R14 header dump decodes in full (examples/spec_examples.rs, #107). dwg-to-dxf writes the decoded header under AutoCAD's names (src/dxf_header.rs): 9,224 variables agree with AutoCAD's export on the 42 drawings of AC1015 to AC1032 that have one, 0 disagree, none is written that the export omits (examples/probe_dxf_header.rs). | +| §9 | AcDb:Header (header variables) | 70 | `closes` | src/header_vars.rs, src/header_table.rs | #127 | One table (src/header_table.rs) drives R14 to R2018: 311 slots on R2018, each under its AutoCAD name or named UNKNOWN__. All 52 corpus sections pass both sentinels, the size, the CRC and every stream boundary, the string and handle streams of R2007 to R2018 included (examples/probe_header_vars.rs, ARCHITECTURE §7s). Against AutoCAD's DXF export of the same drawing, on R2000 to R2018 (42 twins) and on the AC1015 export of the R14 drawings: 11,544 variables agree, 316 more hold a stated relation, 0 disagree. Per release (run 40532346172 on main e7c53e1, header-probe.log of artifact corpus-measurement): R14, R2000, R2004, R2007, R2010 and R2013 close on 8 of 8 drawings each and R2018 on 4 of 4 (2 with a twin), with 0 disagree on every one; that is the evidence behind closing #128 (R2000), #129 (R2004, R2007) and #130 (R2010 to R2018). Not `complete`: R13 (AC1012) has no file and no AC1014 export exists, which #127 tracks. DXF-only: $MEASUREMENT (AcDb:Template, §22), $DWGCODEPAGE (file header), local $TDCREATE and $TDUPDATE (not stored; the DWG holds universal time), $ACADMAINTVER and $LASTSAVEDBY. The spec's R14 header dump decodes in full (examples/spec_examples.rs, #107). dwg-to-dxf writes the decoded header under AutoCAD's names (src/dxf_header.rs): 9,583 variables are written on the 42 drawings of AC1015 to AC1032 that have an export, 9,410 agree with AutoCAD's, 173 more hold a stated relation, 0 disagree, none is written that the export omits (examples/probe_dxf_header.rs, run 40532346172, dxf-header-probe.log). | | §10 | AcDb:Classes | 84 | `closes` | src/classes.rs | #137 | §10.1 R13-R15 and §10.2 R18+; the R2018 record layout fixed in #37. | | §11 | Padding (R13C3 and later) | 86 | `missing` | | #120 | | | §12 | Data section "" (unnamed) | 87 | `missing` | | #135 | | @@ -53,9 +53,9 @@ One row for every section of the *Open Design Specification for .dwg files* v5.4 | §20.3 | Object types | 104 | `closes` | src/object_type.rs | #139 | | | §20.4.1 | Common Entity Data | 106 | `closes` | src/common_entity.rs | #139 | Graphics-preview block (ARCHITECTURE §7f). | | §20.4.2 | Common Entity Handle Data | 107 | `closes` | src/common_entity.rs | #139 | | -| §20.4.3 | TEXT (1) | 108 | `partial` | src/entities/text.rs | #140 | Closes on all 224 TEXT records of the public corpus, R14 to R2018 (no R13 file), with the section's R13-R14 and R2000+ branches as printed; oblique, rotation and width factor are RD (#62). Values equal the DXF twin on R2000 to R2018 (#226, ARCHITECTURE.md §7v). 29 records each on ACadSharp's R14, R2000 and R2004 saves and 4 on export_sample.dwg (R2018) error (#226). DXF oracle (examples/dxf_oracle): 174 records R2000-R2018, every decoded value equals AutoCAD's (870 equal, 1740 by the DXF default, 0 with no DXF group); 708 DXF groups not decoded. The spec's own example (§20.4.3.1) closes on the record's boundary (#107). | -| §20.4.4 | ATTRIB (2) | 109 | `partial` | src/entities/attrib.rs | #140 | Closes on all 28 ATTRIB records of the public corpus, R14 to R2018. Values equal the DXF twin on R2000 to R2018 (#226, ARCHITECTURE.md §7v). DXF oracle (examples/dxf_oracle): 24 records R2000-R2018, every decoded value equals AutoCAD's (209 equal, 257 by the DXF default, 35 with no DXF group); 81 DXF groups not decoded. The spec's own example (§20.4.4.1) closes on the record's boundary (#107). | -| §20.4.5 | ATTDEF (3) | 110 | `partial` | src/entities/attdef.rs | #140 | Closes on all 35 ATTDEF records of the public corpus, R14 to R2018; the prompt follows the ATTRIB fields, as printed. Values equal the DXF twin on R2000 to R2018 (#226, ARCHITECTURE.md §7v). DXF oracle (examples/dxf_oracle): 30 records R2000-R2018, every decoded value equals AutoCAD's (304 equal, 318 by the DXF default, 44 with no DXF group); 96 DXF groups not decoded. The spec's own example (§20.4.5.1) closes on the record's boundary (#107). | +| §20.4.3 | TEXT (1) | 108 | `closes` | src/entities/text.rs | #140 | Closes on all 224 TEXT records of the public corpus, R14 to R2018 (no R13 file), with the section's R13-R14 and R2000+ branches as printed; oblique, rotation and width factor are RD (#62). Values equal the DXF twin on R2000 to R2018 (#226, ARCHITECTURE.md §7v). The records that errored on ACadSharp's R14, R2000 and R2004 saves and on export_sample.dwg (R2018) close since #258; no record of any kind errors on the 52 drawings (run 40532346172 on main e7c53e1, corpus-results.json: errored 0, `errors` empty). DXF oracle (examples/dxf_oracle): 174 records R2000-R2018, every decoded value equals AutoCAD's (870 equal, 1740 by the DXF default, 0 with no DXF group); 708 DXF groups not decoded. The spec's own example (§20.4.3.1) closes on the record's boundary (#107). | +| §20.4.4 | ATTRIB (2) | 109 | `closes` | src/entities/attrib.rs | #140 | Closes on all 28 ATTRIB records of the public corpus, R14 to R2018: no record of any kind errors on the 52 drawings (run 40532346172 on main e7c53e1, corpus-results.json: errored 0, `errors` empty). Values equal the DXF twin on R2000 to R2018 (#226, ARCHITECTURE.md §7v). DXF oracle (examples/dxf_oracle): 24 records R2000-R2018, every decoded value equals AutoCAD's (209 equal, 257 by the DXF default, 35 with no DXF group); 81 DXF groups not decoded. The spec's own example (§20.4.4.1) closes on the record's boundary (#107). | +| §20.4.5 | ATTDEF (3) | 110 | `closes` | src/entities/attdef.rs | #140 | Closes on all 35 ATTDEF records of the public corpus, R14 to R2018 (no record of any kind errors on the 52 drawings (run 40532346172 on main e7c53e1, corpus-results.json: errored 0, `errors` empty)); the prompt follows the ATTRIB fields, as printed. Values equal the DXF twin on R2000 to R2018 (#226, ARCHITECTURE.md §7v). DXF oracle (examples/dxf_oracle): 30 records R2000-R2018, every decoded value equals AutoCAD's (304 equal, 318 by the DXF default, 44 with no DXF group); 96 DXF groups not decoded. The spec's own example (§20.4.5.1) closes on the record's boundary (#107). | | §20.4.6 | BLOCK (4) | 111 | `closes` | src/entities/block.rs | #141 | DXF oracle (examples/dxf_oracle): 264 records R2000-R2018, 3 values disagree (#243) (261 equal, 0 by the DXF default, 0 with no DXF group); 2274 DXF groups not decoded. The spec's own example (§20.4.6.1) closes on the record's boundary (#107). | | §20.4.7 | ENDBLK (5) | 111 | `closes` | src/entities/endblk.rs | #141 | DXF oracle (examples/dxf_oracle): 278 records paired on every release that holds them; the decoder surfaces no field to compare; 705 DXF groups not decoded. The spec's own example (§20.4.7.1) closes on the record's boundary (#107). | | §20.4.8 | SEQEND (6) | 112 | `closes` | src/entities/seqend.rs | #141 | DXF oracle (examples/dxf_oracle): 24 records paired on every release that holds them; the decoder surfaces no field to compare; 48 DXF groups not decoded. The spec's own example (§20.4.8.1) closes on the record's boundary (#107). | @@ -96,7 +96,7 @@ One row for every section of the *Open Design Specification for .dwg files* v5.4 | §20.4.43 | XLINE (41) | 147 | `closes` | src/entities/xline.rs | #143 | DXF oracle (examples/dxf_oracle): 6 records R2000-R2018, every decoded value equals AutoCAD's (36 equal, 0 by the DXF default, 0 with no DXF group); 12 DXF groups not decoded. The spec's own example (§20.4.43.1) closes on the record's boundary (#107). | | §20.4.44 | DICTIONARY (42) | 147 | `closes` | src/objects/dictionary.rs | #149 | DXF oracle (examples/dxf_oracle): 1093 records R2000-R2018, every decoded value equals AutoCAD's (7541 equal, 682 by the DXF default, 12 with no DXF group); 6755 DXF groups not decoded. The spec's own example (§20.4.44.1) closes on the record's boundary (#107). | | §20.4.45 | DICTIONARYWDFLT | 148 | `decoder` | src/objects/dictionary.rs | #149 | DXF oracle (examples/dxf_oracle): 42 records R2000-R2018, every decoded value equals AutoCAD's (126 equal, 42 by the DXF default, 0 with no DXF group); 168 DXF groups not decoded. | -| §20.4.46 | MTEXT (44) | 148 | `partial` | src/entities/mtext.rs | #140 | Closes on all 257 MTEXT records of the public corpus, R14 to R2018 (no R13 file), with the R2000+ line spacing and the R2004+ background block read as printed; R2018 tail and ATTRIB's embedded MTEXT (ARCHITECTURE §7g). Values equal the DXF twin on R2000 to R2018 (#226, ARCHITECTURE.md §7t). 36 records each on ACadSharp's R14 and R2004 saves error (#226). DXF oracle (examples/dxf_oracle): 210 records R2000-R2018, every decoded value equals AutoCAD's (2348 equal, 630 by the DXF default, 942 with no DXF group); 1598 DXF groups not decoded. The spec's own example (§20.4.46.1) closes on the record's boundary (#107). | +| §20.4.46 | MTEXT (44) | 148 | `closes` | src/entities/mtext.rs | #140 | Closes on all 257 MTEXT records of the public corpus, R14 to R2018 (no R13 file), with the R2000+ line spacing and the R2004+ background block read as printed; R2018 tail and ATTRIB's embedded MTEXT (ARCHITECTURE §7g). Values equal the DXF twin on R2000 to R2018 (#226, ARCHITECTURE.md §7t). The 72 records that errored on ACadSharp's R14 and R2004 saves close since #261; no record of any kind errors on the 52 drawings (run 40532346172 on main e7c53e1, corpus-results.json: errored 0, `errors` empty). DXF oracle (examples/dxf_oracle): 210 records R2000-R2018, every decoded value equals AutoCAD's (2348 equal, 630 by the DXF default, 942 with no DXF group); 1598 DXF groups not decoded. The spec's own example (§20.4.46.1) closes on the record's boundary (#107). | | §20.4.47 | LEADER (45) | 150 | `closes` | src/entities/leader.rs | #147 | Closes on all 7 records of the public corpus (R14 to R2018; no R13 file) once the R14+ end point projection is read. Measured departure: from R2010 the box height and width are not written. Values equal the DXF twin on R2000 to R2018 (#71, ARCHITECTURE.md §7ab). DXF oracle (examples/dxf_oracle): 6 records R2000-R2018, every decoded value equals AutoCAD's (78 equal, 18 by the DXF default, 60 with no DXF group); 42 DXF groups not decoded. The spec's own example (§20.4.47.1) closes on the record's boundary (#107). | | §20.4.48 | MLEADER | 152 | `closes` | src/entities/mleader.rs | #147 | Closes on all 105 MULTILEADER records of the public corpus, R14 to R2018 (no R13 file), with the R2010+ and -R2007 branches of §20.4.48 and §20.4.86 as printed. Every value the probe compared equals the DXF twin on R2000 to R2018, colours from R2004 on (#229, ARCHITECTURE.md §7ai). The R2010+ MC and B after the annotative flag stay unnamed (§7g). DXF oracle (examples/dxf_oracle): 90 records R2000-R2018, 3 values disagree (#381) (8532 equal, 0 by the DXF default, 495 with no DXF group); 1686 DXF groups not decoded. | | §20.4.49 | TOLERANCE (46) | 155 | `closes` | src/entities/tolerance.rs | #140 | Closes on all 21 TOLERANCE records of the public corpus, R14 to R2018 (no R13 file), with the unknown short, height and dimgap R13-R14 only as printed. Values equal the DXF twin on R2000 to R2018 (#226, ARCHITECTURE.md §7m). DXF oracle (examples/dxf_oracle): 18 records R2000-R2018, every decoded value equals AutoCAD's (72 equal, 54 by the DXF default, 54 with no DXF group); 54 DXF groups not decoded. The spec's own example (§20.4.49.1) closes on the record's boundary (#107). | @@ -110,7 +110,7 @@ One row for every section of the *Open Design Specification for .dwg files* v5.4 | §20.4.57 | LINETYPE CONTROL (56) | 164 | `closes` | src/objects/control.rs | #148 | DXF oracle (examples/dxf_oracle): 42 records R2000-R2018, every decoded value equals AutoCAD's (42 equal, 0 by the DXF default, 0 with no DXF group); 84 DXF groups not decoded. The spec's own example (§20.4.57.1) closes on the record's boundary (#107). | | §20.4.58 | LTYPE (57) | 165 | `partial` | src/tables/ltype.rs | #148 | DXF oracle (examples/dxf_oracle): 156 records R2000-R2018, 4 values disagree (#242) (1292 equal, 0 by the DXF default, 312 with no DXF group); 202 DXF groups not decoded. | | §20.4.59 | VIEW CONTROL (60) | 167 | `closes` | src/objects/control.rs | #148 | DXF oracle (examples/dxf_oracle): 42 records R2000-R2018, 6 values disagree (#241) (36 equal, 0 by the DXF default, 0 with no DXF group); 84 DXF groups not decoded. The spec's own example (§20.4.59.1) closes on the record's boundary (#107). | -| §20.4.60 | VIEW (61) | 167 | `partial` | src/tables/view.rs | #148 | DXF oracle (examples/dxf_oracle): 6 records R2000-R2018, every decoded value equals AutoCAD's (120 equal, 0 by the DXF default, 12 with no DXF group); 86 DXF groups not decoded. The spec's own example (§20.4.60.1) closes on the record's boundary (#107). | +| §20.4.60 | VIEW (61) | 167 | `closes` | src/tables/view.rs | #148 | Closes on every VIEW record of the 52 drawings: the pre-R2007 records that errored on ACadSharp's R14, R2000 and R2004 saves read as the section prints them (#263; the view mode is group 71, #284), and no record of any kind errors on the 52 drawings (run 40532346172 on main e7c53e1, corpus-results.json: errored 0, `errors` empty). DXF oracle (examples/dxf_oracle): 6 records R2000-R2018, every decoded value equals AutoCAD's (120 equal, 0 by the DXF default, 12 with no DXF group); 86 DXF groups not decoded. The spec's own example (§20.4.60.1) closes on the record's boundary (#107). | | §20.4.61 | UCS CONTROL (62) | 169 | `closes` | src/objects/control.rs | #148 | DXF oracle (examples/dxf_oracle): 42 records R2000-R2018, every decoded value equals AutoCAD's (42 equal, 0 by the DXF default, 0 with no DXF group); 84 DXF groups not decoded. The spec's own example (§20.4.61.1) closes on the record's boundary (#107). | | §20.4.62 | UCS (63) | 170 | `closes` | src/tables/ucs.rs | #148 | The spec's own example (§20.4.62.1) closes on the record's boundary (#107). | | §20.4.63 | TABLE (VPORT) (64) | 172 | `closes` | src/objects/control.rs | #148 | DXF oracle (examples/dxf_oracle): 42 records R2000-R2018, every decoded value equals AutoCAD's (42 equal, 0 by the DXF default, 0 with no DXF group); 99 DXF groups not decoded. The spec's own example (§20.4.63.1) closes on the record's boundary (#107). | @@ -118,14 +118,14 @@ One row for every section of the *Open Design Specification for .dwg files* v5.4 | §20.4.65 | TABLE (APPID) (66) | 175 | `closes` | src/objects/control.rs | #148 | DXF oracle (examples/dxf_oracle): 42 records R2000-R2018, 4 values disagree (#241) (38 equal, 0 by the DXF default, 0 with no DXF group); 84 DXF groups not decoded. The spec's own example (§20.4.65.1) closes on the record's boundary (#107). | | §20.4.66 | APPID (67) | 176 | `closes` | src/tables/appid.rs | #148 | DXF oracle (examples/dxf_oracle): 341 records R2000-R2018, every decoded value equals AutoCAD's (682 equal, 341 by the DXF default, 682 with no DXF group); 341 DXF groups not decoded. The spec's own example (§20.4.66.1) closes on the record's boundary (#107). | | §20.4.67 | DIMSTYLE CONTROL (68) | 177 | `closes` | src/objects/control.rs | #148 | DXF oracle (examples/dxf_oracle): 42 records R2000-R2018, every decoded value equals AutoCAD's (84 equal, 0 by the DXF default, 0 with no DXF group); 135 DXF groups not decoded. The spec's own example (§20.4.67.1) closes on the record's boundary (#107). | -| §20.4.68 | DIMSTYLE (69) | 178 | `partial` | src/tables/dimstyle.rs | #148 | R13/R14 block measured on all 20 R14 records of the public corpus (#74, ARCHITECTURE §7z); 3 records each on ACadSharp's R2007 and R2010 saves error (#228). DXF oracle (examples/dxf_oracle): 108 records R2000-R2018, every decoded value equals AutoCAD's (699 equal, 1137 by the DXF default, 216 with no DXF group); 1159 DXF groups not decoded. The spec's own example (§20.4.68.1) closes on the record's boundary (#107). | +| §20.4.68 | DIMSTYLE (69) | 178 | `closes` | src/tables/dimstyle.rs | #148 | R13/R14 block measured on all 20 R14 records of the public corpus (#74, ARCHITECTURE §7z); The 3 records each on ACadSharp's R2007 and R2010 saves that errored close since #293 (the BL reactor count of the R2007+ entry prefix); no record of any kind errors on the 52 drawings (run 40532346172 on main e7c53e1, corpus-results.json: errored 0, `errors` empty). DXF oracle (examples/dxf_oracle): 108 records R2000-R2018, every decoded value equals AutoCAD's (699 equal, 1137 by the DXF default, 216 with no DXF group); 1159 DXF groups not decoded. The spec's own example (§20.4.68.1) closes on the record's boundary (#107). | | §20.4.69 | VIEWPORT ENTITY CONTROL (70) | 182 | `decoder` | src/objects/control.rs | #146 | The spec's own example (§20.4.69.1) closes on the record's boundary (#107). | | §20.4.70 | VIEWPORT ENTITY HEADER (71) | 183 | `missing` | | #146 | The spec's own example (§20.4.70.1) has no decoder to run (#107). | | §20.4.71 | AcDbAnnotScaleObjectContextData | 184 | `missing` | | #149 | | | §20.4.72 | GROUP (72) | 184 | `closes` | src/objects/acad_group.rs | #149 | The spec's own example (§20.4.72.1) closes on the record's boundary (#107). | | §20.4.73 | MLINESTYLE (73) | 185 | `closes` | src/objects/acad_mlinestyle.rs | #147 | All 10 corpus records, four release bands (ARCHITECTURE §7d.3). DXF oracle (examples/dxf_oracle): 42 records R2000-R2018, every decoded value equals AutoCAD's (462 equal, 0 by the DXF default, 84 with no DXF group); 168 DXF groups not decoded. The spec's own example (§20.4.73.1) closes on the record's boundary (#107). | | §20.4.74 | DICTIONARYVAR | 187 | `closes` | src/objects/dictionary_var.rs | #149 | #76. DXF oracle (examples/dxf_oracle): 258 records R2000-R2018, every decoded value equals AutoCAD's (516 equal, 0 by the DXF default, 0 with no DXF group); 516 DXF groups not decoded. The spec's own example (§20.4.74.1) is a class-numbered record with no class table printed, so only its walk and CRC are checked (#107). | -| §20.4.75 | HATCH | 188 | `partial` | src/entities/hatch.rs | #147 | Gradient block unconditional (ARCHITECTURE §7g); a spline edge with no fit points stores no tangents (§7y, #228). The 8 R14 records are never routed (#229). DXF oracle (examples/dxf_oracle): 48 records R2000-R2018, every decoded value equals AutoCAD's (23360 equal, 0 by the DXF default, 20 with no DXF group); 454 DXF groups not decoded. The spec's own example (§20.4.75.1) is a class-numbered record with no class table printed, so only its walk and CRC are checked (#107). | +| §20.4.75 | HATCH | 188 | `closes` | src/entities/hatch.rs | #147 | Gradient block unconditional (ARCHITECTURE §7g); a spline edge with no fit points stores no tangents (§7y, #228). The R14 class name is routed (#264): all 8 R14 HATCH records decode and close and equal the R2000 saves of the same drawings. No HATCH record of the 52 drawings is skipped or errors (run 40532346172 on main e7c53e1: errored 0, HATCH absent from the skip histogram). The DXF oracle does not score HATCH yet: 48 paired records. DXF oracle (examples/dxf_oracle): 48 records R2000-R2018, every decoded value equals AutoCAD's (23360 equal, 0 by the DXF default, 20 with no DXF group); 454 DXF groups not decoded. The spec's own example (§20.4.75.1) is a class-numbered record with no class table printed, so only its walk and CRC are checked (#107). | | §20.4.76 | FIELD | 192 | `missing` | | #149 | | | §20.4.77 | FIELDLIST | 193 | `missing` | | #149 | | | §20.4.78 | GEODATA | 194 | `closes` | src/entities/geodata.rs | #150 | Routed by class name; geoloc.dwg's record (object version 3) closes and all 77 values equal its DXF twin. The north direction is a 2RD, not 3RD (ARCHITECTURE §7aa). Object version 1 and the R2007-and-earlier civil block are unmeasured. | @@ -156,7 +156,7 @@ One row for every section of the *Open Design Specification for .dwg files* v5.4 | §20.4.103 | TABLEGEOMETRY | 238 | `closes` | src/objects/table_geometry.rs | #151 | Closes on all 14 TABLEGEOMETRY records of the corpus, R14 to R2018 (two tables per release). Against AutoCAD's DXF export every value of the 12 R2000 to R2018 records equals it, 3462 in all, 0 differ (examples/probe_tablegeometry); the objects of the second table were created while saving and have other handles in the DXF, so they are paired in file order. R14 has no DXF twin. The cells' unknown handles (group 330) are not decoded. The spec's `BD 95 Unknown (0)` is read as a `BL`, the DXF's type. No R13 file is in the corpus. | | §20.4.104 | XRECORD | 238 | `closes` | src/objects/xrecord.rs | #149 | Closes on every XRECORD of the public corpus, R14 to R2018 (no R13 file). R14 gives XRECORD a class number from AcDb:Classes rather than the fixed code 0x4F, and is routed by class name (#149). The body is carried as bytes, not yet typed into group-code pairs. DXF oracle (examples/dxf_oracle): 1237 records R2000-R2018, every decoded value equals AutoCAD's (1237 equal, 0 by the DXF default, 1237 with no DXF group); 54466 DXF groups not decoded. The spec's own example (§20.4.104.1) is a class-numbered record with no class table printed, so only its walk and CRC are checked (#107). | | §21 | AcDb:ObjFreeSpace | 241 | `missing` | | #133 | | -| §22 | AcDb:Template | 242 | `missing` | | #133 | Named, not decoded. | +| §22 | AcDb:Template | 242 | `partial` | src/dxf_header.rs | #133 | Read for one field: `dxf_header::measurement` takes the `UInt16` after the description as `$MEASUREMENT`, and `dwg-to-dxf` writes it into the DXF HEADER (#320). Measured departure: from R2007 the description length counts UTF-16 units where §22 counts bytes; AutoCAD writes it empty (0) up to R2004 and as one unit with two bytes from R2007, and every R2007 to R2018 corpus file agrees (src/dxf_header.rs). examples/probe_dxf_header.rs pairs every variable the writer emits with AutoCAD's export of the same drawing: 0 disagree, 0 extra over the 42 drawings that have one (run 40532346172 on main e7c53e1, dxf-header-probe.log). The description text and the section's other fields are not exposed. Not measured: R14 and R2000, whose template is §3.2.4's, which is not read (§3). | | §23 | AcDb:Handles (object map) | 243 | `closes` | src/handle_map.rs | #137 | Every map entry resolves on the R2018 file (STATUS.md). | | §24 | AcDb:AcDsPrototype_1b (DataStorage) | 244 | `missing` | | #136 | §24.1 file header, §24.2 segments (seven subtypes), §24.3 default contents. The ACIS SAB payloads live here (#54, #68). | | §25 | Unknown section | 255 | `missing` | | #135 | |