C3D-0379 · C-Store: erase top-level PDF geometry, move PDF symbol-guts back to 0, delete PDF layers [C3D-CSPDF] done
Safer PDF cleanup for the C-Store drawing where many PDF2_ layers are ALSO referenced by block-internal symbol guts. Moves any in-block entity on a PDF* layer to layer 0 (keeps symbols connected to their real insert layer, never erased); erases only TOP-LEVEL entities on PDF* layers (the exploded-PDF geometry); then deletes every now-empty PDF* layer, keeping and reporting any that still hold geometry. Loops all spaces, collects ids before mutating, verifies the remaining PDF layer count.
C# payload
// C-Store PDF cleanup - SAFELY. Unlike Springdale, many PDF2_ layers are also referenced by
// block-internal symbol guts. So:
// 1. any entity on a PDF2_* layer that lives INSIDE a block definition -> move to "0"
// (keeps the symbol connected to its insert's real layer; never erased)
// 2. any TOP-LEVEL entity on a PDF2_* layer (the exploded-PDF geometry) -> erase
// 3. delete every now-empty PDF2_* layer
// A PDF2_* layer that still has geometry after (shouldn't) is kept and reported.
Log("drawing: " + Db.Filename);
var bt = (BlockTable)Tx.GetObject(Db.BlockTableId, OpenMode.ForRead);
var lt = (LayerTable)Tx.GetObject(Db.LayerTableId, OpenMode.ForWrite);
var pdfLayers = new List<string>();
foreach (ObjectId id in lt) { var l=(LayerTableRecord)Tx.GetObject(id,OpenMode.ForRead); if (l.Name.StartsWith("PDF",StringComparison.OrdinalIgnoreCase)) pdfLayers.Add(l.Name); }
var pset = new HashSet<string>(pdfLayers, StringComparer.OrdinalIgnoreCase);
Log("PDF* layers: " + pdfLayers.Count);
// thaw/unlock them
foreach (var n in pdfLayers) { var l=(LayerTableRecord)Tx.GetObject(lt[n],OpenMode.ForWrite); l.IsFrozen=false; l.IsOff=false; l.IsLocked=false; }
int movedGuts=0, erasedTop=0;
foreach (ObjectId bid in bt) {
var def = (BlockTableRecord)Tx.GetObject(bid, OpenMode.ForRead);
bool isLayout = def.IsLayout;
// collect ids first (mutating while iterating a BTR is unsafe)
var ids = new List<ObjectId>();
foreach (ObjectId sid in def) ids.Add(sid);
foreach (var sid in ids) {
var probe = Tx.GetObject(sid, OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Entity;
if (probe == null || !pset.Contains(probe.Layer)) continue;
var e = (Autodesk.AutoCAD.DatabaseServices.Entity)Tx.GetObject(sid, OpenMode.ForWrite);
if (isLayout) { e.Erase(); erasedTop++; } // top-level exploded-PDF -> gone
else { e.Layer = "0"; movedGuts++; } // symbol guts -> back to 0
}
}
Log(string.Format("moved {0} in-block guts to 0, erased {1} top-level PDF entities", movedGuts, erasedTop));
// current-layer guard, then delete emptied PDF* layers
{ var cl=(LayerTableRecord)Tx.GetObject(Db.Clayer,OpenMode.ForRead); if (pset.Contains(cl.Name)) { Db.Clayer=lt["0"]; Log("current layer was PDF - switched to 0"); } }
int deleted=0, kept=0;
foreach (var n in pdfLayers) {
// is anything still on it?
int still=0;
foreach (ObjectId bid in bt) { var def=(BlockTableRecord)Tx.GetObject(bid,OpenMode.ForRead); foreach (ObjectId sid in def) { var e=Tx.GetObject(sid,OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Entity; if (e!=null && !e.IsErased && e.Layer.Equals(n,StringComparison.OrdinalIgnoreCase)) still++; } }
if (still>0) { kept++; Log(" KEPT " + n + " (" + still + " entities still on it)"); continue; }
try { var l=(LayerTableRecord)Tx.GetObject(lt[n],OpenMode.ForWrite); l.Erase(); deleted++; }
catch (System.Exception ex) { Log(" could not delete " + n + ": " + ex.Message); }
}
Log(string.Format("deleted {0} PDF layers, kept {1}", deleted, kept));
var lt2=(LayerTable)Tx.GetObject(Db.LayerTableId,OpenMode.ForRead);
int remain=0; foreach (ObjectId id in lt2){ var l=(LayerTableRecord)Tx.GetObject(id,OpenMode.ForRead); if (l.Name.StartsWith("PDF",StringComparison.OrdinalIgnoreCase)) remain++; }
Log(string.Format("VERIFY: PDF layers remaining={0} (kept ones had leftover geometry)", remain));
Ed.Regen();
Result
Log
drawing: C:\Users\sanja\OneDrive\_SurveyDisco\260613 - 5030 E Lake Pkwy, Stockbridge, GA 30281, USA\260612-C-Store Sewer As-Built 60 EASEMENT PLAT LEGAL.dwg PDF* layers: 78 moved 12251 in-block guts to 0, erased 5830 top-level PDF entities deleted 78 PDF layers, kept 0 VERIFY: PDF layers remaining=0 (kept ones had leftover geometry)
Notes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.