C3D-INSP2403D · Hero VP framing + candidate layers (read-only) error
Parcel centroids vs each sheet's viewport view-center/height (which parcel each frames) + entity counts on SS-BOUNDARY_* hero layers. To learn the hero mechanism before building 10.
C# payload
// READ-ONLY: what does each hero viewport FRAME, and what's drawn there?
// For 09, 10, R4: the model-space view center+height each VP shows (so I know which parcel it frames),
// and the parcel centroids so I can tell which parcel each sheet is aimed at.
// Also: enumerate hero-candidate layers (SS-BOUNDARY_*) and count entities on each + which are visible.
using System;
using System.Linq;
using System.Collections.Generic;
using Autodesk.AutoCAD.ApplicationServices;
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)}");
// parcel centroids (approx via extents center) so we can match VP view -> parcel
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);
try {
var ext = p.GeometricExtents;
var cx = (ext.MinPoint.X+ext.MaxPoint.X)/2; var cy=(ext.MinPoint.Y+ext.MaxPoint.Y)/2;
Log($"PARCEL #{p.Number} {p.Area/43560.0:0.000}ac center=({cx:0.0},{cy:0.0}) w={(ext.MaxPoint.X-ext.MinPoint.X):0} h={(ext.MaxPoint.Y-ext.MinPoint.Y):0}");
} catch (System.Exception ex) { Log($"PARCEL #{p.Number}: extents note {ex.Message}"); }
}
}
tr.Commit();
}
// each layout's viewport view center + height (model units) => which parcel it's framed on
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);
foreach (ObjectId vid in lay.GetViewports())
{
var vp = tr.GetObject(vid, OpenMode.ForRead) as Viewport;
if (vp == null || vp.Number == 1) continue;
Log($"[{lay.LayoutName}] VP viewCenter=({vp.ViewCenter.X:0.0},{vp.ViewCenter.Y:0.0}) viewHeight={vp.ViewHeight:0} customScale={vp.CustomScale:0.000000}");
}
}
tr.Commit();
}
// hero-candidate layers: entity counts on SS-BOUNDARY_* and BOUNDARY* (model space)
using (var tr = db.TransactionManager.StartTransaction())
{
var want = new List<string>{"SS-BOUNDARY_CYAN","SS-BOUNDARY_RED","SS-BOUNDARY_R3","BOUNDARY"};
var counts = want.ToDictionary(w=>w, w=>0, StringComparer.OrdinalIgnoreCase);
var ms = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead);
foreach (ObjectId id in ms)
{
var ent = tr.GetObject(id, OpenMode.ForRead) as Entity;
if (ent != null && counts.ContainsKey(ent.Layer)) counts[ent.Layer]++;
}
Log("HERO-CANDIDATE LAYER ENTITY COUNTS (model space):");
foreach (var kv in counts) Log($" {kv.Key}: {kv.Value}");
tr.Commit();
}
Result
Notes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.