C# CAD2016 宗地生成界址点,界址点编号及排序

news2024/12/26 16:01:20


1 、界址点起点位置
C# CAD2016 多边形顶点按方向重新排序

 2、 界址点顺时针逆时针走向

C# CAD2016 判断多边形的方向正时针或逆时针旋转

 3、块文件插入

//已知块文件名称 GXGLQTC
//块文件需要插入的坐标点 scaledPoint

 // 插入块到当前图纸中的指定位置
 ObjectId newBlockId;
 BlockTable currentBlockTable = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
 newBlockId = currentBlockTable["GXGLQTC"];

 using (Transaction transaction = db.TransactionManager.StartTransaction())
 {
     BlockReference blockRef = new BlockReference(scaledPoint, newBlockId);
     BlockTable bt = transaction.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
     BlockTableRecord activeSpace = transaction.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
     activeSpace.AppendEntity(blockRef);
     transaction.AddNewlyCreatedDBObject(blockRef, true);
     transaction.Commit();
 }
 4、主要步骤
  1. 获取当前活动文档、数据库和编辑器对象。
  2. 设置一个选择过滤器,只允许用户选择"宗地"图层上的LWPOLYLINE对象。
  3. 用户根据过滤规则进行实体选择后,程序处理所选中的每个闭合多段线。
  4. 对于每个闭合多段线,首先确保它是闭合的且至少有一个顶点,并将所有顶点存储到一个列表中。
  5. 注释部分:这部分原来包含计算多边形方向和排序顶点的逻辑,但后来被注释掉,实际代码中并没有执行这部分操作。
  6. 遍历排序后的顶点列表,为每个顶点创建一个文本标签(DBText)并在模型空间中绘制,标签内容是其顺序编号,位置基于顶点坐标并进行了缩放和平移处理。
  7. 同样针对每个顶点,在模型空间中插入名为“GXGLQTC”的块参照,并将其定位在与文本标签相同的位置。

另外,还提供了一个辅助方法GetCenterOfPolyline,用于计算给定多段线的中心点,但在当前代码片段中并未使用此方法来确定文本标签或块参照的位置。

 5、完整代码

