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

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、主要步骤
- 获取当前活动文档、数据库和编辑器对象。
- 设置一个选择过滤器,只允许用户选择"宗地"图层上的LWPOLYLINE对象。
- 用户根据过滤规则进行实体选择后,程序处理所选中的每个闭合多段线。
- 对于每个闭合多段线,首先确保它是闭合的且至少有一个顶点,并将所有顶点存储到一个列表中。
- 注释部分:这部分原来包含计算多边形方向和排序顶点的逻辑,但后来被注释掉,实际代码中并没有执行这部分操作。
- 遍历排序后的顶点列表,为每个顶点创建一个文本标签(DBText)并在模型空间中绘制,标签内容是其顺序编号,位置基于顶点坐标并进行了缩放和平移处理。
- 同样针对每个顶点,在模型空间中插入名为“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绘画创作模型
相关文章:
C# CAD2016 宗地生成界址点,界址点编号及排序
1 、界址点起点位置C# CAD2016 多边形顶点按方向重新排序 2、 界址点顺时针逆时针走向 C# CAD2016 判断多边形的方向正时针或逆时针旋转 3、块文件插入 //已知块文件名称 GXGLQTC //块文件需要插入的坐标点 scaledPoint// 插入块到当前图纸中的指定位置ObjectId newBlockId;B…...
[ai笔记7] google浏览器ai学习提效定制优化+常用插件推荐
欢迎来到文思源想的ai空间,这是技术老兵重学ai以及成长思考的第7篇分享! 工欲善其事必先利其器,为了ai学习的效能提升,放假期间对google浏览器做了一次系统整改,添加了一些配置和插件,这里既有一些显示、主…...
联想thinkpad-E450双系统升级记
早期笔记本联想thinkpad-E450双系统 大约16年花4000多大洋,买了一台thinkpad-E450屏幕是16寸本,有AMD独立显卡,i5cpu,4G内存。 . 后来加了一个同型号4G内存组成双通道, . 加了一个三星固态500G, . 换了一个…...
Mysql运维篇(四) Xtarbackup--备份与恢复练习
一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。如有侵权,请留言,我及时删除! 前言 xtrabackup是Percona公司CTO Vadim参与开发的一款基于InnoDB的在线热备工具,具有…...
vue3 封装一个通用echarts组件
实现这个组件需要引入echarts和vue-echarts插件,使用vue-echarts是因为它帮我们封装了一些很常用的功能,比如监听页面resize后重新渲染功能,本次组件只使用到了autoresize配置,其它可以根据官方文档按需选配 https://github.com/…...
安装 Windows Server 2003
1.镜像安装 镜像安装:Windows Server 2003 2.安装过程(直接以图的形式呈现) 按Enter(继续),继续后F8继续 直接Enter安装 下一步 秘钥:GM34K-RCRKY-CRY4R-TMCMW-DMDHM 等待安装成功即可...
在STM32中使用DMA进行SD卡读写操作的实现方法
在STM32中,使用DMA进行SD卡的读写操作可以提高数据传输的速度和效率。下面是在STM32中使用DMA进行SD卡读写操作的实现方法: ✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进 ❤欢迎关注我的知乎:对error视而不见…...
StringBuilder/StringBuffer类(Java)
StringBuilder/StringBuffer类 当对字符串进行修改的时候,使用 StringBuffer / StringBuilder 类更方便。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。方法类似 public class…...
SQL的1999语法
目录 交叉连接 实现交叉连接 自然连接 实现自然连接(实际上就是内连接) ON和USING 使用自然连接时要求两张表的字段名称相同,但是如果不相同或者两张表中有两组字段是重名,这时就要利用 ON 子句指定关联条件,利用 USING 子句…...
【AIGC】Stable Diffusion安装包
Stable Diffusion 的安装教程通常分为以下几个步骤: 一、安装 Python: 确保您的系统中已经安装了 Python,并且版本符合 Stable Diffusion 的要求。通常情况下,Python 版本应为 3.6 或更高版本。您可以从 Python 官方网站下载并安…...
C++:迭代器的封装思想
C:迭代器的封装思想 list迭代器实现反向迭代器实现 本博客将通过实现list的迭代器,以及它的反向迭代器,来帮助大家理解迭代器的底层逻辑,以及封装思想。 list迭代器实现 迭代器是一个遍历容器的工具,其可以通过自增自…...
飞天使-k8s知识点17-kubernetes实操2-pod探针的使用
文章目录 探针的使用容器探针启动实验1-启动探针的使用-startupprobeLiveness Probes 和 Readiness Probes演示若存在started.html 则进行 探针的使用 kubectl edit deploy -n kube-system corednslivenessprobe 的使用 livenessProbe:failureThreshold: 5httpGet:path: /heal…...
tee漏洞学习-翻译-3:TrustZone exploit for MSM8974
原文:http://bits-please.blogspot.com/2015/08/full-trustzone-exploit-for-msm8974.html 在这篇博文中,我们将介绍利用上一篇文章中描述的 TrustZone 漏洞的完整过程。 在开发此漏洞时,我只使用了我值得信赖的(个人࿰…...
rust递归遍历磁盘目录及文件
Std库实现 //遍历dir目录,找出修改日期距离当前超过age天的文件名称,存入file_list中 fn visit_dir(dir: &Path, file_list: &mut Vec<String>, age: u64) -> io::Result<()> {if dir.is_dir() {for entry in fs::read_dir(dir)…...
C语言每日一题(56)平衡二叉树
力扣网 110 平衡二叉树 题目描述 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 示例 1: 输入:root [3,9,20,…...
Flutter Android开发 梳理Google Material Design颜色体系
前言 做安卓开发(Kotlin语言),Flutter开发的人员应该都听说过谷歌一直推崇的Material Design,而Material Design Color是其推崇的颜色体系,具体来说,Material Design Color是一套旨在帮助设计师和开发者创…...
每日五道java面试题之java基础篇(六)
目录: 第一题:Java 创建对象有哪⼏种⽅式?第二题 .Integer a 127,Integer b 127;Integer c 128,Integer d 128;相等吗?第三题.Object 类的常⻅⽅法?第四题 List和Set的区别第五题 ArrayList和…...
c++ STL系列——(五)map
目录 引言 特点 包含头文件 基本特性 基本操作 插入元素 访问元素 移除元素 检查是否包含某个键 获取元素数量 高级特性 迭代器 自定义比较函数 实际应用 统计字符出现次数 缓存最近访问的元素 总结 引言 在C中,标准模板库(STL…...
Huggingface 文档翻译完毕
Accelerate 0.27 中文文档音频课程文档AutoTrain 中文文档AWS 中文文档竞赛中文文档Diffusers 0.26 中文文档深度强化学习课程文档数据集服务器中文文档Datasets 2.17 中文文档 Evaluate 0.4 中文文档Huggingface.js 中文文档Hub 中文文档Hub 客户端库 JS 0.20 中文文档推理 AP…...
C++中类的6个默认成员函数 【拷贝构造函数】
文章目录 拷贝构造函数的使用拷贝构造对于自定义类型【浅拷贝】深拷贝拷贝构造函数典型调用场景 拷贝构造函数的使用 在前几章学习对象的时候,我们有的时候需要一个与已存在对象一某一样的新对象 那在创建对象时,可否创建一个与已存在对象一某一样的新对…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
