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

本文主要是介绍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二次开发可以私信进行联系
//感谢大家的点赞,收藏,转发,关注   

这篇关于C# cass10 宗地初始化-根据 “预编号” “权利人”图层对应信息 批量添加到宗地图层的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/737141

相关文章

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

Java如何从Redis中批量读取数据

《Java如何从Redis中批量读取数据》:本文主要介绍Java如何从Redis中批量读取数据的情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一.背景概述二.分析与实现三.发现问题与屡次改进3.1.QPS过高而且波动很大3.2.程序中断,抛异常3.3.内存消

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

mybatis的mapper对应的xml写法及配置详解

《mybatis的mapper对应的xml写法及配置详解》这篇文章给大家介绍mybatis的mapper对应的xml写法及配置详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录前置mapper 对应 XML 基础配置mapper 对应 xml 复杂配置Mapper 中的相