C3D-PDFFREEZE · Freeze unneeded PDF layers (reversible) done
Freezes contours, grading, gravel, power, title block and hatch-pattern PDF layers. Same keep/drop split as the strip, but REVERSIBLE - thaw to bring anything back. Nothing is erased.
C# payload
// FREEZE (not erase) the PDF layers that aren't needed: contours, grading, gravel, power,
// title block, hatch patterns, sheet furniture. Same keep/drop split as the strip ticket, but
// REVERSIBLE - thaw any layer to bring it back.
var lt = (LayerTable)Tx.GetObject(Db.LayerTableId, OpenMode.ForRead);
string[] keep = {
"SSWR","SEWER","SS-","PIPE-SS", "WATR","WATER","WTR", "HYDR","FH",
"ESMT","EASEMENT", "BNDY","BOUND","PROP","PARCEL","LOT",
"ROAD","CURB","PAVE","EOP","RW","R-W","SIDEWLK","SIDEWALK","STRIPE","MRKG",
"BLDG","BUILDING", "TEXT","ANNO","LABEL", "STRM","STORM",
};
string[] drop = {
"CONTOUR","PGRADE","GRADE","TBORDER","TITLE","T-BD","SEAL","GRAPHIC_SCALE","LOGO",
"-PATT","HATCH","VIEWPORT","DEFPOINTS","NORTH","GRAVEL","POWR","POWER","RIVR",
};
bool Keep(string lay) {
var u = lay.ToUpperInvariant();
foreach (var d in drop) if (u.Contains(d)) return false;
foreach (var k in keep) if (u.Contains(k)) return true;
return false;
}
int froze = 0, kept = 0, skipped = 0;
var frozenNames = new List<string>();
foreach (ObjectId id in lt) {
var l = (LayerTableRecord)Tx.GetObject(id, OpenMode.ForRead);
if (!l.Name.ToUpperInvariant().StartsWith("PDF_")) continue;
if (l.Name == "PDF_IMPORT_ASBUILT") { skipped++; continue; } // the block ref itself
if (Keep(l.Name)) { kept++; continue; }
if (l.IsFrozen) { skipped++; continue; }
if (l.ObjectId == Db.Clayer) { Log($" '{l.Name}' is CURRENT layer - cannot freeze, skipping"); skipped++; continue; }
var w = (LayerTableRecord)Tx.GetObject(id, OpenMode.ForWrite);
w.IsFrozen = true;
var chk = (LayerTableRecord)Tx.GetObject(id, OpenMode.ForRead);
if (!chk.IsFrozen) { Log($" FAILED to freeze '{l.Name}'"); continue; }
froze++; frozenNames.Add(l.Name);
}
Log($"FROZEN {froze} PDF layers (kept {kept} visible, skipped {skipped}) (verified).");
Log("--- frozen ---");
foreach (var n in frozenNames.OrderBy(x => x)) Log(" " + n);
Log("REVERSIBLE: thaw any of these in the Layer Properties Manager to bring the geometry back.");
Result
Log
FROZEN 42 PDF layers (kept 34 visible, skipped 1) (verified). --- frozen --- PDF_0-ALIGN-SDL2-T PDF_0-PIPE-EX SS PDF_0-PIPE-STM A PDF_0-PIPE-STM B PDF_0-PIPE-STM C PDF_2015_Flood_Map_DFIRM PDF_ae_title-36x24$SEAL PDF_ae_title-36x24$SEAL2 PDF_ae_title-36x24$T-BD-COPY PDF_ae_title-36x24$T-BD-INFO1 PDF_ae_title-36x24$T-BD-INFO2 PDF_ae_title-36x24$T-BD-LINE PDF_ae_title-36x24$T-BD-LOGO PDF_ae_title-36x24$T-BD-PROJ PDF_ae_title-36x24$T-BD-PROJ2 PDF_ae_title-36x24$TBORDER PDF_ae_title-36x24$TITLE PDF_C-CONC PDF_C-DEMO PDF_C-SIGNS PDF_C-SSWR-PIPE-PATT PDF_C-SSWR-STRC-PATT PDF_E CONCRETE PDF_E EDGE PVMT PDF_E FENCE PDF_E GRAVEL PDF_E IPF-SET PDF_E POWER PDF_E WALL PDF_GRAPHIC_SCALE PDF_INDEX_CONTOURS PDF_INTER_CONTOURS PDF_Level 3 PDF_NOTES PDF_P-Setbacks PDF_PGRADE PDF_REVISIONS PDF_SWM PDF_SWM-TXT PDF_TXT200 PDF_V-POWR-OVHD PDF_V-RIVR-EDGE REVERSIBLE: thaw any of these in the Layer Properties Manager to bring the geometry back.
Notes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
- recipeFreeze, never erase. First attempt erased 8,579 entities from the PDF block; frozen layers thaw back in one click.