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.
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
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.