Converting AutoCAD Civil 3D drawings to R2018 ASCII DXF for redaction
Converting 14 AutoCAD Civil 3D drawings (AC1032/AC1027, 184 to 336k graphical entities, AECC_* objects, DGN linestyle LS*/DGNLSDEF objects, ACIS REGIONs, MULTILEADERs) to R2018 ASCII DXF for redaction. An ACadSharp 3.7.1 .NET bridge did DWG read -> DXF write -> DXF re-read and SHA-256-compared every public property of every object, failing on any difference, any reader/writer notification, or any UnknownEntity/UnknownNonGraphicalObject. Result: 0/14 accepted, tens of thousands of 'failures' per file (Preview thumbnails, BlockRecord.XRefPath, Hatch SeedPoints/GradientColor, MultiLeader ContextData/ProxyGeometries, dictionary CloningFlags). LibreDWG dwg2dxf 0.14 was likewise rejected for stderr noise ('Invalid CMC flag 0xf5 ignored', 'Unknown object, skipping', 'Unhandled Class object AECC_*'). Needed a defensible acceptance bar that ships readable drawings without unverifiable payloads.
Exact-roundtrip equality is unmeetable for Civil 3D content in any OSS reader; measure entity retention against the reader's own pre-write inventory instead. Verified facts (ezdxf 1.4 recover.readfile on the rejected candidates):
- Both converters' DXFs parse with 0 auditor errors. ACadSharp outputs needed 0 fixes; LibreDWG outputs needed only code-202 fixes ('Removed invalid key <name>.dgn-StrokePattern-N in DICTIONARY', 'Deleted XRECORD with invalid owner') from skipped DGN linestyle objects. TEXT/MTEXT/ATTRIB/ATTDEF and MULTILEADER counts were identical across the two converters on the same file.
- Cross-tool inventory check: ACadSharp's
before.graphical_entities(entities excluding BLOCK/ENDBLK/SEQEND/VERTEX) equals the LibreDWG DXF's DXFGraphic count minus VERTEX and SEQEND (8,673 = 10,739 - 1,332 - 734 on one file), so the bridge's pre-write count is a converter-independent denominator for a loss ratio even when the bridge's own writer fails. - ACadSharp 3.7.1 DxfWriter threw
System.OverflowException: Value was either too large or too small for an Int16on a drawing with a RasterImage + 772 handles absent from the loaded document, producing no output; dwg2dxf 0.14 converted the same file completely. On a Civil 3D survey drawing (~280k POINTs, ACDSDATA) the bridge process died (exit 74, empty audit) while dwg2dxf succeeded. Keep LibreDWG as a second tier behind ACadSharp rather than choosing one. - MULTILEADER text lives in
entity.context.mtext.default_content(ezdxf), DXF group code 304, not in TEXT/MTEXT; a redaction pass over TEXT/MTEXT only misses stationing/label text. - Leak surface beyond text entities: IMAGEDEF filenames carrying absolute project paths (
K:\...\<client>...tif), dictionary keys embedding a project ID via DGN linestyle names, DATALINK paths. Scan string group codes 1-8/300-309/1000-1003 in the serialized DXF, not just text entities.
Adopted policy: chain acadsharp -> libredwg -> ODA File Converter; accept the first candidate with <=1% graphical loss vs the bridge's pre-write inventory and 0 text/MULTILEADER loss; strip and disclose (counts by type) all opaque content (unknown DXFTagStorage objects, ACIS solids, IMAGE + IMAGEDEF, binary XRECORD/XDATA, ACDSDATA) instead of failing the file; explode ACAD_PROXY_ENTITY proxy graphics with ezdxf explode(); disclose ezdxf recover fixes applied at load and require the reserialized output to audit with 0 errors/0 fixes.