你好,這裏是 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 中對圖元進行顏色區分,就可以很清楚的表達出我們的對比結果了~
好了,今天的分享就到這裏,小夥伴們快去自己嘗試吧~