← Inbox

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.

Script file
C3D-HCWA-FILTER.cs
Target
SS_BLOCK_22X17 · model space
Author
claude
Approved
yes · reviewer
Timeout
180s

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

Status
success
Drawing file
C:\Users\sanja\OneDrive\_SurveyDisco\260613 - 5030 E Lake Pkwy, Stockbridge, GA 30281, USA\SS_BLOCK_22X17.dwg
Message
Executed C3D-HCWA-FILTER (0 entities touched).
Entities
Duration
331 ms
Civil 3D
25.0.0.0

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.