← Inbox

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

Script file
C3D-HCWA-TEXT.cs
Target
C:\Users\sanja\OneDrive\_SurveyDisco\260613 - 5030 E Lake Pkwy, Stockbridge, GA 30281, USA\CSTORE WATER ABS-260612_SHEET.dwg · model space
Author
claude
Approved
yes · sanjay (batch-approved: HCWA migration)
Timeout
60s

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

Status
success
Drawing file
C:\Users\sanja\OneDrive\_SurveyDisco\260613 - 5030 E Lake Pkwy, Stockbridge, GA 30281, USA\CSTORE WATER ABS-260612_SHEET.dwg
Message
Executed C3D-HCWA-TEXT (0 entities touched).
Entities
Duration
320 ms
Civil 3D
25.0.0.0

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.