C3D-0368 · Move all frozen-layer entities to a new frozen layer HIDDEN, delete the emptied layers [C3D-HIDDEN] done
Reads the currently-frozen layers live, moves every entity on them (model space and all layouts) onto a new layer HIDDEN, deletes the now-empty source layers, and freezes HIDDEN so the geometry stays hidden. Entities are preserved, not erased. Verifies HIDDEN is frozen, holds the moved entities, and no source layer remains.
C# payload
// Move every entity on a currently-FROZEN layer to a new layer HIDDEN (created frozen), then
// delete the emptied source layers. Reads the frozen set live. HIDDEN stays frozen so the
// geometry remains hidden; the entities are preserved, not erased.
const string TARGET = "HIDDEN";
Log("drawing: " + Db.Filename);
var lt = (LayerTable)Tx.GetObject(Db.LayerTableId, OpenMode.ForWrite);
// which layers are frozen right now (the sources)
var srcNames = new List<string>();
foreach (ObjectId id in lt) {
var l = (LayerTableRecord)Tx.GetObject(id, OpenMode.ForRead);
if (l.IsFrozen && !l.Name.Equals(TARGET, StringComparison.OrdinalIgnoreCase)) srcNames.Add(l.Name);
}
srcNames.Sort(StringComparer.OrdinalIgnoreCase);
Log("frozen source layers: " + srcNames.Count);
foreach (var n in srcNames) Log(" " + n);
if (srcNames.Count == 0) { Log("nothing frozen - nothing to do"); return; }
// create HIDDEN (thawed for now so we can move entities onto it; frozen at the end)
ObjectId targetId;
if (lt.Has(TARGET)) { targetId = lt[TARGET]; Log(TARGET + " already exists"); }
else { var nl = new LayerTableRecord(); nl.Name = TARGET; targetId = lt.Add(nl); Tx.AddNewlyCreatedDBObject(nl, true); Log("created " + TARGET); }
{
var t = (LayerTableRecord)Tx.GetObject(targetId, OpenMode.ForWrite);
t.IsFrozen = false; t.IsOff = false; t.IsLocked = false;
}
// thaw/unlock sources so their entities are editable
foreach (var n in srcNames) {
var l = (LayerTableRecord)Tx.GetObject(lt[n], OpenMode.ForWrite);
l.IsFrozen = false; l.IsOff = false; l.IsLocked = false;
}
// move entities across every block (model + layouts) so paper-space frozen items come too
var srcSet = new HashSet<string>(srcNames, StringComparer.OrdinalIgnoreCase);
var bt = (BlockTable)Tx.GetObject(Db.BlockTableId, OpenMode.ForRead);
int moved = 0;
foreach (ObjectId btrId in bt) {
var btr = (BlockTableRecord)Tx.GetObject(btrId, OpenMode.ForRead);
foreach (ObjectId id in btr) {
var probe = Tx.GetObject(id, OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Entity;
if (probe == null) continue;
if (!srcSet.Contains(probe.Layer)) continue;
var e = (Autodesk.AutoCAD.DatabaseServices.Entity)Tx.GetObject(id, OpenMode.ForWrite);
e.Layer = TARGET;
moved++;
}
}
Log("moved " + moved + " entities to " + TARGET);
// current layer must not be a delete target
{
var cl = (LayerTableRecord)Tx.GetObject(Db.Clayer, OpenMode.ForRead);
if (srcSet.Contains(cl.Name)) { Db.Clayer = lt["0"]; Log("current layer was frozen source - switched to 0"); }
}
// delete emptied source layers
int deleted = 0;
foreach (var n in srcNames) {
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("deleted " + deleted + " layers");
// freeze HIDDEN
{
var t = (LayerTableRecord)Tx.GetObject(targetId, OpenMode.ForWrite);
t.IsFrozen = true;
}
// verify
var lt2 = (LayerTable)Tx.GetObject(Db.LayerTableId, OpenMode.ForRead);
int leftover = 0;
foreach (var n in srcNames) if (lt2.Has(n)) { leftover++; Log(" STILL PRESENT: " + n); }
var h = (LayerTableRecord)Tx.GetObject(lt2[TARGET], OpenMode.ForRead);
int onHidden = 0;
foreach (ObjectId btrId in bt) {
var btr = (BlockTableRecord)Tx.GetObject(btrId, OpenMode.ForRead);
foreach (ObjectId id in btr) {
var e = Tx.GetObject(id, OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Entity;
if (e != null && !e.IsErased && e.Layer.Equals(TARGET, StringComparison.OrdinalIgnoreCase)) onHidden++;
}
}
Log(string.Format("VERIFY: {0} frozen={1} entities on {0}={2} emptied-layers-still-present={3} {4}",
TARGET, h.IsFrozen, onHidden, leftover, leftover==0 ? "CLEAN" : "*** NOT CLEAN ***"));
Ed.Regen();
Result
Log
drawing: C:\Users\sanja\OneDrive\_SurveyDisco\260613 - 5030 E Lake Pkwy, Stockbridge, GA 30281, USA\ACAD-260612-Springdale Sanitary Sewer Extension As-Built 60 wPROFILE.dwg frozen source layers: 23 FIRE_HYDRANT FIRE_HYDRANT_VALVE PROJECT_BOUNDARY_TEXT PUMP_STATION_TEXT SEWER_EASEMENT RED SEWER_EASEMENT_20 SEWER_LINE E1 SEWER_LINE_TEXT E1 SEWER_MANHOLE E1 SEWER_MANHOLE_TEXT E1 SS-0-FRAME SS-BOUNDARY SS-ROAD-BUILDING SS-ROAD-CANOPY SS-ROAD-DUMPSTER SS-ROAD-SIDEWALK SS-ROAD-STRIPE SS-ROAD-TBC WATER_LINE WATER_LINE_PTS WATER_LINE_TEXT WATER_VALVE WATER_VAULT created HIDDEN moved 339 entities to HIDDEN deleted 23 layers VERIFY: HIDDEN frozen=True entities on HIDDEN=339 emptied-layers-still-present=0 CLEAN
Notes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.