← Inbox

C3D-HERORECON · Hero recon: tracts + sheets + hero layers (read-only) done

Layouts + per-VP framing/freeze, hero/boundary layers (flags+count+centroid), and TRACT A/B parcels. For heroing A on 22X17 A and B on 22X17 B.

Script file
C3D-HERORECON.cs
Target
active document · model space
Author
claude
Approved
yes · claude (read-only)
Timeout
60s

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

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

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 LAND LOT'
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=7 centroid=(2166658.4,1330714.4)
  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 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=(997009.0,588301.6) viewH=982 scale=0.016667 frozenHero=[]
== LAYOUT [22X17 B] ==
  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 [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] ==
  VP viewCenter=(20.7,7.3) viewH=19 scale=1.000000 frozenHero=[]
  VP viewCenter=(2166681.6,1330434.7) viewH=1003 scale=0.016335 frozenHero=[]

Notes

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

No notes yet.