C3D-0049 · READ-ONLY: layer audit data - points by description, entities by layer [LAYER-AUDIT] done
Groups all CogoPoints by raw description and the layer they sit on (so the correct-layer mapping can be read from points already placed correctly), and lists every non-point entity on the 29 used layers by type with samples. No changes.
C# payload
// READ-ONLY. Layer audit data for "is everything on the correct layer".
//
// Part 1: the 524 CogoPoints on layer 0 - grouped by raw description, since the description is
// what decides which layer a point belongs on. Points already on a named layer are listed too,
// so the correct-layer mapping can be read off what is ALREADY right rather than invented.
// Part 2: every non-point entity on the 29 used layers, by layer and type, with a sample.
// Nothing is modified. No layer is changed. This only reports.
var ms = (BlockTableRecord)Tx.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(Db), OpenMode.ForRead);
// ---- Part 1: CogoPoints by (layer, description) ----
var byDesc = new Dictionary<string, Dictionary<string,int>>(); // desc -> layer -> count
int npts = 0;
foreach (ObjectId id in ms) {
var cp = Tx.GetObject(id, OpenMode.ForRead) as CogoPoint;
if (cp == null) continue;
npts++;
string d = (cp.RawDescription ?? "").Trim().ToUpper();
if (d.Length == 0) d = "<blank>";
string lay = cp.Layer;
if (!byDesc.ContainsKey(d)) byDesc[d] = new Dictionary<string,int>();
if (!byDesc[d].ContainsKey(lay)) byDesc[d][lay] = 0;
byDesc[d][lay]++;
}
Log("=== COGO POINTS: " + npts + " total, by DESCRIPTION -> layer(count) ===");
var descs = new List<string>(byDesc.Keys);
descs.Sort();
foreach (var d in descs) {
var parts = new List<string>();
int tot = 0;
foreach (var kv in byDesc[d]) { parts.Add(kv.Key + "(" + kv.Value + ")"); tot += kv.Value; }
Log(String.Format(" {0,-16} n={1,-4} {2}", d, tot, String.Join(" ", parts)));
}
// ---- Part 2: non-point entities on the used non-PDF/C- layers ----
var KEEP = new HashSet<string>(new string[] {
"0","BLOCK_CLOSURE","BLOCK_NORTH_ARROW","PROPERTY_LINE","ROAD_EDGE_OF_PAVEMENT",
"ROAD_RIGHT-OF-WAY","SEWER_EASEMENT","SEWER_EASEMENT_20","SEWER_EASEMENT_TEXT",
"SEWER_LINE","SEWER_LINE_TEXT","SEWER_MANHOLE","SEWER_MANHOLE_EXISTING",
"SEWER_MANHOLE_TEXT","SS-0-FRAME","SS-BOUNDARY","SS-BOUNDARY LAND LOT",
"SS-ROAD-BUILDING","SS-ROAD-CANOPY","SS-ROAD-CL","SS-ROAD-DUMPSTER",
"SS-ROAD-GUARDRAIL","SS-ROAD-SIDEWALK","SS-ROAD-STRIPE","SS-ROAD-TBC",
"V-CTRL-LINE-SHOT","V-CTRL-TEXT","WATER_VALVE","WATER_VAULT" });
Log("");
Log("=== NON-POINT ENTITIES on the 29 used layers ===");
var rows = new Dictionary<string, List<string>>(); // "layer|type" -> samples
var cnts = new Dictionary<string, int>();
foreach (ObjectId id in ms) {
Autodesk.AutoCAD.DatabaseServices.DBObject o;
try { o = Tx.GetObject(id, OpenMode.ForRead); } catch { continue; }
if (o is CogoPoint) continue;
var ent = o as Autodesk.AutoCAD.DatabaseServices.Entity;
if (ent == null || !KEEP.Contains(ent.Layer)) continue;
string key = ent.Layer + "|" + o.GetType().Name;
if (!cnts.ContainsKey(key)) { cnts[key] = 0; rows[key] = new List<string>(); }
cnts[key]++;
if (rows[key].Count < 3) {
string samp = "[" + o.Handle + "]";
var mt = o as MText; if (mt != null) samp += " \"" + (mt.Contents.Length > 40 ? mt.Contents.Substring(0,40) : mt.Contents).Replace("\n"," ") + "\"";
var dt = o as DBText; if (dt != null) samp += " \"" + dt.TextString + "\"";
var pl = o as Polyline; if (pl != null) samp += String.Format(" verts={0} len={1:F1} closed={2}", pl.NumberOfVertices, pl.Length, pl.Closed);
var ln = o as Line; if (ln != null) samp += String.Format(" len={0:F1}", ln.Length);
var br = o as BlockReference; if (br != null) samp += " block=" + br.Name;
rows[key].Add(samp);
}
}
var keys = new List<string>(cnts.Keys);
keys.Sort();
foreach (var k in keys) {
var bits = k.Split('|');
Log(String.Format(" {0,-24} {1,-22} n={2}", bits[0], bits[1], cnts[k]));
foreach (var s in rows[k]) Log(" " + s);
}
Result
Log
=== COGO POINTS: 564 total, by DESCRIPTION -> layer(count) ===
<blank> n=1 0(1)
1 IN BLUE WATER LINE STUB n=1 0(1)
1 IN WATER LINE n=1 0(1)
18 CON PIPEINV 6.1 TO TOP OF BOX n=1 0(1)
2 IN PVC LINE n=1 0(1)
2 IN RPZ BFP COR n=4 0(4)
24IN RIDGED INV 9.42 WITH SILT n=1 0(1)
24IN RIDGED PIPE INV TO 18 PIPE INV 5.3 BOT 11.1 n=1 0(1)
2X1 TRAFIC SIG BX n=1 SS-0-FRAME(1)
40EASEMENT n=2 0(2)
6 IN BOL n=19 0(19)
6 IN PVC STUB n=1 0(1)
AC n=5 0(5)
BLDG COR SW n=4 0(4)
BLDG COR CON TBC START n=1 0(1)
BOX COR n=3 0(3)
CL n=20 0(20)
CL YELLOW LINE SPLITS n=1 0(1)
CLEAN OUT n=5 0(5)
CON n=3 0(3)
CON COR CANOPY n=2 0(2)
CON EP n=9 0(9)
CON EP CANOPY n=2 0(2)
CON PAD n=8 0(8)
CON PAD VAULT n=1 0(1)
CON VAC\AIR n=1 0(1)
CROSS WALK SIG n=1 SS-0-FRAME(1)
CURB CUT BACK CON GUTTER n=5 0(5)
DI n=7 0(7)
DI 18 CON PIPE INV 4.73 n=1 0(1)
DI 18 METAL PIPE INV 3.73 n=1 0(1)
DI 18 METAL PIPE INV 3.95 n=1 0(1)
DI 18 PIPE INV 3.4 n=1 0(1)
DI 2FT ROUND INV 10.11 n=1 0(1)
DI INV BOT 5.08 18 CON PIPE n=1 0(1)
DOT SIG BOX 4X4 n=1 SS-0-FRAME(1)
DUMP STER COR n=3 0(3)
DUMPSTER COR TBC n=1 0(1)
ELEC POWERBMETER AND STUT OFF n=1 0(1)
ELEC STUB n=4 0(4)
END CON n=2 0(2)
EP n=37 0(37)
EP CON n=2 0(2)
EP CON COR n=4 0(4)
EP DUMPSTER WALL n=1 0(1)
EP TBC n=1 0(1)
FH n=4 WATER_VALVE(4)
G RAIL n=4 0(4)
G WIRE n=5 0(5)
GREASE TRAP n=5 0(5)
GREASE TRAP 6 PVC 6.52 INV 7.77 n=1 0(1)
GREASE TRAP ASPHALT OVER n=1 0(1)
GUTTER n=3 0(3)
GUTTER END TBC n=1 0(1)
H CAP SIGN n=2 0(2)
HANDY CAP n=2 0(2)
HC07-05 n=1 0(1)
HC07-06 n=1 0(1)
IPF n=5 0(5)
LAT n=1 0(1)
MAIN VAVLE n=1 0(1)
MH n=1 SS-0-FRAME(1)
OHP n=3 0(3)
P STRIPE n=9 0(9)
P STRIPE CON EP n=8 0(8)
P STRIPE SW n=7 0(7)
PP n=1 0(1)
PP AND ELECT STUB n=1 0(1)
R/W n=3 0(3)
RAMP n=4 0(4)
RT LANE BIKE ONLY SIGN n=1 SS-0-FRAME(1)
SIG POLE n=1 SS-0-FRAME(1)
SIGN n=1 0(1)
SSMH n=6 SEWER_MANHOLE(4) SS-0-FRAME(2)
SSMH A1 n=1 SEWER_MANHOLE(1)
SSMH A10 n=1 SEWER_MANHOLE(1)
SSMH A2 n=1 SEWER_MANHOLE(1)
SSMH A3 n=1 SEWER_MANHOLE(1)
SSMH A4 n=1 SEWER_MANHOLE(1)
SSMH A5 n=1 SEWER_MANHOLE(1)
SSMH A6 n=1 SEWER_MANHOLE(1)
SSMH INV 10.28 n=1 SS-0-FRAME(1)
SSMH INV 12.22 n=1 SS-0-FRAME(1)
SSMH INV 12.65 n=1 SS-0-FRAME(1)
SSMH INV 9.45 n=1 SS-0-FRAME(1)
SSMH MAIN n=1 SEWER_MANHOLE_EXISTING(1)
SSMH TEST MH n=2 SEWER_MANHOLE(2)
SW n=6 0(6)
SW P STRIPE n=8 0(8)
SW BLDG LINE n=1 0(1)
SW COR n=2 0(2)
SW END n=2 0(2)
SW RAMP n=4 0(4)
SW TBC COR n=1 0(1)
TBC n=152 0(152)
TBC COR n=1 0(1)
TBC DUMP WALL n=1 0(1)
TBC DWY n=2 0(2)
TBC END n=2 0(2)
TBC END EP n=4 0(4)
TBC EP n=2 0(2)
TBC SW n=3 0(3)
TBC SW COR n=2 0(2)
TBC SW CROSS WALK n=2 0(2)
TBC SW WATER TO BLDG n=1 0(1)
TBC WALL n=4 0(4)
TBM n=1 0(1)
TRAFFIC SIG BX n=2 SS-0-FRAME(2)
TURN LANE n=6 0(6)
TURNING LANE n=3 0(3)
UTIL POLE n=1 0(1)
VAULT n=4 0(4)
VAULT COR n=6 0(6)
WATER n=1 0(1)
WATER LINE n=13 0(13)
WATER LINE AT CROSS WALK n=1 0(1)
WATER LINE AT CROSS WALK n=1 0(1)
WATER LINE MARK FOR NEW LINE TO BLDG n=1 0(1)
WATER LINE STUB n=2 0(2)
WATER LINE TO BLDG n=1 0(1)
WATER STUB n=1 0(1)
WATER V STUB n=1 0(1)
WATER VAULT n=2 0(2)
WHITE LINE n=14 0(14)
WHITE LINE END n=1 0(1)
WHITE LINE ENDS n=1 0(1)
WHITE LINE TURNING LANE n=2 0(2)
WV n=8 WATER_VALVE(8)
WV STUB n=1 0(1)
YELLOW LINE n=18 0(18)
=== NON-POINT ENTITIES on the 29 used layers ===
0 PdfReference n=1
[23B6B]
PROPERTY_LINE Polyline n=1
[2E1D3] verts=8 len=1913.6 closed=True
ROAD_EDGE_OF_PAVEMENT Hatch n=1
[2F280]
ROAD_EDGE_OF_PAVEMENT Line n=7
[2E421] len=18.2
[2E423] len=23.6
[2E424] len=26.7
ROAD_EDGE_OF_PAVEMENT Polyline n=5
[23A31] verts=5 len=117.3 closed=False
[23A32] verts=7 len=155.9 closed=False
[23A39] verts=7 len=27.1 closed=False
ROAD_RIGHT-OF-WAY Line n=3
[2E1FD] len=195.9
[2F27D] len=229.9
[2F27E] len=229.9
ROAD_RIGHT-OF-WAY Polyline n=1
[2E434] verts=3 len=104.5 closed=False
SEWER_EASEMENT_20 ParcelSegment n=1
[2F0E1]
SEWER_EASEMENT_TEXT ParcelSegmentLabel n=29
[2EE59]
[2EE5A]
[2EE5B]
SEWER_EASEMENT Polyline n=2
[2EE30] verts=19 len=1663.3 closed=True
[2EEB6] verts=8 len=1248.5 closed=True
SEWER_EASEMENT Site n=1
[23922]
SEWER_LINE_TEXT MText n=28
[2EF4E] "12.07'"
[2EF4F] "131.42'"
[2EF50] "133.04'"
SEWER_LINE Line n=14
[2E95F] len=12.1
[2EC86] len=132.5
[2EC87] len=133.2
SEWER_MANHOLE_TEXT Leader n=5
[2EDAA]
[2EDAF]
[2EDB3]
SEWER_MANHOLE_TEXT MText n=21
[2ED70] "MH A16\PRIM 751.17\PIN N/A\POUT N/A"
[2ED72] "MH A14\PRIM 734.14\PIN 722.02\POUT "
[2ED74] "MH A12\PRIM 727.40\PIN N/A\POUT N/A"
SS-0-FRAME MText n=2
[2E305] "FFE:728.5"
[2E308] "F.F.E.=728.50"
SS-0-FRAME Polyline n=5
[23A40] verts=7 len=244.0 closed=False
[23AEA] verts=5 len=33.7 closed=False
[2EDE9] verts=4 len=36.9 closed=True
SS-BOUNDARY Parcel n=1
[2F0E0]
SS-BOUNDARY Polyline n=2
[2F0C3] verts=27 len=2871.3 closed=True
[2F0C7] verts=27 len=2871.3 closed=True
SS-BOUNDARY Site n=2
[2E1E9]
[2F0DE]
SS-ROAD-BUILDING Polyline n=1
[23A3B] verts=6 len=354.5 closed=True
SS-ROAD-CANOPY Polyline n=1
[23A3E] verts=5 len=302.7 closed=False
SS-ROAD-CL Line n=1
[2E1FC] len=198.0
SS-ROAD-CL Polyline n=3
[23A22] verts=8 len=230.1 closed=False
[23A23] verts=9 len=518.6 closed=False
[23A24] verts=3 len=110.8 closed=False
SS-ROAD-DUMPSTER Polyline n=1
[23A3D] verts=6 len=58.8 closed=True
SS-ROAD-GUARDRAIL Polyline n=1
[23A3A] verts=4 len=150.2 closed=False
SS-ROAD-SIDEWALK Polyline n=2
[23A33] verts=5 len=400.7 closed=False
[23A34] verts=36 len=344.4 closed=False
SS-ROAD-STRIPE Polyline n=42
[23A51] verts=2 len=17.8 closed=False
[23A52] verts=2 len=16.9 closed=False
[23A53] verts=2 len=17.8 closed=False
SS-ROAD-TBC Arc n=8
[2ED4C]
[2ED4D]
[2ED4F]
SS-ROAD-TBC Line n=14
[2ED4E] len=139.4
[2ED50] len=48.3
[2ED52] len=14.0
SS-ROAD-TBC Polyline n=55
[23ADA] verts=9 len=188.6 closed=False
[23ADB] verts=9 len=146.1 closed=False
[23ADE] verts=3 len=70.8 closed=False
V-CTRL-LINE-SHOT Leader n=2
[2EDFE]
[2EE00]
V-CTRL-TEXT MText n=2
[2EDFF] "S43\U+00B0 30' 29"E 9725.42 TO CC HC07-0"
[2EE01] "S12\U+00B0 39' 08"W 11339.24 TO CC HC07-"
WATER_VAULT Polyline n=2
[2E2BD] verts=4 len=28.6 closed=True
[2E2BE] verts=4 len=41.4 closed=TrueNotes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.