C3D-0392 · ACAD C-Store: PDF2 -> 0, remove Aec layers [C3D-AECPDF] done
Moves ALL PDF2*/PDF* content (top-level and in-block guts) to layer 0 and deletes the emptied PDF layers; deletes the Aec* layers (erasing the empty AecObjExplode insert, moving any real content to 0 first) and purges unused AecObjExplode block defs. Keeps and reports any layer that still holds geometry. Verifies none remain.
C# payload
// Move ALL PDF2* content to layer 0 (top-level and in-block guts), delete the emptied PDF2*
// layers; and delete the Aec* layers (moving any content off them first - guts to 0, top-level
// erased if it's the empty AecObjExplode insert, else moved to 0 to be safe).
Log("drawing: " + Db.Filename);
var bt = (BlockTable)Tx.GetObject(Db.BlockTableId, OpenMode.ForRead);
var lt = (LayerTable)Tx.GetObject(Db.LayerTableId, OpenMode.ForWrite);
// collect target layers
var pdf=new List<string>(); var aec=new List<string>();
foreach (ObjectId id in lt){ var l=(LayerTableRecord)Tx.GetObject(id,OpenMode.ForRead);
if (l.Name.StartsWith("PDF",StringComparison.OrdinalIgnoreCase)) pdf.Add(l.Name);
if (l.Name.StartsWith("Aec",StringComparison.OrdinalIgnoreCase)) aec.Add(l.Name);
}
Log("PDF* layers: " + pdf.Count + " Aec* layers: " + aec.Count);
var pset=new HashSet<string>(pdf,StringComparer.OrdinalIgnoreCase);
var aset=new HashSet<string>(aec,StringComparer.OrdinalIgnoreCase);
// thaw/unlock all targets
foreach (var n in pdf){ var l=(LayerTableRecord)Tx.GetObject(lt[n],OpenMode.ForWrite); l.IsFrozen=false; l.IsOff=false; l.IsLocked=false; }
foreach (var n in aec){ var l=(LayerTableRecord)Tx.GetObject(lt[n],OpenMode.ForWrite); l.IsFrozen=false; l.IsOff=false; l.IsLocked=false; }
// move all PDF2/Aec content to 0
int pdfMoved=0, aecErased=0, aecMoved=0;
foreach (ObjectId bid in bt){
var def=(BlockTableRecord)Tx.GetObject(bid,OpenMode.ForRead);
bool isLayout=def.IsLayout;
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) continue;
if (pset.Contains(probe.Layer)){
var e=(Autodesk.AutoCAD.DatabaseServices.Entity)Tx.GetObject(sid,OpenMode.ForWrite);
e.Layer="0"; pdfMoved++;
} else if (aset.Contains(probe.Layer)){
var e=(Autodesk.AutoCAD.DatabaseServices.Entity)Tx.GetObject(sid,OpenMode.ForWrite);
var br=e as BlockReference;
bool empty=false;
if (br!=null){ try { var ex=br.GeometricExtents; if (ex.MinPoint.X>1e19||ex.MaxPoint.X<-1e19) empty=true; } catch { empty=true; } }
if (isLayout && empty){ e.Erase(); aecErased++; } else { e.Layer="0"; aecMoved++; }
}
}
}
Log(string.Format("PDF2 -> 0: {0} entities. Aec: erased {1} empty inserts, moved {2} to 0", pdfMoved, aecErased, aecMoved));
// current-layer guard
{ var cl=(LayerTableRecord)Tx.GetObject(Db.Clayer,OpenMode.ForRead); if (pset.Contains(cl.Name)||aset.Contains(cl.Name)){ Db.Clayer=lt["0"]; Log("current layer was a target - switched to 0"); } }
// delete now-empty PDF2 and Aec layers; purge AecObjExplode block defs
int delPdf=0, delAec=0, kept=0;
System.Func<string,int> stillOn = (name)=>{ int c=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(name,StringComparison.OrdinalIgnoreCase)) c++; } } return c; };
foreach (var n in pdf){ if (stillOn(n)>0){ kept++; continue; } try { ((LayerTableRecord)Tx.GetObject(lt[n],OpenMode.ForWrite)).Erase(); delPdf++; } catch {} }
foreach (var n in aec){ if (stillOn(n)>0){ kept++; Log(" kept Aec " + n); continue; } try { ((LayerTableRecord)Tx.GetObject(lt[n],OpenMode.ForWrite)).Erase(); delAec++; } catch (System.Exception ex){ Log(" keep " + n + ": " + ex.Message); } }
// purge unused AecObjExplode block defs
var bt2=(BlockTable)Tx.GetObject(Db.BlockTableId,OpenMode.ForWrite);
foreach (ObjectId bid in bt2){ var def=(BlockTableRecord)Tx.GetObject(bid,OpenMode.ForRead); if (!def.Name.StartsWith("AecObjExplode",StringComparison.OrdinalIgnoreCase)) continue; if (def.GetBlockReferenceIds(true,false).Count==0){ try { ((BlockTableRecord)Tx.GetObject(bid,OpenMode.ForWrite)).Erase(); Log("purged block def " + def.Name); } catch {} } }
Log(string.Format("deleted {0} PDF layers, {1} Aec layers, kept {2}", delPdf, delAec, kept));
// verify
var lt3=(LayerTable)Tx.GetObject(Db.LayerTableId,OpenMode.ForRead);
int pRem=0,aRem=0; foreach (ObjectId id in lt3){ var l=(LayerTableRecord)Tx.GetObject(id,OpenMode.ForRead); if (l.Name.StartsWith("PDF",StringComparison.OrdinalIgnoreCase)) pRem++; if (l.Name.StartsWith("Aec",StringComparison.OrdinalIgnoreCase)) aRem++; }
Log(string.Format("VERIFY: PDF layers left={0} Aec layers left={1}", pRem, aRem));
Ed.Regen();
Result
Log
drawing: C:\Users\sanja\OneDrive\_SurveyDisco\260613 - 5030 E Lake Pkwy, Stockbridge, GA 30281, USA\ACAD-260612-C-Store Sewer As-Built 60 EASEMENT PLAT LEGAL.dwg PDF* layers: 1 Aec* layers: 2 PDF2 -> 0: 16 entities. Aec: erased 1 empty inserts, moved 0 to 0 purged block def AecObjExplode_22X17_Pspace purged block def AecObjExplode_22X17_Vport_5F2 deleted 1 PDF layers, 2 Aec layers, kept 0 VERIFY: PDF layers left=0 Aec layers left=0
Notes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.