C3D-VERIFY613 · Post-migration HCWA audit (read-only) done
Final layer inventory after migration
C# payload
// Read-only audit of the 260613 drawing against the HCWA As-built CAD Standards.
// Reports: every layer with entity counts by type, drawing units/coord system, and the
// point-code inventory relevant to water/sewer features.
var bt = (BlockTable)Tx.GetObject(Db.BlockTableId, OpenMode.ForRead);
var ms = (BlockTableRecord)Tx.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead);
var byLayer = new Dictionary<string, Dictionary<string,int>>();
int total = 0;
foreach (ObjectId id in ms) {
var o = Tx.GetObject(id, OpenMode.ForRead);
var e = o as Autodesk.AutoCAD.DatabaseServices.Entity;
if (e == null) continue;
total++;
string lay = e.Layer, t = o.GetType().Name;
if (!byLayer.ContainsKey(lay)) byLayer[lay] = new Dictionary<string,int>();
byLayer[lay][t] = byLayer[lay].TryGetValue(t, out var n) ? n+1 : 1;
}
Log("=== MODEL SPACE LAYERS ===");
foreach (var kv in byLayer.OrderBy(k => k.Key)) {
var parts = new List<string>();
foreach (var t in kv.Value.OrderByDescending(x => x.Value)) parts.Add($"{t.Key}x{t.Value}");
Log($" {kv.Key,-34} {string.Join(", ", parts)}");
}
Log($"model entities: {total}, layers used: {byLayer.Count}");
// all layers defined in the drawing (even empty) — HCWA requires exact layer names
var lt = (LayerTable)Tx.GetObject(Db.LayerTableId, OpenMode.ForRead);
int defined = 0; var hcwa = new List<string>();
foreach (ObjectId id in lt) {
var l = (LayerTableRecord)Tx.GetObject(id, OpenMode.ForRead);
defined++;
var n = l.Name.ToUpperInvariant();
if (n.Contains("WATER") || n.Contains("SEWER") || n.Contains("HYDRANT") || n.Contains("EASEMENT")
|| n.Contains("PROJECT_BOUND") || n.Contains("ROAD_") || n.Contains("LOT_") || n.Contains("ADDRESS"))
hcwa.Add(l.Name);
}
Log($"=== LAYERS DEFINED: {defined} ===");
Log("HCWA-looking layers present:");
foreach (var n in hcwa.OrderBy(x => x)) Log(" " + n);
Log($"INSUNITS={Db.Insunits}");
Result
Log
=== MODEL SPACE LAYERS === 0 CogoPointx68, ParcelSegmentLabelx15, Parcelx1, ParcelSegmentTablex1 FIRE_HYDRANT Circlex2 FIRE_HYDRANT_TEXT DBTextx3 FIRE_HYDRANT_VALVE Circlex2 ROAD_EDGE_OF_PAVEMENT Polylinex1 ROAD_TEXT DBTextx1 SEWER_EASEMENT Polylinex3, Linex1 SEWER_EASEMENT_TEXT DBTextx1 SEWER_LINE Linex12 SEWER_LINE_TEXT DBTextx7 SEWER_MANHOLE Circlex10 SEWER_MANHOLE_TEXT DBTextx20 SS-ESMT-SSE20 Sitex1, ParcelSegmentx1 SS-FRZ CogoPointx57, Circlex1 SS-GREASE CogoPointx4 SS-V-ROAD-CURB Polylinex6 V-GREASE Circlex4, DBTextx4 V-STRM-STRC Polylinex9 V-STRM-TEXT CogoPointx11, DBTextx9 V-WATR-STRC Polylinex1 WATER_END_CAP Circlex1 WATER_LINE Polylinex4 WATER_LINE_TEXT DBTextx11 WATER_SERVICE Circlex6 WATER_VALVE Circlex1 WATER_VALVE_TEXT DBTextx5 WATER_VAULT Polylinex2 WATER_VAULT_TEXT DBTextx4 model entities: 290, layers used: 28 === LAYERS DEFINED: 88 === HCWA-looking layers present: ADDRESS_TEXT FIRE_HYDRANT FIRE_HYDRANT_EXISTING FIRE_HYDRANT_EXISTING_TEXT FIRE_HYDRANT_MANUFACTURED_YEAR FIRE_HYDRANT_MANUFACTURER FIRE_HYDRANT_TEXT FIRE_HYDRANT_VALVE FIRE_HYDRANT_VALVE_EXISTING FIRE_HYDRANT_VALVE_EXISTING_TEXT FIRE_HYDRANT_VALVE_TEXT LAND_LOT_LINE LAND_LOT_LINE_TEXT LOT_NUMBER_TEXT PROJECT_BOUNDARY PROJECT_BOUNDARY_TEXT ROAD_EDGE_OF_PAVEMENT ROAD_RIGHT-OF-WAY ROAD_RIGHT-OF-WAY_TEXT ROAD_TEXT SEWER_EASEMENT SEWER_EASEMENT_TEXT SEWER_END_OF_LINE SEWER_END_OF_LINE_TEXT SEWER_FORCE_MAIN SEWER_FORCE_MAIN_TEXT SEWER_LINE SEWER_LINE_EXISTING SEWER_LINE_EXISTING_TEXT SEWER_LINE_TEXT SEWER_MANHOLE SEWER_MANHOLE_EXISTING SEWER_MANHOLE_EXISTING_TEXT SEWER_MANHOLE_TEXT SEWER_TAP SEWER_TAP_TEXT UTILITY_EASEMENT UTILITY_EASEMENT_EXISTING UTILITY_EASEMENT_EXISTING_TEXT UTILITY_EASEMENT_TEXT WATER_EASEMENT WATER_EASEMENT_TEXT WATER_END_CAP WATER_END_CAP_TEXT WATER_LINE WATER_LINE_EXISTING WATER_LINE_EXISTING_TEXT WATER_LINE_TEXT WATER_METER WATER_METER_TEXT WATER_QUALITY_CRITICAL_AREA WATER_SERVICE WATER_SERVICE_TEXT WATER_VALVE WATER_VALVE_EXISTING WATER_VALVE_EXISTING_TEXT WATER_VALVE_TEXT WATER_VAULT WATER_VAULT_TEXT INSUNITS=Feet
Notes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.