返回介绍

绘制自定义实体对象

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

调用控件函数:DrawCustomEntity直接在图上,绘制自定义实体,如下C#代码:

 private void button2_Click(object sender, EventArgs e)
        {
            // 调用DrawCustomEntity绘制一个自定义实体,实体类型字符串为:DrawCustEntity
            MxDrawCustomEntity ent = (MxDrawCustomEntity)axMxDrawX1.DrawCustomEntity("DrawCustEntity","");
            
            // 开始设置自定义实体的属性。
            ent.BeginSetValue();
            // 设置属性Width
            ent.SetDouble("Width", 30);
            MxDrawPoint pt1 = new MxDrawPoint();
            pt1.x = 10;
            pt1.y = 10;
            MxDrawPoint pt2 = new MxDrawPoint();
            pt2.x = 100;
            pt2.y = 200;
            // 设置属性Point1,Point2
            ent.SetPoint("Point1", pt1);
            ent.SetPoint("Point2", pt2);
            ent.SetLong("Count", 2);
            // 结束设置自定义实体的属性。
            ent.EntSetValue();
            // 更新显示
            axMxDrawX1.UpdateDisplay();
        }

下面函数MyDrawMline,用来具体绘制自定义实体,将用在后面的事件中调用。

    // MyDrawMline,用来绘制我们的自定义实体
    private void MyDrawMline(MxDrawWorldDraw pWorldDraw, MxDrawCustomEntity pCustomEntity, MxDrawPoint curPt)
    {  
        // 取自定义实体的端点数目。
        if (!pCustomEntity.IsHave("Count"))
            return;
        long lCount = pCustomEntity.GetLong("Count");
        MxDrawPolyline tmpPl = new MxDrawPolyline();

        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线,用于生成双线。
            tmpPl.AddVertexAt(pt);
        }
        if (curPt != null)
            tmpPl.AddVertexAt(curPt);
        if (tmpPl.NumVerts < 2)
        {
            // 端点数少于2就,不构成直线,就不需要显示。
            return;
        }
        // 求pl线,开始点的导数.
        MxDrawVector3d vecFx;
        if (!tmpPl.GetFirstDeriv(tmpPl.GetStartParam(), out vecFx))
            return;
        if (vecFx.IsZeroLength())
            return;
        // 把向量旋转90度.
        vecFx.RotateByXyPlan(3.14159265 / 2.0);
        vecFx.Normalize();
        //  得到双线的宽度属性。
        double dWidth = pCustomEntity.GetDouble("Width");
        vecFx.Mult(dWidth);
        MxDrawPoint startPt = tmpPl.GetStartPoint();
        // 向pl线,两个方向偏移,
        MxDrawPoint offsetPt1 = new MxDrawPoint();
        offsetPt1.x = startPt.x;
        offsetPt1.y = startPt.y;
        offsetPt1.Add(vecFx);
        MxDrawPoint offsetPt2 = new MxDrawPoint();
        offsetPt2.x = startPt.x;
        offsetPt2.y = startPt.y;
        offsetPt2.Sum(vecFx);
        MxDrawText text = new MxDrawText();
        text.TextString = "Test";
        text.Height = 100;
        text.Position = startPt;
        text.AlignmentPoint = startPt;
        MxDrawPoint pt1, pt2;
        text.GetBoundingBox(out pt1, out pt2);
        MxDrawPoint pt3 = new MxDrawPoint();
        pt3.x = pt1.x;
        pt3.y = pt2.y;
        MxDrawPoint pt4 = new MxDrawPoint();
        pt4.x = pt2.x;
        pt4.y = pt1.y;
        MxDrawPoints pts = new MxDrawPoints();
        pts.Add(pt1.x, pt1.y, 0);
        pts.Add(pt3.x, pt3.y, 0);
        pts.Add(pt2.x, pt2.y, 0);
        pts.Add(pt4.x, pt4.y, 0);
        Int32 lDraworder = pWorldDraw.Draworder;
        pWorldDraw.Draworder = lDraworder + 1;
        pWorldDraw.DrawWipeout(pts);
        pWorldDraw.Draworder = lDraworder + 2;
        pWorldDraw.DrawEntity((MxDrawEntity)text);
        pWorldDraw.Draworder = lDraworder;
        //    pWorldDraw->
        {
            MxDrawResbuf newobj;
            if (tmpPl.OffsetCurves(dWidth, offsetPt1, out newobj))
            {
                for (Int32 j = 0; j < newobj.Count; j++)
                {
                    MxDrawEntity tmpObj = (MxDrawEntity)newobj.AtObject(j);
                    if (tmpObj == null)
                        continue;
                    pWorldDraw.DrawEntity(tmpObj);
                }
                newobj.RemoveAll();
            }
        }
        {
            MxDrawResbuf newobj;
            if (tmpPl.OffsetCurves(dWidth, offsetPt2, out newobj))
            {
                for (Int32 j = 0; j < newobj.Count; j++)
                {
                    MxDrawEntity tmpObj = (MxDrawEntity)newobj.AtObject(j);
                    if (tmpObj == null)
                        continue;
                    pWorldDraw.DrawEntity(tmpObj);
                }
                // 这不使用newobj,需要显示调用RemoveAll函数清楚内存。
                // 不然这个可能就会程序退出时才释放,这时它会去释放控件对象指针,有可能会出错。
                newobj.RemoveAll();
            }
        }
    }

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

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

发布评论

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