当前位置: 首页 > article >正文

CAD二次开发IFoxCAD框架系列(26)- 分段测量多段线长度和计算多边形的面积


    #region 分段测量多段线长度
    private static double textHight = 10;

    [CommandMethod(nameof(PolylineDemo))]
    public void PolylineDemo()
    {
       using var tr = new DBTrans();
        if(!tr.LayerTable.Has("标注"))
        {
            tr.LayerTable.Add("标注",1);
        }
        var pso = new PromptSelectionOptions()
        {
            MessageForAdding = "\n选择要测量的多段线或【设置字高(S)】"
        };
        pso.Keywords.Add("S"," ");
        OpFilter sf = OpFilter.Build(e=>e.Dxf(0)== "LWPOLYLINE");
       
        pso.KeywordInput += (o, s) =>
        {
            switch (s.Input.ToUpper())
            {
                case "S":
                    var r2 = Env.Editor.GetDouble("\n请输入字高<"+textHight+">");
                    if (r2.Status == PromptStatus.OK && r2.Value>0)
                    {
                        textHight = r2.Value;
                    }
                    break;
                case " ":
                    return;
            }
        };

        //开始选择
        var r1 = Env.Editor.GetSelection(pso,sf);
        if (r1.Status != PromptStatus.OK)
        {
            return;
        }
        //获取到所有的多段线
        var polylines = r1.Value.GetEntities<Polyline>();

        foreach (var polyline in polylines)
        {
            for (int i = 0; i < polyline.NumberOfVertices; i++)
            {
                //获取当前线段的类型
                var st = polyline.GetSegmentType (i); 
                if(st == SegmentType.Line)//直线
                {
                    var cur = polyline.GetLineSegmentAt(i).ToCurve();
                    AddText(cur, tr); //添加文字
                }else if(st == SegmentType.Arc)//圆弧
                {
                    var cur = polyline.GetArcSegmentAt(i).ToCurve();
                    AddText(cur, tr); //添加文字
                }   
            }
            if (polyline.Closed)
            {
                var ppr  = Env.Editor.GetPoint("\n选择多边形面积计算结果的位置");
                if (r1.Status != PromptStatus.OK)
                {
                    return;
                }
                var point3d =  ppr.Value;
                GetArea(polyline, point3d,tr);
            }
           
        }

    }

    private void AddText(Curve curve,DBTrans tr)
    {
        //拿到线段起点和终点
        var pt1 = curve.StartPoint;
        var pt2 = curve.EndPoint;
        var length = curve.GetLength();
        //计算角度
        var angle1 = pt1.GetAngle(pt2);
        //计算文字偏移角度
        var angle2 = angle1 + Math.PI*0.5;

        var textPoint = curve.GetPointAtDist(length*0.5).Polar(angle2,textHight);
        var text = new DBText()
        {
           Position = textPoint,
           TextString = (length/1000).ToString("0.00"),
           HorizontalMode = TextHorizontalMode.TextCenter,
           VerticalMode = TextVerticalMode.TextVerticalMid,
           AlignmentPoint = textPoint,
           WidthFactor = 0.7,
           Layer = "标注",
           Height = textHight
        };
        //设置文字角度和线平行并向上
        text.Rotation =  angle1 > Math.PI*0.5 && angle1 <= Math.PI*1.5 ? angle2 + Math.PI : angle1;
        tr.CurrentSpace.AddEntity(text);

    }

    /// <summary>
    /// 计算多边形的面积
    /// </summary>
    /// <param name="polyline">要计算的多边形对象</param>
    /// <param name="point">放置的点</param>
    /// <param name="tr"></param>
    public void GetArea(Polyline polyline,Point3d point,DBTrans tr)
    {
        if (polyline.Closed)
        {
            List<Point2d> pointList = polyline.GetPoints()
                .Select(point => point.Point2d()).ToList();
            double area = Math.Abs(GeometryEx.GetArea(pointList));
            var text = new DBText()
            {
                Position = point,
                TextString = "当前多边形的面积为:" + (area / 1000).ToString("0.00"),
                HorizontalMode = TextHorizontalMode.TextCenter,
                VerticalMode = TextVerticalMode.TextVerticalMid,
                AlignmentPoint = point,
                WidthFactor = 0.7,
                Layer = "标注",
                Height = textHight,
            };
            var sts = tr.TextStyleTable;
            if (sts.Has("宋体"))
            {
                var textStyle = tr.TextStyleTable.GetRecord("宋体");
                if (textStyle != null)
                {
                    text.TextStyleId = textStyle.Id;
                }
            }
           
            tr.CurrentSpace.AddEntity(text);
        }
        
    }

    #endregion

在这里插入图片描述
如果遇到中文字体乱码,可以如下操作,选择字体为宋体。
在这里插入图片描述
在这里插入图片描述


http://www.kler.cn/a/290016.html

相关文章:

  • 客户案例 | 如何利用Ansys工具提供互联系统(以及系统的系统),从而使“软件定义汽车”成为可能
  • 监控录音如何消除杂音?降低录音噪音的五个技巧
  • 使用VSCode远程连接服务器并解决Neo4j无法登陆问题
  • C++ QT 工具日志异步分批保存
  • spring cloud 入门笔记1(RestTemplate,Consul)
  • 数据分析那些事儿——关于A/B实验
  • CTFHub技能树-备份文件下载-网站源码
  • 一款用于分析java socket连接问题的工具
  • 【蓝桥杯青少组】第十五届省赛python(2024)
  • UE5.3 新学到的一些性能测试合计(曼巴学习笔记)
  • Unet改进10:在不同位置添加CPCA||通道先验卷积注意力机制
  • ARM内存屏障/编译屏障API(__DMB、__DSB、__ISB)用法及举例
  • 基于Spring的Uniapp自动更新实现方法
  • 一篇常见第三方库之以及详细使用示例教程
  • C++第四十五弹---深入理解包装器:提升代码复用性与安全性的利器
  • 浙大数据结构:01-复杂度3 二分查找
  • 一文读懂期权交易规则和操作方法分享
  • gitk无法打开
  • Python将两个Excel文件按相同字段合并到一起
  • gcc编译与Linux下的库
  • k8s dial tcp 10.97.0.1:443: i/o timeout
  • 帮招一名3C大佬机器视觉工程师,工作地:苏州,月薪25K-30K,30岁以下,Halcon独立开发,单休,有管理经验更佳有绩效奖
  • 飞利浦开放式耳机怎么样?飞利浦、西圣、漫步者爆火机型大对决!
  • SprinBoot+Vue宠物领养救助微信小程序的设计与实现
  • 解决firewalld启动状态下docker无法启动
  • AI时代的信仰是什么