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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web3 基金会推出去中心化之声计划:投入高额 DOT 和 KSM ,助力去中心化治理

作者&#xff1a;Web3 Foundation Team 编译&#xff1a;OneBlock 原文&#xff1a;https://medium.com/web3foundation/decentralized-voices-program-93623c27ae43 Web3 基金会为 Polkadot 和 Kusama 创建了去中心化之声计划&#xff08;Decentralized Voices Program&…

【深度学习笔记】3_1 线性回归

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 3.1 线性回归 线性回归输出是一个连续值&#xff0c;因此适用于回归问题。回归问题在实际中很常见&#xff0c;如预测房屋价格、气温、销售额等连续值的问题。与回归问…

3.测试教程 - 基础篇

文章目录 软件测试的生命周期软件测试&软件开发生命周期如何描述一个bug如何定义bug的级别bug的生命周期如何开始第一次测试测试的执行和BUG管理产生争执怎么办&#xff08;处理人际关系&#xff09; 大家好&#xff0c;我是晓星航。今天为大家带来的是 测试基础 相关的讲解…

C++最佳实践之编译篇

C最佳实践之工程编译 在大型c/c工程开发中&#xff0c;往往会涉及多级CMakeLists.txt的调用&#xff0c;并且调用方式错综复杂&#xff0c;主要有以下两种方式&#xff1a; 1. 子目录中的CMakeList.txt独立生成目标&#xff0c;不作为主目标生成过程的依赖关系&#xff08;比…

架构师技能9-深入mybatis:Creating a new SqlSession到查询语句耗时特别长

开篇语录&#xff1a;以架构师的能力标准去分析每个问题&#xff0c;过后由表及里分析问题的本质&#xff0c;复盘总结经验&#xff0c;并把总结内容记录下来。当你解决各种各样的问题&#xff0c;也就积累了丰富的解决问题的经验&#xff0c;解决问题的能力也将自然得到极大的…

【生活】浅浅记录

各位小伙伴们好鸭&#xff0c;今天不是技术文章&#xff0c;浅浅记录一下最近几个月的收获&#x1f60a; 新的一年&#xff0c;一起努力&#xff0c;加油加油&#xff01;

2024年【安全员-A证】免费试题及安全员-A证作业模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-A证免费试题参考答案及安全员-A证考试试题解析是安全生产模拟考试一点通题库老师及安全员-A证操作证已考过的学员汇总&#xff0c;相对有效帮助安全员-A证作业模拟考试学员顺利通过考试。 1、【多选题】 《陕西…

黑色金属冶炼5G智能工厂数字孪生可视化管控系统,推进金属冶炼行业数字化转型

黑色金属冶炼5G智能工厂数字孪生可视化管控系统&#xff0c;推进金属冶炼行业数字化转型。随着科技的不断发展&#xff0c;数字化转型已经成为各行各业发展的必然趋势。金属冶炼行业作为传统工业的重要组成部分&#xff0c;也面临着数字化转型的挑战和机遇。为了推进金属冶炼行…

Vue知识学习

Vue 是什么&#xff1f; 概念&#xff1a;Vue 是一个用于构建用户界面的渐进式框架 Vue 的两种使用方式: ① Vue 核心包开发 场景:局部 模块改造 ② Vue 核心包& Vue插件工程化开发 场景:整站开发 创建Vue 实例&#xff0c;初始化渲染的核心步骤: 1.准备容器 2.引包(官…

这两招,让你轻松俘获客户心

面向政府的数字化解决方案作为睿鸿数字应用的一个分支&#xff0c;在充分借鉴政府项目中积累的丰富经验的基础上&#xff0c;积极开发更多领域通用的标准化产品。 2023年&#xff0c;睿鸿推出了一系列创新的数字应用产品&#xff0c;包括动态表单系统、统一集成门户、统一通信中…

【MySQL】如何理解索引(高频面试点)

一、前言 首先这个博客会介绍一些关于MySQL中索引的基本内容以及一些基本的语法&#xff0c;当然里面也会有些常见的面试题的解答。 二、关于索引 1、概念 索引是一种能够帮助MySQL高效的去磁盘检索数据的一种数据结构。在MySQL的Innodb存储引擎中呢&#xff0c;采用的是B树的…

