C3D-INSP619B · Which 2 tracts are subject + neighbors (read-only) done
Parcel centroids + tract/N-F adjoiner/road labels with positions, to identify the 2 subject tracts and their adjoiners.
C# payload
// READ-ONLY: which tracts are the SUBJECT (2 of them) and who are the neighbors.
// - each Parcel: number, name, area, centroid
// - each tract-area text label + its position
// - each N/F adjoiner label + position (so we can match neighbor -> which tract it abuts)
// - the "subject"/"boundary line" style hints
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)}");
// parcels with centroid
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} style='{p.StyleName}'");
}
}
tr.Commit();
}
// all text labels of interest with position
using (var tr = db.TransactionManager.StartTransaction())
{
var ms = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead);
var tracts = new List<string>();
var nf = new List<string>();
var roads = new List<string>();
foreach (ObjectId id in ms)
{
var e = tr.GetObject(id, OpenMode.ForRead);
string s=null; Point3d pos=Point3d.Origin;
if(e is DBText t){ s=t.TextString; pos=t.Position; }
else if(e is MText m){ s=m.Text; pos=m.Location; }
if(string.IsNullOrWhiteSpace(s)) continue;
var u=s.ToUpperInvariant().Replace("\n"," ");
string tag=$"({pos.X:0.0},{pos.Y:0.0})";
string flat=s.Replace("\n"," ").Trim();
if(u.Contains("TRACT")) tracts.Add($"{tag} {flat}");
else if(u.Contains("N/F")) nf.Add($"{tag} {flat}");
else if(u.Contains("ROAD")||u.Contains("DRIVE")||u.Contains("R/W")) roads.Add($"{tag} {flat}");
}
Log($"TRACT LABELS ({tracts.Count}):"); foreach(var x in tracts.Distinct()) Log($" {x}");
Log($"N/F ADJOINER LABELS ({nf.Count}):"); foreach(var x in nf.Distinct()) Log($" {x}");
Log($"ROAD / R-W LABELS ({roads.Count}):"); foreach(var x in roads.Distinct()) Log($" {x}");
tr.Commit();
}
Result
Log
ACTIVE: 260619 - 3625 Stonewall Tell Rd.dwg PARCEL #5 'TRACT B' 3.314ac centroid=(2166690.5,1330383.0) style='Property' PARCEL #6 'TRACT A' 0.994ac centroid=(2166746.4,1330613.6) style='Property' TRACT LABELS (4): (2166772.4,1330561.7) TRACT "A" AREA 43,299 sq.ft. 0.99 acres (2166608.7,1330445.1) TRACT "B" AREA 144,347 sq.ft. 3.31 acres (2166936.0,1330261.0) TRACT "D" AREA 119,893 sq.ft. 2.75 acres (2167015.5,1330665.4) NORTH TRACT CALLS FOR 50' R/W STONEWALL TELL ROAD DB 30122 - PG 413 N/F ADJOINER LABELS (3): (2166050.0,1331000.0) N/F BOBBY WALKER DB 32512 - PG 402 MARCH 11, 2002 (2166790.1,1330945.1) N/F LATISSA NECOLE THOMAS & DANIEL WEBSTER WHITE JANUARY 30, 2001 (2167018.2,1330800.7) N/F JEFFERY L. VAUGHAN APRIL 30, 2001 DB 30326 - PG 474 DB 16958 - PG 165 - NOT REFERENCED ROAD / R-W LABELS (5): (2166875.6,1330482.3) STONEWALL TELL ROAD (R/W VARIES) (2166741.9,1330863.3) DEMONEY ROAD (R/W VARIES) (2166583.4,1330010.5) NEWBORN DRIVE SW (R/W VARIES) (2166587.1,1330107.4) LINE PER SPECIAL USE PERMIT DESCRIPTION (693' SOUTH PARALLEL LLL TO NEWBORN DRIVE) (2166751.7,1330472.5) ASPHALT DRIVE
Notes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.