Hi
This works for me:
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using System.ComponentModel;
using AcAp = Autodesk.AutoCAD.ApplicationServices.Application;
namespace ViewportToWorldCoordinates
{
public class Commands
{
[CommandMethod("EV")]
public void UIBindingsNotificationExample()
{
INotifyPropertyChanged source = Application.UIBindings.CurrentViewport as INotifyPropertyChanged;
source.PropertyChanged += currentViewportChanged;
}
void currentViewportChanged(object sender, PropertyChangedEventArgs e)
{
var doc = AcAp.DocumentManager.MdiActiveDocument;
var db = doc.Database;
var ed = doc.Editor;
// Check to see if the Model layout is active
if (db.TileMode)
{
// Model layout
}
else
{
var cvport = (short)AcAp.GetSystemVariable("CVPORT");
if (cvport == 1)
{
// paper space
}
else
{
using (var tr = db.TransactionManager.StartTransaction())
{
var vp = (Viewport)tr.GetObject(ed.ActiveViewportId, OpenMode.ForRead);
Matrix3d EyeToWorld =
Matrix3d.Rotation(-vp.TwistAngle, vp.ViewDirection, vp.ViewTarget) *
Matrix3d.Displacement(vp.ViewTarget - Point3d.Origin) *
Matrix3d.WorldToPlane(vp.ViewDirection);
var ptCenter = new Point3d(vp.ViewCenter.X, vp.ViewCenter.Y, 0).TransformBy(EyeToWorld);
ed.WriteMessage("\n*** Current Viewport= {0} ViewVenter= {1},{2}\n", cvport, ptCenter.X, ptCenter.Y);
tr.Commit();
}
}
}
}
}
}