天天看點

Revit二次開發-牆開洞問題Revit二次開發-牆開洞問題

Revit二次開發-牆開洞問題

牆開洞有多種情況,這裡分平面/矩形牆上開洞和圓/弧牆開洞兩部分。

所有牆開洞的基本思路都是建立族,加載族,布置族。

平面/矩形牆上開洞

思路是建立一個族,在牆上開一個矩形、圓形、其他異形洞口;然後将洞口布置在指定的位置。

  1. 以基于牆的公制正常模型.rft建立族,布置需要的洞口。
  2. 将洞口加載到指定的document。
  3. 計算洞口位置,擷取組類型、标高、牆等其他參數,使用Autodesk.Revit.Creation.Document.NewFamilyInstance布置族。

圓/弧牆開洞

思路與矩形牆開洞一緻,隻是有些問題:上面矩形牆的族直接布置在弧牆上,可能會導緻洞口挖不開。

分兩種:1是開矩形洞,2是開圓形或其他異形洞。

圓/弧牆開矩形洞

弧牆開矩形洞直接使用revit給的api就可以:

Autodesk.Revit.Creation.Document

Opening NewOpening(Wall wall, DB.XYZ pntStart, DB.XYZ pntEnd);

計算矩形洞的兩個角點就好。

圓/弧牆開圓形或其他異形洞

  1. 以基于牆的公制正常模型.rft建立族。使用
Autodesk.Revit.ApplicationServices.Application.NewFamilyDocument

該方法傳回族的document。

2. 擷取族中的牆,開啟Transaction,在牆上建立需要的洞。使用

Autodesk.Revit.Creation.FamilyItemFactory

Opening NewOpening(DB.Element host, CurveArray profile);

這個方法隻能用于族文檔。不能在revit目前目前文檔中使用。

在一個就是由于直接指定了洞形狀,在想改變就不行了,隻能一個洞類型,就建立一個族。例如,直徑相同的圓形洞,可以使用同一個族,位置可以根據建立族執行個體的時候指定不同位置。

3. 将族載入目前文檔。這裡有兩種方式,一種是将族文檔儲存到本地,再從本地載入到目前文檔;另一種是直接使用

Autodesk.Revit.DB.Document

Family LoadFamily(Document targetDocument);

方法,直接載入并傳回族。但這個方法需要目前文檔沒有已開啟的Transaction。是以,如果有Transaction,需要先commit,再start。

4. 最好根據洞形狀特征給族設定名稱。

5. 最後,就是調用

Autodesk.Revit.Creation.Document

FamilyInstance NewFamilyInstance(DB.XYZ location, DB.FamilySymbol symbol, DB.Element host, Level level, StructuralType structuralType);

建立族執行個體。

最後,需要注意一個問題,無論哪種牆,要開哪種洞,revit本身有bug——第一次載入族,建立族執行個體後,洞已經存在,并且位置、host、形狀等都沒錯,但作為host的牆就是沒被開洞。

解決方法就是,判斷是否目前文檔是否已經載入過這個洞的族,如果沒有,說明第一次開洞,就把開完的opening實體删除,重新做一次。