C3D-HCWA-LAYERS · Create 71 HCWA CAD layers done
Creates every layer from the HCWA Digital As-built CAD Standards Rev 1.6 table, names exactly as specified, with discipline colours and a description carrying the standard's Type/Surveyed columns. Idempotent - existing layers are left as they are.
C# payload
// Create the 71 HCWA CAD layers from "Digital As-built CAD Standards for Consultants",
// Henry County Water Authority, Rev 1.6 (Nov 1 2023), Table of HCWA CAD Layers.
//
// Layer names appear EXACTLY as in the standard's table - the standard requires that, and warns
// against near-duplicates (WATER_LINE vs WATER_LINES, SEWER_LINE_TEXT vs SEWER_TEXT) coexisting.
// Colours follow the discipline convention already in use: water 5, sewer 3, easement 6,
// casing/misc 4, road 8, text/control/boundary 7, fire 1.
//
// EnsureLayer (DrawingContext.cs) creates the layer if missing and returns the existing id
// otherwise, so this is idempotent - re-running will not duplicate or overwrite anything.
// Layer DESCRIPTION carries the standard's Type + Surveyed columns for reference.
// Host owns Tx; host regens after commit.
var defs = new (string name, string type, short colour, string surveyed)[] {
(@"ADDRESS_TEXT", @"Text", 7, @"No"),
(@"CASING", @"Poly", 4, @"Yes"),
(@"CASING_TEXT", @"Text", 4, @"No"),
(@"FDC", @"Insert", 1, @"Yes"),
(@"FIRE_HYDRANT", @"Insert", 1, @"Yes"),
(@"FIRE_HYDRANT_TEXT", @"Text", 1, @"No"),
(@"FIRE_HYDRANT_MANUFACTURER", @"Text", 1, @"No"),
(@"FIRE_HYDRANT_MANUFACTURED_YEAR", @"Text", 1, @"No"),
(@"FIRE_HYDRANT_EXISTING", @"Insert", 1, @"Yes"),
(@"FIRE_HYDRANT_EXISTING_TEXT", @"Text", 1, @"No"),
(@"FIRE_HYDRANT_VALVE", @"Insert", 1, @"Yes"),
(@"FIRE_HYDRANT_VALVE_TEXT", @"Text", 1, @"No"),
(@"FIRE_HYDRANT_VALVE_EXISTING", @"Insert", 1, @"Yes"),
(@"FIRE_HYDRANT_VALVE_EXISTING_TEXT", @"Text", 1, @"No"),
(@"HORIZONTAL_AND_VERTICAL_CONTROL_POINT", @"Line", 7, @"Yes"),
(@"HORIZONTAL_AND_VERTICAL_CONTROL_TEXT", @"Text", 7, @"No"),
(@"LAND_LOT_LINE", @"Line", 7, @"No"),
(@"LAND_LOT_LINE_TEXT", @"Text", 7, @"No"),
(@"LOT_NUMBER_TEXT", @"Text", 7, @"No"),
(@"PROJECT_BOUNDARY", @"Poly", 7, @"Yes"),
(@"PROJECT_BOUNDARY_TEXT", @"Text", 7, @"No"),
(@"PROPERTY_LINE", @"Poly", 7, @"Yes"),
(@"PUMP_STATION", @"Poly", 4, @"Yes"),
(@"PUMP_STATION_TEXT", @"Text", 4, @"No"),
(@"ROAD_EDGE_OF_PAVEMENT", @"Poly", 8, @"Yes"),
(@"ROAD_RIGHT-OF-WAY", @"Poly", 8, @"Yes"),
(@"ROAD_RIGHT-OF-WAY_TEXT", @"Text", 8, @"No"),
(@"ROAD_TEXT", @"Text", 8, @"No"),
(@"SEWER_EASEMENT", @"Poly", 3, @"Yes"),
(@"SEWER_EASEMENT_TEXT", @"Text", 3, @"No"),
(@"SEWER_END_OF_LINE", @"Insert", 3, @"Yes"),
(@"SEWER_END_OF_LINE_TEXT", @"Text", 3, @"No"),
(@"SEWER_FORCE_MAIN", @"Line", 3, @"Yes"),
(@"SEWER_FORCE_MAIN_TEXT", @"Text", 3, @"No"),
(@"SEWER_FORCE_MAIN_EXISTING", @"Line", 3, @"Yes"),
(@"SEWER_FORCE_MAIN_EXISTING_TEXT", @"Text", 3, @"No"),
(@"SEWER_LINE", @"Line", 3, @"Yes"),
(@"SEWER_LINE_TEXT", @"Text", 3, @"No"),
(@"SEWER_LINE_EXISTING", @"Line", 3, @"Yes"),
(@"SEWER_LINE_EXISTING_TEXT", @"Text", 3, @"No"),
(@"SEWER_MANHOLE", @"Insert", 3, @"Yes"),
(@"SEWER_MANHOLE_TEXT", @"Text", 3, @"No"),
(@"SEWER_MANHOLE_EXISTING", @"Insert", 3, @"Yes"),
(@"SEWER_MANHOLE_EXISTING_TEXT", @"Text", 3, @"No"),
(@"SEWER_TAP", @"Line", 3, @"Yes"),
(@"SEWER_TAP_TEXT", @"Text", 3, @"No"),
(@"UTILITY_EASEMENT", @"Poly", 6, @"Yes"),
(@"UTILITY_EASEMENT_TEXT", @"Text", 6, @"No"),
(@"UTILITY_EASEMENT_EXISTING", @"Poly", 6, @"Yes"),
(@"UTILITY_EASEMENT_EXISTING_TEXT", @"Text", 6, @"No"),
(@"WATER_EASEMENT", @"Poly", 5, @"Yes"),
(@"WATER_EASEMENT_TEXT", @"Text", 5, @"No"),
(@"WATER_END_CAP", @"Line", 5, @"Yes"),
(@"WATER_END_CAP_TEXT", @"Text", 5, @"No"),
(@"WATER_LINE", @"Line", 5, @"Yes"),
(@"WATER_LINE_TEXT", @"Text", 5, @"No"),
(@"WATER_LINE_EXISTING", @"Line", 5, @"Yes"),
(@"WATER_LINE_EXISTING_TEXT", @"Text", 5, @"No"),
(@"WATER_METER", @"Insert", 5, @"Yes"),
(@"WATER_METER_TEXT", @"Text", 5, @"No"),
(@"WATER_QUALITY_CRITICAL_AREA", @"Line", 4, @"Yes"),
(@"WATER_SERVICE", @"Line", 5, @"No"),
(@"WATER_SERVICE_TEXT", @"Text", 5, @"No"),
(@"WATER_VALVE", @"Insert", 5, @"Yes"),
(@"WATER_VALVE_TEXT", @"Text", 5, @"No"),
(@"WATER_VALVE_EXISTING", @"Insert", 5, @"Yes"),
(@"WATER_VALVE_EXISTING_TEXT", @"Text", 5, @"No"),
(@"WATER_VAULT", @"Insert", 5, @"Yes"),
(@"WATER_VAULT_TEXT", @"Text", 5, @"No"),
(@"WETLAND_BOUNDARY", @"Line", 4, @"Yes")
};
var lt0 = (LayerTable)Tx.GetObject(Db.LayerTableId, OpenMode.ForRead);
var before = new List<string>();
foreach (ObjectId id in lt0) {
var l = (LayerTableRecord)Tx.GetObject(id, OpenMode.ForRead);
before.Add(l.Name);
}
Log("drawing had " + before.Count + " layers");
int made = 0, already = 0;
foreach (var d in defs)
{
bool existed = before.Contains(d.name);
var id = EnsureLayer(d.name, d.colour);
var ltr = (LayerTableRecord)Tx.GetObject(id, OpenMode.ForWrite);
ltr.Description = "HCWA " + d.type + (d.surveyed == "Yes" ? " / surveyed" : "");
if (existed) { already++; }
else { made++; Log(" + " + d.name + " (" + d.type + ", colour " + d.colour + ")"); }
}
var lt1 = (LayerTable)Tx.GetObject(Db.LayerTableId, OpenMode.ForRead);
int total = 0, present = 0;
foreach (ObjectId id in lt1) total++;
foreach (var d in defs) if (lt1.Has(d.name)) present++;
Log("created " + made + ", already present " + already);
Log("all " + defs.Length + " HCWA layers present: " + (present == defs.Length ? "YES" : "NO (" + present + ")") +
"; drawing now has " + total + " layers (verified)");
Result
Log
drawing had 323 layers + ADDRESS_TEXT (Text, colour 7) + CASING (Poly, colour 4) + CASING_TEXT (Text, colour 4) + FDC (Insert, colour 1) + FIRE_HYDRANT (Insert, colour 1) + FIRE_HYDRANT_TEXT (Text, colour 1) + FIRE_HYDRANT_MANUFACTURER (Text, colour 1) + FIRE_HYDRANT_MANUFACTURED_YEAR (Text, colour 1) + FIRE_HYDRANT_EXISTING (Insert, colour 1) + FIRE_HYDRANT_EXISTING_TEXT (Text, colour 1) + FIRE_HYDRANT_VALVE (Insert, colour 1) + FIRE_HYDRANT_VALVE_TEXT (Text, colour 1) + FIRE_HYDRANT_VALVE_EXISTING (Insert, colour 1) + FIRE_HYDRANT_VALVE_EXISTING_TEXT (Text, colour 1) + HORIZONTAL_AND_VERTICAL_CONTROL_POINT (Line, colour 7) + HORIZONTAL_AND_VERTICAL_CONTROL_TEXT (Text, colour 7) + LAND_LOT_LINE (Line, colour 7) + LAND_LOT_LINE_TEXT (Text, colour 7) + LOT_NUMBER_TEXT (Text, colour 7) + PROJECT_BOUNDARY (Poly, colour 7) + PROJECT_BOUNDARY_TEXT (Text, colour 7) + PROPERTY_LINE (Poly, colour 7) + PUMP_STATION (Poly, colour 4) + PUMP_STATION_TEXT (Text, colour 4) + ROAD_EDGE_OF_PAVEMENT (Poly, colour 8) + ROAD_RIGHT-OF-WAY (Poly, colour 8) + ROAD_RIGHT-OF-WAY_TEXT (Text, colour 8) + ROAD_TEXT (Text, colour 8) + SEWER_EASEMENT_TEXT (Text, colour 3) + SEWER_END_OF_LINE (Insert, colour 3) + SEWER_END_OF_LINE_TEXT (Text, colour 3) + SEWER_FORCE_MAIN (Line, colour 3) + SEWER_FORCE_MAIN_TEXT (Text, colour 3) + SEWER_FORCE_MAIN_EXISTING (Line, colour 3) + SEWER_FORCE_MAIN_EXISTING_TEXT (Text, colour 3) + SEWER_LINE_TEXT (Text, colour 3) + SEWER_LINE_EXISTING (Line, colour 3) + SEWER_LINE_EXISTING_TEXT (Text, colour 3) + SEWER_MANHOLE (Insert, colour 3) + SEWER_MANHOLE_TEXT (Text, colour 3) + SEWER_MANHOLE_EXISTING (Insert, colour 3) + SEWER_MANHOLE_EXISTING_TEXT (Text, colour 3) + SEWER_TAP (Line, colour 3) + SEWER_TAP_TEXT (Text, colour 3) + UTILITY_EASEMENT (Poly, colour 6) + UTILITY_EASEMENT_TEXT (Text, colour 6) + UTILITY_EASEMENT_EXISTING (Poly, colour 6) + UTILITY_EASEMENT_EXISTING_TEXT (Text, colour 6) + WATER_EASEMENT (Poly, colour 5) + WATER_EASEMENT_TEXT (Text, colour 5) + WATER_END_CAP (Line, colour 5) + WATER_END_CAP_TEXT (Text, colour 5) + WATER_LINE_TEXT (Text, colour 5) + WATER_LINE_EXISTING (Line, colour 5) + WATER_LINE_EXISTING_TEXT (Text, colour 5) + WATER_METER (Insert, colour 5) + WATER_METER_TEXT (Text, colour 5) + WATER_QUALITY_CRITICAL_AREA (Line, colour 4) + WATER_SERVICE (Line, colour 5) + WATER_SERVICE_TEXT (Text, colour 5) + WATER_VALVE (Insert, colour 5) + WATER_VALVE_TEXT (Text, colour 5) + WATER_VALVE_EXISTING (Insert, colour 5) + WATER_VALVE_EXISTING_TEXT (Text, colour 5) + WATER_VAULT (Insert, colour 5) + WATER_VAULT_TEXT (Text, colour 5) + WETLAND_BOUNDARY (Line, colour 4) created 67, already present 3 all 70 HCWA layers present: YES; drawing now has 390 layers (verified)
Notes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.