Revit SDK: ProximityDetection_WallJoinControl 墙相交检测

前言

这个例子介绍了如何使用过滤器以及墙体的位置线来及进行相交检测,包括:

  1. 找到和墙相交的柱子
  2. 找到出入口的障碍物
  3. 找到墙各个端点接近的墙
  4. 验证墙和其它墙的交接情况
    在这里插入图片描述

内容

找到和墙相交的柱子

关键点在于 ElementIntersectsElementFilter 可以用于过滤和对应Element几何相交的其它Element,核心逻辑:

// 找到文件所有的建筑柱和结构柱
FilteredElementCollector collector = new FilteredElementCollector(m_doc);
List<BuiltInCategory> columnCategories = new List<BuiltInCategory>();
columnCategories.Add(BuiltInCategory.OST_Columns);
columnCategories.Add(BuiltInCategory.OST_StructuralColumns);
collector.WherePasses(new ElementMulticategoryFilter(columnCategories));

// 用 ElementIntersectsElementFilter 进行过滤
ElementIntersectsElementFilter testElementIntersectsElementFilter = 
   new ElementIntersectsElementFilter(wall);

collector.WherePasses(testElementIntersectsElementFilter);

在这里插入图片描述

找到出入口的障碍物

核心逻辑:

  1. 得到所有的出入口
  2. 用出入口 Element 的几何来做过滤

得到所有的出入口:

FilteredElementCollector collector = new FilteredElementCollector(m_doc);
ElementClassFilter filterFamilyInstance = new ElementClassFilter(typeof(FamilyInstance));
ElementCategoryFilter filterDoorCategory = new ElementCategoryFilter(BuiltInCategory.OST_Doors);
LogicalAndFilter filterDoorInstance = new LogicalAndFilter(filterDoorCategory, filterFamilyInstance);
return collector.WherePasses(filterDoorInstance).ToElements();

用出入口 Element 的几何来做过滤:

// 得到出入口构件的几何实体
IEnumerator<GeometryObject> Objects = egressElement.get_Geometry(new Autodesk.Revit.DB.Options()).GetEnumerator();
Objects.MoveNext();
GeometryInstance gi = Objects.Current as GeometryInstance;
IEnumerator<GeometryObject> Objects1 = gi.GetInstanceGeometry().GetEnumerator();

while (Objects1.MoveNext()){
   // 得到当前出入口的几何实体
   GeometryObject egressGObj = Objects1.Current;

   if (egressGObj is Solid){
      Solid egressVolume = egressGObj as Solid;
      // 过滤掉ElementType,保留其它Element
      FilteredElementCollector blockingcollector = new FilteredElementCollector(m_doc);
      blockingcollector.WhereElementIsNotElementType();

      // 用过滤器判断是否和几何实体相交
      ElementIntersectsSolidFilter testElementIntersectsSolidFilter = 
         new ElementIntersectsSolidFilter(egressVolume);
      blockingcollector.WherePasses(testElementIntersectsSolidFilter);

      IEnumerable<Element> blockingElement = blockingcollector;

      // Exclude the door itself  
      List<ElementId> exclusions = new List<ElementId>();
      exclusions.Add(egressElement.Id);
      blockingcollector.Excluding(exclusions);

      count++;
   }
}

效果:
在这里插入图片描述

找到墙各个端点接近的墙

核心逻辑:

  1. 找到墙中心线
  2. 用墙中心线端点生成圆柱
  3. 判断其它墙是否和圆柱相交

核心代码,用墙中心线端点生成圆柱来进行过滤:

// 用墙中心线端点生成圆柱
List<CurveLoop> curveloops = new List<CurveLoop>();
CurveLoop circle = new CurveLoop();
circle.Append(Arc.Create(point, radius
   , 0, Math.PI, 
   XYZ.BasisX, XYZ.BasisY));
circle.Append(Arc.Create(point, radius
   , Math.PI, 2 * Math.PI, 
   XYZ.BasisX, XYZ.BasisY));
curveloops.Add(circle);
Solid wallEndCylinder = 
   GeometryCreationUtilities.CreateExtrusionGeometry(curveloops, XYZ.BasisZ, height);

