你好,这里是 BIM 的乐趣,我是九哥~
今天我们来聊一个老生常谈的话题——模型版本对比。
先来看一段视频演示:
Dynamo模型版本对比
比较同一个模型的不同版本,找出新增,删除以及更改的内容,虽然感觉上实现应该不难,但是让你在 Dynamo 里写这么个程序,相信很多人也是不知道该如何上手。今天我们就来聊聊如何用 Dynamo 写这么个程序。
最开始是自己胡乱尝试,获取参数对比参数之类的,发现效率特别低,后来就在 Bing 上搜了下,发现大佬 Jeremy Tammik 博客里介绍过。在他的帖子中提到过解决问题的两种方法,其中有一个就是比较模型的 “快照”。看了这篇文章对我启发挺大的,所以就照着尝试了一下。
文章里详细介绍了比较方法,并且创建了 GitHub 库,有二开需求的小伙伴,直接去看看估计就搞定了,我这里呢,就是类比下,把相同的方法,用 Python 实现,并在 Dynamo 里做成一种通用的简便快捷的方法。
接下来进入正题,我们要对比 Revit 模型的版本变化,主要是对比几方面:
- 新增图元
- 删除图元
- 参数变化
- 几何变化
- 参数和几何均变化
一、判断图元是新增还是删除,我们可以使用图元的 GUID
这一步很简单,遍历 A 模型的图元 GUID 是否在 B 模型列表内,反过来再遍历 B 模型的图元 GUID 是否在 A 模型列表内,这样就能找出新增还是删除的图元了。
newguid = [e for e in docAguid if e not in docBguid]
deletedguid = [e for e in docBguid if e not in docAguid]
二、判断图元和参数变化
这里就用到了 “快照” 的概念,可以将参数和几何转换成 Encode 对比,也可以转换成字符串进行对比,看你的操作习惯,例如对比参数,我们可以定义一个自定义函数,如下:
def parametersnapshot(x):
parameters = x.Parameters
paramnames = [p.Definition.Name for p in parameters]
sortedindex = sorted(range(len(paramnames)), key = lambda k : paramnames[k])
sortedparameters = [paramnames[i] for i in sortedindex]
paramvalues = []
for p in parameters:
if p.AsString() != None:
paramvalues.append(p.AsString())
else :
paramvalues.append(p.AsValueString())
sortedvalues = [paramvalues[i] for i in sortedindex]
return ', '.join(['%s : %s' % (param,value) for param,value in zip(sortedparameters,sortedvalues)])
几何的话,需要先将 solid 转换成 Mesh,再获取 Mesh 的顶点,再转换成字符串进行对比,效率就高很多了。
这个需要自己去多尝试了,我的方法不一定是最好的,就不展示,小伙伴们子去试试哈~
然后将所有的对比结果依次输出即可,也可输出对比的图元 ID,在 Revit 中对图元进行颜色区分,就可以很清楚的表达出我们的对比结果了~
好了,今天的分享就到这里,小伙伴们快去自己尝试吧~