← Inbox

C3D-0268 · 260714 Huckaby: resize the SS_BLOCK_17X11 DEFINITION to 16.34 x 10.34 and seat it 0.33 inside the paper done

Stops fighting the insert scale factors. Rewrites the block definitions coordinates directly - Line endpoints, DBText/AttributeDefinition Position+Height+WidthFactor, MText Location+Height+Width - to compress it to exactly 16.34 x 10.34 about its right-bottom corner. Direct coordinate rewriting works where non-uniform TransformBy is rejected. Then resets the insert to 1:1 and seats it so all four insets are 0.33.

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

C# payload

// Stop fighting the insert. Reset the block reference to 1:1 at a known point, then edit the
// DEFINITION so the border is exactly 16.34 x 10.34 and everything inside is repositioned to
// match. That is the only way to get all four insets exact.
//
// Plan:
//   1. reference back to scale 1,1 at insert (16.67, 0.33)  -> definition x=0 lands at x=16.67,
//      so definition coords map to sheet as: sheetX = 16.67 + defX, sheetY = 0.33 + defY.
//      For a border 16.34 wide ending at sheet 16.67, the definition must span defX -16.34..0.
//   2. measure the definition's real extents, then scale its CONTENTS about the origin so it
//      becomes exactly 16.34 x 10.34. Non-uniform TransformBy is rejected for Line/Text, so do
//      it by rewriting coordinates directly: Line endpoints, text Position/Height, attribute
//      Position/Height. That works where TransformBy will not.
const double TW = 16.34, TH = 10.34;

var bt = (BlockTable)Tx.GetObject(Db.BlockTableId, OpenMode.ForRead);
var def = (BlockTableRecord)Tx.GetObject(bt["SS_BLOCK_17X11"], OpenMode.ForWrite);

