Revit SDK 介绍:TraverseSystem 用广度遍历的方式遍历MEP系统

news2024/7/6 18:32:51

前言

这个例子介绍了用广度遍历的方式遍历MEP系统。

内容

打开 Revit 自带例子,选择红框中的某条风管,不要选择机械,图中选中只是为了和遍历结果对应:
在这里插入图片描述
红色区域到风管机的遍历结果:
在这里插入图片描述

核心逻辑

遍历逻辑主函数:

public void Traverse(){
   // 获取根节点
   m_startingElementNode = GetStartingElementNode();

   // 广度遍历
   Traverse(m_startingElementNode);
}

广度遍历:

private void Traverse(TreeNode elementNode){
   AppendChildren(elementNode);
   foreach (TreeNode node in elementNode.ChildNodes){
      Traverse(node);
   }
}

添加子节点逻辑:

private void AppendChildren(TreeNode elementNode){
   List<TreeNode> nodes = elementNode.ChildNodes;
   ConnectorSet connectors;

   // 找到相关连接,可能是管件,也可能是管线
   Element element = GetElementById(elementNode.Id);
   FamilyInstance fi = element as FamilyInstance;
   if (fi != null){
      connectors = fi.MEPModel.ConnectorManager.Connectors;
   } else {
      MEPCurve mepCurve = element as MEPCurve;
      connectors = mepCurve.ConnectorManager.Connectors;
   }

   // 处理所有的连接件
   foreach (Connector connector in connectors){
      MEPSystem mepSystem = connector.MEPSystem;
      // Ignore the connector does not belong to any MEP System or belongs to another different MEP system
      if (mepSystem == null || !mepSystem.Id.IntegerValue.Equals(m_system.Id.IntegerValue)){
         continue;
      }

      //
      // 找到当前节点的方向,如果 Parent 为空,即根节点,那么就用一个连接方向作为它的方向
      // 如果 Parent 不为空,则用连接的方向作为自己的方向
      if (elementNode.Parent == null){
         if (connector.IsConnected){
            elementNode.Direction = connector.Direction;
         }
      } else {
         if (connector.IsConnectedTo(elementNode.InputConnector)) {
            elementNode.Direction = connector.Direction;
            continue;
         }
      }

      // 从当前的连接生成一个子节点
      Connector connectedConnector = GetConnectedConnector(connector);
      if (connectedConnector != null){
            TreeNode node = new TreeNode(m_document, connectedConnector.Owner.Id);
            node.InputConnector = connector;
            node.Parent = elementNode;
            nodes.Add(node);
      }
   }
}

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

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

相关文章

Visual Studio将C#项目编译成EXE可执行程序

经常看文章时会收获不少实用工具&#xff0c;有的在github上是编译好的&#xff0c;有的则是未编译的项目文件。所以经常会使用Visual Studio编译项目文件成exe可执行程序&#xff0c;以下为编译的流程。 第一步&#xff0c;从github上下载项目文件&#xff0c;举个例子&#…

解决`SQLyog Trial`试用到期的问题(提供一个脚本解决方案)

文章目录 一、要删除的注册表项二、写了个脚本干这个事儿三、最后 本文将总结SQLyog Trial试用到期的问题。 其实解决起来很简单&#xff0c;就是将SQLyog相关注册表删掉即可 一、要删除的注册表项 WinR打开运行&#xff0c;输入regedit回车&#xff0c;打开注册表 在HKEY_C…

基于Elasticsearch的多文档检索 比如 商品(goods)、案例(cases)

概述 Elasticsearch多文档聚合检索 详细 记得把这几点描述好咯&#xff1a;需求&#xff08;要做什么&#xff09; 代码实现过程 项目文件结构截图 演示效果 应用场景 我们需要在五种不同的文档中检索数据。 比如 商品&#xff08;goods&#xff09;、案例&#xff08;ca…

汇编程序设计MOOC精选题

一、微型计算机基础 1.微型计算机各部件之间是用&#xff08;系统总线&#xff09;连接起来的 2.冯诺依曼结构确定计算机的五个基本部件&#xff1a;i/o&#xff0c;存储器、控制器和&#xff08;运算器&#xff09; 微处理器通过&#xff08;数据&#xff09;总线 向存储器和…

java程序处理三张表要进行怎么样的操作

首先第一步梳理思路&#xff0c;id没有存在说明是新添加的&#xff0c;如果id存在那就是对现有文章的修改。 /*** 发布文章或保存草稿** param dto* return*/Overridepublic ResponseResult submitNews(WmNewsDto dto) {//0.条件判断if(dto null||dto.getContent() null){ret…

CKA 真题练习(十六)备份还原etcd

题目&#xff1a; 首先&#xff0c;为运行在 https://11.0.1.111:2379 上的现有 etcd 实例创建快照并将快照保存到 /var/lib/backup/etcd-snapshot.db (注意&#xff0c;真实考试中&#xff0c;这里写的是 https://127.0.0.1:2379) 为给定实例创建快照预计能在几秒钟内完成。 …

