概述
在Revit中进行设计的时候,常常会需要对构件的位置进行判断,比如是否发生构件碰撞,施工操作空间是否足够等,一些市政管线项目则会对各专业管线的安全距离作出要求。Revit自带的碰撞检测还有NV中的都不太好用。比如设定检测范围时不够灵活,再比如画管线的时候,管线和弯头、设备之间发生的碰撞我们可能认为是正常的,但是软件仍然会输出结果,无效结果过多则等于没有做分析。而Dynamo则能比较完美的解决这些问题。
Dynamo的Geometry节点分组下有许多几何相关的节点,功能非常强大并且实用。本章主要讲如何利用几何相关节点批量的进行碰撞检测。其实要用Revit API实现硬碰撞检测还是比较简单的,几行代码就能搞定,但是要实现软碰撞则相对困难,因为没有相关的API可以使用,如果要调用第三方的库有涉及到几何转化的问题,要不就需要自己去造车轮子了。而利用Dynamo却能轻松解决这个问题,因为Dynamo不仅已经有实现软硬碰撞的节点,还能直接将Revit中的几何直接转化成Dynamo工作空间的几何。主要使用到的功能节点是Geometry.DoesIntersect节点和Geometry.DistanceTo节点。如下图,可以看到两个节点的用法完全相同,只是Geometry.DoesIntersect节点输出的是布尔值,而Geometry.DistanceTo会输出两个几何构件之间的实际距离,当距离为零的时候,是发生了硬碰撞,距离不为零但是超过容许值则可认为构件发生了软碰撞。
实现过程
构件过滤
首先要解决的是如何避免不想检测的范围,比如相同专业的管线直接不检测碰撞,仅对不同专业之间的构件进行检测。这里就需要构件到构件精确的过滤。Dynamo的Selection节点组下边提供了几种常见的过滤器,在View分组下还有一个All Elements In Active View的节点过滤当前视图的所有构件。建议关闭几何图形预览,否则会比较卡。
然后对获取到的构件进行二次过滤即可得到想要的构件组合。如下图节点可以过滤出当前视图中所有的“专业”参数的参数值为“2”的构件。注意这里的“专业”参数的储存类型是字符串,如果存储类型是其他类型,则输入端节点应当随之改变。
当然也可以通过简单的脚本来实现过滤,全凭喜好。
1 | #Copyright (c) 2017, 刘博 |
构件分组
按照上一步的方法分别取出“专业”为“1”和“2”的两组构件,此时对每一分租内部的构件应当不进行碰撞检测,而不同组之间的构件应当进行两两检测,此时直接利用Dynamo的笛卡尔积节点就可以得到两两分组。
碰撞检测
把上一步操作中分组好的构件分别取出来,再讲构件的几何进行两两组合检测分析。这里只演示了硬碰撞检测,因为软碰撞检测是一样的用法,只需要设置一个阈值进行大小判断。
碰撞结果中有重复的构件,写一个小脚本过滤一下就好。可以看到脚本节点左侧的输入端对数据类型是没有限制的。脚本可以打包成自定义节点,这样可以对输入端的数据类型做进一步的约束,以免发生不必要的错误。
1 | #Copyright (c) 2017, 刘博 |
将碰撞结果为true的构件取出,可获取到一个碰撞构件清单,在视图中将颜色改变为红色,可在Revit中进行查看。如下图中,蓝色构件为专业1,黄色构件为专业2,红色为检测到的碰撞构件。灰色显示的构件则没有进行判断,成功的运行了算法,对两个不同专业的模型做出了正确的碰撞检测判断结果。
如果需要实现更多组的构件检测判断,实现过程也是类似的,这里就不多说了。
吐槽几句
这几天我的Dynamo程序变得极度不友好了,单独启动一点问题没有,但是在Revit中启动却常常在进入软件的瞬间直接假死,连文档都来不及打开。现在能不能用这个软件全凭运气,开个十几次大概能成功一次,完全不知道问题出在了哪里,期待尽快出下一个版本可以更新一下。