返回介绍

交互绘制直线2

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

下面我们演示一下,动态绘制一个直线,并在直线上动态显示直线长度

A.执行命令

调用DoCommand(2),开始执行绘图命令

private void button2_Click(object sender, EventArgs e)
        {
            axMxDrawX1.DoCommand(2);
        }

B. 响应命令事件

增加控件ImplementCommandEvent事件响应,在事件实现交互绘直线代码

 private void axMxDrawX1_ImplementCommandEvent(object sender, AxMxDrawXLib._DMxDrawXEvents_ImplementCommandEventEvent e)
        {
            if(e.iCommandId == 2)
            {
                //点取第一点
                MxDrawUiPrPoint getPt = new MxDrawUiPrPoint();
                getPt.message = "点取第一点:";
                if (getPt.go() != MCAD_McUiPrStatus.mcOk)
                    return;
                //点取第二点
                MxDrawUiPrPoint getSecondtPt = new MxDrawUiPrPoint();
                getSecondtPt.message = "点取第二点:";

                // 在点取第二个点时,启动一个动态制操作,在DynWorldDraw函数实现动态绘制。
                MxDrawCustomEntity spDrawData = getSecondtPt.InitUserDraw("DrawLine");
                //设置动态绘制时使用的,开始点数据。
                spDrawData.SetPoint("startpoint", getPt.value());
                //文字高度;
                double dTextH = axMxDrawX1.ViewLongToDocCoord(10);
                spDrawData.SetDouble("TextH", dTextH);
                // 成功取到第二个点.
                if (getSecondtPt.go() != MCAD_McUiPrStatus.mcOk)
                    return;

                // 把动态绘制的内容绘制到图上。
                spDrawData.Draw();
            }
        }

C.增加动态绘制事件

如下图:

d4.png

D.在动态绘制事件里加入绘制代码

代码如下:

private void axMxDrawX1_DynWorldDraw(object sender, AxMxDrawXLib._DMxDrawXEvents_DynWorldDrawEvent e)
        {
            // 得到动态绘制数据
            MxDrawCustomEntity pCustomEntity = (MxDrawCustomEntity)e.pData;
            // 得到动态绘制对象。
            MxDrawWorldDraw pWorldDraw = (MxDrawWorldDraw)e.pWorldDraw;
            string sGuid = pCustomEntity.Guid;
            // 得到当前鼠标点坐标
            MxDrawPoint curPoint = new MxDrawPoint();
            curPoint.x = e.dX;
            curPoint.y = e.dY;
            if (sGuid == "DrawLine")
            {
                // 动态绘制一条线
                // 得到开始点.
                MxDrawPoint sPt = pCustomEntity.GetPoint("startpoint");
                // 得到文字高度参数.
                double dTextH = pCustomEntity.GetDouble("TextH");
                // 绘制动态线。
                pWorldDraw.DrawLine(sPt.x, sPt.y, curPoint.x, curPoint.y);
                // 得到距离文字.
                double dDist = sPt.DistanceTo(curPoint);
                
                String sTxt = "L=" + dDist.ToString();
                // 得到文字角度.
                MxDrawVector3d vec = curPoint.SumVector(sPt);
                double dAng = vec.Angle();
                // 在中点位置,绘制一个距离文本.
                pWorldDraw.DrawText(sPt.x + (e.dX - sPt.x) * 0.5, sPt.y + (e.dY - sPt.y) * 0.5, sTxt, dTextH, dAng * 180.0 / 3.14159265, MCAD_McHorizontalAlignment.mcHorizontalAlignmentCenter,MCAD_McVerticalAlignment.mcVerticalAlignmentBottom); 
            }
        }

E.如何动态绘制一个虚线

调用AddLinetype添加一个线型,然后pWorldDraw.LineType值为添加的线型名,后面的Draw函数就会使用该线型,详细如下代码:

 private void axMxDrawX1_DynWorldDraw(object sender, AxMxDrawXLib._DMxDrawXEvents_DynWorldDrawEvent e)
        {
            // 得到动态绘制数据
            MxDrawCustomEntity pCustomEntity = (MxDrawCustomEntity)e.pData;
            // 得到动态绘制对象。
            MxDrawWorldDraw pWorldDraw = (MxDrawWorldDraw)e.pWorldDraw;
            string sGuid = pCustomEntity.Guid;
            // 得到当前鼠标点坐标
            MxDrawPoint curPoint = new MxDrawPoint();
            curPoint.x = e.dX;
            curPoint.y = e.dY;
            if (sGuid == "DrawLine")
            {
                // 动态绘制一条线
                // 得到开始点.
                MxDrawPoint sPt = pCustomEntity.GetPoint("startpoint");
                // 得到文字高度参数.
                double dTextH = pCustomEntity.GetDouble("TextH");
                //定义虚线数据据,"MyLineType"是线型名,"6,-8"是虚线的一个单位定义,6是实线长,-8是空格长
                axMxDrawX1.AddLinetype("DrawMyDottedLine", "6,-10");
                //设计当前线型为"MyLineType"
                pWorldDraw.LineType = "DrawMyDottedLine";
              
                // 设置绘制线的宽度
                pWorldDraw.LineWidth = 2;
                
                // 绘制动态线。
                pWorldDraw.DrawLine(sPt.x, sPt.y, curPoint.x, curPoint.y);
                // 得到距离文字.
                double dDist = sPt.DistanceTo(curPoint);
                
                String sTxt = "L=" + dDist.ToString();
                // 得到文字角度.
                MxDrawVector3d vec = curPoint.SumVector(sPt);
                double dAng = vec.Angle();
                // 在中点位置,绘制一个距离文本.
                pWorldDraw.DrawText(sPt.x + (e.dX - sPt.x) * 0.5, sPt.y + (e.dY - sPt.y) * 0.5, sTxt, dTextH, dAng * 180.0 / 3.14159265, MCAD_McHorizontalAlignment.mcHorizontalAlignmentCenter,MCAD_McVerticalAlignment.mcVerticalAlignmentBottom); 
            }
        }

程序运行效果如下:

d5.png

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

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

发布评论

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