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

news2024/11/25 1:46:10

    #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.coloradmin.cn/o/2100934.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开绕组永磁电机驱动系统零序电流抑制策略研究(7)——基于零矢量重新分布的120°矢量解耦/中间六边形调制零序电流抑制策略

1.前言 很久没有更新过开绕组电机的仿真了。在一年前发了开绕组的各种调制策略。开绕组电机最常见的两种解耦调制就是120矢量解耦/中间六边形调制和180矢量解耦/最大六边形调制。 我当时想的是&#xff0c;180解耦调制/最大六边形调制的电压利用率最高&#xff0c;所以我就一直…

docker部署project-exam-system

使⽤docker部署project-exam-system 1. 背景&#xff0c;在⼀台主机之内&#xff0c;实现容器的编排&#xff0c;发布考试系统 2. 环境准备 1. docker 1. vim /etc/docker/daemon.json 2. docker-compos 3. 普通的部署 1. 镜像 1. 前端&#xff1a;nginx latest服务 1. 拉取…

Python实现贝叶斯优化器(Bayes_opt)优化深度森林(Deep Forest)分类模型(deepforest分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 深度森林是一种基于集成学习的机器学习方法&#xff0c;其设计灵感来源于深度学习的成功。它通过堆叠多…

2024年四款必备的Windows录屏工具推荐!

无论你是教育工作者、游戏主播、还是企业培训师&#xff0c;一款好的录屏工具都能让你的工作事半功倍。今天&#xff0c;我们就来探讨录屏工具几种不同的使用情境&#xff0c;并推荐几款适合相应情境的Windows录屏工具&#xff01; 福昕录屏大师 直达链接&#xff1a;www.fox…

云联惠涉传!商家联盟再起新秀!某店模式 三年百亿销售额!

大家好&#xff0c;我是吴军&#xff0c;任职于一家致力于软件开发领域的公司&#xff0c;担任产品经理的职位。 今天&#xff0c;我想和大家探讨一下曾经风靡一时的云联惠平台。在其全盛时期&#xff0c;该平台吸引了超过一千万的用户&#xff0c;并且资金规模达到了6000亿的…

食品种类检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

食品种类检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

100%结构化输出——OpenAI新功能大幅增强工具调用

告别杂乱输出&#xff0c;OpenAI引领大模型的精准时代 ©作者|Steven 来源|神州问学 作为一名大模型的使用者&#xff0c;你是否曾通过编写极其复杂的提示词&#xff0c;以规范化模型输出的内容&#xff0c;然而结果普遍是模型输出格式与要求的格式相差甚远&#xff0c;导…

[米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-27浅谈XILINX BRAM的基本使用

软件版本&#xff1a;VIVADO2021.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA 实验平台&#xff1a;米联客-MLK-H3-CZ08-7100开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http…

0826-0901 各种面试笔试题算法题整理

目录 1. 最长回文子串 2. 设计模式里和单一职责原则冲突的是&#xff1f; 3. int array[] {10,20,30} cout<<-2[array-1] 是多少 4. python 定义 class method 直接对类修改变量值和建立对象后通过对象修改变量值&#xff0c;最后的结果是多少 5. LRU缓存 6. 二叉…

Kafka【六】Linux下安装Kafka集群

Kafka从早期的消息传输系统转型为开源分布式事件流处理平台系统&#xff0c;所以很多核心组件&#xff0c;核心操作都是基于分布式多节点的。本文这里采用三台虚拟机模拟真实物理主机搭建Zookeeper集群和kafka集群。 VMware可以使用户在一台计算机上同时运行多个操作系统&…

继承(CPP)

引言 继承是CPP的一个重要语法。在现实生活中存在“子承父业”的说法&#xff0c;在CPP中同样存在这样的语法&#xff0c;而继承就是这种语法。 面向对象的三大特征&#xff1a;封装、继承、多态 本文将通过以下要素&#xff0c;进行继承的深入讲解 1.继承的概念及定义 2.基…

什么是网络准入控制系统?四款网络准入控制系统推荐 干货满满!

在当今的企业网络环境中&#xff0c;随着设备类型的多样化和远程办公的普及&#xff0c;网络安全面临的挑战愈加复杂。网络准入控制系统&#xff08;Network Access Control, NAC&#xff09;应运而生&#xff0c;成为企业保障网络安全的重要工具。本文就带你详细了解这一系统&…

4 款基于Python的鼠标键盘自动化工具,可解决Windows、macOS和Linux下的桌面自动化问题

在日常工作中&#xff0c;自动化工具可以极大地提升我们的工作效率&#xff0c;尤其是当面对重复性任务时。今天&#xff0c;我们将详细介绍四款基于Python的鼠标键盘自动化工具&#xff0c;帮助你在各种平台上轻松实现自动化操作。这些工具分别是 PyAutoGUI、KeymouseGo、Keyl…

《Nature》重磅发布:ChatGPT在学术研究和写作中的最佳应用指南

在论文写作过程中&#xff0c;ChatGPT 已成为许多研究人员的得力助手。知名生物医学教授 Milton Pividori 博士在《Nature》杂志上发表的文章《Chatbots in Science: What Can ChatGPT Do for You?》详细探讨了如何通过精心设计的提示词来有效利用 ChatGPT 提高学术写作的效率…

支付宝线上小程序打开异常

1. 其他手机都可以正常访问线上版本&#xff0c;只有一个安卓手机不行&#xff08;排除支付宝低版本以及手机系统问题&#xff09; 2. 出现访问异常的手机都可以正常访问体验版以及开发版本 3. 尝试去关闭该手机的联调设置以及清除开发版缓存&#xff0c;成功访问线上版本 需要…

如何彻底关闭Chrome浏览器自动更新

1.首先找到桌面 中Google Chrome浏览器的图片,鼠标右键打开文件所在的位置 2.选择Google 目录 选择 Update 目录 右键 选择属性 右键 选择属性 点击确定 修改成功 3.继续 第(2)步 选择 高级 4.点击禁用继承 !!!!!!! 测试 再次点击 Update 文件夹 弹出 你当前无权访问该文件夹…

一文1400字Jmeter实现mqtt协议压力测试

1. 下载jmeter&#xff0c;解压 https://jmeter.apache.org/download_jmeter.cgi 以 5.4.3 为例&#xff0c;下载地址&#xff1a; https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.4.3.zip linux下解压&#xff1a; unzip apache-jmeter-5.4.3.zip 2. 下载m…

如何在 Github 上找到心仪的开源项目?

Github&#xff0c;全球最大的开源社区&#xff0c;集中了目前最多、最优质的各种开源代码。 我们经常说不要重复造轮子&#xff0c;但如果不知道怎么找到已有的轮子&#xff0c;那就没有前提&#xff0c;对自己来说什么轮子都是新的。所以&#xff0c;搞开发&#xff0c;首先要…

Opencv中的直方图(5)计算EMD距离的函数EMD()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算两个加权点配置之间的“最小工作量”距离。 该函数计算地球搬运工距离&#xff08;Earth Mover’s Distance&#xff09;和/或两个加权点配…

微电网管理系统

微电网管理系统 1. 相关概念简介 基本概念及分析意义&#xff1a; 微电网基本概念&#xff1a;微电网&#xff08;MG&#xff09;由分布式电源、用电负荷、能量管理系统等组成&#xff0c;是一个能够基本实现内部电力电量平衡的供用电系统。 通过整合分布式电源、储能、负荷…