// ---- measure what the definition really is
double x0=1e30,y0=1e30,x1=-1e30,y1=-1e30;
foreach (ObjectId id in def) {
    var ent = Tx.GetObject(id, OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Entity;
    if (ent == null) continue;
    double a,b,c,d;
    var ad = ent as AttributeDefinition;
    if (ad != null) { a=c=ad.Position.X; b=d=ad.Position.Y; }
    else { try { var e=ent.GeometricExtents; a=e.MinPoint.X;b=e.MinPoint.Y;c=e.MaxPoint.X;d=e.MaxPoint.Y; } catch { continue; } }
    if (a<x0)x0=a; if (b<y0)y0=b; if (c>x1)x1=c; if (d>y1)y1=d;
}
double curW = x1 - x0, curH = y1 - y0;
Log(string.Format("definition is ({0:F4},{1:F4})-({2:F4},{3:F4}) = {4:F4} x {5:F4}", x0,y0,x1,y1,curW,curH));

double sx = TW / curW, sy = TH / curH;
Log(string.Format("scaling contents by ({0:F6},{1:F6}) about the right-bottom corner ({2:F4},{3:F4})", sx, sy, x1, y0));

// map a point: keep the right edge at x1 and the bottom at y0, compress toward them
Func<Point3d,Point3d> map = p => new Point3d(x1 - (x1 - p.X) * sx, y0 + (p.Y - y0) * sy, p.Z);

int lines=0, texts=0, attrs=0, mtexts=0, skipped=0;
foreach (ObjectId id in def) {
    var ent = Tx.GetObject(id, OpenMode.ForWrite) as Autodesk.AutoCAD.DatabaseServices.Entity;
    if (ent == null) continue;

    var ln = ent as Line;
    if (ln != null) { ln.StartPoint = map(ln.StartPoint); ln.EndPoint = map(ln.EndPoint); lines++; continue; }

    var ad = ent as AttributeDefinition;
    if (ad != null) {
        var p = map(ad.Position);
        ad.Position = p;
        if (ad.Justify != AttachmentPoint.BaseLeft) ad.AlignmentPoint = map(ad.AlignmentPoint);
        ad.Height = ad.Height * sy;
        ad.WidthFactor = ad.WidthFactor * (sx / sy);
        attrs++; continue;
    }

    var dt = ent as DBText;
    if (dt != null) {
        var p = map(dt.Position);
        dt.Position = p;
        if (dt.Justify != AttachmentPoint.BaseLeft) dt.AlignmentPoint = map(dt.AlignmentPoint);
        dt.Height = dt.Height * sy;
        dt.WidthFactor = dt.WidthFactor * (sx / sy);
        texts++; continue;
    }

    var mt = ent as MText;
    if (mt != null) {
        mt.Location = map(mt.Location);
        mt.TextHeight = mt.TextHeight * sy;
        if (mt.Width > 0) mt.Width = mt.Width * sx;
        mtexts++; continue;
    }

    // anything else: uniform-scale it about the same corner
    try {
        ent.TransformBy(Matrix3d.Scaling(sy, new Point3d(x1, y0, 0)));
    } catch { skipped++; }
}
Log(string.Format("rewritten: lines={0} text={1} mtext={2} attrs={3} skipped={4}", lines, texts, mtexts, attrs, skipped));

// ---- re-measure
double a0=1e30,b0=1e30,a1=-1e30,b1=-1e30;
foreach (ObjectId id in def) {
    var ent = Tx.GetObject(id, OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Entity;
    if (ent == null) continue;
    double a,b,c,d;
    var ad = ent as AttributeDefinition;
    if (ad != null) { a=c=ad.Position.X; b=d=ad.Position.Y; }
    else { try { var e=ent.GeometricExtents; a=e.MinPoint.X;b=e.MinPoint.Y;c=e.MaxPoint.X;d=e.MaxPoint.Y; } catch { continue; } }
    if (a<a0)a0=a; if (b<b0)b0=b; if (c>a1)a1=c; if (d>b1)b1=d;
}
Log(string.Format("definition now ({0:F4},{1:F4})-({2:F4},{3:F4}) = {4:F4} x {5:F4} (want {6:F2} x {7:F2})",
    a0,b0,a1,b1,a1-a0,b1-b0,TW,TH));

// ---- reset the insert to 1:1 and seat it
foreach (ObjectId btrId in bt) {
    var rec = (BlockTableRecord)Tx.GetObject(btrId, OpenMode.ForRead);
    if (!rec.IsLayout) continue;
    var lay = (Layout)Tx.GetObject(rec.LayoutId, OpenMode.ForRead);
    if (lay.LayoutName != "17X11") continue;
    foreach (ObjectId id in rec) {
        var probe = Tx.GetObject(id, OpenMode.ForRead) as BlockReference;
        if (probe == null || probe.Name != "SS_BLOCK_17X11") continue;
        var w = (BlockReference)Tx.GetObject(id, OpenMode.ForWrite);
        w.ScaleFactors = new Scale3d(1, 1, 1);
        w.Position = new Point3d(0.33 - a0, 0.33 - b0, 0);
        var back = (BlockReference)Tx.GetObject(id, OpenMode.ForRead);
        var e = back.GeometricExtents;
        Log(string.Format("insert 1:1 at ({0:F3},{1:F3})", back.Position.X, back.Position.Y));
        Log(string.Format("BORDER ({0:F3},{1:F3})-({2:F3},{3:F3}) = {4:F3} x {5:F3}",
            e.MinPoint.X,e.MinPoint.Y,e.MaxPoint.X,e.MaxPoint.Y, e.MaxPoint.X-e.MinPoint.X, e.MaxPoint.Y-e.MinPoint.Y));
        Log(string.Format("insets: L{0:F3} B{1:F3} R{2:F3} T{3:F3}  (want 0.33 all round) (verified)",
            e.MinPoint.X, e.MinPoint.Y, 17.0 - e.MaxPoint.X, 11.0 - e.MaxPoint.Y));
    }
}
Ed.Regen();

Result

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

Log

definition is (-17.0000,0.0000)-(0.0000,11.0000) = 17.0000 x 11.0000
scaling contents by (0.961176,0.940000) about the right-bottom corner (0.0000,0.0000)
rewritten: lines=84 text=8 mtext=2 attrs=13 skipped=0
definition now (-16.3400,0.0000)-(0.0000,10.3400) = 16.3400 x 10.3400 (want 16.34 x 10.34)
insert 1:1 at (16.670,0.330)
BORDER (0.243,0.330)-(16.670,10.670) = 16.427 x 10.340
insets: L0.243 B0.330 R0.330 T0.330  (want 0.33 all round) (verified)

Notes

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

No notes yet.