C# cass10 宗地初始化-根据 “预编号” “权利人”图层对应信息 批量添加到宗地图层

运行环境Visual Studio 2022 c# cad2016 cass10

根据 “预编号” “权利人”图层对应信息 批量添加到宗地图层

一、主要步骤

  1. zdimport 方法:这个方法用于导入宗地信息。首先通过调用 AutoCAD API 获取当前活动文档、数据库和编辑器对象。然后根据 CreatePalette.SelectedLayerName 获取用户选择的图层名字,并通过 FindJZDLayer 方法找到名为 "JZD" 的图层的 ObjectId。

    接下来,通过创建一个外部多段线的选择过滤器 outerFilter 来选择用户在指定图层上选择的所有外部多段线。如果选择成功,就开始一个数据库事务 tr,以确保数据的一致性。

    在每个被选中的外部多段线上进行迭代,首先读取外部多段线的属性,包括是否闭合和顶点的数量。如果多段线是闭合的且顶点数量大于0,则需要进一步处理。

    通过调用 GetCenterOfPolyline 方法计算多边形的中心点,并根据一定的比例因子对顶点进行缩放计算,得到缩放后的点 scaledPoint

    然后创建一个文本对象 DBText,设置其文本内容为顶点的索引值,并将其位置设置为缩放后的点。将缩放后的点添加到一个点集合 outerPoints 中,以备后续操作使用。

    接下来,创建一个用于选择内部文本对象的选择过滤器 innerFilter,其中包含实体类型为 "TEXT"。

    然后使用 ed.SelectWindowPolygon 方法根据外部多段线的顶点集合和内部选择过滤器选择所有位于多段线内部的文本对象。如果选择成功,则开始处理内部文本对象。

    在内部文本对象的迭代中,根据文本对象所在的图层名称判断其属性,并将预编号和权利人信息保存到相应的变量中,并使用 ed.WriteMessage 方法输出到编辑器中。

    最后,通过创建一个新的 ResultBuffer 对象 rb,添加各种扩展数据(包括预编号、权利人等),并将其赋值给外部多段线的 XData 属性。还将外部多段线的图层设置为 "JZD" 图层,并提交事务。

  2. GetCenterOfPolyline 方法:这个方法用于计算多段线的中心点。它遍历多段线的每个顶点,将顶点的 X、Y、Z 坐标分别累加求和,最后返回坐标的平均值作为中心点的坐标。

  3. FindJZDLayer 方法:这个方法用于在图层表中查找名为 "JZD" 的图层。它遍历图层表,比较每个图层记录的名称是否与 "JZD" 相同,如果找到了匹配的图层记录,则返回该图层的 ObjectId。

  4. GetOrCreateJZDLayer 方法:这个方法用于获取名为 "JZD" 的图层的 ObjectId。首先检查图层表中是否已经存在名为 "JZD" 的图层,如果存在则直接返回该图层的 ObjectId,如果不存在则创建一个新的图层记录,并添加到图层表中,最后返回新图层的 ObjectId。

  5. IsPointInside 方法:这个方法用于判断一个点是否在给定的多段线内部。它使用交叉次数的方法来判断,如果点与多段线相交的次数为奇数,则认为该点在多段线内部,否则认为在外部。

  6. CountCharacterOccurrences 方法:这个静态方法用于统计一个字符串中某个子字符串出现的次数。它使用 IndexOf 方法查找子字符串在字符串中的位置,并通过迭代进行计数,直到找不到子字符串为止。

