概述

    在一些设计场景中,用户需要用到相互靠近但又不重叠的面域。但用户画图过程中,因为画图习惯或者精度问题,一些肉眼无法识别的重叠在所难免,因此需要些工具来辅助重叠判别和重叠区域识别。

原理

    用面域间的布尔运算可以判定两个面域是否重叠。为了让用户知道重叠区域在哪,需要把重叠的区域生成重来,并设置特定的图层和颜色;当面域数量比较多时,耗时比较多,还需要设置进度条;判别完后,用户想知道有没有面域重叠,有多少个面域重叠,因此还需要输出结论;用户有时只想对某个或者某些图层进行面域识别,因此还需要提供一个选择的界面。整个原理比较简单,就不提供流程图了。

代码实现

     完整业务代码(界面和ViewModel未包含)如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using Autodesk.AutoCAD.Colors;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.GraphicsInterface;
using Autodesk.AutoCAD.Runtime;
using CadToolset.Common;
using TimesBIM.CadToolset.App.Commands.Landscape;
using TimesBIM.CadToolset.App.Utils;
using TimesBIM.CadToolset.App.View.Landscape;
using TimesBIM.CadToolset.App.ViewModel.Landscape;
using Application = Autodesk.AutoCAD.ApplicationServices.Application;[assembly: CommandClass(typeof(CmdCheckRegion))]namespace TimesBIM.CadToolset.App.Commands.Landscape
{public class CmdCheckRegion{private const string _regionLayerName = "00-重叠面域";[CommandMethod("MYJC")]public void CheckRegion(){var db = Application.DocumentManager.MdiActiveDocument.Database;using (var transaction = db.TransactionManager.StartTransaction()){var mDocumentLock = Application.DocumentManager.MdiActiveDocument.LockDocument();var regions = GetRegions(transaction);//获取面域var layerTable = transaction.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;//层表var layerTableRecords = GetLayerTableRecords(layerTable);//获取层表记录SetLayerByName(layerTable);//设置目标图层var regionTuples = layerTableRecords.Select(x => new Tuple<string, List<Region>>(x.Name, regions //面域按图层分组.Where(y => y.LayerId.ToString() == x.Id.ToString()).ToList())).ToList();regionTuples = regionTuples.Where(x => x.Item2.Count > 0).ToList();var checkRegionVM = new CheckRegionVM(regionTuples.Select(x => new CheckRegionVM.LayerForCheck { ToCheck = x.Item1.Contains("(预)"), LayerName = x.Item1 }).ToList());var checkRegionView = new CheckRegionView { DataContext = checkRegionVM };checkRegionView.ShowDialog();if ( !checkRegionView.ToConfirm) { transaction.Commit(); return; };//选择检查图层CheckRegions(transaction, layerTable[_regionLayerName], checkRegionVM, regionTuples, regions);//检查mDocumentLock.Dispose();transaction.Commit();}}private List<Region> GetRegions(Transaction transaction){var regions = new List<Region>();var doc = Application.DocumentManager.MdiActiveDocument;var curBlockTb = transaction.GetObject(doc.Database.BlockTableId, OpenMode.ForWrite) as BlockTable; //当前文档块表if (curBlockTb == null) { transaction.Commit(); return regions; }var modelSpaceBlockTableRecord = (BlockTableRecord)transaction.GetObject(curBlockTb[BlockTableRecord.ModelSpace], OpenMode.ForWrite);foreach (ObjectId id in modelSpaceBlockTableRecord){var region = transaction.GetObject(id, OpenMode.ForRead);if (region != null && region is Region) regions.Add(region as Region);}return regions;}private List<LayerTableRecord> GetLayerTableRecords(LayerTable layerTable){var layerTableRecords = new List<LayerTableRecord>();foreach (ObjectId id in layerTable){layerTableRecords.Add((LayerTableRecord)id.GetObject(OpenMode.ForRead));}return layerTableRecords;}private void SetLayerByName(LayerTable layerTable){using (var record = new LayerTableRecord()){record.Name = _regionLayerName;record.Color = Color.FromRgb(255, 0, 0);layerTable.UpgradeOpen();//修改图层打开方式为写if (!layerTable.Has(record.Name)) layerTable.Add(record);//将新图层追加到图层表layerTable.DowngradeOpen();}}private void CheckRegions(Transaction transaction,ObjectId layerId, CheckRegionVM checkRegionVM, List<Tuple<string, List<Region>>> regionTuples, List<Region> regions){var layers = checkRegionVM.LayerForChecks.Where(x => x.ToCheck).Select(x => x.LayerName).ToList();regionTuples = regionTuples.Where(x => layers.Contains(x.Item1)).ToList();regions = regions.Where(x => regionTuples.Any(y => y.Item2.Contains(x))).ToList();var overlapedRegionCount = 0;var count = regions.Count;if (count < 2) { MessageBox.Show("面域数<2,不需要检查重叠");return; }var progressMeter = new ProgressMeter();progressMeter.Start("面域重叠检查进行中...");progressMeter.SetLimit(count*(count-1)/2);foreach (var region in regions){int index = regions.IndexOf(region);for (int i = index + 1; i < regions.Count; i++){var overlapResult = RegionOverlap(region, regions[i], out var OverlapedRegion);progressMeter.MeterProgress();if (overlapResult){OverlapedRegion.SetLayerId(layerId, true);transaction.AddEntity(OverlapedRegion);//添加实体overlapedRegionCount++;}}}progressMeter.Stop();var message = overlapedRegionCount > 0 ? "重叠面域数为:" + overlapedRegionCount+ ",请检查图面。" : "未有发现面域重叠!";if (overlapedRegionCount > 0) MessageBox.Show(message);}private static bool RegionOverlap(Region bigRegion, Region regionSecond,out Region region){var newRegion1 = (Region)bigRegion.Clone();region = (Region)regionSecond.Clone();try{region.BooleanOperation(BooleanOperationType.BoolIntersect, newRegion1);}catch{return false;}return region.Area > 0;}}
}

实现效果

输入文件

图层选择界面

进度条

运行完以后输出结论

重叠区域标识

CAD开发__面域重叠检查相关推荐

  1. CAD开发__识别相交线之间闭合区域

    概述     在设计过程中,用户需要从一堆相交的线中去找出所有的闭合区域,然后统计面积或者做其他标注.CAD自带的BO命令可以生产面域,但只能一个个操作,显得比较繁琐.为此,给用户开发一个框选线识别闭 ...

  2. CAD开发__盖梁生成

    概述     盖梁是桥梁中常见的构件.在不同项目中,随着跨径.桥宽.桥梁类型不一样,盖梁类型多种多样,有标准的,也有非标标的.因此,设计过程中也经常需要画盖梁图.然而,画盖梁图技术含量不高,显得比较繁 ...

  3. C#开发中Windows域认证登录2(扩展吉日嘎拉GPM系统)

    为什么80%的码农都做不了架构师?>>>    原文地址:http://www.cuiwenyuan.com/shanghai/post/Windows-AD-Logon-Inter ...

  4. 十秒解决开发环境跨域问题——取消浏览器同源策略

    解决开发环境跨域问题方法有很多,设置代理什么的略显繁琐:接下来介绍一个十秒解决开发环境跨域问题的方法--取消浏览器同源策,解决所有跨域问题,以谷歌浏览器为例. 一:Windows ①:关闭浏览器 ②: ...

  5. 本地跨域处理ajax,Node.js配合node-http-proxy解决本地开发ajax跨域问题

    情景: 前后端分离,本地前端开发调用接口会有跨域问题,一般有以下3种解决方法: 1. 后端接口打包到本地运行(缺点:每次后端更新都要去测试服下一个更新包,还要在本地搭建java运行环境,麻烦) 2. ...

  6. vue开发环境跨域与生产环境跨域

    常见的跨域的方式 同源策略 所谓同源(即指在同一个域)具有以下三个相同点 协议相同(protocol) 主机相同(host) 端口相同(port) jsonp JSONP的原型:创建一个回调函数,然后 ...

  7. 【CAD开发】gltf文件格式的转换工具汇总(js、python、c++)

    文章目录 1.gltf格式简介 2.C# 代码 2.1 3dsMax/maya导出插件(Babylon.js) 2.python代码 2.1 gltflib (v2.0) 3.JavaScript代码 ...

  8. revit开发__箱梁粱体生成

    revit开发__箱梁粱体生成 问题描述 解决思路 代码实现 运行效果 问题描述 对于梁式桥,因为平竖曲线的存在,无法简单地用拉伸去模拟桥梁的形状.如果强行用拉伸去生成,粱段与粱段之间会出现缺口,中心 ...

  9. CAD软件绘制建筑图时坐标检查的操作

    很多小伙伴不知道在使用CAD软件绘制建筑图的过程中该如何对CAD图纸中的坐标进行检查,为了让大家对CAD软件有深入的了解,接下来的CAD教程小编就以国产CAD软件--浩辰CAD建筑软件为例来给大家介绍 ...

最新文章

  1. 怎样卸载外壳扩展的DLL?
  2. partial 分部类-庞大类的瘦身计划
  3. python 表格查询_python单表查询
  4. 排序算法:选择排序、插入排序、希尔排序
  5. pyhton链式赋值在可变类型/不可变类型上的区别以及其本质
  6. 转载 树莓派vnc 教程
  7. 04 ZooKeeperAPI实战
  8. 《惢客创业日记》2020.03.16-31(周一) 国家有难,匹夫有责(三)
  9. 市场研究中的数据分析知识整理 (四)-主成分分析和因子分析
  10. CISSP考点拾遗——关于道德
  11. 汽车电子中的2520贴片晶振
  12. 用树莓派做一个语音机器人
  13. texture packer 处理图片空白的问题
  14. python求斜率_python – 在曲线上找到斜率变化的位置
  15. [高等数学]解析一道关于函数极限的概念考察题(001)
  16. c++的继承与派生之从入门到入坟-------集大成者
  17. 工薪族巧理财之定期存款中整存整取、零存整取、存本取息之间的微妙区别
  18. java基础网络编程
  19. c语言循环结构程序设计教学,高级C语言循环结构程序设计教学教材演示幻灯片.ppt...
  20. centos安装libxml2, libxslt, lxml python

热门文章

  1. 小白自学笔记——JAVA基础 2.2变量
  2. 第4章 SIM卡锁定
  3. linux 基本命令操作su、ls、touch、rm、alias
  4. 《游戏脚本的设计与开发》-第一章总结 文字脚本的功能扩展和一个游戏测试
  5. 信息学奥赛第十七节 —— 栈与队列(stack、queue)
  6. 【转】让我们如此享受的慢性毒药
  7. word 显示左侧导航条(目录条)
  8. 坑爹的北大青鸟长沙东塘实力校区(转载)
  9. JSP连数据库登录检查用户名和密码模板
  10. 11.3 出来混大学,总是要还的——《逆袭大学》连载