← Inbox

C3D-HEROAB2 · Hero TRACT A/B by layer only (viewport untouched) done

22X17 A: keep SS-BOUNDARY TRACT A, freeze others. 22X17 B: keep SS-BOUNDARY TRACT B, freeze others. LAYER ISOLATION ONLY - no viewport change. Reversible.

Script file
C3D-HEROAB2.cs
Target
260619 - 3625 Stonewall Tell Rd.dwg · paper space
Author
claude
Approved
yes · auto-auth
Timeout
60s

C# payload

// Hero TRACT A on "22X17 A", TRACT B on "22X17 B" — LAYER ISOLATION ONLY. VIEWPORT UNTOUCHED.
// Per-VP: thaw the tract's own SS-BOUNDARY TRACT x layer, freeze the OTHER tract's layer (+ the other
// hero layers) so only the sheet's tract shows. FREEZE, never erase. No ViewCenter/scale/target changes.
using System;
using System.Linq;
using System.Collections.Generic;
using Autodesk.AutoCAD.DatabaseServices;

var db = Db;

const string A_HERO = "SS-BOUNDARY TRACT A";
const string B_HERO = "SS-BOUNDARY TRACT B";
// hero layers to freeze in a sheet's VP (everything hero-ish except the one we keep)
string[] ALL_HERO = { "SS-BOUNDARY", "SS-BOUNDARY CYAN", "SS-BOUNDARY LAND LOT", "SS-BOUNDARY MAG",
                      "SS-BOUNDARY RED", "SS-BOUNDARY TRACT A", "SS-BOUNDARY TRACT B" };

ObjectId LayerId(Transaction tr, string name)
{
    var lt = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead);
    foreach (ObjectId id in lt){ var l=(LayerTableRecord)tr.GetObject(id,OpenMode.ForRead); if(string.Equals(l.Name,name,StringComparison.OrdinalIgnoreCase)) return id; }
    return ObjectId.Null;
}
void GlobalThaw(string name)
{
    using var tr = db.TransactionManager.StartTransaction();
    var id = LayerId(tr, name);
    if (id != ObjectId.Null){ var l=(LayerTableRecord)tr.GetObject(id,OpenMode.ForWrite); if(l.IsFrozen){ l.IsFrozen=false; Log($"globally thawed {name} (per-VP freeze needs it thawed globally)"); } }
    tr.Commit();
}

// keep layers must be globally thawed to display in any VP
GlobalThaw(A_HERO);
GlobalThaw(B_HERO);

void HeroSheet(string layoutName, string keepLayer)
{
    using var tr = db.TransactionManager.StartTransaction();
    var ld = (DBDictionary)tr.GetObject(db.LayoutDictionaryId, OpenMode.ForRead);
    Layout lay = null;
    foreach (DBDictionaryEntry e in ld){ var l=(Layout)tr.GetObject(e.Value,OpenMode.ForRead); if(string.Equals(l.LayoutName,layoutName,StringComparison.OrdinalIgnoreCase)){ lay=l; break; } }
    if (lay == null){ Log($"[{layoutName}] not found"); tr.Commit(); return; }

    var keepId = LayerId(tr, keepLayer);
    var freezeIds = ALL_HERO.Where(n => !string.Equals(n, keepLayer, StringComparison.OrdinalIgnoreCase))
                            .Select(n => LayerId(tr, n)).Where(i => i != ObjectId.Null).ToArray();

    foreach (ObjectId vid in lay.GetViewports())
    {
        var vp = tr.GetObject(vid, OpenMode.ForWrite) as Viewport;
        if (vp == null || vp.Number == 1) continue;
        // LAYER ISOLATION ONLY — do NOT touch ViewCenter/ViewTarget/ViewHeight/CustomScale.
        if (keepId != ObjectId.Null) vp.ThawLayersInViewport(new[]{ keepId }.AsEnumerable().GetEnumerator());
        if (freezeIds.Length > 0) vp.FreezeLayersInViewport(freezeIds.AsEnumerable().GetEnumerator());
        Log($"[{layoutName}] VP#{vp.Number}: kept '{keepLayer}', froze {freezeIds.Length} other hero layers (viewport view UNCHANGED)");
    }
    tr.Commit();
}