namespace cad自定义面板集.jzd
{
    internal class jzd01
    {
        // 选定"宗地"图层上的封闭对象(例如闭合多段线)
        [CommandMethod("GenerateBoundaryPoints")]
        public static void GenerateBoundaryPoints()
        {
            // 获取当前活动文档和数据库

            // 获取当前AutoCAD应用中的活动文档、数据库和编辑器对象
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            // 创建一个选择过滤器,限制用户只能选择"宗地"图层上的LWPOLYLINE对象作为外部边界
            SelectionFilter outerFilter = new SelectionFilter(new TypedValue[] {
    new TypedValue((int)DxfCode.Start, "LWPOLYLINE"),
    new TypedValue((int)DxfCode.LayerName, "宗地")
});
            // 提示用户根据上述规则进行实体选择,并获取选择结果
            PromptSelectionResult outerSelRes = ed.GetSelection(outerFilter);
            // 检查用户是否成功选择了实体
            if (outerSelRes.Status == PromptStatus.OK)
            {
                using (Transaction tr = db.TransactionManager.StartTransaction())// 开始事务处理以确保数据一致性
                {
                    foreach (ObjectId outerId in outerSelRes.Value.GetObjectIds())// 遍历所有被选中的外部多段线
                    {
                        Polyline outerPolyline = (Polyline)tr.GetObject(outerId, OpenMode.ForRead);
                        // 确保所选多段线是闭合的且至少有一个顶点
                        if (outerPolyline.Closed && outerPolyline.NumberOfVertices > 0)
                        {
                            List<Point2d> sortedOuterPoints = new List<Point2d>();
                            for (int i = 0; i < outerPolyline.NumberOfVertices; i++)
                            {
                                Point2d point = outerPolyline.GetPoint2dAt(i);
                                sortedOuterPoints.Add(point);
                            }

                             多边形顶点集合outerPoints的边界框
                            //var boundingBox = outerPoints.Aggregate(
                            //    new { MinX = double.MaxValue, MaxX = double.MinValue, MinY = double.MaxValue, MaxY = double.MinValue },
                            //    (a, b) =>
                            //    {
                            //        return new
                            //        {
                            //            MinX = Math.Min(a.MinX, b.X),
                            //            MaxX = Math.Max(a.MaxX, b.X),
                            //            MinY = Math.Min(a.MinY, b.Y),
                            //            MaxY = Math.Max(a.MaxY, b.Y)
                            //        };
                            //    });

                             找到左上角的顶点作为候选西北角
                            //Point2d topLeftCorner = new Point2d(boundingBox.MinX, boundingBox.MaxY);

                             找到最接近左上角(西北方向)的顶点索引
                            //int startVertexIndex = outerPoints.IndexOf(outerPoints.OrderBy(p => Math.Pow(p.X - topLeftCorner.X, 2) + Math.Pow(p.Y - topLeftCorner.Y, 2)).First());

                             确保起始顶点是真正的西北角,并按照顺时针排序
                            //bool isClockwiseFromNorthwest = true;
                            //int j = outerPoints.Count - 1;
                            //double sum = 0;

                            //for (int i = 0; i < outerPoints.Count - 1 || (i == outerPoints.Count - 2 && j == outerPoints.Count - 1); i++)
                            //{
                            //    // Shoelace公式的实现,计算三角形对角线乘积之和
                            //    if (i != outerPoints.Count - 2 || j != outerPoints.Count - 1)
                            //    {
                            //        sum += (outerPoints[j].X - outerPoints[i].X) * (outerPoints[(j + 1) % outerPoints.Count].Y + outerPoints[i].Y);
                            //    }
                            //    else
                            //    {
                            //        // 处理最后一个三角形,连接最后一个顶点和第一个顶点
                            //        sum += (outerPoints[j].X - outerPoints[i].X) * (outerPoints[0].Y + outerPoints[i].Y);
                            //    }

                            //    // 更新下一次迭代的索引值(注意这里在循环体内部更新j以正确处理最后一个元素之后的“下一个”顶点)
                            //    j = i;
                            //}
                            //ed.WriteMessage(sum + "sum\n");

                             根据有符号面积判断多边形的方向
                            //if (sum > 0)
                            //{
                            //    isClockwiseFromNorthwest = false;
                            //}
                            //else
                            //{
                            //    isClockwiseFromNorthwest = true;
                            //}
                            //ed.WriteMessage(isClockwiseFromNorthwest + "方向\n");
                             创建一个新的列表,包含从西北角开始按顺时针顺序排列的顶点
                            //List<Point2d> sortedOuterPoints = new List<Point2d>();
                            //if (!isClockwiseFromNorthwest)
                            //{
                            //    ed.WriteMessage(isClockwiseFromNorthwest + "方向1");
                            //    // 如果原始顺序不是从西北角开始顺时针排列,则反转整个列表并重新调整起始点位置
                            //    var reversedOuterPoints = outerPoints.ToList();
                            //    reversedOuterPoints.Reverse();//反序

                            //    sortedOuterPoints.AddRange(reversedOuterPoints);
                            //    sortedOuterPoints.RemoveAt(sortedOuterPoints.Count - 1); // 移除最后一个顶点(与第一个顶点重叠)
                            //    sortedOuterPoints.Insert(0, outerPoints[startVertexIndex]);
                            //}
                            //else
                            //{
                            //    ed.WriteMessage(isClockwiseFromNorthwest + "方向2");
                            //    // 否则直接使用原始列表并调整起始顶点位置
                            //    sortedOuterPoints.AddRange(outerPoints.Skip(startVertexIndex));
                            //    sortedOuterPoints.Insert(0, outerPoints[startVertexIndex]);
                            //}
                            // 使用sortedOuterPoints进行后续操作
                            if (sortedOuterPoints.Count > 0)
                            {
                        

                                Dictionary<Point2d, int> pointIndexDict = new Dictionary<Point2d, int>();

                                for (int i = 0; i < sortedOuterPoints.Count; i++)
                                {
                                    // 创建并设置文本对象
                                    Point2d point = sortedOuterPoints[i];
                                    // 获取多边形的中心点
                                    Point3d center = GetCenterOfPolyline(outerPolyline);
                                    // 定义你的扩展因子,比如 1.5 表示扩大1.5倍
                                    double scaleFactor = 1.1;

                                    // 将顶点向中心点平移,然后按比例缩放
                                    Point3d scaledPoint = new Point3d(
                                        (point.X - center.X) * scaleFactor + center.X,
                                        (point.Y - center.Y) * scaleFactor + center.Y,
                                        0
                                    );
                                    scaledPoint = new Point3d(point.X, point.Y,0);
                                    DBText text = new DBText();
                                    text.TextString = "T"+(i + 1).ToString();
                                    text.Height = 0.85;

                                    text.Position = scaledPoint;

                                    // 将文本添加到模型空间
                                    using (Transaction transaction = db.TransactionManager.StartTransaction())
                                    {
                                        BlockTable bt = transaction.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                                        BlockTableRecord ms = transaction.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
                                        ms.AppendEntity(text);
                                        transaction.AddNewlyCreatedDBObject(text, true);
                                        transaction.Commit();
                                    }
                                    // 插入块到当前图纸中的指定位置
                                    ObjectId newBlockId;
                                    BlockTable currentBlockTable = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
                                    newBlockId = currentBlockTable["GXGLQTC"];

                                    using (Transaction transaction = db.TransactionManager.StartTransaction())
                                    {
                                        BlockReference blockRef = new BlockReference(scaledPoint, newBlockId);
                                        BlockTable bt = transaction.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                                        BlockTableRecord activeSpace = transaction.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
                                        activeSpace.AppendEntity(blockRef);
                                        transaction.AddNewlyCreatedDBObject(blockRef, true);
                                        transaction.Commit();
                                    }
                                }
                            }
                                
                           
                            
                        }
                    }
                    tr.Commit();
                }
            }
               
        }