二、完整代码 
namespace 宗地信息.宗地
{internal class zd初始化{public static void zdimport(){// 获取当前AutoCAD应用中的活动文档、数据库和编辑器对象Document doc = Application.DocumentManager.MdiActiveDocument;Database db = doc.Database;Editor ed = doc.Editor;string SelectedLayerName = CreatePalette.SelectedLayerName;ObjectId jzdLayerId = FindJZDLayer(db); // 使用实例调用 FindJZDLayer 方法SelectionFilter outerFilter = new SelectionFilter(new TypedValue[] {new TypedValue((int)DxfCode.Start, "LWPOLYLINE"),new TypedValue((int)DxfCode.LayerName, SelectedLayerName)
});PromptSelectionResult outerSelRes = ed.GetSelection(outerFilter);if (outerSelRes.Status == PromptStatus.OK){using (Transaction tr = db.TransactionManager.StartTransaction())// 开始事务处理以确保数据一致性{foreach (ObjectId outerId in outerSelRes.Value.GetObjectIds())// 遍历所有被选中的外部多段线{using (Polyline outerPolyline = (Polyline)tr.GetObject(outerId, OpenMode.ForRead))// 读取所选多段线{if (outerPolyline.Closed && outerPolyline.NumberOfVertices > 0){Point3dCollection outerPoints = new Point3dCollection();for (int i = 0; i < outerPolyline.NumberOfVertices; i++){Point3d point = outerPolyline.GetPoint3dAt(i);Point3d center = GetCenterOfPolyline(outerPolyline);double scaleFactor = 1.1;Point3d scaledPoint = new Point3d((point.X - center.X) * scaleFactor + center.X,(point.Y - center.Y) * scaleFactor + center.Y,(point.Z - center.Z) * scaleFactor + center.Z);// 创建并设置文本对象DBText text = new DBText();text.TextString = i.ToString();//text.Height = 1; // 文字高度设为1个单位text.Position = scaledPoint;outerPoints.Add(scaledPoint);}SelectionFilter innerFilter = new SelectionFilter(new TypedValue[] {new TypedValue((int)DxfCode.Start, "TEXT"),  // 实体类型为TEXT});PromptSelectionResult innerSelRes = ed.SelectWindowPolygon(outerPoints, innerFilter);if (innerSelRes.Status == PromptStatus.OK){string ybh = "";string qlr = "";foreach (ObjectId id2 in innerSelRes.Value.GetObjectIds()){DBText text = tr.GetObject(id2, OpenMode.ForRead) as DBText;if (text != null){if (text.Layer == "预编号"){ybh = text.TextString;ed.WriteMessage("预编号:" + ybh + "\n");}if (text.Layer == "权利人"){qlr = text.TextString;ed.WriteMessage("权利人:" + qlr + "\n");}}}ed.WriteMessage("\n 修改XData01。");// 遍历ResultBuffer以查看数据using (Transaction transaction = db.TransactionManager.StartTransaction()){Entity ent01 = transaction.GetObject(outerId, OpenMode.ForWrite) as Entity;RegAppTable table = (RegAppTable)transaction.GetObject(doc.Database.RegAppTableId, OpenMode.ForWrite, false);ResultBuffer rb = new ResultBuffer();string appName = "YBDJH";if (!table.Has(appName)){RegAppTableRecord regAppRec = new RegAppTableRecord();regAppRec.Name = appName;table.Add(regAppRec);transaction.AddNewlyCreatedDBObject(regAppRec, true);}rb.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName));rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, ybh));appName = "SOUTH";if (!table.Has(appName)){RegAppTableRecord regAppRec = new RegAppTableRecord();regAppRec.Name = appName;table.Add(regAppRec);transaction.AddNewlyCreatedDBObject(regAppRec, true);}rb.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName));rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "300000"));rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "JC"+ybh));rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString,  qlr));rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "0710"));appName = "JZSJMJ";if (!table.Has(appName)){RegAppTableRecord regAppRec = new RegAppTableRecord();regAppRec.Name = appName;table.Add(regAppRec);transaction.AddNewlyCreatedDBObject(regAppRec, true);}rb.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName));rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, ybh));ent01.XData = rb;ent01.LayerId = jzdLayerId;transaction.Commit();ed.WriteMessage("\n 修改XData。");}}}}}tr.Commit();}}}// GetCenterOfPolyline 是一个假设存在的方法,用于计算多边形的中心点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);}}public static ObjectId FindJZDLayer(Database db){using (Transaction tr = db.TransactionManager.StartTransaction()){LayerTable lt = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;if (lt == null){return ObjectId.Null;}foreach (ObjectId layerId in lt){LayerTableRecord ltr = tr.GetObject(layerId, OpenMode.ForRead) as LayerTableRecord;if (ltr.Name.Equals("JZD", StringComparison.OrdinalIgnoreCase)){return layerId;}}return ObjectId.Null;}}public ObjectId GetOrCreateJZDLayer(Database db){string layerName = "JZD";using (Transaction tr = db.TransactionManager.StartTransaction()){// 检查图层是否已存在LayerTable lt = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;if (lt.Has("JZD")){return lt["JZD"];}else{LayerTableRecord newLayer = new LayerTableRecord();newLayer.Name = layerName;ObjectId newLayerId = lt.Add(newLayer);tr.AddNewlyCreatedDBObject(newLayer, true);tr.Commit();return newLayerId;}}}// 定义一个方法,输入参数为一个多段线对象和一个三维点,返回值为布尔类型,表示该点是否在多段线内部public bool IsPointInside(Polyline polyline, Point3d point){int crossings = 0;for (int i = 0; i < polyline.NumberOfVertices; i++){Point3d start = polyline.GetPoint3dAt(i);int nextIndex = (i + 1) % polyline.NumberOfVertices;Point3d end = polyline.GetPoint3dAt(nextIndex);if (start.Y > point.Y && end.Y > point.Y)continue;if (start.Y <= point.Y && end.Y <= point.Y)continue;if (point.X < Math.Min(start.X, end.X))continue;double slope = (end.Y - start.Y) / (end.X - start.X);double intersectX = start.X + (point.Y - start.Y) / slope;if (point.X >= intersectX)crossings++;}return (crossings % 2) == 1;}//包含字符 出现次数public static int CountCharacterOccurrences(string str, string substring){if (string.IsNullOrEmpty(str) || string.IsNullOrEmpty(substring))return 0;int index = 0, count = 0;while ((index = str.IndexOf(substring, index)) != -1){count++;index += substring.Length; // 移动到下一个可能的位置}return count;}}
}

