C3D-ROAD619 · Road: TBC curb + CL + label done
Curb runs (END-broken), centerline, road name text from survey points
C# payload
// Draw road linework from survey points: TBC curb runs (break at 'END'), CL centerline, road label.
var bt = (BlockTable)Tx.GetObject(Db.BlockTableId, OpenMode.ForRead);
var ms = (BlockTableRecord)Tx.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
var cd = CivilDoc; var cps = cd.CogoPoints;
List<(uint num, Point2d p, string d)> Grp(string name) {
var list = new List<(uint, Point2d, string)>();
foreach (ObjectId gid in cd.PointGroups) {
var pg = (Autodesk.Civil.DatabaseServices.PointGroup)Tx.GetObject(gid, OpenMode.ForRead);
if (pg.Name != name) continue;
foreach (var pn in pg.GetPointNumbers()) { try { var cp = (Autodesk.Civil.DatabaseServices.CogoPoint)Tx.GetObject(cps.GetPointByPointNumber(pn), OpenMode.ForRead); list.Add((pn, new Point2d(cp.Easting, cp.Northing), cp.RawDescription ?? "")); } catch {} }
}
return list;
}
ObjectId AddPl(List<Point2d> pts, string layer) {
var pl = new Polyline(); for (int i = 0; i < pts.Count; i++) pl.AddVertexAt(i, pts[i], 0, 0, 0);
pl.Layer = layer; ms.AppendEntity(pl); Tx.AddNewlyCreatedDBObject(pl, true); return pl.ObjectId;
}
// --- TBC curb: connect in point-number order, new run at each 'END' ---
EnsureLayer("SS-V-ROAD-CURB", 1);
var tbc = Grp("TBC").OrderBy(x => x.num).ToList();
int runs = 0; var cur = new List<Point2d>();
foreach (var t in tbc) {
cur.Add(t.p);
if (t.d.ToUpperInvariant().Contains("END")) { if (cur.Count >= 2) { AddPl(cur, "SS-V-ROAD-CURB"); runs++; } cur = new List<Point2d>(); }
}
if (cur.Count >= 2) { AddPl(cur, "SS-V-ROAD-CURB"); runs++; }
Log($"TBC: {runs} curb run(s) drawn on SS-V-ROAD-CURB");
// --- Road CL: main through-road points, sorted N->S (drop far-west spur) ---
EnsureLayer("SS-V-ROAD-CNTR", 3);
var cl = Grp("CL").Where(x => x.p.X >= 2166550).OrderByDescending(x => x.p.Y).Select(x => x.p).ToList();
if (cl.Count >= 2) { AddPl(cl, "SS-V-ROAD-CNTR"); Log($"CL: {cl.Count} pts -> centerline on SS-V-ROAD-CNTR"); }
// --- Road name text along CL ---
if (cl.Count >= 2) {
var n0 = cl[0]; var nL = cl[cl.Count - 1];
double rot = System.Math.Atan2(n0.Y - nL.Y, n0.X - nL.X); // south->north, reads upward
var m = cl[cl.Count / 2];
var mt = new MText { Location = new Point3d(m.X, m.Y, 0), Contents = "STONEWALL TELL ROAD", TextHeight = 8, Rotation = rot, Attachment = AttachmentPoint.MiddleCenter };
mt.Layer = "C-ANNO"; ms.AppendEntity(mt); Tx.AddNewlyCreatedDBObject(mt, true);
Log("Road label 'STONEWALL TELL ROAD' added on C-ANNO");
}
Log("Road linework complete.");
Result
Log
TBC: 4 curb run(s) drawn on SS-V-ROAD-CURB CL: 21 pts -> centerline on SS-V-ROAD-CNTR Road label 'STONEWALL TELL ROAD' added on C-ANNO Road linework complete.
Notes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.