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

news2025/2/24 8:31:31

运行环境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://www.coloradmin.cn/o/1465795.html

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

相关文章

CSB ----> XXE靶场记

小记&#xff1a;XXE的靶场 1.XXE的触发基本条件 想要触发XXE靶场&#xff0c;必须满足以下的条件 网站开启了外部实体解析libxml<2.9.0 版本 默认开启了外部实体解析&#xff1a;默认开启了外部实体解析网站管理员开启了外部实体解析&#xff08;不过这个一般不太可能&a…

android 15

https://android-developers.googleblog.com/2024/02/first-developer-preview-android15.html android 15的预览版出了&#xff0c;这个版本的发布计划大概是这样的&#xff08;大约是今年8月发布最终版本&#xff09; https://developer.android.com/about/versions/15/over…

vue3中使用vuedraggable实现拖拽el-tree数据进分组

看效果&#xff1a; 可以实现单个拖拽、双击添加、按住ctrl键实现多个添加&#xff0c;或者按住shift键实现范围添加&#xff0c;添加到框中的数据&#xff0c;还能拖拽排序 先安装 vuedraggable 这是他的官网 vue.draggable中文文档 - itxst.com npm i vuedraggable -S 直接…

Kubernetes安装nginx-controller作为统一网关

nginx-controller是什么呢? 它是一个能调度nginx的一个kubernetes operator,它能监听用户创建,更新,删除NginxConf对象,来调度本地的nginx实现配置的动态更新。如添加新的代理(http,https,tcp,udp),缓存(浏览器缓存,本地缓存),ssl证书(配置本身,ConfigMap,Secret),更新,删除等…

Js的 Promise的 then catch 笔记240222

Js的 Promise的 then catch 笔记240222 基本用法 new Promise(f>{setTimeout(ev>{f("一秒后输出控制台");},1000); }).then(f的参数>{console.log(f的参数); }); // 控制台输出: 一秒后输出控制台上面代码中, f 的标准名叫做 resolve , 所以应该写成 new …

开发Chrome插件,background.js中log打印未出现在控制台

不同于内容脚本&#xff08;通常命名content.js&#xff09;&#xff0c;在后台脚本&#xff08;通常命名background.js或service-worker.js&#xff09;中console.log并不会在控制台中直接显示。 要查看后台脚本上下文的正确控制台&#xff0c;执行如下步骤&#xff1a; 访问…

【Python笔记-设计模式】原型模式

一、说明 原型模式是一种创建型设计模式&#xff0c; 用于创建重复的对象&#xff0c;同时又能保证性能。 使一个原型实例指定了要创建的对象的种类&#xff0c;并且通过拷贝这个原型来创建新的对象。 (一) 解决问题 主要解决了对象的创建与复制过程中的性能问题。主要针对…

有哪些适合程序员的副业?

如果你经常玩知乎、看公众号&#xff08;软件、工具、互联网这几类的&#xff09;你就会发现&#xff0c;好多资源连接都变成了夸克网盘、迅雷网盘的资源链接。 例如&#xff1a;天涯神贴&#xff0c;基本上全是夸克、UC、迅雷网盘的资源链接。 有资源的前提下&#xff0c;迅雷…

QT_day4

1.思维导图 2. 输入闹钟时间格式是小时:分钟 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);id startTimer(1000);flag1;speecher new QTextT…

基础数据结构和算法《》

递归 1.递归应该一种比较常见的实现一些特殊代码逻辑时需要做的&#xff0c;但常常也是最绕的一种方式&#xff0c;在解释递归 之前&#xff0c;我们用循环和递归来做个比较1.1.如果你打开一扇门后&#xff0c;同样发现前方也有一扇们&#xff0c;紧接着你又打开下一扇门...直…

应用回归分析:泊松回归

泊松回归是一种广泛用于计数数据的回归分析方法。它适用于响应变量是非负整数的情况&#xff0c;特别是当这些计数呈现出明显的离散分布时。泊松回归通过泊松分布的概率分布函数来建模计数数据&#xff0c;使其成为处理计数数据的自然选择。本文将介绍泊松回归的基本概念、应用…

石头剪刀布游戏(C语言)

题目描述 石头剪刀布游戏有 3 种出拳形状&#xff1a;石头、剪刀、布。分别用字母 A , B , C 表示。 游戏规则: 出拳形状之间的胜负规则如下&#xff1a; A > B&#xff1b;B > C&#xff1b;C > A&#xff1b;">"左边一个字母&#xff0c;表示相对优…

进程线程通信-day6

1、将信号和消息队列的课堂代码敲一遍 //发送端 #include<myhead.h>//定义一个消息结构类型 struct msgbuf {long mtype;char mtext[1024]; }; //定义一个宏&#xff0c;表示消息正文大小 #define MSGSIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc, const…

PBM模型学习

本专栏着重讲解PBM学习所得&#xff0c;学习笔记、心得&#xff0c;并附有视频素材资料&#xff0c;视频详细目录如下&#xff1a; PBM相关参数解释1 PBM相关参数解释2 PBM相关案例实践1 PBM相关案例实践2 PBM相关案例实践2 PBM相关案例实践3 PBM多相流中次相界面设置1 PBM多相…

Kotlin 进阶 学习 委托

1.接口委托 package com.jmj.jetpackcomposecompositionlocal.byStudy/*** 接口委托*/ interface HomeDao{fun getAllData():List<String> }interface ADao{fun getById(id:Int):String }class HomeDaoImpl:HomeDao{override fun getAllData(): List<String> {ret…

MATLAB中的稀疏矩阵和密集矩阵

在MATLAB中&#xff0c;矩阵可以表示为密集或稀疏格式。通常&#xff0c;矩阵默认以密集格式存储&#xff0c;这意味着每个元素都明确地存储在内存中&#xff0c;无论它的值是多少。然而&#xff0c;当矩阵含有大量的零元素时&#xff0c;这种存储方式就会变得非常低效。为了更…

iOS整理 - 关于直播 - 搭建服务端

前言 其实本人一直都想自己简单做一套直播&#xff08;包括移动端和服务端&#xff09;的开发测试&#xff0c;但是之前一直做得比较迷茫。最近偶然间在来了灵感&#xff0c;瞬间解除了我很多疑惑。我会分享出来&#xff0c;希望大家一起研究下。稍后&#xff0c;我完整做好了…

ZS Associates致盛咨询是什么公司?排名怎么样?

随着商业化时代的加速演进&#xff0c;咨询公司在企业发展中的“智囊团”角色愈发突显。对于医药企业来说&#xff0c;一个优秀的咨询团队不仅可以帮助推动整体战略转型及内部改革&#xff0c;还对药品研发、营销起到优化促进作用。 那什么样的咨询企业可称之为优秀的咨询企业…

关于msvcr120.dll丢失怎样修复的详细解决步骤方法分享,msvcr120.dll文件的相关内容

在电脑使用过程中&#xff0c;我们经常遇到各种系统错误&#xff0c;其中msvcr120.dll丢失是一个常见问题。msvcr120.dll文件是Visual C Redistributable for Visual Studio 2015/2017的一个组件&#xff0c;主要用于支持某些应用程序的正常运行。当电脑出现msvcr120.dll丢失情…

SpringBoot项目启动报java.nio.charset.MalformedInputException Input length = 1解决方案

报错详情 SpringBoot启动报错java.nio.charset.MalformedInputException: Input length 1 报错原因 出现这个的原因&#xff0c;就是解析yml文件时&#xff0c;中文字符集不是utf-8的原因&#xff0c;这是maven在项目编译时&#xff0c;默认字符集编码是GBK。 解决方式 检…