Java 时间范围

前端使用Element-ui 时间范围组件 后端注意在Vo里面时间设置String类型不要设置Date类型 XMl组件字段映射成功性

【基于Cocos Creator实现的赛车游戏】9.实现汽车节点的控制逻辑

转载知识星球 | 深度连接铁杆粉丝&#xff0c;运营高品质社群&#xff0c;知识变现的工具 项目地址&#xff1a;赛车小游戏-基于Cocos Creator 3.5版本实现: 课程的源码&#xff0c;基于Cocos Creator 3.5版本实现 在上一节的课程中&#xff0c;您已经实现了通过触控给刚体施…

LIO-SAM论文与代码总结

看了一些注释版的代码和博客&#xff0c;很多都很详细&#xff0c;但是有的看起来比较绕&#xff0c;或者对一些名词和定义的解释有歧义&#xff0c;不一定就说错了&#xff0c;但是仍然不方便自己理解&#xff0c;所以自己梳理一下&#xff0c;顺便记录。 目录 原文附带架构…

js 小数相乘后,精度缺失问题,记录四舍五入,向下取整

在做项目的时候&#xff0c;有一个计算金额的&#xff0c;结果发现计算的金额总是缺失0.01&#xff0c;发现相乘的时候&#xff0c;会失去精度&#xff0c;如图所示。被这整的吐血&#xff0c;由于计算逻辑由前端计算&#xff0c;所以传值后端总出错(尽量后端计算)。 还发现to…

React Native 环境配置(mac)

React Native 环境配置&#xff08;mac&#xff09; 1.Homebrew2.Node.js、WatchMan3.Yarn4.Android环境配置1.安装JDK2.下载AndroidStudio1.国内配置 Http Proxy2.安装SDK1.首先配置sdk的路径2.SDK 下载 3.创建模拟器4.配置 ANDROID_HOME 环境变量 5.IOS环境1.升级ruby&#x…

SQL8 查找某个年龄段的用户信息

描述 题目&#xff1a;现在运营想要针对20岁及以上且23岁及以下的用户开展分析&#xff0c;请你取出满足条件的设备ID、性别、年龄。 用户信息表&#xff1a;user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543…

神经网络 06(优化方法)

一、优化方法 网络搭建好&#xff0c;损失函数设计好之后&#xff0c; 根据损失函数更新参数(权重&#xff0c;偏移)。参数更新过程就是一个神经网络优化过程。 二、梯度下降方法 梯度下降法简单来说就是一种寻找使损失函数最小化的方法。从数学上的角度来看&#xff0c;梯度…

仿东郊到家app系统及功能介绍

类似东郊到家app系统开发&#xff0c;预约sap东郊到家软件定制开发&#xff0c;东郊到家小程序APP开发&#xff0c;东郊到家模式系统定制开发 一、东郊到家软件介绍 1、东郊到家app是一家以推拿为主项&#xff0c;个人定制型的o2o平台&#xff0c;东郊到家app平台提供、正规、安…

计算即时订单比例-首单使用开窗函数row_number()

1 需求 即时订单和计划订单 订单配送中&#xff0c;如果期望配送日期和下单日期相同&#xff0c;称为即时订单&#xff0c;如果期望配送日期和下单日期不同&#xff0c;称为计划订单。 请从配送信息表&#xff08;delivery_info&#xff09;中求出每个用户的首单&#xff08;用…

langchain主要模块(一):模型输入输出

langchain2之模型输入输出 langchain1.概念2.主要模块模型输入/输出 (Model I/O)数据连接 (Data connection)链式组装 (Chains)代理 (Agents)内存 (Memory)回调 (Callbacks) 3.模型输入/输出 (Model I/O)提示提示模板示例选择器 模型LLMsChatModels 输出解释器 langchain 1.概…

计算机竞赛 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉

文章目录 0 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习多目标跟踪 …

opencv(python)视频按帧切片/cv2.VideoCapture()用法

一、介绍 cv2.VideoCapture是OpenCV中一个用于捕捉视频的类。它可以访问计算机的摄像头&#xff0c;或从视频文件中读取图像。通过cv2.VideoCapture&#xff0c;用户可以轻松地捕捉、保存、编辑和传输视频流数据。 使用cv2.VideoCapture可以实现以下功能&#xff1a; 1. 打开…

基于微信小程序的自习室系统设计与实现,可作为毕业设计

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 需求分析3.1用户需求分析3.1.1 学生用户3.1.3 管理员用户 4 数据库设计4.4.1 E…

linux————ansible

一、认识自动化运维 自动化运维: 将日常IT运维中大量的重复性工作&#xff0c;小到简单的日常检查、配置变更和软件安装&#xff0c;大到整个变更流程的组织调度&#xff0c;由过去的手工执行转为自动化操作&#xff0c;从而减少乃至消除运维中的延迟&#xff0c;实现“零延时”…