← Inbox

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.

Script file
C3D-0368.cs
Target
260612-Springdale Sanitary Sewer Extension As-Built 60 wPROFILE.dwg · model space
Author
claude
Approved
yes · reviewer
Timeout
180s

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

Status
success
Drawing file
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
Message
Executed C3D-0368 (0 entities touched).
Entities
Duration
706 ms
Civil 3D
25.0.0.0

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.