C3D-0321 · 260714 Huckaby R2: real squiggle overhead-power linetype (AMZIGZAG) done
The GRCV pattern only looked like a dashed line because it references shape 133 in AeccLand.shx, and that file defines only TREE/STONE/BOX/CIRCLE - so it was drawing a 0.014-scale circle, i.e. nothing. This builds OVERHEAD_POWER on shape 135 AMZIGZAG from ltypeshp.shx, a real multi-segment zigzag that ships with AutoCAD and is already on the support path - the same construction acad.lin uses for ZIGZAG and TRACKS. Applies it to SS-V-POWER-CL at LinetypeScale 40. Verifies the shape number, scale and SHX file on read-back.
C# payload
// A REAL squiggle overhead-power linetype.
//
// Why the last one looked like a plain dashed line: the drawing's GRCV points at shape 133 in
// AeccLand.shx, and that file only defines TREE(130) / STONE(131) / BOX(132) / CIRCLE(133).
// So GRCV was drawing a tiny circle at 0.014 scale - invisible - leaving just dashes.
//
// ltypeshp.shx (shipped with AutoCAD, already on the support path and already referenced by this
// drawing) defines:
// *135,14,AMZIGZAG 9,(108,0),(15,56),(30,-112),(15,56),(107,0),(0,0),0
// which is a real multi-segment zigzag - the overhead-power squiggle. This builds
// OVERHEAD_POWER on it, the same way acad.lin builds ZIGZAG and TRACKS.
const string LTNAME = "OVERHEAD_POWER";
const string LAYER = "SS-V-POWER-CL";
const string SHXFILE = "ltypeshp.shx";
const double LTS = 40.0;
Log("drawing: " + Db.Filename);
// ---- a shape-file text style pointing at ltypeshp.shx (the drawing already has one)
var tst = (TextStyleTable)Tx.GetObject(Db.TextStyleTableId, OpenMode.ForWrite);
ObjectId shapeStyle = ObjectId.Null;
foreach (ObjectId id in tst) {
var ts = (TextStyleTableRecord)Tx.GetObject(id, OpenMode.ForRead);
if (!ts.IsShapeFile) continue;
if (ts.FileName.IndexOf("ltypeshp", StringComparison.OrdinalIgnoreCase) >= 0) { shapeStyle = id; break; }
}
if (shapeStyle.IsNull) {
var ns = new TextStyleTableRecord();
ns.Name = ""; // shape styles are unnamed
ns.FileName = SHXFILE;
ns.IsShapeFile = true;
shapeStyle = tst.Add(ns);
Tx.AddNewlyCreatedDBObject(ns, true);
Log("created a shape style for " + SHXFILE);
} else {
var ts = (TextStyleTableRecord)Tx.GetObject(shapeStyle, OpenMode.ForRead);
Log("using existing shape style, file=" + ts.FileName);
}
// ---- the linetype: segment, squiggle, segment -> ---/\/\---/\/\---
var ltt = (LinetypeTable)Tx.GetObject(Db.LinetypeTableId, OpenMode.ForWrite);
ObjectId ltId;
if (ltt.Has(LTNAME)) {
ltId = ltt[LTNAME];
var old = (LinetypeTableRecord)Tx.GetObject(ltId, OpenMode.ForWrite);
old.Comments = "Overhead power ---/\\/\\---/\\/\\---";
old.PatternLength = 0.75;
old.NumDashes = 3;
old.SetDashLengthAt(0, 0.3);
old.SetDashLengthAt(1, -0.15);
old.SetShapeStyleAt(1, shapeStyle);
old.SetShapeNumberAt(1, 135); // AMZIGZAG
old.SetShapeScaleAt(1, 0.15);
old.SetShapeOffsetAt(1, new Vector2d(-0.15, 0.0));
old.SetShapeRotationAt(1, 0.0);
old.SetShapeIsUcsOrientedAt(1, false);
old.SetDashLengthAt(2, 0.3);
Log("rebuilt existing " + LTNAME);
} else {
var rec = new LinetypeTableRecord();
rec.Name = LTNAME;
rec.Comments = "Overhead power ---/\\/\\---/\\/\\---";
rec.PatternLength = 0.75;
rec.NumDashes = 3;
rec.SetDashLengthAt(0, 0.3);
rec.SetDashLengthAt(1, -0.15);
rec.SetShapeStyleAt(1, shapeStyle);
rec.SetShapeNumberAt(1, 135); // AMZIGZAG
rec.SetShapeScaleAt(1, 0.15);
rec.SetShapeOffsetAt(1, new Vector2d(-0.15, 0.0));
rec.SetShapeRotationAt(1, 0.0);
rec.SetShapeIsUcsOrientedAt(1, false);
rec.SetDashLengthAt(2, 0.3);
ltId = ltt.Add(rec);
Tx.AddNewlyCreatedDBObject(rec, true);
Log("created " + LTNAME);
}
{
var r = (LinetypeTableRecord)Tx.GetObject(ltId, OpenMode.ForRead);
Log(string.Format(" {0}: dashes={1} patLen={2:F3}", r.Name, r.NumDashes, r.PatternLength));
for (int i = 0; i < r.NumDashes; i++) {
int shp = 0; double sc = 0; string sf = "";
try { shp = r.ShapeNumberAt(i); } catch { }
try { sc = r.ShapeScaleAt(i); } catch { }
try { var sid = r.ShapeStyleAt(i);
if (!sid.IsNull) sf = ((TextStyleTableRecord)Tx.GetObject(sid, OpenMode.ForRead)).FileName; } catch { }
Log(string.Format(" dash{0} len={1,6:F3} shape={2} scale={3:F3} file={4}", i, r.DashLengthAt(i), shp, sc, sf));
}
}
// ---- apply to the power centrelines
var lt = (LayerTable)Tx.GetObject(Db.LayerTableId, OpenMode.ForRead);
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)");
}
var ms = (BlockTableRecord)Tx.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(Db), OpenMode.ForWrite);
int n = 0;
foreach (ObjectId id in ms) {
var probe = Tx.GetObject(id, OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Entity;
if (probe == null || !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} squiggles (verified)",
back.Handle, back.LinetypeScale, line != null ? line.Length : 0.0,
line != null ? line.Length / (0.75 * LTS) : 0.0));
}
Log("");
Log(string.Format("{0} (AMZIGZAG from {1}) applied to {2} centrelines", LTNAME, SHXFILE, n));
Ed.Regen();
Result
Log
drawing: C:\Users\sanja\OneDrive\_SurveyDisco\260714 - 285 Huckaby Rd, Brooks, GA 30205, USA\260714 - 285 Huckaby Rd R2.dwg
using existing shape style, file=ltypeshp.shx
created OVERHEAD_POWER
OVERHEAD_POWER: dashes=3 patLen=0.750
dash0 len= 0.300 shape=0 scale=1.000 file=
dash1 len=-0.150 shape=135 scale=0.150 file=ltypeshp.shx
dash2 len= 0.300 shape=0 scale=1.000 file=
layer SS-V-POWER-CL -> OVERHEAD_POWER (verified)
[20C9D] ltscale=40.0 len=893.0 -> ~30 squiggles (verified)
[20C9E] ltscale=40.0 len=364.6 -> ~12 squiggles (verified)
[20CA9] ltscale=40.0 len=1514.6 -> ~50 squiggles (verified)
[20CB1] ltscale=40.0 len=1569.6 -> ~52 squiggles (verified)
OVERHEAD_POWER (AMZIGZAG from ltypeshp.shx) applied to 4 centrelinesNotes
What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.
No notes yet.