Dynamo | 使用Dynamo实现批量碰撞检测

概述

在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的节点过滤当前视图的所有构件。建议关闭几何图形预览,否则会比较卡。

element collector

然后对获取到的构件进行二次过滤即可得到想要的构件组合。如下图节点可以过滤出当前视图中所有的“专业”参数的参数值为“2”的构件。注意这里的“专业”参数的储存类型是字符串,如果存储类型是其他类型,则输入端节点应当随之改变。

参数判断

当然也可以通过简单的脚本来实现过滤,全凭喜好。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#Copyright (c) 2017, 刘博
#The Author's Blog http://autumnflavor.com
#This Script is for collecting the elements with given parameter value.

# Default imports
import clr

# Import RevitAPI
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *

# Import DocumentManager and TransactionManager
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

# Import ToDSType(bool) extension method
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)

#The input to this node will be stored in the IN[0] variable.

doc = DocumentManager.Instance.CurrentDBDocument
app = DocumentManager.Instance.CurrentUIApplication.Application

elements = UnwrapElement(IN[0])
parameter = IN[1]
paramValue = IN[2]

result = []
if hasattr(elements, "__iter__"):
for elem in elements:
for p in elem.Parameters:
if p.Definition.Name == parameter:
currentValue = p.AsString()
if (currentValue == paramValue):
result.append(elem)


#Assign your output to the OUT variable
OUT = result

构件分组

按照上一步的方法分别取出“专业”为“1”和“2”的两组构件,此时对每一分租内部的构件应当不进行碰撞检测,而不同组之间的构件应当进行两两检测,此时直接利用Dynamo的笛卡尔积节点就可以得到两两分组。

笛卡尔积

碰撞检测

把上一步操作中分组好的构件分别取出来,再讲构件的几何进行两两组合检测分析。这里只演示了硬碰撞检测,因为软碰撞检测是一样的用法,只需要设置一个阈值进行大小判断。

碰撞结果中有重复的构件,写一个小脚本过滤一下就好。可以看到脚本节点左侧的输入端对数据类型是没有限制的。脚本可以打包成自定义节点,这样可以对输入端的数据类型做进一步的约束,以免发生不必要的错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#Copyright (c) 2017, 刘博
#The Author's Blog http://autumnflavor.com
#This Script is for collecting the elements with given parameter value.

# Default imports
import clr

# Import RevitAPI
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *

# Import DocumentManager and TransactionManager
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

# Import ToDSType(bool) extension method
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)

#The input to this node will be stored in the IN[0] variable.

doc = DocumentManager.Instance.CurrentDBDocument
app = DocumentManager.Instance.CurrentUIApplication.Application

elements = UnwrapElement(IN[0])

result = []
ids = []
if hasattr(elements, "__iter__"):
for elem in elements:
id = elem.Id.IntegerValue
if not elem.Id.IntegerValue in ids:
ids.append(id)
result.append(elem)


#Assign your output to the OUT variable
OUT = result

将碰撞结果为true的构件取出,可获取到一个碰撞构件清单,在视图中将颜色改变为红色,可在Revit中进行查看。如下图中,蓝色构件为专业1,黄色构件为专业2,红色为检测到的碰撞构件。灰色显示的构件则没有进行判断,成功的运行了算法,对两个不同专业的模型做出了正确的碰撞检测判断结果。

如果需要实现更多组的构件检测判断,实现过程也是类似的,这里就不多说了。

吐槽几句

这几天我的Dynamo程序变得极度不友好了,单独启动一点问题没有,但是在Revit中启动却常常在进入软件的瞬间直接假死,连文档都来不及打开。现在能不能用这个软件全凭运气,开个十几次大概能成功一次,完全不知道问题出在了哪里,期待尽快出下一个版本可以更新一下。

文章目录
  1. 1. 概述
  2. 2. 实现过程
    1. 2.1. 构件过滤
    2. 2.2. 构件分组
    3. 2.3. 碰撞检测
  3. 3. 吐槽几句