Revit二次開發-牆開洞問題
牆開洞有多種情況,這裡分平面/矩形牆上開洞和圓/弧牆開洞兩部分。
所有牆開洞的基本思路都是建立族,加載族,布置族。
平面/矩形牆上開洞
思路是建立一個族,在牆上開一個矩形、圓形、其他異形洞口;然後将洞口布置在指定的位置。
- 以基于牆的公制正常模型.rft建立族,布置需要的洞口。
- 将洞口加載到指定的document。
- 計算洞口位置,擷取組類型、标高、牆等其他參數,使用Autodesk.Revit.Creation.Document.NewFamilyInstance布置族。
圓/弧牆開洞
思路與矩形牆開洞一緻,隻是有些問題:上面矩形牆的族直接布置在弧牆上,可能會導緻洞口挖不開。
分兩種:1是開矩形洞,2是開圓形或其他異形洞。
圓/弧牆開矩形洞
弧牆開矩形洞直接使用revit給的api就可以:
Autodesk.Revit.Creation.Document
Opening NewOpening(Wall wall, DB.XYZ pntStart, DB.XYZ pntEnd);
計算矩形洞的兩個角點就好。
圓/弧牆開圓形或其他異形洞
- 以基于牆的公制正常模型.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實體删除,重新做一次。