C3D-0046 · Layer filter: USED - NO PDF/C- (29 layers) [FILTER-USED] error
Creates a layer group filter holding the 29 layers that actually contain entities, excluding every PDF* and C-* layer. Membership derived from the entity count per layer, not assumed. Replaces any existing filter of the same name so re-runs do not duplicate, and reads the filter back from the database to verify.
C# payload
// Layer filter "USED - NO PDF/C-": the 29 layers that actually hold entities in model space or a
// layout, excluding anything starting PDF or C-.
//
// Membership was derived by counting entities per layer (C3D-0045), not assumed.
//
// TRAP (cookbook 16): Db.LayerFilters returns a STRUCT copy. Editing the returned tree does
// nothing unless it is assigned back with Db.LayerFilters = root. Idempotent: an existing filter
// of the same name is replaced, so a re-run does not stack duplicates.
string[] KEEP = new string[] {
"0", "BLOCK_CLOSURE", "BLOCK_NORTH_ARROW", "PROPERTY_LINE", "ROAD_EDGE_OF_PAVEMENT",
"ROAD_RIGHT-OF-WAY", "SEWER_EASEMENT", "SEWER_EASEMENT_20", "SEWER_EASEMENT_TEXT",
"SEWER_LINE", "SEWER_LINE_TEXT", "SEWER_MANHOLE", "SEWER_MANHOLE_EXISTING",
"SEWER_MANHOLE_TEXT", "SS-0-FRAME", "SS-BOUNDARY", "SS-BOUNDARY LAND LOT",
"SS-ROAD-BUILDING", "SS-ROAD-CANOPY", "SS-ROAD-CL", "SS-ROAD-DUMPSTER",
"SS-ROAD-GUARDRAIL", "SS-ROAD-SIDEWALK", "SS-ROAD-STRIPE", "SS-ROAD-TBC",
"V-CTRL-LINE-SHOT", "V-CTRL-TEXT", "WATER_VALVE", "WATER_VAULT",
};
const string FILTER_NAME = "USED - NO PDF/C-";
var root = Db.LayerFilters; // struct copy - must be assigned back
var parent = root.Root;
// drop an existing filter of the same name so re-running does not duplicate it
LayerFilter existing = null;
foreach (LayerFilter f in parent.NestedFilters)
if (f.Name == FILTER_NAME) { existing = f; break; }
if (existing != null) { parent.NestedFilters.Remove(existing); Log("replaced existing filter"); }
var grp = new LayerGroup();
grp.Name = FILTER_NAME;
var lt = (LayerTable)Tx.GetObject(Db.LayerTableId, OpenMode.ForRead);
int added = 0, missing = 0;
foreach (string nm in KEEP) {
if (!lt.Has(nm)) { Log(" MISSING layer: " + nm); missing++; continue; }
var l = (LayerTableRecord)Tx.GetObject(lt[nm], OpenMode.ForRead);
grp.LayerIds.Add(l.ObjectId);
added++;
}
parent.NestedFilters.Add(grp);
Db.LayerFilters = root; // THE assignment that makes it persist
// verify by reading it back out of the database
int verified = -1;
var check = Db.LayerFilters;
foreach (LayerFilter f in check.Root.NestedFilters)
if (f.Name == FILTER_NAME) verified = ((LayerGroup)f).LayerIds.Count;
Log("filter \"" + FILTER_NAME + "\": added " + added + ", missing " + missing);
Log("read back from Db.LayerFilters: " + verified + " layers (verified)");
Ed.Regen();
Result
Notes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.