← Inbox

C3D-HEROAB · Hero TRACT A on 22X17 A, TRACT B on 22X17 B done

Reframe each sheet VP onto its tract + per-VP hero isolation (A=SS-BOUNDARY LAND LOT, B=SS-BOUNDARY TRACT B). Reversible. Verify after.

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

C# payload

// Hero TRACT A on sheet "22X17 A", TRACT B on sheet "22X17 B".
// Both sheets' main VP are currently framed ~1.17M units away from the tracts. Reframe each VP onto
// its tract centroid (keep existing scale/height), and set per-VP layer isolation so each sheet shows
// only its tract's hero linework. FREEZE (reversible), never erase. Read-back verify.
using System;
using System.Linq;
using System.Collections.Generic;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;

var db = Db;

// tract centroids (from recon)
var A_CENTER = new Point2d(2166741.9, 1330610.1);
var B_CENTER = new Point2d(2166659.9, 1330379.4);

// hero layer per tract. B has a dedicated layer; A's boundary lives on SS-BOUNDARY LAND LOT.
const string A_HERO = "SS-BOUNDARY LAND LOT";
const string B_HERO = "SS-BOUNDARY TRACT B";
// other hero layers to freeze in a given sheet's VP so the wrong tract's linework doesn't show
string[] ALL_HERO = { "SS-BOUNDARY", "SS-BOUNDARY CYAN", "SS-BOUNDARY LAND LOT", "SS-BOUNDARY MAG",
                      "SS-BOUNDARY RED", "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}"); } }
    tr.Commit();
}

// make sure every hero layer we touch is globally thawed (per-VP freeze can't display a globally frozen layer)
foreach (var n in ALL_HERO) GlobalThaw(n);

void HeroSheet(string layoutName, Point2d center, 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;
        // reframe onto the tract (keep scale/height/twist)
        vp.ViewCenter = center;
        vp.ViewTarget = new Point3d(center.X, center.Y, 0);
        // isolate: thaw the keep layer, freeze the other hero layers in THIS vp
        if (keepId != ObjectId.Null) vp.ThawLayersInViewport(new[]{ keepId }.AsEnumerable().GetEnumerator());
        if (freezeIds.Length > 0) vp.FreezeLayersInViewport(freezeIds.AsEnumerable().GetEnumerator());
        Log($"[{layoutName}] VP#{vp.Number}: reframed to ({center.X:0.0},{center.Y:0.0}), kept '{keepLayer}', froze {freezeIds.Length} other hero layers");
    }
    tr.Commit();
}

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

// verify
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}) frozenHero=[{string.Join(", ", frn)}]");
            }
        }
    }
    tr.Commit();
}
Log("DONE. Reversible (freeze + reframe, nothing erased).");

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-HEROAB (0 entities touched).
Entities
Duration
765 ms
Civil 3D
25.0.0.0

Log

globally thawed SS-BOUNDARY RED
== HERO TRACT A -> sheet 22X17 A ==
[22X17 A] VP#2: reframed to (2166741.9,1330610.1), kept 'SS-BOUNDARY LAND LOT', froze 5 other hero layers
== HERO TRACT B -> sheet 22X17 B ==
[22X17 B] VP#-1: reframed to (2166659.9,1330379.4), kept 'SS-BOUNDARY TRACT B', froze 5 other hero layers
[22X17 B] VP#-1: reframed to (2166659.9,1330379.4), kept 'SS-BOUNDARY TRACT B', froze 5 other hero layers
VERIFY [22X17 A] VP viewCenter=(2166741.9,1330610.1) frozenHero=[SS-BOUNDARY TRACT B, SS-BOUNDARY RED, SS-BOUNDARY, SS-BOUNDARY CYAN, SS-BOUNDARY MAG]
VERIFY [22X17 B] VP viewCenter=(2166659.9,1330379.4) frozenHero=[SS-BOUNDARY RED, SS-BOUNDARY, SS-BOUNDARY LAND LOT, SS-BOUNDARY CYAN, SS-BOUNDARY MAG]
VERIFY [22X17 B] VP viewCenter=(2166659.9,1330379.4) frozenHero=[SS-BOUNDARY RED, SS-BOUNDARY, SS-BOUNDARY LAND LOT, SS-BOUNDARY CYAN, SS-BOUNDARY MAG]
DONE. Reversible (freeze + reframe, nothing erased).

Notes

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

No notes yet.