 //有需要cad二次开发可以私信进行联系
//感谢大家的点赞,收藏,转发,关注   

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

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

相关文章

[OpenAI]继ChatGPT后发布的Sora模型原理与体验通道

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言OpenAI体验通道Spacetime Latent Patches 潜变量时空碎片, 建构视觉语言系统…

day11_内部类代码块枚举课后练习 - 参考答案

文章目录 day11_课后练习代码阅读题第1题第2题第3题第4题第5题第6题第7题第8题第9题第10题第11题第12题 代码编程题第13题 day11_课后练习 代码阅读题 第1题 知识点&#xff1a;实例初始化 案例&#xff1a;判断运行结果 package com.atguigu.test01;class HelloA{public …

稳定运行矿山鸿蒙系统——飞凌嵌入式的这2款核心板获得「矿鸿资质证书」

飞凌嵌入式FETMX6ULL-S核心板和FETA40i-C核心板近期通过了“矿鸿兼容性测试认证”&#xff0c;这两款嵌入式核心板与矿鸿OS的结合将进一步推动煤矿行业的智能化进程。 矿鸿&#xff08;MineHarmony&#xff09;操作系统是由国家能源集团基于鸿蒙系统推出的一款专为煤矿行业设计…

网页403错误(Spring Security报异常 Encoded password does not look like BCrypt)

这个错误通常表现为"403 Forbidden"或"HTTP Status 403"&#xff0c;它指的是访问资源被服务器理解但拒绝授权。换句话说&#xff0c;服务器可以理解你请求看到的页面&#xff0c;但它拒绝给你权限。 也就是说很可能测试给定的参数有问题&#xff0c;后端…

C++力扣题目 392--判断子序列 115--不同的子序列 583--两个字符串的删除操作 72--编辑操作

392.判断子序列 力扣题目链接(opens new window) 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;&quo…

小说阅读软件书架界面和历史记录界面

1、引言 终于修改到书架界面和历史阅读记录界面了&#xff0c;修改完这两个界面就算完成一大半了&#xff0c;这两个界面其实都差不多&#xff0c;代码逻辑都一样&#xff0c;因此后面也会只展示书架界面的代码&#xff0c;历史阅读记录界面就展示效果图就行了。 2、实现代码 …

无线听觉新体验:南卡、韶音、墨觉骨传导耳机综合评测

作为一个资深的跑步爱好者&#xff0c;我几乎离不开音乐的陪伴。不知道大家有没有同感&#xff0c;有时候一首歌曲就是我坚持下去的动力&#xff0c;尤其是在那段艰难的跑步时刻。但是找到一款既能让我在运动中自由呼吸、又能提供优质音乐体验的耳机&#xff0c;并不是一件容易…

Redis(十五)Bitmap、Hyperloglog、GEO案例、布隆过滤器

文章目录 面试题常见统计类型聚合统计排序统计二值统计基数统计 Hyperloglog专有名词UV&#xff08;Unique Visitor&#xff09;独立访客PV&#xff08;Page View&#xff09;页面浏览量DAU&#xff08;Daily Active User&#xff09;日活跃用户量MAU&#xff08;Monthly Activ…

人工智能 — 数字图像

目录 一、图像1、像素2、图像分辨率3、RGB 模型4、灰度5、通道6、对比度7、RGB 转化为 Gray8、RGB 值转化为浮点数9、二值化10、常用视觉库11、频率12、幅值 二、图像的取样与量化1、数字图像2、取样3、量化 三、上采样与下采样1、上采样&#xff08;upsampling&#xff09;2、…

Encoder-decoder 与Decoder-only 模型之间的使用区别

承接上文&#xff1a;Transformer Encoder-Decoer 结构回顾 笔者以huggingface T5 transformer 对encoder-decoder 模型进行了简单的回顾。 由于笔者最近使用decoder-only模型时发现&#xff0c;其使用细节和encoder-decoder有着非常大的区别&#xff1b;而huggingface的接口为…

解决SpringAMQP工作队列模型程序报错:WARN 48068:Failed to declare queue: simple.queue

这里写目录标题 1.运行环境2.报错信息3.解决方案4.查看解决之后的效果 1.运行环境 使用docker运行了RabbitMQ的服务器&#xff1a; 在idea中导入springAMQP的jar包&#xff0c;分别编写了子模块生产者publisher&#xff0c;消费者consumer&#xff1a; 1.在publisher中运行测试…

Excel Ctrl + E快捷键 批量合并提取数据

目录 一. 合并数据二. 提取数据 Ctrl L 只是快捷键&#xff0c;在数据面板中有快速填充的按钮。 一. 合并数据 &#x1f914;有如图所示的数据&#xff0c;现在想批量的把姓名和电话合在一起 &#x1f9d0;先把要处理的数据手动复制到一起&#xff0c;然后按下 Ctrl E 就可以…

Element table 实现表格行、列拖拽功能

安装包 npm install sortablejs --save <template><div class"draggable" style"padding: 20px"><el-table row-key"id" :data"tableData" style"width: 100%" border><el-table-columnv-for"(it…

【C++私房菜】面向对象中的多重继承以及菱形继承

文章目录 一、多重继承1、多重继承概念2、派生类构造函数和析构函数 二、菱形继承和虚继承2、虚继承后的构造函数和析构函数 三、has-a 与 is-a 一、多重继承 1、多重继承概念 **多重继承&#xff08;multiple inheritance&#xff09;**是指从多个直接基类中产生派生类的能力…

Stable Diffusion 模型分享:AstrAnime(Astr动画)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五 下载地址 模型介绍 AstrAnime 是一个动漫模型&#xff0c;画风色彩鲜明&#xff0c;擅长绘制漂亮的小姐姐。 条目内容类型大模型…

uniapp实现全局悬浮框

uniapp实现全局悬浮框(按钮,页面,图片自行设置) 可拖动 话不多说直接上干货 1,在components新建组件(省去了每个页面都要引用组件的麻烦) 2,实现代码 <template><view class"call-plate" :style"top: top px;left: left px;" touchmove&quo…

【目标检测新SOTA!v7 v4作者新作!】YOLO v9 思路复现 + 全流程优化

YOLO v9 思路复现 全流程优化 提出背景&#xff1a;深层网络的 信息丢失、梯度流偏差YOLO v9 设计逻辑可编程梯度信息&#xff08;PGI&#xff09;&#xff1a;使用PGI改善训练过程广义高效层聚合网络&#xff08;GELAN&#xff09;&#xff1a;使用GELAN改进架构 对比其他解法…

V2X与ETC到底有什么不同?

作者介绍 新春假期刚刚结束&#xff0c;大家在返程路上是否会因为堵车发愁&#xff1f;尤其是在假期结束后高速不再免费&#xff0c;人工收费口大排长队&#xff0c;这时大家是否会感慨ETC&#xff08;Electronic Toll Collection&#xff0c;电子不停车收费&#xff09;技术为…

如何在Shopee平台上优化饰品类目选品?

在Shopee这样竞争激烈的电商平台上&#xff0c;针对饰品类目进行选品是一项需要精心策划和执行的任务。卖家们需要通过深入的市场分析和精准的策略&#xff0c;才能在激烈的竞争中脱颖而出&#xff0c;提高产品的曝光度和销售业绩。下面将介绍一些在Shopee平台上优化饰品类目选…

【高德地图】Android搭建3D高德地图详细教

&#x1f4d6;Android搭建3D高德地图详细教程 &#x1f4d6;第1章 高德地图介绍✅了解高德地图✅2D地图与3D地图 &#x1f4d6;第2章 搭建3D地图并显示✅第 1 步&#xff1a;创建 Android 项目✅第 2 步&#xff1a;获取高德Key✅第 3 步&#xff1a;下载地图SDK✅第 4 步&…