// 遍历所有的墙,进行几何相交判断
FilteredElementCollector collector = new FilteredElementCollector(m_doc);
collector.OfCategory(BuiltInCategory.OST_Walls);
ElementIntersectsSolidFilter testElementIntersectsSolidFilter = 
   new ElementIntersectsSolidFilter(wallEndCylinder);
collector.WherePasses(testElementIntersectsSolidFilter);

效果:
在这里插入图片描述

验证墙和其它墙的交接情况

核心逻辑,获取墙中心线,断开连接,判断是否连接,然后重新连接。
核心 API:

namespace Autodesk.Revit.DB
{
    public static class WallUtils
    {
        // 允许墙在相应端点与其它墙相交
        public static void AllowWallJoinAtEnd(Wall wall, int end);
        // 禁止墙在相应端点与其它墙相交
        public static void DisallowWallJoinAtEnd(Wall wall, int end);
        // 判断墙在相应端点是否与其它墙相交
        public static bool IsWallJoinAllowedAtEnd(Wall wall, int end);
    }
}

如何获取墙的中心线:

LocationCurve locationCurve = wall.Location as LocationCurve;

如何从中心线获取与其它墙的相交信息:

ElementArray array = locationCurve.get_ElementsAtJoin(end);

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

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

相关文章

配置环境变量的作用

配置环境变量的作用 一般运行过程&#xff1a;寻找QQ.exe所在的目录&#xff0c;输入QQ.exe配置环境变量&#xff1a;把QQ所在的路径配给操作系统Path&#xff0c; 在任何路径下都能运行QQ.exe 举例&#xff1a; 定义变量&#xff1a;SCALA_HOME SCALA_HOME、JAVA_HOME 等这…

Python面试:什么是GIL

1. GIL (Global Interpreter lock)可以避免多个线程同时执行字节码。 import threadinglock threading.Lock()n [0]def foo():with lock:n[0] n[0] 1n[0] n[0] 1threads [] for i in range(5000):t threading.Thread(targetfoo)threads.append(t)for t in threads:t.s…

机器连接和边缘计算

以一种高效、可扩展的方式进行连接和边缘计算的结合&#xff0c;解决了在工业物联网应用中的机器数据集成问题。 一 边缘计算 边缘计算描述了由中央平台管理的数据分散式处理&#xff0c;它对于工业物联网而言非常重要。在许多应用程序中&#xff0c;由于数据量非常大&#xf…

修改linux中tomcat的端口

随便修改一个 以8055为例子 开放8081端口 firewall-cmd --permanent --add-port8081/tcp firewall-cmd --reload firewall-cmd --list-all

Java 并发编程

Java 并发编程 一、线程创建1.继承 Thread 类2.实现 Runnable 接口3.实现 Callable 接口 二、线程方法三、线程同步1.同步代码块2.同步方法3.ReentrantLock4.乐观锁 四、线程池1.ThreadPoolExecutor2.Executors 一、线程创建 1.继承 Thread 类 通过继承 Thread 类来创建线程是…

【高性能计算】opencl语法及相关概念(三)事件,内存

opencl中的事件概念 当谈到OpenCL中的事件时&#xff0c;它们代表了执行的各个阶段或操作的状态信息。通过使用事件&#xff0c;您可以跟踪和管理内核执行以及内存操作的进度和顺序。以下是与OpenCL事件相关的关键概念&#xff1a; 创建事件&#xff1a;您可以使用clCreateUse…

Java运行时jar时终端输出的中文日志是乱码

运行Jar时在控制台输出的中文日志全是乱码&#xff0c;这是因为cmd/bash默认的编码是GBK&#xff0c;只要把cmd的编码改成UTF-8即可 两种方式修改&#xff1a;临时修改和注册表永久修改 临时修改 只对当前的cmd页面有效&#xff0c;关闭后重新打开都会恢复成GBK, 打开cmd&am…

记一次对链接、COMMON块、多重符号定义的理解

问题引入 首先是两个测试程序 // foo.c long long int a;// bar.c #include <stdio.h>int a; int main(){a 1;long long int len sizeof(a);printf("%lld\n", len);return 0; }将两个程序链接到一起 问题&#xff1a;len等于几&#xff1f; 初步分析 环境…

研磨设计模式day15策略模式

场景 问题描述 经常会有这样的需要&#xff0c;在不同的时候&#xff0c;要使用不同的计算方式。 解决方案 策略模式 定义&#xff1a; 解决思路&#xff1a;

