C3D-0267 · 260714 Huckaby: correct the left inset on the 17X11 border done
The left inset came out 0.243 because the block definition is 17.0905 wide, not the nominal 17.000. Measures the inserts real extents to derive the true definition size, solves the scale from that for a 16.340 x 10.340 border, then re-seats using the measured offset between the insert point and the extents so all four insets land on 0.33.
C# payload
// Left inset came out 0.243 instead of 0.330: the block definition is 17.0905 wide, not the
// nominal 17.000 (something in it sticks 0.09 past the border line). Rather than assume a width,
// measure the insert's ACTUAL extents and solve the scale from them, then re-seat.
const double PW = 17.0, PH = 11.0, INSET = 0.33;
double tw = PW - 2 * INSET, th = PH - 2 * INSET; // 16.340 x 10.340
LayoutManager.Current.CurrentLayout = "17X11";
var bt = (BlockTable)Tx.GetObject(Db.BlockTableId, OpenMode.ForRead);
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;
// current state
var e0 = probe.GeometricExtents;
double curW = e0.MaxPoint.X - e0.MinPoint.X;
double curH = e0.MaxPoint.Y - e0.MinPoint.Y;
var s0 = probe.ScaleFactors;
// unscaled definition size implied by what we can measure
double defW = curW / s0.X, defH = curH / s0.Y;
Log(string.Format("measured def size {0:F4} x {1:F4} (nominal 17 x 11)", defW, defH));
var w = (BlockReference)Tx.GetObject(id, OpenMode.ForWrite);
double sx = tw / defW, sy = th / defH;
w.ScaleFactors = new Scale3d(sx, sy, 1.0);
// now re-seat using the measured offset between the insert point and the extents
var probe2 = (BlockReference)Tx.GetObject(id, OpenMode.ForRead);
var e1 = probe2.GeometricExtents;
double dxLeft = e1.MinPoint.X - probe2.Position.X; // offset from insert to left edge
double dyBottom = e1.MinPoint.Y - probe2.Position.Y;
w.Position = new Point3d(INSET - dxLeft, INSET - dyBottom, 0);
var back = (BlockReference)Tx.GetObject(id, OpenMode.ForRead);
var e = back.GeometricExtents;
Log(string.Format("scale ({0:F6},{1:F6}) insert ({2:F3},{3:F3})", sx, sy, 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 {4:F2} all round) (verified)",
e.MinPoint.X, e.MinPoint.Y, PW - e.MaxPoint.X, PH - e.MaxPoint.Y, INSET));
}
}
Ed.Regen();
Result
Log
measured def size 17.0904 x 11.0000 (nominal 17 x 11) scale (0.956093,0.940000) insert (16.757,0.330) BORDER (0.243,0.330) - (16.757,10.670) = 16.514 x 10.340 insets: L0.243 B0.330 R0.243 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.