← Inbox

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.

Script file
C3D-LAYERCHECK.cs
Target
active document · model space
Author
claude
Approved
yes · auto-auth
Timeout
60s

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

Status
success
Drawing file
C:\Users\sanja\OneDrive\_SurveyDisco\260709 - 1512 Bass Rd, Macon, GA 31210, USA\260709 - 1512 Bass Rd.dwg
Message
Executed C3D-LAYERCHECK (0 entities touched).
Entities
Duration
341 ms
Civil 3D
25.0.0.0

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.