C3D-HCWA-TEXT · HCWA migration 5/5: single-line text done
Convert MText to single-line DBText (HCWA: all required text must be single line text); road names to ROAD_TEXT
C# payload
// HCWA migration 5/5: TEXT. HCWA: "All required text must be single line text."
// Converts MText on utility/road layers to single-line DBText, and puts road names on ROAD_TEXT.
var bt = (BlockTable)Tx.GetObject(Db.BlockTableId, OpenMode.ForRead);
var ms = (BlockTableRecord)Tx.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
var lt = (LayerTable)Tx.GetObject(Db.LayerTableId, OpenMode.ForRead);
if (!lt.Has("ROAD_TEXT")) { Log("ABORT: ROAD_TEXT missing — run C3D-HCWALAYERS first."); return; }
var convert = new List<ObjectId>();
foreach (ObjectId id in ms) {
var o = Tx.GetObject(id, OpenMode.ForRead);
if (!(o is MText mt)) continue;
var lay = mt.Layer.ToUpperInvariant();
// only touch the utility/road/easement text we're migrating
if (lay.Contains("ESMT") || lay.Contains("SSWR") || lay.Contains("WATR") || lay.Contains("ROAD"))
convert.Add(id);
}
int made = 0;
foreach (var id in convert) {
var mt = (MText)Tx.GetObject(id, OpenMode.ForRead);
// strip MText formatting codes and split on paragraph breaks -> one DBText per line
var raw = mt.Contents ?? "";
raw = System.Text.RegularExpressions.Regex.Replace(raw, @"\\[A-Za-z][^;\\]*;", "");
raw = raw.Replace("{", "").Replace("}", "");
var lines = raw.Split(new[]{"\\P","\n"}, StringSplitOptions.RemoveEmptyEntries);
var s0 = string.Join(" ", lines).ToUpperInvariant();
// road name text -> ROAD_TEXT, else keep the entity's current (already-migrated) layer
bool isRoad = s0.Contains("R/W") || s0.Contains("ROAD") || s0.Contains("PKWY") ||
s0.Contains("PARKWAY") || s0.Contains(" RD") || s0.Contains("DRIVE");
string target = isRoad ? "ROAD_TEXT" : mt.Layer;
double h = mt.TextHeight > 0 ? mt.TextHeight : 4.0;
double y = mt.Location.Y;
foreach (var ln in lines) {
var t = new DBText {
Position = new Point3d(mt.Location.X, y, 0),
TextString = ln.Trim(),
Height = h,
Rotation = mt.Rotation,
Layer = target
};
ms.AppendEntity(t); Tx.AddNewlyCreatedDBObject(t, true);
y -= h * 1.5;
made++;
Log($" MText -> DBText '{ln.Trim()}' on {target}");
}
var w = (MText)Tx.GetObject(id, OpenMode.ForWrite);
w.Erase();
}
Log($"TEXT migration: {convert.Count} MText converted to {made} single-line DBText entities.");
Result
Log
MText -> DBText 'SPRINGDALE RD (80' R/W)' on ROAD_TEXT TEXT migration: 1 MText converted to 1 single-line DBText entities.
Notes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.