C3D-HERORECON2 · Hero recon v2 after user fixed layers (read-only) done
Re-read TRACT A/B parcels (layer+centroid), all hero/boundary layers (flags+count+centroid), per-VP freeze state. Layers only.
C# payload
// READ-ONLY hero recon (single ticket) for 260619.
// (a) layouts + each floating VP's view center/height + per-VP frozen SS/hero layers
// (b) every SS-BOUNDARY_/hero/boundary layer: on/frozen/color/lw + model-space entity count + centroid
// (c) parcels TRACT A / TRACT B: number, area, centroid
using System;
using System.Linq;
using System.Collections.Generic;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.Civil.ApplicationServices;
using Autodesk.Civil.DatabaseServices;
var db = Db;
Log($"ACTIVE: {System.IO.Path.GetFileName(Doc.Name)}");
bool isHeroLayer(string n) =>
n.IndexOf("BOUNDARY", StringComparison.OrdinalIgnoreCase) >= 0
|| n.IndexOf("HERO", StringComparison.OrdinalIgnoreCase) >= 0;
// (c) parcels
using (var tr = db.TransactionManager.StartTransaction())
{
var cdoc = CivilDocument.GetCivilDocument(db);
foreach (ObjectId sid in cdoc.GetSiteIds())
{
var site = (Site)tr.GetObject(sid, OpenMode.ForRead);
foreach (ObjectId pid in site.GetParcelIds())
{
var p = (Parcel)tr.GetObject(pid, OpenMode.ForRead);
string c="?"; try{var e=p.GeometricExtents; c=$"({(e.MinPoint.X+e.MaxPoint.X)/2:0.0},{(e.MinPoint.Y+e.MaxPoint.Y)/2:0.0})";}catch{}
Log($"PARCEL #{p.Number} '{p.Name}' {p.Area/43560.0:0.000}ac centroid={c} layer='{p.Layer}'");
}
}
tr.Commit();
}
// (b) hero-candidate layers: flags + count + centroid of their entities
using (var tr = db.TransactionManager.StartTransaction())
{
var lt = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead);
var flags = new SortedDictionary<string,string>(StringComparer.OrdinalIgnoreCase);
foreach (ObjectId id in lt)
{
var l = (LayerTableRecord)tr.GetObject(id, OpenMode.ForRead);
if (isHeroLayer(l.Name))
flags[l.Name] = $"off={l.IsOff} frozen={l.IsFrozen} color={l.Color.ColorIndex} lw={l.LineWeight}";
}
// counts + centroid accumulation
var cnt = new Dictionary<string,int>(StringComparer.OrdinalIgnoreCase);
var sx = new Dictionary<string,double>(StringComparer.OrdinalIgnoreCase);
var sy = new Dictionary<string,double>(StringComparer.OrdinalIgnoreCase);
var ms = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead);
foreach (ObjectId id in ms)
{
var e = tr.GetObject(id, OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Entity;
if (e == null || !flags.ContainsKey(e.Layer)) continue;
double cx, cy;
try { var ex=e.GeometricExtents; cx=(ex.MinPoint.X+ex.MaxPoint.X)/2; cy=(ex.MinPoint.Y+ex.MaxPoint.Y)/2; } catch { continue; }
cnt[e.Layer]=cnt.TryGetValue(e.Layer,out var c)?c+1:1;
sx[e.Layer]=sx.TryGetValue(e.Layer,out var x)?x+cx:cx;
sy[e.Layer]=sy.TryGetValue(e.Layer,out var y)?y+cy:cy;
}
Log("HERO/BOUNDARY LAYERS:");
foreach (var kv in flags)
{
int c = cnt.TryGetValue(kv.Key, out var cc) ? cc : 0;
string ctr = c>0 ? $"centroid=({sx[kv.Key]/c:0.0},{sy[kv.Key]/c:0.0})" : "centroid=—";
Log($" {kv.Key}: {kv.Value} count={c} {ctr}");
}
tr.Commit();
}
// (a) layouts + VP view + per-VP frozen hero layers
using (var tr = db.TransactionManager.StartTransaction())
{
var ld = (DBDictionary)tr.GetObject(db.LayoutDictionaryId, OpenMode.ForRead);
foreach (DBDictionaryEntry e in ld)
{
if (string.Equals(e.Key,"Model",StringComparison.OrdinalIgnoreCase)) continue;
var lay = (Layout)tr.GetObject(e.Value, OpenMode.ForRead);
Log($"== LAYOUT [{lay.LayoutName}] ==");
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 hero = new List<string>();
if (fl != null) foreach (ObjectId lid in fl){ var n=((LayerTableRecord)tr.GetObject(lid,OpenMode.ForRead)).Name; if(isHeroLayer(n)) hero.Add(n); }
Log($" VP viewCenter=({vp.ViewCenter.X:0.0},{vp.ViewCenter.Y:0.0}) viewH={vp.ViewHeight:0} scale={vp.CustomScale:0.000000} frozenHero=[{string.Join(", ", hero)}]");
}
}
tr.Commit();
}
Result
Log
ACTIVE: 260619 - 3625 Stonewall Tell Rd.dwg PARCEL #24 'TRACT "B"' 3.314ac centroid=(2166659.9,1330379.4) layer='C-PROP' PARCEL #23 'TRACT "A"' 0.994ac centroid=(2166741.9,1330610.1) layer='SS-BOUNDARY TRACT A' HERO/BOUNDARY LAYERS: BOUNDARY PTS: off=False frozen=False color=7 lw=LineWeight035 count=0 centroid=— SS-BOUNDARY: off=False frozen=False color=3 lw=LineWeight035 count=6 centroid=(2166741.5,1330628.7) SS-BOUNDARY CYAN: off=False frozen=False color=4 lw=LineWeight018 count=9 centroid=(2166668.6,1330537.1) SS-BOUNDARY LAND LOT: off=False frozen=False color=2 lw=LineWeight025 count=6 centroid=(2166644.5,1330731.8) SS-BOUNDARY MAG: off=False frozen=False color=210 lw=LineWeight020 count=11 centroid=(2166796.4,1330261.3) SS-BOUNDARY RED: off=False frozen=True color=1 lw=LineWeight018 count=1 centroid=(2166636.8,1330615.6) SS-BOUNDARY TRACT A: off=False frozen=False color=3 lw=LineWeight018 count=1 centroid=(2166741.9,1330610.1) SS-BOUNDARY TRACT B: off=False frozen=False color=5 lw=LineWeight018 count=1 centroid=(2166659.9,1330379.4) SS-BOUNDARY_PTS: off=False frozen=False color=1 lw=ByLineWeightDefault count=0 centroid=— == LAYOUT [11X17] == VP viewCenter=(17.4,8.4) viewH=16 scale=1.000000 frozenHero=[] VP viewCenter=(996903.4,588233.9) viewH=1637 scale=0.010000 frozenHero=[] == LAYOUT [22X17 A] == VP viewCenter=(16.8,8.3) viewH=17 scale=1.000000 frozenHero=[] VP viewCenter=(997009.0,588301.6) viewH=982 scale=0.016667 frozenHero=[] == LAYOUT [22X17 B] == VP viewCenter=(997009.0,588301.6) viewH=982 scale=0.016667 frozenHero=[] == LAYOUT [22X17 C] == VP viewCenter=(18.0,8.3) viewH=19 scale=1.000000 frozenHero=[] VP viewCenter=(997009.0,588301.6) viewH=982 scale=0.016667 frozenHero=[] == LAYOUT [HOUSEDIM] ==
Notes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.