[CommandMethod("DVPB", CommandFlags.NoTileMode)]
public void DrawViewportBoundaryInModelSpace()
{
var doc = AcAp.DocumentManager.MdiActiveDocument;
var db = doc.Database;
var ed = doc.Editor;
var options
= new PromptEntityOptions
("\nSelect rectangular viewport: "); options.SetRejectMessage("\nSelected object must be a viewport.");
options
.AddAllowedClass(typeof(Viewport
),
true); var result = ed.GetEntity(options);
if (result.Status != PromptStatus.OK) return;
using (var tr = db.TransactionManager.StartTransaction())
{
var vp = (Viewport)tr.GetObject(result.ObjectId, OpenMode.ForRead);
var model = (BlockTableRecord)tr.GetObject(
SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForWrite);
// local methods
void DrawLine(Point3d p1, Point3d p2, int colorIndex)
{
var line
= new Line
(p1, p2
) { ColorIndex
= colorIndex
}; model.AppendEntity(line);
tr.AddNewlyCreatedDBObject(line, true);
}
void DrawVp(Point3d p1, Point3d p2, Point3d p3, Point3d p4, int colorIndex)
{
DrawLine(p1, p2, colorIndex);
DrawLine(p2, p3, colorIndex);
DrawLine(p3, p4, colorIndex);
DrawLine(p4, p1, colorIndex);
}
// get the viewport vertices in paper space WCS coordinates
var extents = vp.GeometricExtents;
var pt1 = extents.MinPoint;
var pt2
= new Point3d
(extents
.MaxPoint.X, extents
.MinPoint.Y,
0.0); var pt3 = extents.MaxPoint;
var pt4
= new Point3d
(extents
.MinPoint.X, extents
.MaxPoint.Y,
0.0);
// transform the points to the viewport DCS
pt1 = pt1.TransformBy(vp.PSDCS2DCS());
pt2 = pt2.TransformBy(vp.PSDCS2DCS());
pt3 = pt3.TransformBy(vp.PSDCS2DCS());
pt4 = pt4.TransformBy(vp.PSDCS2DCS());
// draw a red rectangle in model space
DrawVp(pt1, pt2, pt3, pt4, 1);
// transform the points to the WCS
pt1 = pt1.TransformBy(vp.DCS2WCS());
pt2 = pt2.TransformBy(vp.DCS2WCS());
pt3 = pt3.TransformBy(vp.DCS2WCS());
pt4 = pt4.TransformBy(vp.DCS2WCS());
// draw a green rectangle in model space
DrawVp(pt1, pt2, pt3, pt4, 3);
tr.Commit();
}
}