C3D-HCWA-FILTER · Layer filter for the HCWA layers done
Creates a layer filter group "HCWA As-Built" containing exactly the HCWA standard layers. Replaces an existing group of the same name. Verifies by reading the filter tree back off the database.
C# payload
// Create a layer filter GROUP holding exactly the HCWA layers.
// A LayerGroup is a LayerFilter that carries an explicit list of layer ids (as opposed to a
// property-expression filter), so the group holds precisely these names and nothing else.
// API verified by reflecting AcDbMgd: Autodesk.AutoCAD.LayerManager.LayerGroup : LayerFilter,
// with LayerIds; the tree comes from Db.LayerFilters (LayerFilterTree) and must be assigned
// back to Db.LayerFilters to persist. That namespace is NOT in the host's imports - qualify it.
// Replaces an existing group of the same name rather than duplicating it.
// Host owns Tx; host regens after commit.
const string GROUP = "HCWA As-Built";
var want = new string[] {
@"ADDRESS_TEXT",
@"CASING",
@"CASING_TEXT",
@"FDC",
@"FIRE_HYDRANT",
@"FIRE_HYDRANT_TEXT",
@"FIRE_HYDRANT_MANUFACTURER",
@"FIRE_HYDRANT_MANUFACTURED_YEAR",
@"FIRE_HYDRANT_EXISTING",
@"FIRE_HYDRANT_EXISTING_TEXT",
@"FIRE_HYDRANT_VALVE",
@"FIRE_HYDRANT_VALVE_TEXT",
@"FIRE_HYDRANT_VALVE_EXISTING",
@"FIRE_HYDRANT_VALVE_EXISTING_TEXT",
@"HORIZONTAL_AND_VERTICAL_CONTROL_POINT",
@"HORIZONTAL_AND_VERTICAL_CONTROL_TEXT",
@"LAND_LOT_LINE",
@"LAND_LOT_LINE_TEXT",
@"LOT_NUMBER_TEXT",
@"PROJECT_BOUNDARY",
@"PROJECT_BOUNDARY_TEXT",
@"PROPERTY_LINE",
@"PUMP_STATION",
@"PUMP_STATION_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_FORCE_MAIN_EXISTING",
@"SEWER_FORCE_MAIN_EXISTING_TEXT",
@"SEWER_LINE",
@"SEWER_LINE_TEXT",
@"SEWER_LINE_EXISTING",
@"SEWER_LINE_EXISTING_TEXT",
@"SEWER_MANHOLE",
@"SEWER_MANHOLE_TEXT",
@"SEWER_MANHOLE_EXISTING",
@"SEWER_MANHOLE_EXISTING_TEXT",
@"SEWER_TAP",
@"SEWER_TAP_TEXT",
@"UTILITY_EASEMENT",
@"UTILITY_EASEMENT_TEXT",
@"UTILITY_EASEMENT_EXISTING",
@"UTILITY_EASEMENT_EXISTING_TEXT",
@"WATER_EASEMENT",
@"WATER_EASEMENT_TEXT",
@"WATER_END_CAP",
@"WATER_END_CAP_TEXT",
@"WATER_LINE",
@"WATER_LINE_TEXT",
@"WATER_LINE_EXISTING",
@"WATER_LINE_EXISTING_TEXT",
@"WATER_METER",
@"WATER_METER_TEXT",
@"WATER_QUALITY_CRITICAL_AREA",
@"WATER_SERVICE",
@"WATER_SERVICE_TEXT",
@"WATER_VALVE",
@"WATER_VALVE_TEXT",
@"WATER_VALVE_EXISTING",
@"WATER_VALVE_EXISTING_TEXT",
@"WATER_VAULT",
@"WATER_VAULT_TEXT",
@"WETLAND_BOUNDARY"
};
var lt = (LayerTable)Tx.GetObject(Db.LayerTableId, OpenMode.ForRead);
var tree = Db.LayerFilters;
var root = tree.Root;
// drop a previous run's group so this is idempotent
Autodesk.AutoCAD.LayerManager.LayerFilter dup = null;
foreach (Autodesk.AutoCAD.LayerManager.LayerFilter f in root.NestedFilters)
if (f.Name == GROUP) { dup = f; break; }
if (dup != null) { root.NestedFilters.Remove(dup); Log("removed existing '" + GROUP + "' filter"); }
var grp = new Autodesk.AutoCAD.LayerManager.LayerGroup();
grp.Name = GROUP;
int added = 0, missing = 0;
foreach (var n in want)
{
if (!lt.Has(n)) { Log(" MISSING layer '" + n + "'"); missing++; continue; }
grp.LayerIds.Add(lt[n]);
added++;
}
root.NestedFilters.Add(grp);
Db.LayerFilters = tree;
// verify by re-reading the tree back off the database
int found = -1;
foreach (Autodesk.AutoCAD.LayerManager.LayerFilter f in Db.LayerFilters.Root.NestedFilters)
if (f.Name == GROUP)
{
var g2 = f as Autodesk.AutoCAD.LayerManager.LayerGroup;
found = (g2 == null) ? -2 : g2.LayerIds.Count;
}
Log("layer filter '" + GROUP + "': added " + added + " layer(s), " + missing + " missing");
Log("read back from the database: " + (found >= 0 ? found + " layer(s) in the group (verified)"
: found == -2 ? "found but not a LayerGroup" : "NOT FOUND"));
Result
Log
layer filter 'HCWA As-Built': added 70 layer(s), 0 missing read back from the database: 70 layer(s) in the group (verified)
Notes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.