        private static Point3d GetCenterOfPolyline(Polyline polyline)
        {
            double xSum = 0, ySum = 0, zSum = 0;
            for (int i = 0; i < polyline.NumberOfVertices; i++)
            {
                Point3d vertex = polyline.GetPoint3dAt(i);
                xSum += vertex.X;
                ySum += vertex.Y;
                zSum += vertex.Z;
            }
            return new Point3d(xSum / polyline.NumberOfVertices, ySum / polyline.NumberOfVertices, zSum / polyline.NumberOfVertices);
        }
    }
}

 

//感谢大家的点赞,收藏,转发,关注 
//附送AI 图片无版权 随意用 龙年大吉大利
通义万相        阿里最新推出的A绘画创作模型 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1449708.html

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

相关文章

分布式文件系统 SpringBoot+FastDFS+Vue.js【三】

分布式文件系统 SpringBootFastDFSVue.js【三】 七、创建后台--分角色管理7.1.创建后台数据库表7.2.创建实体类7.2.1.Admin7.2.2.Menu7.2.3.MenuBean7.2.4.Role7.2.5.RoleMenu 7.3.编辑配置文件application.yml7.4.编写工具类7.4.1.AuthContextHolder7.4.2.HttpUtils7.4.3.Stri…

【机器学习案例4】为机器学习算法编码分类数据【含源码】

目录 编码分类数据 序数编码 标签编码 一次性编码 目标编码 目标编码的优点 目标编码的缺点 在现实生活中,收集的原始数据很少采用我们可以直接用于机器学习模型的格式,即数值型数据。因此,需要进行一些预处理,以便以正确的格式呈现数据、选择信息丰富的数据或降低其…

【计算机网络】网络层之IP协议

文章目录 1.基本概念2.协议头格式3.网段划分4.特殊的IP地址5.IP地址的数量限制6.私有IP地址和公网IP地址7.路由 1.基本概念 IP地址是定位主机的&#xff0c;具有一个将数据报从A主机跨网络可靠的送到B主机的能力。 但是有能力就一定能做到吗&#xff0c;只能说有很大的概率。…

NARF关键点检测及SAC-IA粗配准

一、生成对应深度图 C #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/common/io.h> #include <pcl/range_image/range_image.h> #include <pcl/visualization/range_image_visualizer.h>…

手撕链表OJ

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

使用Vue.js输出一个hello world

导入vue.js <script src"https://cdn.jsdelivr.net/npm/vue2/dist/vue.js"></script> 创建一个标签 <div id"app">{{message}}</div> 接管标签内容&#xff0c;创建vue实例 <script type"text/javascript">va…

Python算法题集_二叉树的中序遍历

Python算法题集_二叉树的中序遍历 题94&#xff1a;1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【直接递归】2) 改进版一【函数递归】3) 改进版二【迭代遍历】 4. 最优算法 本文为Python算法题集之一的代码示例 题94&#xff1a; 1. 示例说…

BMS再进阶(新能源汽车电池管理系统)

引言 一文入门BMS&#xff08;电池管理系统&#xff09;_bms电池管理-CSDN博客 BMS进阶&#xff08;Type-C、PD快充、充电IC、SOC算法、电池管理IC&#xff09;_充电ic asi aso功能-CSDN博客 本文是上面两篇博客的续篇&#xff0c;之前都是讲解一些BMS基本原理&#xff0c;…

(14)Hive调优——合并小文件

