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

相关文章

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调