C3D-0325 · 260714 Huckaby R2: power line ----P----P---- linetype done
Erases the drawn squiggle polylines and their layer, then builds POWER_P as an exact clone of this drawings own GAS_LINE geometry (A,.5,-.2,[text,STANDARD,S=.1,X=-0.1,Y=-.05],-.25) with P instead of GAS - GAS_LINE already renders correctly here so its numbers are the reliable ones. Assigns it to SS-V-POWER-CL and sets the 4 centrelines ByLayer at LinetypeScale 20 for a ~19 ft repeat and 2 ft text. Verifies the dashes, layer assignment and each entity.
C# payload
// Bin the drawn squiggles, go back to a clean line, and give the power layer a ----P----P----
// text linetype.
//
// Built exactly like this drawing's own GAS_LINE, which is the proven pattern here:
// *GAS_LINE A,.5,-.2,["GAS",STANDARD,S=.1,U=0.0,X=-0.1,Y=-.05],-.25
// Same numbers, "P" instead of "GAS". GAS_LINE reads correctly in this drawing at its current
// scales, so copying its geometry is the reliable move rather than inventing new values.
const string LTNAME = "POWER_P";
const string LAYER = "SS-V-POWER-CL";
const string SQUIG = "SS-V-POWER-SQUIGGLE";
Log("drawing: " + Db.Filename);
var ms = (BlockTableRecord)Tx.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(Db), OpenMode.ForWrite);
// ---- 1. remove the drawn squiggles
int wiped = 0;
foreach (ObjectId id in ms) {
var e = Tx.GetObject(id, OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Entity;
if (e == null || e.IsErased) continue;
if (!e.Layer.Equals(SQUIG, StringComparison.OrdinalIgnoreCase)) continue;
var w = (Autodesk.AutoCAD.DatabaseServices.Entity)Tx.GetObject(id, OpenMode.ForWrite);
w.Erase(); wiped++;
}
Log("erased " + wiped + " drawn squiggle polylines");
var lt = (LayerTable)Tx.GetObject(Db.LayerTableId, OpenMode.ForWrite);
if (lt.Has(SQUIG)) {
try {
var dead = (LayerTableRecord)Tx.GetObject(lt[SQUIG], OpenMode.ForWrite);
dead.Erase();
Log("erased layer " + SQUIG);
} catch (System.Exception e) { Log("layer " + SQUIG + " left in place: " + e.Message); }
}
// ---- 2. the P linetype, cloned from GAS_LINE's proven geometry
var tst = (TextStyleTable)Tx.GetObject(Db.TextStyleTableId, OpenMode.ForRead);
ObjectId styleId = tst.Has("STANDARD") ? tst["STANDARD"] : (tst.Has("Standard") ? tst["Standard"] : Db.Textstyle);
Log("text style: " + ((TextStyleTableRecord)Tx.GetObject(styleId, OpenMode.ForRead)).Name);
var ltt = (LinetypeTable)Tx.GetObject(Db.LinetypeTableId, OpenMode.ForWrite);
ObjectId ltId;
if (ltt.Has(LTNAME)) {
ltId = ltt[LTNAME];
Log(LTNAME + " exists - rebuilding");
} else {
var rec = new LinetypeTableRecord();
rec.Name = LTNAME;
ltId = ltt.Add(rec);
Tx.AddNewlyCreatedDBObject(rec, true);
Log("created " + LTNAME);
}
{
var r = (LinetypeTableRecord)Tx.GetObject(ltId, OpenMode.ForWrite);
r.Comments = "Power line ----P----P----P----P----P----P--";
r.PatternLength = 0.95; // .5 + .2 + .25, same as GAS_LINE
r.NumDashes = 3;
r.SetDashLengthAt(0, 0.5);
r.SetDashLengthAt(1, -0.2);
r.SetShapeStyleAt(1, styleId);
r.SetShapeNumberAt(1, 0);
r.SetTextAt(1, "P");
r.SetShapeScaleAt(1, 0.1);
r.SetShapeOffsetAt(1, new Vector2d(-0.1, -0.05));
r.SetShapeRotationAt(1, 0.0);
r.SetShapeIsUcsOrientedAt(1, false);
r.SetDashLengthAt(2, -0.25);
}
{
var back = (LinetypeTableRecord)Tx.GetObject(ltId, OpenMode.ForRead);
Log(string.Format("{0}: dashes={1} patLen={2:F3}", back.Name, back.NumDashes, back.PatternLength));
for (int i = 0; i < back.NumDashes; i++) {
string t = ""; double sc = 0;
try { t = back.TextAt(i); } catch { }
try { sc = back.ShapeScaleAt(i); } catch { }
Log(string.Format(" dash{0} len={1,6:F3} text=\"{2}\" scale={3:F3}", i, back.DashLengthAt(i), t, sc));
}
}
// ---- 3. apply to the layer; entities ByLayer at the scale the user proved works
if (!lt.Has(LAYER)) { Log("layer " + LAYER + " missing"); return; }
var ltr = (LayerTableRecord)Tx.GetObject(lt[LAYER], OpenMode.ForWrite);
ltr.LinetypeObjectId = ltId;
{
var back = (LayerTableRecord)Tx.GetObject(lt[LAYER], OpenMode.ForRead);
var used = (LinetypeTableRecord)Tx.GetObject(back.LinetypeObjectId, OpenMode.ForRead);
Log("layer " + back.Name + " -> " + used.Name + " (verified)");
}
// GAS_LINE-style patterns read at LTSCALE-relative sizes; this drawing has LTSCALE=1 and the
// user found 0.1 too small to matter for a 0.95 pattern, so scale to give a ~20 ft repeat.
const double LTS = 20.0;
int n = 0;
foreach (ObjectId id in ms) {
var probe = Tx.GetObject(id, OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Entity;
if (probe == null || probe.IsErased) continue;
if (!probe.Layer.Equals(LAYER, StringComparison.OrdinalIgnoreCase)) continue;
var w = (Autodesk.AutoCAD.DatabaseServices.Entity)Tx.GetObject(id, OpenMode.ForWrite);
w.LinetypeId = Db.ByLayerLinetype;
w.LinetypeScale = LTS;
n++;
var back = (Autodesk.AutoCAD.DatabaseServices.Entity)Tx.GetObject(id, OpenMode.ForRead);
var line = back as Line;
Log(string.Format(" [{0}] ltscale={1:F1} len={2:F1} -> ~{3:F0} P's, {4:F1} ft apart (verified)",
back.Handle, back.LinetypeScale, line != null ? line.Length : 0.0,
line != null ? line.Length / (0.95 * LTS) : 0.0, 0.95 * LTS));
}
Log("");
Log(string.Format("{0} on {1} centrelines, text height {2:F2} ft", LTNAME, n, 0.1 * LTS));
Ed.Regen();
Result
Log
drawing: C:\Users\sanja\OneDrive\_SurveyDisco\260714 - 285 Huckaby Rd, Brooks, GA 30205, USA\260714 - 285 Huckaby Rd R2.dwg erased 4 drawn squiggle polylines erased layer SS-V-POWER-SQUIGGLE text style: Standard created POWER_P POWER_P: dashes=3 patLen=0.950 dash0 len= 0.500 text="" scale=1.000 dash1 len=-0.200 text="P" scale=0.100 dash2 len=-0.250 text="" scale=1.000 layer SS-V-POWER-CL -> POWER_P (verified) [20C9D] ltscale=20.0 len=893.0 -> ~47 P's, 19.0 ft apart (verified) [20C9E] ltscale=20.0 len=364.6 -> ~19 P's, 19.0 ft apart (verified) [20CA9] ltscale=20.0 len=1514.6 -> ~80 P's, 19.0 ft apart (verified) [20CB1] ltscale=20.0 len=1569.6 -> ~83 P's, 19.0 ft apart (verified) POWER_P on 4 centrelines, text height 2.00 ft
Notes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.