.NET
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic to the Top
- Bookmark
- Subscribe
- Printer Friendly Page
Coordinate s for center of viewport in WCS
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
I've been trying to get the center coordinates of a viewport for the last few days with no consistent success. Any help?
Here's the code I've been using:
using (Database _wdb = HostApplicationServices.WorkingDatabase)
{
using (Transaction _trn = _wdb.TransactionManager.StartTransaction())
{
Editor _edt = Application.DocumentManager.MdiActiveDocument.Edit or;
Viewport _cvp = (Viewport)_trn.GetObject(_edt.CurrentViewportObjec tId,OpenMode.ForRead);
Point2d _try1 = _cvp.ViewCenter;
Point3d _try2 = _edt.GetCurrentView().Target;
}
}The "ViewCenter" property will occasionally return a valid point, but mostly they both return (0,0) or something similar. Any help?
Solved! Go to Solution.
Re: Coordinate s for center of viewport in WCS
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
This is one way you can go about it, might seem a little awkward:
Editor _edt = Application.DocumentManager.MdiActiveDocument.Edit
Viewport _cvp = (Viewport)_trn.GetObject(_edt.CurrentViewportObjec
_edt.SwitchToModelSpace();
Application.SetSystemVariable("CVPORT", _cvp.Number);
Point3d cenPnt = (Point3d)Application.GetSystemVariable("VIEWCTR");
_edt.SwitchToPaperSpace();
Re: Coordinate s for center of viewport in WCS
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
maybe this simplified code may help you to do the math as well.
Matrix3d ps2wcs = pvp2.GetModelToPaperTransform().Inverse();
public static Matrix3d GetModelToPaperTransform(this Autodesk.AutoCAD.DatabaseServices.Viewport pvp)
{
Point3d center = new Point3d(pvp.ViewCenter.X, pvp.ViewCenter.Y, 0.0);
Vector3d v = new Vector3d(pvp.CenterPoint.X - center.X, pvp.CenterPoint.Y - center.Y, 0.0);
return Matrix3d.Displacement(v)
* Matrix3d.Scaling(pvp.CustomScale, center)
* Matrix3d.Rotation(pvp.TwistAngle, Vector3d.ZAxis, Point3d.Origin)
* Matrix3d.WorldToPlane(new Plane(pvp.ViewTarget, pvp.ViewDirection));
}
Credits to Gile, see http://www.acadnetwork.com/topic-19.0.html#c2
...
using GeometryExtensions;
...
//Create the Paperspace Viewport boundary in Modelspace.
[CommandMethod("msPVPByGile")]
public void CreateViewportBorderInModelSpaceByGile()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
if (db.TileMode)
{
ed.WriteMessage("\nStart from within Paperspace!");
return;
}
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
BlockTableRecord ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord
BlockTableRecord ps = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord
LayoutManager layMgr = LayoutManager.Current;
Layout lay = (Layout)tr.GetObject(layMgr.GetLayoutId(layMgr.Cur
Viewport pvp2 = (Viewport)tr.GetObject(lay.GetViewports()[1], OpenMode.ForRead);
Polyline vpPoly = pvp2.GetPaperSpaceBoundary();
Polyline msKader = (Polyline)vpPoly.Clone();
ps.AppendEntity(vpPoly);
tr.AddNewlyCreatedDBObject(vpPoly, true);
//Matrix3d ps2wcs = pvp2.PSDCS2DCS() * pvp2.DCS2WCS();
Matrix3d ps2wcs = pvp2.DCS2WCS() * pvp2.PSDCS2DCS();
msKader.TransformBy(ps2wcs);
ms.AppendEntity(msKader);
tr.AddNewlyCreatedDBObject(msKader, true);
tr.Commit();
}
}
public static class ViewportExtensions
{
public static Polyline GetPaperSpaceBoundary(this Autodesk.AutoCAD.DatabaseServices.Viewport pvp)
{
Polyline vpPoly = null;
if (!pvp.NonRectClipOn)
{
Extents3d vpExt = pvp.GeometricExtents;
vpPoly = new Polyline(4);
vpPoly.AddVertexAt(0, new Point2d(vpExt.MinPoint.X, vpExt.MinPoint.Y), 0, 0, 0);
vpPoly.AddVertexAt(1, new Point2d(vpExt.MaxPoint.X, vpExt.MinPoint.Y), 0, 0, 0);
vpPoly.AddVertexAt(2, new Point2d(vpExt.MaxPoint.X, vpExt.MaxPoint.Y), 0, 0, 0);
vpPoly.AddVertexAt(3, new Point2d(vpExt.MinPoint.X, vpExt.MaxPoint.Y), 0, 0, 0);
vpPoly.Closed = true;
}
else
{
vpPoly = (Polyline)pvp.NonRectClipEntityId.GetObject(OpenMo
}
return vpPoly;
}
}

