← Inbox

C3D-0381 · C-Store: frozen layers' top-level entities -> frozen HIDDEN, delete emptied ones (guts protected) [C3D-CSHIDDEN] done

Moves ONLY top-level entities on the 11 currently-frozen layers to a frozen HIDDEN layer, never reaching into block definitions (symbol guts stay put and connected to their real insert layer). Deletes a source layer only if nothing remains on it; keeps any that still hold in-block guts. Re-freezes HIDDEN.

Script file
C3D-0381.cs
Target
260612-C-Store Sewer As-Built 60 EASEMENT PLAT LEGAL.dwg · model space
Author
claude
Approved
yes · auto-auth
Timeout
180s

C# payload

// C-Store: move TOP-LEVEL entities on currently-frozen layers to a frozen HIDDEN layer, then
// delete the emptied source layers. NEVER touches block-internal geometry (symbol guts) - only
// entities whose owner BlockTableRecord IsLayout. A source layer that still holds in-block guts
// after the move is KEPT (not deleted) so no symbol loses its parts.
const string TARGET = "HIDDEN";
Log("drawing: " + Db.Filename);
var bt = (BlockTable)Tx.GetObject(Db.BlockTableId, OpenMode.ForRead);
var lt = (LayerTable)Tx.GetObject(Db.LayerTableId, OpenMode.ForWrite);

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);
if (srcNames.Count==0){ Log("nothing frozen"); return; }
var srcSet = new HashSet<string>(srcNames, StringComparer.OrdinalIgnoreCase);

ObjectId targetId;
if (lt.Has(TARGET)) targetId=lt[TARGET];
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; }
foreach (var n in srcNames) { var l=(LayerTableRecord)Tx.GetObject(lt[n],OpenMode.ForWrite); l.IsFrozen=false; l.IsOff=false; l.IsLocked=false; }

// move ONLY top-level entities on frozen layers to HIDDEN
int moved=0;
foreach (ObjectId bid in bt) {
    var def=(BlockTableRecord)Tx.GetObject(bid,OpenMode.ForRead);
    if (!def.IsLayout) continue;                         // guard: never reach into block defs
    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 || !srcSet.Contains(probe.Layer)) continue;
        var e=(Autodesk.AutoCAD.DatabaseServices.Entity)Tx.GetObject(sid,OpenMode.ForWrite);
        e.Layer=TARGET; moved++;
    }
}
Log("moved " + moved + " top-level entities to " + TARGET);

{ var t=(LayerTableRecord)Tx.GetObject(targetId,OpenMode.ForWrite); t.IsFrozen=true; }
{ var cl=(LayerTableRecord)Tx.GetObject(Db.Clayer,OpenMode.ForRead); if (srcSet.Contains(cl.Name)){ Db.Clayer=lt["0"]; Log("current layer was frozen src - switched to 0"); } }

// delete a source ONLY if nothing remains on it (in-block guts keep it alive)
int deleted=0, kept=0;
foreach (var n in srcNames) {
    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 + " in-block guts)"); 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} layers, kept {1} (still have guts)", deleted, kept));

var h=(LayerTableRecord)Tx.GetObject(lt[TARGET],OpenMode.ForRead);
Log("VERIFY: HIDDEN frozen=" + h.IsFrozen);
Ed.Regen();

Result

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

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
frozen source layers: 11
created HIDDEN
moved 248 top-level entities to HIDDEN
  kept SS-0-FRAME (1 in-block guts)
  kept SS-BOUNDARY (6 in-block guts)
  kept SS-ROAD-STRIPE (15 in-block guts)
deleted 8 layers, kept 3 (still have guts)
VERIFY: HIDDEN frozen=True

Notes

What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.

No notes yet.