目录 一、小文件产生的原因 二、小文件的危害 三、小文件的解决方案 3.1 小文件的预防 3.1.1 减少Map数量 3.1.2 减少Reduce的数量 3.2 已存在的小文件合并 3.2.1 方式一&#xff1a;insert overwrite (推荐) 3.2.2 方式二&#xff1a;concatenate 3.2.3 方式三&#xff…

react【六】 React-Router 路由

文章目录 1、Router1.1 路由1.2 认识React-Router1.3 Link和NavLink1.4 Navigate1.5 Not Found页面配置1.6 路由的嵌套1.7 手动路由的跳转1.7.1 在函数式组件中使用hook1.7.2 在类组件中封装高阶组件 1.8 动态路由传递参数1.9 路由的配置文件以及懒加载 1、Router 1.1 路由 1.…

FT2232调试记录(2)

FT2232调试记录 &#xff08;1&#xff09;获取当前连接的FTDI设备通道个数:&#xff08;2&#xff09;获取当前连接的设备通道的信息:&#xff08;3&#xff09;配置SPI的通道:&#xff08;4&#xff09;如何设置GPIO:&#xff08;5&#xff09;DEMO测试&#xff1a; FT2232调…

软件实例分享,门诊处方软件存储模板处方笺教程,个体诊所电子处方开单系统软件教程

软件实例分享&#xff0c;门诊处方软件存储模板处方笺教程&#xff0c;个体诊所电子处方开单系统软件教程、 一、前言 以下软件教程以 佳易王诊所电子处方管理软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 电子处方软件支持病历汇总…

VitePress-15- 配置- description 的作用详解

作用描述 1、descriptioin 是站点的描述&#xff0c; 会被解析为 html 页面的 <meta name"description" content "xxx"> 标签 。2、description 本身就是 <meta> 标签的一种&#xff0c;不会在页面上展示出来&#xff0c; 仅仅是作为页面的一…

动态内存管理:new和delete的底层探索

之前我们在C语言上是学过malloc和calloc还要realloc等函数来在堆上获取相应的内存&#xff0c;但是这些函数是存在缺陷的&#xff0c;今天引入对new和delete的学习&#xff0c;来了解new和delete的底层实现。 首先就是在C中我们为什么要对内存进行区域的分块&#xff1f; 答案…

腾讯云4核8G服务器多少钱?

腾讯云4核8G服务器多少钱&#xff1f;轻量应用服务器4核8G12M带宽一年446元、646元15个月&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;标准型SA2服务器1444.8元一年&#xff0c;在txy.wiki可以查询详细配置和精准报价…

Apache 神禹(shenyu)源码阅读(三)——被网关路由的后端服务 Client 向 Admin 注册的数据传输(Client端)

前言 在真正测试 Divide 插件时&#xff0c;想要知道后端服务&#xff08;以下称为 Client&#xff09;是如何将自己的信息注册到管理台&#xff08;以下称为 Client&#xff09;。这里后端服务用的是 shenyu 自带的 http 的例子&#xff0c;项目名字为 shenyu-examples-http。…

QlikSense财务聚合函数:IRR/NPV/XIRR/XNPV

IRR - 脚本函数 IRR() 函数用于返回聚合内部回报率&#xff0c;以揭示迭代于 group by 子句定义的大量记录上的表达式的数值表示的现金流系列。 这些现金流不必是均值&#xff0c;因为它们可用于年金。但是&#xff0c;现金流必须定期出现&#xff0c;例如每月或每年。内部收…

BUGKU-WEB 你必须让他停下

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; 解题思路 图片会消失,那应该是使用了js来控制根据提示,那就是要停止js才会看到flag (也就是要抓包,不要陷入停止js的思维) 相关工具 F12大法Burp Suit抓包工具 解题步骤 出现图片的时候,源码中确实出现…

CISA知识点

审计流程21%&#xff1b;运营和业务恢复23%&#xff1b;保护资产27%&#xff1b;IT治理17%&#xff1b;开发12%。 领域1-信息系统审计流程 规划-现场工作-报告 &#xff08;1&#xff09;审计规划 了解业务使命、目标、目的和流程 找到相关规定 实施风险分析&#xff08;…

权限提升:利用Linux错配提权

目录 Linux权限基础 Linux用户权限 Linux文件权限 特殊的Linux文件权限 Linux本机信息收集 Linux错配提权 crontab计划任务提权 SUID提权 Linux权限基础 Linux用户权限 在Linux中&#xff0c;根据权限的不同&#xff0c;大致可以分为三种&#xff1a;超级用户&#x…