C# cass10 面积计算

运行环境Visual Studio 2022 c# cad2016 cass10

通过面积计算得到扩展数据,宗地面积 ,房屋占地面积,房屋使用面积

一、主要步骤

  1. 获取当前AutoCAD应用中的活动文档、数据库和编辑器对象。
  2. 创建一个选择过滤器,限制用户只能选择"宗地"图层上的LWPOLYLINE对象作为外部边界。
  3. 提示用户根据上述规则进行实体选择,并获取选择结果。
  4. 遍历所有被选中的外部多段线,确保所选多段线是闭合的且至少有一个顶点。
  5. 创建并填充一个表示外部多段线边界坐标的点集合。
  6. 使用多边形窗口选择方式让用户选择位于外部多段线内的实体。
  7. 遍历用户在内部区域所选的所有闭合多段线,计算房屋面积和附属面积。
  8. 计算宗地面积和输出结果。

二、完整代码

internal class zdfwmj
{public static List<string> filelist1 = new List<string>();public static List<string> filelist2 = new List<string>();public void fwzymj(){// 获取当前AutoCAD应用中的活动文档、数据库和编辑器对象Document doc = Application.DocumentManager.MdiActiveDocument;Database db = doc.Database;Editor ed = doc.Editor;string SelectedLayerName = CreatePalette.SelectedLayerName;NumberContainer numberContainer = new NumberContainer();//ed.WriteMessage("选择的图层:" + SelectedLayerName + "\n");// 创建一个选择过滤器,限制用户只能选择"宗地"图层上的LWPOLYLINE对象作为外部边界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))// 读取所选多段线{// 确保所选多段线是闭合的且至少有一个顶点double totalArea = 0; // 总面积double totalAreaZdmj = 0; // 总面积double totalAreaSYmj = 0; // 总面积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);// 定义你的扩展因子,比如 1.5 表示扩大1.5倍double scaleFactor = 1.2;// 将顶点向中心点平移,然后按比例缩放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;将文本添加到模型空间//using (Transaction transaction = db.TransactionManager.StartTransaction())//{//    BlockTable bt = transaction.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;//    BlockTableRecord ms = transaction.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;//    ms.AppendEntity(text);//    transaction.AddNewlyCreatedDBObject(text, true);//    transaction.Commit();//}outerPoints.Add(scaledPoint);}// 创建一个窗口选择过滤器,用于选择位于外部多段线内的所有实体SelectionFilter innerFilter = new SelectionFilter(new TypedValue[] {new TypedValue((int)DxfCode.Start, "LWPOLYLINE"),new TypedValue((int)DxfCode.LayerName, "JMD")});// 使用多边形窗口选择方式让用户选择位于外部多段线内的实体PromptSelectionResult innerSelRes = ed.SelectWindowPolygon(outerPoints, innerFilter);// 检查用户是否成功在内部区域进行了实体选择if (innerSelRes.Status == PromptStatus.OK){SelectionSet innerSelectionSet = innerSelRes.Value;// 遍历用户在内部区域所选的所有闭合多段线foreach (ObjectId id2 in innerSelectionSet.GetObjectIds()){using (Polyline polyline2 = (Polyline)tr.GetObject(id2, OpenMode.ForRead)){if (polyline2.Closed && polyline2.NumberOfVertices > 0){Entity ent2 = (Entity)tr.GetObject(id2, OpenMode.ForWrite);//ent2.Color = Color.FromColorIndex(ColorMethod.ByAci, 3); // 示例:将颜色设为黄色//ed.UpdateScreen(); // 确保颜色更改即时生效filelist1.Clear();filelist2.Clear();int filelist1ii = 0;if (ent2 != null && ent2.XData != null){List<int> numbers01 = new List<int> { 141161, 141121, 141151 };//房屋编码List<int> numbers02 = new List<int> { 141800, 140001, 143130, 143111, 143112 };//房屋附属编码ResultBuffer rb = ent2.GetXDataForApplication("SOUTH");string xdata = rb.ToString();foreach (TypedValue tv in rb){filelist1.Add(tv.TypeCode.ToString());//码filelist2.Add(tv.Value.ToString());//值}filelist1ii = filelist1.Count();//房屋面积if (filelist1ii == 3){if (numbers01.Contains(Convert.ToInt32(filelist2[1]))){string fwjg = numberContainer.GetDescription(Convert.ToInt32(filelist2[1]));int fileValue;if (int.TryParse(filelist2[2], out fileValue)){double calculatedUsageArea = polyline2.Area * fileValue;//ed.WriteMessage($"\n房屋面积信息:{fwjg}{fileValue} 占地面积:{polyline2.Area:N2} 使用面积:{calculatedUsageArea:N2}\n");totalAreaZdmj += polyline2.Area;totalAreaSYmj += calculatedUsageArea;using (Transaction transaction = db.TransactionManager.StartTransaction()){RegAppTable table02 = (RegAppTable)transaction.GetObject(doc.Database.RegAppTableId, OpenMode.ForWrite, false);ResultBuffer rb02 = new ResultBuffer();string appName02 = "扩展数据";if (!table02.Has(appName02)){RegAppTableRecord regAppRec = new RegAppTableRecord();regAppRec.Name = appName02;table02.Add(regAppRec);transaction.AddNewlyCreatedDBObject(regAppRec, true);}rb02.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName02));rb02.Add(new TypedValue((int)DxfCode.ExtendedDataReal, polyline2.Area));rb02.Add(new TypedValue((int)DxfCode.ExtendedDataReal, calculatedUsageArea));ent2.XData = rb02;transaction.Commit();}}else{//ed.WriteMessage("\n无法将文件列表中的值转换为整数以计算使用面积!");}}}if (filelist1ii == 2){ed.WriteMessage("\n附属编码:" + filelist2[1]);if (numbers02.Contains(Convert.ToInt32(filelist2[1]))){string fwjg = numberContainer.GetDescription(Convert.ToInt32(filelist2[1]));//double fsmj = FwmjArea(polyline2, db, ed, tr);TypedValue[] tvs = new TypedValue[]{new TypedValue((int)DxfCode.Operator, "<and"),new TypedValue((int)DxfCode.Start, "TEXT"),new TypedValue((int)DxfCode.LayerName, "房屋附属1"),new TypedValue((int)DxfCode.Operator, "and>")};SelectionFilter sf = new SelectionFilter(tvs);PromptSelectionResult psr = ed.SelectAll(sf);SelectionSet ss = psr.Value;foreach (SelectedObject so in ss){DBText text = tr.GetObject(so.ObjectId, OpenMode.ForRead) as DBText;if (IsPointInside(polyline2, text.Position)){string input = text.TextString;//文字分解string[] parts = input.Split(' ');foreach (string part in parts){// 按中文逗号分割键值对string[] keyValue = part.Split(','); // 注意:这里的逗号是中文逗号,不是英文逗号if (keyValue.Length == 2){string key = keyValue[0];string value = keyValue[1];//ed.WriteMessage("键: " + key + ", 值: " + value+ "\n");bool result = key.Contains("Q");if (result){totalArea += polyline2.Area;//ed.WriteMessage($"全:{key}{value} 附属面积:{polyline2.Area:N2}\n");}result = key.Contains("B");if (result){totalArea += polyline2.Area / 2;//ed.WriteMessage($"半:{key}{value} 附属面积:{polyline2.Area:N2}\n");}}else{//ed.WriteMessage("未能分割出键值对:" + part);}}using (Transaction transaction = db.TransactionManager.StartTransaction()){RegAppTable table02 = (RegAppTable)transaction.GetObject(doc.Database.RegAppTableId, OpenMode.ForWrite, false);ResultBuffer rb02 = new ResultBuffer();string appName02 = "扩展数据";if (!table02.Has(appName02)){RegAppTableRecord regAppRec = new RegAppTableRecord();regAppRec.Name = appName02;table02.Add(regAppRec);transaction.AddNewlyCreatedDBObject(regAppRec, true);}rb02.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName02));rb02.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, input));rb02.Add(new TypedValue((int)DxfCode.ExtendedDataReal, totalArea));ent2.XData = rb02;transaction.Commit();}//ed.WriteMessage($"房屋附属:{input} 附属面积:{totalArea:N2}\n");}}   }}}}}}}Entity ent01 = tr.GetObject(outerId, OpenMode.ForWrite) as Entity;RegAppTable table = (RegAppTable)tr.GetObject(doc.Database.RegAppTableId, OpenMode.ForWrite, false);ResultBuffer rb01 = new ResultBuffer();string appName = "扩展数据";if (!table.Has(appName)){RegAppTableRecord regAppRec = new RegAppTableRecord();regAppRec.Name = appName;table.Add(regAppRec);tr.AddNewlyCreatedDBObject(regAppRec, true);}rb01.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName));rb01.Add(new TypedValue((int)DxfCode.ExtendedDataReal, outerPolyline.Area));rb01.Add(new TypedValue((int)DxfCode.ExtendedDataReal, totalAreaZdmj));rb01.Add(new TypedValue((int)DxfCode.ExtendedDataReal, (totalAreaSYmj + totalArea)));ent01.XData = rb01;}//ed.WriteMessage($"\n宗地面积:{outerPolyline.Area:N2} \n\n房屋占地面积:{totalAreaZdmj:N2}\n房屋使用面积:{(totalAreaSYmj + totalArea):N2}\n");}}tr.Commit();}}}/// <summary>FwmjAreapublic double FwmjArea(Polyline polyline, Database db, Editor ed, Transaction tr){Point3dCollection outerPoints = new Point3dCollection(); // 创建并填充一个表示外部多段线边界坐标的点集合double areaFWFS = 0;//房屋附属面积for (int i = 0; i < polyline.NumberOfVertices; i++){Point3d point = polyline.GetPoint3dAt(i);outerPoints.Add(point);}// 创建一个窗口选择过滤器,用于选择位于外部多段线内的所有实体SelectionFilter innerFilter = new SelectionFilter(new TypedValue[] {new TypedValue((int)DxfCode.Operator, "<and"),new TypedValue((int)DxfCode.Start, "TEXT"),new TypedValue((int)DxfCode.LayerName, "房屋附属1"),new TypedValue((int)DxfCode.Operator, "and>")});// 使用多边形窗口选择方式让用户选择位于外部多段线内的实体PromptSelectionResult innerSelRes = ed.SelectAll(innerFilter);if (innerSelRes.Status == PromptStatus.OK){SelectionSet innerSelectionSet = innerSelRes.Value;foreach (SelectedObject so in innerSelectionSet){DBText text = tr.GetObject(so.ObjectId, OpenMode.ForRead) as DBText;if (IsPointInside(polyline, text.Position)){string input = text.TextString;//ed.WriteMessage("\n房屋附属文字2:", input.ToString());//ed.WriteMessage("\n房屋附属文字2:", polyline.Area);}}}return areaFWFS;}/// </summary>/// <param name="polyline"></param>/// <param name="point"></param>/// <returns></returns>// 定义一个方法,输入参数为一个多段线对象和一个三维点,返回值为布尔类型,表示该点是否在多段线内部public bool IsPointInside(Polyline polyline, Point3d point){// 初始化交叉次数变量为0,用于记录点与多段线各线段相交的次数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);// 如果线段两端点都在检测点Y轴上方或下方,则此线段与过检测点的水平线不相交,跳过此次循环if (start.Y > point.Y && end.Y > point.Y)continue;if (start.Y <= point.Y && end.Y <= point.Y)continue;// 如果检测点X坐标小于线段起点和终点的X坐标最小值,则此线段位于检测点左侧,跳过此次循环if (point.X < Math.Min(start.X, end.X))continue;// 计算线段的斜率,并根据直线方程计算线段与过检测点Y坐标水平线的交点横坐标double slope = (end.Y - start.Y) / (end.X - start.X);double intersectX = start.X + (point.Y - start.Y) / slope;// 如果检测点X坐标大于等于交点横坐标,则表示检测点在线段的一侧,增加交叉次数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;}// GetCenterOfPolyline 是一个假设存在的方法,用于计算多边形的中心点private 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);}
}

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

   

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

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

相关文章

究竟做老隋分享的temu蓝海项目怎么样?这些要点要关注

近年来&#xff0c;跨境电商成为了一股热潮&#xff0c;许多企业纷纷投身其中&#xff0c;希望能够分得一杯羹。其中&#xff0c;Temu项目备受关注。本文将从可靠性角度分析Temu蓝海项目&#xff0c;帮助您了解其优势和潜在风险。 一、 Temu项目的背景与可靠性 Temu是由拼多多推…

Codeforces Round 494 (Div. 3)

目录 A. Polycarps Pockets B. Binary String Constructing C. Intense Heat D. Coins and Queries E. Tree Constructing F. Abbreviation A. Polycarps Pockets 记录数量可以直接开一个桶即可然后求最大值 void solve(){cin>>n;vector<int> ton(105);int …

【进程概念】

目录 什么是在计算机运行的程序这么多运行的程序计算机是如何管理的先描述再组织 什么是在计算机运行的程序 对于一个在磁盘可执行的二进制文件&#xff0c;也可叫做可执行程序。对于一个可执行的程序&#xff0c;程序有自己的代码和数据。一旦运行起来&#xff0c;就会在计算…

Error: A JNI error has occurred, please check your installation and try again

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【Redis服务搭建】

目录 Redis的修改配置启动以及参数调优Redis的常用基本操作Redis运维监控命令Redis的配置的动态更新和写入Redis的多用户管理Redis的慢日志Redis禁用危险命令和压测工具Redis持久化存储1.Redis的RDB持久化存储2.Redis的AOF持久化存储 Redis的主从复制redis的哨兵实现主从自动切…

深入探索Linux:ACL权限、特殊位与隐藏属性的奥秘

前言&#xff1a; 在Linux系统中&#xff0c;文件和目录的权限管理是一项至关重要的任务。它决定了哪些用户或用户组可以对文件或目录执行读、写或执行等操作。传统的Linux权限模型基于用户、组和其他的概念&#xff0c;但随着时间的推移&#xff0c;这种模型在某些情况下显得…

RISC-V知识总结 —— 指令集

资源1: RISC-V China – RISC-V International 资源2: RISC-V International – RISC-V: The Open Standard RISC Instruction Set Architecture 资源3: RV32I, RV64I Instructions — riscv-isa-pages documentation 1. 指令集架构的类型 在讨论RISC-V或任何处理器架构时&…

OpenLayers多要素旋转平移缩放及olext深度定制化

目录 1.前言2.olext官方示例3.重写Transform.js4.自定义样式5.自定义选中机制6.拓展思考6.1包围框的角度问题6.2不选中要素如何平移 7总结 1.前言 首先OpenLayers本身是支持旋转、平移、缩放的。olext 只是在 OpenLayers 的基础上又做了一层封装&#xff0c;使得看起来比较好看…

函数栈帧的创建及销毁(超详解)

目录 1.预备知识 1.1内存区的划分 1.2认识相关寄存器和汇编指令 1.2.1寄存器 1.2.2相关汇编指令 2.测试前 2.1测试代码及环境 2.2 main函数也是被其他函数调用的 3.函数栈帧的创建 4.进入函数内部 5.形参与实参 6.call/jump add函数 7.函数栈帧的销毁 7.1保存…

使用transformer来训练自己的大模型实现自定义AI绘图软件的详细操作步骤

使用transformer来训练自己的大模型实现自定义AI绘图软件的详细操作步骤&#xff01;下面的步骤是非常细致的&#xff0c;如果你有一台自己的GPU算力还算可以的服务器主机&#xff0c;想自己训练AI大模型。可以按照如下步骤开展操作。 要使用 Transformer 框架训练属于自己的大…

哪种游泳耳机品牌更好?2024四款甄选高评分榜单好物!

在繁忙的都市生活中&#xff0c;游泳已经成为了许多人释放压力、保持健康的重要方式。而随着科技的进步&#xff0c;游泳耳机也逐渐走进了人们的视野&#xff0c;让音乐与游泳完美结合&#xff0c;为游泳爱好者带来了全新的运动体验。然而&#xff0c;在琳琅满目的游泳耳机市场…

matlab|计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度

1 主要内容 该程序参考《计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度》模型&#xff0c;主要实现的是计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度模型。通过引入碳捕集电厂–电转气–燃气机组协同利用框架&#xff0c;碳捕集的CO2 可作为电转气原料&#xf…

Linux下出现ERROR: 1 Can‘t create/write to filexxxxxx

此类问题大多都是权限问题&#xff0c;将根目录的读写权限设置为最高即可解决 案例&#xff0c;ubantu中安装mysql&#xff0c;出现ERROR: 1 Cant create/write to file /home/utf/server_202402/db/mysql/data/mysql/db.MYI (Errcode: 13) 解决办法&#xff1a;将/home/utf目…

【算法与数据结构】417、LeetCode太平洋大西洋水流问题

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;题目要求雨水既能流向太平洋也能流向大西洋的网格。雨水流向取决于网格的高度。一个比较直接的方式是对…

element ui 安装 简易过程 已解决

我之所以将Element归类为Vue.js&#xff0c;其主要原因是Element是&#xff08;饿了么团队&#xff09;基于MVVM框架Vue开源出来的一套前端ui组件。我最爱的就是它的布局容器&#xff01;&#xff01;&#xff01; 下面进入正题&#xff1a; 1、Element的安装 首先你需要创建…

Java设计模式-结构型-适配器模式

Java设计模式-结构型-适配器模式 本文我们简单说下设计模式中的适配器模式。 一、概述 ​ 与电源适配器相似&#xff0c;在适配器模式中引入了一个被称为适配器(Adapter)的包装类&#xff0c;而它所包装的对象称为适配者(Adaptee)&#xff0c;即被适配的类。适配器的实现就是…

基于springboot+vue的桂林旅游景点导游平台(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Spring Security 重点解析

Spring Security 重点解析 文章目录 Spring Security 重点解析1. 简介2. 依赖3. 登录认证3.1 登录校验流程3.2 Spring Security 默认登录的原理3.2.1 Spring Security 完整流程3.2.2 登录逻辑探究 3.3 自定义改动3.3.1 自定义用户密码校验3.3.2 自定义 UserDetails 获取方式 F1…

基于Spring Boot的安康旅游网站的设计与实现,计算机毕业设计(带源码+论文)

源码获取地址&#xff1a; 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1760645517548793858

SpringSecurity + OAuth2 详解

SpringSecurity入门到精通 ************************************************************************** SpringSecurity 介绍 **************************************************************************一、入门1.简介与选择2.入门案例-默认的登录和登出接口3.登录经过了…