- UID
- 658062
- 积分
- 2147
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2008-10-22
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 csharp 于 2014-11-28 15:43 编辑
Getting point coordinates in UCS from MessageFilter By Balaji Ramamoorthy
Here is a code snippet to convert the mouse coordinates retreived from the Windows message in a message filter to an AutoCAD point coordinate in UCS.
class MyMessageFilter : System.Windows.Forms.IMessageFilter {
private const int WM_LBUTTONDBLCLK = 0x203;
bool System.Windows.Forms.IMessageFilter .PreFilterMessage
(ref System.Windows.Forms.Message m)
{
if (m.Msg == WM_LBUTTONDBLCLK)
{
Document doc = Application .DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor; // Double clicked point coordinates in pixels
int x = m.LParam.ToInt32() & 0xffff;
int y = (m.LParam.ToInt32() >> 16);
System.Drawing.Point p = new Point (x, y); // Pixel to device independent coordinates
System.Windows.Point p1 = new System.Windows.Point();
System.Windows.Vector s = Autodesk.AutoCAD.Windows.Window.GetDeviceIndependentScale
(IntPtr .Zero);
p1.X = (int )(p.X / s.X);
p1.Y = (int )(p.Y / s.Y); // Device independent coordinates to WCS
short vpNum = (short )Application .GetSystemVariable("CVPORT" );
Point3d bp = ed.PointToWorld(p1, vpNum); // WCS to UCS
bp = bp.TransformBy(
ed.CurrentUserCoordinateSystem.Inverse());
ed.WriteMessage(String .Format("\\n{0} {1}" , bp.X, bp.Y));
}
return false ;
}
}
Please note that there could be slight variation from the coordinates displayed by AutoCAD in its status bar. This is a similar behavior when using "acedCoordFromPixelToWorld" to do such conversion. As AutoCAD uses some internal functions that may be different from what is exposed in the API, so the reply from our engineering to a similar query in the past, was that whatever approach we use, we may never be able to retrieve the exact same values as that of what is displayed in the status bar of AutoCAD UI.
|
|