C3D-0058 · READ-ONLY: all water items and their layers [WATER-AUDIT] done
Lists every water-related CogoPoint (WATER/WV/FH/VALVE/METER/VAULT/BFP/RPZ/HYDRANT/BOL/TAP in the description) with point number, description and layer, plus a per-layer tally, and every entity sitting on a WATER* layer by type. No changes.
C# payload
// READ-ONLY. Every water-related item and the layer it is on.
//
// Two passes:
// 1) CogoPoints whose description mentions WATER / WV / FH / VALVE / METER / VAULT / BFP / RPZ
// / HYDRANT / BOL, listed individually with point number, description and layer.
// 2) Every entity (any type) sitting on a layer whose name contains WATER, so linework and text
// already on water layers is covered too.
// Nothing is modified.
var ms = (BlockTableRecord)Tx.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(Db), OpenMode.ForRead);
Func<Func<string>, string> safe = f => { try { return f(); } catch (System.Exception ex) { return "<" + ex.GetType().Name + ">"; } };
string[] KEYS = new string[] { "WATER", "WV", "FH", "VALVE", "VAVLE", "METER", "VAULT",
"BFP", "RPZ", "HYDRANT", "BOL", "TAP" };
var ptRows = new List<string>();
var ptByLayer = new Dictionary<string,int>();
foreach (ObjectId id in ms) {
CogoPoint cp = null;
try { cp = Tx.GetObject(id, OpenMode.ForRead) as CogoPoint; } catch { continue; }
if (cp == null) continue;
string d = safe(() => (cp.RawDescription ?? "")).Trim();
string u = " " + d.ToUpper() + " ";
bool hit = false;
foreach (string k in KEYS) {
// word-ish match so "SW" does not catch on "WV" etc.
if (u.IndexOf(" " + k + " ") >= 0 || u.IndexOf(k) >= 0 && k.Length > 2) { hit = true; break; }
}
if (!hit) continue;
string lay = safe(() => cp.Layer);
if (!ptByLayer.ContainsKey(lay)) ptByLayer[lay] = 0;
ptByLayer[lay]++;
ptRows.Add(String.Format(" pt {0,-6} {1,-42} {2}", safe(() => cp.PointNumber.ToString()), d, lay));
}
ptRows.Sort();
Log("=== WATER-RELATED POINTS (" + ptRows.Count + ") ===");
foreach (var r in ptRows) Log(r);
Log("");
Log(" -- by layer --");
foreach (var kv in ptByLayer) Log(" " + kv.Key + " : " + kv.Value);
// pass 2: anything on a WATER* layer
Log("");
Log("=== ENTITIES ON WATER* LAYERS ===");
var byLay = new Dictionary<string, Dictionary<string,int>>();
foreach (ObjectId id in ms) {
Autodesk.AutoCAD.DatabaseServices.DBObject o;
try { o = Tx.GetObject(id, OpenMode.ForRead); } catch { continue; }
var ent = o as Autodesk.AutoCAD.DatabaseServices.Entity;
if (ent == null) continue;
string lay = safe(() => ent.Layer);
if (lay.ToUpper().IndexOf("WATER") < 0) continue;
string tn = o.GetType().Name;
if (!byLay.ContainsKey(lay)) byLay[lay] = new Dictionary<string,int>();
if (!byLay[lay].ContainsKey(tn)) byLay[lay][tn] = 0;
byLay[lay][tn]++;
}
var lays = new List<string>(byLay.Keys); lays.Sort();
foreach (var l in lays) {
var parts = new List<string>();
foreach (var kv in byLay[l]) parts.Add(kv.Key + ":" + kv.Value);
Log(" " + l + " [" + String.Join(" ", parts) + "]");
}
Result
Log
=== WATER-RELATED POINTS (76) ===
pt 1085 WATER 0
pt 1115 FH WATER_VALVE
pt 1116 WV WATER_VALVE
pt 1117 WV WATER_VALVE
pt 1118 VAULT COR 0
pt 1119 WATER VAULT 0
pt 1120 VAULT COR 0
pt 1121 VAULT COR 0
pt 1122 2 IN RPZ BFP COR 0
pt 1123 2 IN RPZ BFP COR 0
pt 1124 2 IN RPZ BFP COR 0
pt 1125 2 IN RPZ BFP COR 0
pt 1126 VAULT COR 0
pt 1127 VAULT COR 0
pt 1128 VAULT COR 0
pt 1129 WATER VAULT 0
pt 1134 1 IN BLUE WATER LINE STUB 0
pt 1136 1 IN WATER LINE 0
pt 1137 WATER LINE TO BLDG 0
pt 1138 WATER LINE MARK FOR NEW LINE TO BLDG 0
pt 224 6 IN BOL 0
pt 225 6 IN BOL 0
pt 226 6 IN BOL 0
pt 233 6 IN BOL 0
pt 234 6 IN BOL 0
pt 244 6 IN BOL 0
pt 245 6 IN BOL 0
pt 246 6 IN BOL 0
pt 247 6 IN BOL 0
pt 249 6 IN BOL 0
pt 254 6 IN BOL 0
pt 256 6 IN BOL 0
pt 257 6 IN BOL 0
pt 258 6 IN BOL 0
pt 259 6 IN BOL 0
pt 260 6 IN BOL 0
pt 261 6 IN BOL 0
pt 262 6 IN BOL 0
pt 263 6 IN BOL 0
pt 345 WATER LINE STUB 0
pt 356 TBC SW WATER TO BLDG 0
pt 393 ELEC POWERBMETER AND STUT OFF 0
pt 406 WATER STUB 0
pt 408 FH WATER_VALVE
pt 409 WV WATER_VALVE
pt 432 WATER LINE STUB 0
pt 440 MAIN VAVLE 0
pt 441 CON PAD VAULT 0
pt 447 VAULT 0
pt 448 VAULT 0
pt 449 VAULT 0
pt 450 VAULT 0
pt 465 WV WATER_VALVE
pt 477 WATER LINE 0
pt 481 WATER LINE 0
pt 484 WATER LINE 0
pt 487 WATER LINE 0
pt 490 WATER LINE 0
pt 493 WATER LINE 0
pt 496 WATER LINE 0
pt 499 WATER LINE 0
pt 501 WV WATER_VALVE
pt 502 FH WATER_VALVE
pt 503 WATER LINE 0
pt 507 WV WATER_VALVE
pt 508 WV STUB 0
pt 509 WV WATER_VALVE
pt 511 WATER LINE 0
pt 512 WATER LINE AT CROSS WALK 0
pt 518 WATER LINE 0
pt 528 WATER LINE 0
pt 531 WATER LINE 0
pt 533 WATER LINE AT CROSS WALK 0
pt 537 FH WATER_VALVE
pt 538 WATER V STUB 0
pt 539 WV WATER_VALVE
-- by layer --
0 : 64
WATER_VALVE : 12
=== ENTITIES ON WATER* LAYERS ===
WATER_VALVE [CogoPoint:12]
WATER_VAULT [Polyline:2]Notes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.