PyCharm软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 PyCharm是一种集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门为Python开发者设计。它是由捷克软件公司JetBrains开发的&#xff0c;为Python开发人员提供了高效、易用和功能丰富的工具集。 以下是PyCharm软件的主要…

基于 Docker 的 MySQL 主从复制搭建(Mac M1版本)

系统&#xff1a;Macbook M1 镜像版本&#xff1a;mysql:5.7 如果是要查 slave连接不上 master的问题&#xff0c;可以直接跳到文章末尾踩坑处 准备工作 拉取镜像 docker pull mysql:5.7本地数据卷挂载 因为mysql不挂载的话&#xff0c;重启丢失数据&#xff0c;所以在本地创…

用Cmake build OpenCV后,在VS中查看OpenCV源码的方法(环境VS2022+openCV4.8.0) Part III

用Cmake build OpenCV后&#xff0c;在VS中查看OpenCV源码的方法(环境VS2022openCV4.8.0) Part III 用Cmake build OpenCV后&#xff0c;在VS中查看OpenCV源码的方法&#xff08;环境VS2022openCV4.8.0&#xff09; Part I_松下J27的博客-CSDN博客 用Cmake build OpenCV后&…

Maven的profiles多环境配置

一个项目通常都会有多个不同的运行环境&#xff0c;例如开发环境&#xff0c;测试环境、生产环境等。而不同环境的构建过程很可能是不同的&#xff0c;例如数据源配置、插件、以及依赖的版本等。每次将项目部署到不同的环境时&#xff0c;都需要修改相应的配置&#xff0c;这样…

学习node之——如何在项目中使用MySQL、前后端的身份认证

上一篇文章只写了一丢丢&#xff0c;这篇才是正片&#xff0c;look look look 一、使用mysql模块操作数据库 1、查询数据 这里连接数据库的用户和密码都是我们在安装mysql时配置的密码。每个人的users表格里面数据不同&#xff0c;结果也会不一样哟&#xff01; // 导入mys…

统一网关Gateway

文章目录 概览网关的作用搭建网关断言工厂路由过滤器全局过滤器案例 过滤器执行顺序跨域问题 概览 网关的作用 搭建网关 断言工厂 路由过滤器 全局过滤器 案例 过滤器执行顺序 跨域问题

QT基础教程之四QMainWindow

QT基础教程之四QMainWindow QMainWindow是一个为用户提供主窗口程序的类&#xff0c;包含一个菜单栏&#xff08;menu bar&#xff09;、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget)&#xff0c;是许多应用程序…

【c语言】输出n行按如下规律排列的数

题述&#xff1a;输出n行按如下规律排列的数 输入&#xff1a; 4(应该指的是n) 输出: 思路&#xff1a; 利用下标的规律求解&#xff0c;考察数组下标的灵活应用&#xff0c;我们可以看出数从1开始是斜着往下放的&#xff0c;那么我们如何利用两层for循环求解这道题&#xff…

打造完美直播:深入解析人脸美颜SDK的算法与特性

在如今数字化的时代&#xff0c;直播已经成为了人们与世界互动的重要方式之一。而在众多直播平台中&#xff0c;吸引观众并提供高质量的视觉体验成为了至关重要的任务。其中&#xff0c;人脸美颜技术的应用对于提升直播质量和观众体验起到了不可忽视的作用。本文将深入解析人脸…

【pyqt5界面化工具开发-13】QtDesigner功能择优使用

目录 0x00 前言&#xff1a; 一、完成基本的布局 二、其他功能的使用 三、在代码行开发 0x00 前言&#xff1a; QtDesigner工具的择优使用&#xff1a; 1、他的界面开发&#xff0c;是我们主要需要使用的功能 2、他的其他功能的使用&#xff0c;有需要就可使用&#xff…

【java】【已解决】IDEA启动报错:Lombok Requires Annotation Processing

解决办法&#xff1a; 1、根据异常提示操作&#xff1a; 直接点击错误提示后面的蓝色标识【Enable】&#xff08;小编点完了所以变灰色&#xff09;&#xff0c;此操作等价于下面的步骤&#xff1a; 【File】-->【Settings】-->【Build】-->【Compiler】-->【Ann…