返回介绍

响应事件,增加捕捉

发布于 2023-08-09 23:10:33 字数 4026 浏览 0 评论 0 收藏 0

如果需要捕捉自定义实体的端点,最近点等,需要响应捕捉事件:CustomEntity_getOsnapPoints

如下C#代码,返回自定义实体的端点,计算最近点并返回。

 // 响应该事件,计算自定义实体捕捉点
        private void axMxDrawX1_CustomEntity_getOsnapPoints(object sender, _DMxDrawXEvents_CustomEntity_getOsnapPointsEvent e)
        {

            // 		enum OsnapMode         { kOsModeEnd          = 1,
            // 			kOsModeMid          = 2,
            // 			kOsModeCen          = 3,
            // 			kOsModeNode         = 4,
            // 			kOsModeQuad         = 5, 
            // 			kOsModeIns          = 7,
            // 			kOsModePerp         = 8,
            // 			kOsModeTan          = 9,
            // 			kOsModeNear         = 10,
            // 			kOsModeInt          = 11
            // 		};
            e.pOk = 0;

            // 得到自义实体对象。
            MxDrawCustomEntity pCustomEntity = (MxDrawCustomEntity)e.pCustomEntity;
            String sGuid = pCustomEntity.Guid;

            if (sGuid == "DrawCustEntity")
            {
                
                if (!pCustomEntity.IsHave("Count"))
                    return;

                // 得到点数.
                long lCount = pCustomEntity.GetLong("Count");

                if (lCount < 2)
                    return;


                if (e.lOsnapMode == 1)
                {
                    // 端点捕捉。
                    MxDrawPoint pickPoint = (MxDrawPoint)axMxDrawX1.NewPoint();

                    // 得到当前鼠标点。
                    pickPoint.x = e.dPickPointX;
                    pickPoint.y = e.dPickPointY;

                    // 得到开始点,结束点。
                    String sName = "Point1";
                    MxDrawPoint stp = pCustomEntity.GetPoint(sName);

                    sName = "Point" + lCount.ToString();

                    MxDrawPoint ept = pCustomEntity.GetPoint(sName);


                    // 计算出当前点与那个点最近,然后返回.
                    Double dDis1 = pickPoint.DistanceTo(stp);
                    Double dDis2 = pickPoint.DistanceTo(ept);


                    if (dDis1 < dDis2)
                    {
                        e.pSnapPointsX = stp.x;
                        e.pSnapPointsY = stp.y;

                    }
                    else
                    {
                        e.pSnapPointsX = ept.x;
                        e.pSnapPointsY = ept.y;


                    }

                    e.pOk = 1;

                }
                else if (e.lOsnapMode == 10)
                {
                    // 最近点捕捉。
                     MxDrawPolyline pl = new MxDrawPolyline();

                    // 把自定义实体变成一个 PL线,用于计算最近点坐标。
                    for (long i = 0; i < lCount; i++)
                    {
                        String sName;
                        sName = "Point" + (i + 1).ToString();
                        if (!pCustomEntity.IsHave(sName))
                            break;

                        // 取自定义实体的端点坐标。
                        MxDrawPoint pt = pCustomEntity.GetPoint(sName);

                        pl.AddVertexAt(pt);
                        
                    }

                    // 得到当前鼠标点。
                    MxDrawPoint pickPoint = (MxDrawPoint)axMxDrawX1.NewPoint();

                    pickPoint.x = e.dPickPointX;
                    pickPoint.y = e.dPickPointY;


                    // 计算最近点。
                    MxDrawPoint closePoint = pl.GetClosestPointTo2(pickPoint, false);

                    if (closePoint != null)
                    {
                        // 计算最点,然后返回。
                        e.pSnapPointsX = closePoint.x;
                        e.pSnapPointsY = closePoint.y;

                        e.pOk = 1;
                    }
                }
                   
                
            }
        }

运行效果如下图 :

ce3.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文