利用Dynamo进行模型版本对比

你好,这里是 BIM 的乐趣,我是九哥~

今天我们来聊一个老生常谈的话题——模型版本对比。

先来看一段视频演示:

此处为语雀视频卡片,点击链接查看:003-模型调整跟踪.mp4

比较同一个模型的不同版本,找出新增,删除以及更改的内容,虽然感觉上实现应该不难,但是让你在 Dynamo 里写这么个程序,相信很多人也是不知道该如何上手。今天我们就来聊聊如何用 Dynamo 写这么个程序。

最开始是自己胡乱尝试,获取参数对比参数之类的,发现效率特别低,后来就在 Bing 上搜了下,发现大佬 Jeremy Tammik 博客里介绍过。在他的帖子中提到过解决问题的两种方法,其中有一个就是比较模型的 “快照”。看了这篇文章对我启发挺大的,所以就照着尝试了一下。

文章里详细介绍了比较方法,并且创建了 GitHub 库,有二开需求的小伙伴,直接去看看估计就搞定了,我这里呢,就是类比下,把相同的方法,用 Python 实现,并在 Dynamo 里做成一种通用的简便快捷的方法。

接下来进入正题,我们要对比 Revit 模型的版本变化,主要是对比几方面:

1、新增图元

2、删除图元

3、参数变化

4、几何变化

5、参数和几何均变化

一、判断图元是新增还是删除,我们可以使用图元的 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 对比,也可以转换成字符串进行对比,看你的操作习惯,例如对比参数,我们可以定义一个自定义函数,如下:

    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]

几何的话,需要先将 solid 转换成 Mesh,再获取 Mesh 的顶点,再转换成字符串进行对比,效率就高很多了。

这个需要自己去多尝试了,我的方法不一定是最好的,就不展示,小伙伴们子去试试哈~

然后将所有的对比结果依次输出即可,也可输出对比的图元 ID,在 Revit 中对图元进行颜色区分,就可以很清楚的表达出我们的对比结果了~

image

好了,今天的分享就到这里,小伙伴们快去自己尝试吧~

你可能感兴趣的:(利用Dynamo进行模型版本对比)