如何开发通过蓝牙技术实现灯光智能调节的小程序

近年来&#xff0c;随着智能家居市场日渐兴起&#xff0c;人们对于家居生活品质的需求不断提升。在这一背景下&#xff0c;蓝牙智能调节小程序的开发能够为客户提供更便捷、智能化的LED灯光调节方案。需求方想要实现通过蓝牙开发实现LED灯光亮度和颜色的智能调节&#xff0c;同…

NOW 闹个元宵?与亚信安慧AntDB一起猜灯谜,抽奖品

关于亚信安慧AntDB数据库 AntDB数据库始于2008年&#xff0c;在运营商的核心系统上&#xff0c;服务国内24个省市自治区的数亿用户&#xff0c;具备高性能、弹性扩展、高可靠等产品特性&#xff0c;峰值每秒可处理百万笔通信核心交易&#xff0c;保障系统持续稳定运行超十年&a…

关于使用Mxnet GPU版本运行DeepAR报错解决方案

1.引言 我们经常使用GPU来训练和部署神经网络&#xff0c;因为与CPU相比&#xff0c;它提供了更多的计算能力。在本教程中&#xff0c;我们将介绍如何将GPU与MXNet GluonTS一起使用。 首先&#xff0c;确保您的机器中至少有一个Nvidia GPU&#xff0c;并正确安装了CUDA以及CUDN…

SORA技术报告快速解读——浅谈其AIGC积累的技术底蕴

SORA技术报告解读 文章目录 概要SORA整体概要关键性的技术方案解析1. 视觉类型的特征嵌入和处理-video encoder1.1 压缩视频的特征网络模型是什么&#xff1f;1.2 如何处理不同分辨率的训练和推理问题&#xff1f;2 Scaling transformers 扩散模型3. 生成解码器 小结 概要 最…

深度学习基础(三)循环神经网络(RNN)

之前的章节我们初步介绍了卷积神经网络&#xff08;CNN&#xff09;&#xff1a; 深度学习基础&#xff08;二&#xff09;卷积神经网络&#xff08;CNN&#xff09;-CSDN博客文章浏览阅读2次。卷积神经网络&#xff08;CNN&#xff09;的应用领域广泛&#xff0c;尤其在图像处…

跟着野火学FreeRTOS:第二段(事件组)

在小节里面介绍了二进制信号量&#xff0c;计数信号量&#xff0c;互斥量和递归互斥量等功能&#xff0c;其中二进制信号量和计数信号量&#xff08;也包括队列&#xff09;常用于任务和任务之间以及任务和中断之间的同步&#xff0c;她们具有以下属性&#xff1a; 当等待的事…

Sora----打破虚实之间的最后一根枷锁----这扇门的背后是人类文明的晟阳还是最后的余晖

目录 一.Sora出道即巅峰 二.为何说Sora是该领域的巨头 三.Sora无敌的背后究竟有怎样先进的处理技术 1.Spacetime Latent Patches 潜变量时空碎片&#xff0c;建构视觉语言系统 2.扩散模型与Diffusion Transformer&#xff0c;组合成强大的信息提取器 3.DiT应用于潜变量时…

每日五道java面试题之spring篇(三)

目录&#xff1a; 第一题 ApplicationContext和BeanFactory有什么区别&#xff1f;第二题 Spring中的事务是如何实现的&#xff1f;第三题 Spring中什么时候Transactional会失效&#xff1f;第四题 Spring容器启动流程是怎样的&#xff1f;第五题 Spring Boot、Spring MVC 和 S…

隐藏饿了么el-select组件的el-select-dropdown部分,只使用el-select的显示框

隐藏饿了么el-select组件的el-select-dropdown部分,只使用el-select的显示框 问题: 由于el-select组件的el-select-dropdown部分是自动插入在最外层Body上的&#xff0c;所以在当前组件的scoped中让el-select-dropdown组件display:none不会生效所以需要&#xff1a; :popper-…