Log("== HERO TRACT A -> 22X17 A ==");
HeroSheet("22X17 A", A_HERO);
Log("== HERO TRACT B -> 22X17 B ==");
HeroSheet("22X17 B", B_HERO);

// verify per-VP frozen hero layers (and confirm view coords are UNCHANGED from recon)
using (var tr = db.TransactionManager.StartTransaction())
{
    var ld = (DBDictionary)tr.GetObject(db.LayoutDictionaryId, OpenMode.ForRead);
    foreach (var name in new[]{"22X17 A","22X17 B"})
    {
        foreach (DBDictionaryEntry e in ld)
        {
            var lay=(Layout)tr.GetObject(e.Value,OpenMode.ForRead);
            if(!string.Equals(lay.LayoutName,name,StringComparison.OrdinalIgnoreCase)) continue;
            foreach (ObjectId vid in lay.GetViewports())
            {
                var vp=tr.GetObject(vid,OpenMode.ForRead) as Viewport;
                if(vp==null||vp.Number==1) continue;
                var fl=vp.GetFrozenLayers(); var frn=new List<string>();
                if(fl!=null) foreach(ObjectId lid in fl){ var n=((LayerTableRecord)tr.GetObject(lid,OpenMode.ForRead)).Name; if(n.IndexOf("SS-BOUNDARY",StringComparison.OrdinalIgnoreCase)>=0) frn.Add(n); }
                Log($"VERIFY [{name}] VP viewCenter=({vp.ViewCenter.X:0.0},{vp.ViewCenter.Y:0.0}) [unchanged] frozenHero=[{string.Join(", ", frn)}]");
            }
        }
    }
    tr.Commit();
}
Log("DONE. Layer isolation only; viewports untouched. Reversible.");

Result

Status
success
Drawing file
C:\Users\sanja\OneDrive\_SurveyDisco\260619 - 3625 Stonewall Tell Rd, Atlanta, GA 30349, USA\260619 - 3625 Stonewall Tell Rd.dwg
Message
Executed C3D-HEROAB2 (0 entities touched).
Entities
Duration
379 ms
Civil 3D
25.0.0.0

Log

== HERO TRACT A -> 22X17 A ==
[22X17 A] VP#2: kept 'SS-BOUNDARY TRACT A', froze 6 other hero layers (viewport view UNCHANGED)
== HERO TRACT B -> 22X17 B ==
[22X17 B] VP#-1: kept 'SS-BOUNDARY TRACT B', froze 6 other hero layers (viewport view UNCHANGED)
[22X17 B] VP#-1: kept 'SS-BOUNDARY TRACT B', froze 6 other hero layers (viewport view UNCHANGED)
VERIFY [22X17 A] VP viewCenter=(997009.0,588301.6) [unchanged] frozenHero=[SS-BOUNDARY TRACT B, SS-BOUNDARY RED, SS-BOUNDARY, SS-BOUNDARY LAND LOT, SS-BOUNDARY CYAN, SS-BOUNDARY MAG]
VERIFY [22X17 B] VP viewCenter=(16.5,8.6) [unchanged] frozenHero=[SS-BOUNDARY RED, SS-BOUNDARY, SS-BOUNDARY LAND LOT, SS-BOUNDARY CYAN, SS-BOUNDARY MAG, SS-BOUNDARY TRACT A]
VERIFY [22X17 B] VP viewCenter=(997009.0,588301.6) [unchanged] frozenHero=[SS-BOUNDARY RED, SS-BOUNDARY, SS-BOUNDARY LAND LOT, SS-BOUNDARY CYAN, SS-BOUNDARY MAG, SS-BOUNDARY TRACT A]
DONE. Layer isolation only; viewports untouched. Reversible.

Notes

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

No notes yet.