C3D-LAYERCHECK · Find TBC point layer + existing curb linework layers done
Read-only: which layer TBC points sit on, and any existing curb/EOP-named layers, so new curb linework lands on the correct existing layer.
C# payload
// READ-ONLY: find the layer TBC points live on, and any existing curb/EOP-type linework layers,
// so new curb polylines land on the correct existing layer instead of a made-up one.
using System;
using System.Linq;
using System.Collections.Generic;
using Autodesk.Civil.ApplicationServices;
using Autodesk.Civil.DatabaseServices;
using Autodesk.AutoCAD.DatabaseServices;
var db = Db;
var cdoc = CivilDocument.GetCivilDocument(db);
using (var tr = db.TransactionManager.StartTransaction())
{
// 1) what layer(s) do TBC-family points sit on?
var tbcLayers = new Dictionary<string,int>(StringComparer.OrdinalIgnoreCase);
foreach (ObjectId id in cdoc.CogoPoints)
{
var cp = tr.GetObject(id, OpenMode.ForRead) as CogoPoint;
if (cp == null) continue;
var raw = (cp.RawDescription ?? "").Trim().ToUpperInvariant();
if (!raw.StartsWith("TBC")) continue;
var lyr = cp.Layer ?? "(null)";
tbcLayers[lyr] = tbcLayers.TryGetValue(lyr, out var c) ? c+1 : 1;
}
Log("TBC point layers:");
foreach (var kv in tbcLayers.OrderByDescending(k => k.Value))
Log($" {kv.Value,4} '{kv.Key}'");
// 2) list ALL layers in the drawing whose name suggests curb/EOP/edge-of-pavement linework
var lt = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead);
Log("Layers matching curb/EOP/edge/paving keywords:");
foreach (ObjectId lid in lt)
{
var ltr = (LayerTableRecord)tr.GetObject(lid, OpenMode.ForRead);
var name = ltr.Name;
if (name.IndexOf("CURB", StringComparison.OrdinalIgnoreCase) >= 0
|| name.IndexOf("EOP", StringComparison.OrdinalIgnoreCase) >= 0
|| name.IndexOf("EDGE", StringComparison.OrdinalIgnoreCase) >= 0
|| name.IndexOf("PAV", StringComparison.OrdinalIgnoreCase) >= 0
|| name.IndexOf("TBC", StringComparison.OrdinalIgnoreCase) >= 0)
Log($" '{name}'");
}
// 3) any existing polylines/lines already on those TBC point layers (proof pattern already exists)?
var ms = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead);
var lineLayers = new Dictionary<string,int>(StringComparer.OrdinalIgnoreCase);
foreach (ObjectId id in ms)
{
var e = tr.GetObject(id, OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Entity;
if (e == null) continue;
if (e is Polyline || e is Polyline3d || e is Line)
{
var lyr = e.Layer;
if (lyr.IndexOf("CURB", StringComparison.OrdinalIgnoreCase) >= 0
|| lyr.IndexOf("EOP", StringComparison.OrdinalIgnoreCase) >= 0
|| lyr.IndexOf("TBC", StringComparison.OrdinalIgnoreCase) >= 0)
lineLayers[lyr] = lineLayers.TryGetValue(lyr, out var c) ? c+1 : 1;
}
}
Log("Existing curb/TBC-named linework by layer:");
foreach (var kv in lineLayers.OrderByDescending(k => k.Value))
Log($" {kv.Value,4} '{kv.Key}'");
tr.Commit();
}
Result
Log
TBC point layers:
299 '0'
Layers matching curb/EOP/edge/paving keywords:
'SS-V-ROAD-CURB'
'X-ROAD-CURB'
Existing curb/TBC-named linework by layer:
33 'SS-V-ROAD-CURB'Notes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.