[<CommandMethod("BLTRPS", CommandFlags.UsePickSet)>]
let blockTransPSCmd() =
let doc = acadApp.DocumentManager.MdiActiveDocument
let db = doc.Database
let ed = doc.Editor
let peo = PromptEntityOptions("Select block reference")
peo.SetRejectMessage "Only a block reference allowed."
peo.AllowNone <- true
peo.AddAllowedClass(typeof<BlockReference>, false)
let per = ed.GetEntity peo
if per.Status = PromptStatus.OK then
let ppo = PromptPointOptions("Pick first corner point")
let ppr0 = ed.GetPoint ppo
if per.Status = PromptStatus.OK then
ppo.Message <- "Pick second corner point"
let ppr1 = ed.GetPoint ppo
if per.Status = PromptStatus.OK then
use tr = db.TransactionManager.StartTransaction()
let br = tr.GetObject(per.ObjectId, OpenMode.ForRead) :?> BlockReference
let mp0, mp1 = ppr0.Value, ppr1.Value
let mcen = mp0 + (mp1 - mp0) / 2.
// Rotation and scaling from mspace to pspace
let ms2ps =
Matrix3d.Displacement(Point3d.Origin - mcen) *
Matrix3d.Scaling(1. / br.ScaleFactors.X, mcen) *
Matrix3d.Rotation(-br.Rotation, Vector3d.ZAxis, mcen) *
Matrix3d.WorldToPlane(Vector3d.ZAxis)
let pp0, pp1 = mp0.TransformBy ms2ps, mp1.TransformBy ms2ps
let size = pp1 - pp0
// Rotation for viewcenter from pspace to mspace
let vcen3 =
mcen.TransformBy <|
Matrix3d.Rotation(-br.Rotation, Vector3d.ZAxis, Point3d.Origin)
let bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) :?> BlockTable
let ps = tr.GetObject(bt.[BlockTableRecord.PaperSpace], OpenMode.ForWrite) :?> BlockTableRecord
let brnew = br.Clone() :?> BlockReference
brnew.TransformBy ms2ps
ps.AppendEntity brnew |> ignore
tr.AddNewlyCreatedDBObject(brnew, true)
use vp = new Viewport(Width = abs size.X, Height = abs size.Y)
let vpId = ps.AppendEntity vp
tr.AddNewlyCreatedDBObject(vp, true)
tr.Commit()
// Viewport has to be added to database
use tr = db.TransactionManager.StartTransaction()
let vp = tr.GetObject(vpId, OpenMode.ForWrite) :?> Viewport
vp.On <- true
vp.ViewCenter <- Point2d(vcen3.X, vcen3.Y)
// Rotation and scaling of viewport
vp.TwistAngle <- -br.Rotation
vp.ViewHeight <- abs size.Y * br.ScaleFactors.X
tr.Commit()