← Inbox

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.

Script file
C3D-0321.cs
Target
260714 - 285 Huckaby Rd R2.dwg · model space
Author
claude
Approved
yes · auto-auth
Timeout
60s

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

Status
success
Drawing file
C:\Users\sanja\OneDrive\_SurveyDisco\260714 - 285 Huckaby Rd, Brooks, GA 30205, USA\260714 - 285 Huckaby Rd R2.dwg
Message
Executed C3D-0321 (0 entities touched).
Entities
Duration
476 ms
Civil 3D
25.0.0.0

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 centrelines

Notes

What worked, what didn't, job-specific gotchas — flagged notes feed the recipes.

No notes yet.