C3D-0060 · Move water points to FIRE_HYDRANT and WATER_LINE [MOVE-WATER-PTS] done
Per the numbered decisions: FH (4) to FIRE_HYDRANT; WATER LINE, its variants, 2 IN RPZ BFP COR, the stubs/MAIN VAVLE and TBC SW WATER TO BLDG (31) to WATER_LINE. WV, bollards, vaults and the WATER_VAULT polylines are left alone; pt 393 ELEC stays on 0 as no electrical layer exists. Matched by exact description, idempotent, reads back to verify.
C# payload
// Move water points to their correct layers, per the user's numbered decisions.
//
// 2) FH -> FIRE_HYDRANT (4 pts)
// 4) WATER LINE -> WATER_LINE (13 pts)
// 6) WATER LINE variants -> WATER_LINE (10 pts)
// 7) 2 IN RPZ BFP COR -> WATER_LINE (4 pts)
// 9) WATER STUB / WV STUB /
// WATER V STUB / MAIN VAVLE -> WATER_LINE (4 pts)
// 10) TBC SW WATER TO BLDG -> WATER_LINE (1 pt)
//
// NOT moved (user: n/a): WV, 6 IN BOL, VAULT/VAULT COR, WATER VAULT, the WATER_VAULT polylines.
// NOT moved: pt 393 ELEC POWERBMETER - no electrical layer exists, stays on 0 per item 11.
//
// Points are matched by EXACT description, taken from the audit - not by substring, so
// "WATER VAULT" cannot be caught by a "WATER" rule and "WV STUB" cannot be caught by "WV".
// Both target layers already exist (verified C3D-0059). Idempotent: a point already on its
// target layer is skipped, so a re-run is a no-op. Reads back and verifies before finishing.
var FH = new HashSet<string>(new string[] { "FH" });
var LINE = new HashSet<string>(new string[] {
"WATER LINE",
"WATER LINE STUB", "WATER LINE TO BLDG", "WATER LINE AT CROSS WALK",
"WATER LINE AT CROSS WALK", "WATER LINE MARK FOR NEW LINE TO BLDG",
"1 IN BLUE WATER LINE STUB", "1 IN WATER LINE",
"2 IN RPZ BFP COR",
"WATER STUB", "WV STUB", "WATER V STUB", "MAIN VAVLE",
"TBC SW WATER TO BLDG",
});
var ms = (BlockTableRecord)Tx.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(Db), OpenMode.ForRead);
var lt = (LayerTable)Tx.GetObject(Db.LayerTableId, OpenMode.ForRead);
if (!lt.Has("FIRE_HYDRANT")) { Log("ABORT: FIRE_HYDRANT missing"); return; }
if (!lt.Has("WATER_LINE")) { Log("ABORT: WATER_LINE missing"); return; }
int movedFh = 0, movedLine = 0, skipped = 0;
foreach (ObjectId id in ms) {
var cp0 = Tx.GetObject(id, OpenMode.ForRead) as CogoPoint;
if (cp0 == null) continue;
string d = (cp0.RawDescription ?? "").Trim().ToUpper();
string target = null;
if (FH.Contains(d)) target = "FIRE_HYDRANT";
else if (LINE.Contains(d)) target = "WATER_LINE";
if (target == null) continue;
if (cp0.Layer == target) { skipped++; continue; } // idempotent
var cp = (CogoPoint)Tx.GetObject(id, OpenMode.ForWrite);
string was = cp.Layer;
cp.Layer = target;
if (target == "FIRE_HYDRANT") movedFh++; else movedLine++;
Log(String.Format(" pt {0,-6} {1,-40} {2} -> {3}", cp.PointNumber, d, was, target));
}
Log("");
Log("moved to FIRE_HYDRANT: " + movedFh + " moved to WATER_LINE: " + movedLine + " already correct: " + skipped);
// verify by re-reading
int vf = 0, vl = 0;
foreach (ObjectId id in ms) {
var cp = Tx.GetObject(id, OpenMode.ForRead) as CogoPoint;
if (cp == null) continue;
if (cp.Layer == "FIRE_HYDRANT") vf++;
if (cp.Layer == "WATER_LINE") vl++;
}
Log("read back: FIRE_HYDRANT holds " + vf + " points, WATER_LINE holds " + vl + " points (verified)");
Ed.Regen();
Result
Log
pt 345 WATER LINE STUB 0 -> WATER_LINE pt 356 TBC SW WATER TO BLDG 0 -> WATER_LINE pt 406 WATER STUB 0 -> WATER_LINE pt 408 FH WATER_VALVE -> FIRE_HYDRANT pt 432 WATER LINE STUB 0 -> WATER_LINE pt 440 MAIN VAVLE 0 -> WATER_LINE pt 477 WATER LINE 0 -> WATER_LINE pt 481 WATER LINE 0 -> WATER_LINE pt 484 WATER LINE 0 -> WATER_LINE pt 487 WATER LINE 0 -> WATER_LINE pt 490 WATER LINE 0 -> WATER_LINE pt 493 WATER LINE 0 -> WATER_LINE pt 496 WATER LINE 0 -> WATER_LINE pt 499 WATER LINE 0 -> WATER_LINE pt 502 FH WATER_VALVE -> FIRE_HYDRANT pt 503 WATER LINE 0 -> WATER_LINE pt 508 WV STUB 0 -> WATER_LINE pt 511 WATER LINE 0 -> WATER_LINE pt 512 WATER LINE AT CROSS WALK 0 -> WATER_LINE pt 518 WATER LINE 0 -> WATER_LINE pt 528 WATER LINE 0 -> WATER_LINE pt 531 WATER LINE 0 -> WATER_LINE pt 533 WATER LINE AT CROSS WALK 0 -> WATER_LINE pt 537 FH WATER_VALVE -> FIRE_HYDRANT pt 538 WATER V STUB 0 -> WATER_LINE pt 1115 FH WATER_VALVE -> FIRE_HYDRANT pt 1122 2 IN RPZ BFP COR 0 -> WATER_LINE pt 1123 2 IN RPZ BFP COR 0 -> WATER_LINE pt 1124 2 IN RPZ BFP COR 0 -> WATER_LINE pt 1125 2 IN RPZ BFP COR 0 -> WATER_LINE pt 1134 1 IN BLUE WATER LINE STUB 0 -> WATER_LINE pt 1136 1 IN WATER LINE 0 -> WATER_LINE pt 1137 WATER LINE TO BLDG 0 -> WATER_LINE pt 1138 WATER LINE MARK FOR NEW LINE TO BLDG 0 -> WATER_LINE moved to FIRE_HYDRANT: 4 moved to WATER_LINE: 30 already correct: 0 read back: FIRE_HYDRANT holds 4 points, WATER_LINE holds 30 points (verified)
Notes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.