王子茹 于超
(大連理工大學 建設工程學部,大連 116024)
隨著經濟與科技的發(fā)展,世界各個行業(yè)正在迅猛發(fā)展,自動化與工業(yè)化水平得到了顯著提升,建筑工程行業(yè)也開始從傳統(tǒng)構建時代,向裝配式、工業(yè)化和自動化時代過渡,建筑產業(yè)會隨著社會節(jié)奏加快而不斷優(yōu)化項目整個生命周期,節(jié)約設備與人力成本,提高工作效率成為了業(yè)內人員努力的方向[1]。與此同時,一類把參數信息與建筑結合在一起的理念便孕育而生:建筑信息模型(Building Information Modeling,BIM)。BIM 特征在于利用數字化技術,使建筑項目的設計、施工、運營、后期維護以及拆除的信息集成,貫穿了項目始終,受到行業(yè)內廣泛認可[2-4]。
其中,Revit 作為實現BIM 技術理念的集成軟件,擁有“所見即所得”的特點,且軟件本身就為研究者提供了后臺API 命令,為參數化生成模型等功能的開發(fā)打下了良好的基礎[5]。
研究者基于Revit 軟件,針對鋼結構或鋼筋混凝土建筑、橋體以及多面體等結構類型進行不同方式的參數化研究。其中文獻[5]初步提供了點-線-面的參數化建模路線;文獻[6]優(yōu)化了表達模型的數據結構,設計出查重元素的算法,減少事務變更次數,提高了效率;文獻[7]則提供了創(chuàng)建族庫的新思路。
木結構作為我國傳統(tǒng)建筑結構類型,在環(huán)境優(yōu)美的度假村莊以及國家重點名勝古跡等地方都占據著結構種類中的領導地位[8]。隨著新時代人們越來越倡導綠色環(huán)保、溫暖舒適等居住要求,木結構深受建筑設計師的青睞。
在木屋結構方面,文獻[9]初步利用API 接口設計了木屋模型分析系統(tǒng),是以機械加工的角度對木結構孔槽加工相關數據的準確性進行了優(yōu)化,方便用戶提取木屋模型數據。文獻[10-11]提供了利用RevitAPI 與Dynamo 插件結合來完成建模的方法,并高效解決了墻面切割處理等問題。
綜上可以看出關于木屋表面與模型數據處理等細節(jié)方面已有許多建樹,但較少提及木屋結構的參數化自動建模部分。
在木屋結構的建模過程中,繁雜的開孔、凹槽構造以及如何對應材質信息是其獨有的特點,也是研究者們進行探究的重點。在Revit 中手動創(chuàng)建屬于孔槽的空心族,再創(chuàng)建族實例生成對應的凹槽,這增加了用戶的手動操作時間,效率較低,此過程并沒有實現自動化建模。
本文將利用RevitAPI 命令與C#編程技術進行交互[5,6],以三角形木屋頂為例,精確到螺栓、圓釘等細小部件,根據操作者需要的參數,完成孔槽構造的自動生成工作,自動匹配模型材質信息。通過設計編寫后臺代碼生成UI 窗口程序插件,令生成的模型分步演示,最終在軟件中詳細呈現三角形方木屋頂模型,真正實現參數化木屋頂自動建模功能。
針對Revit 的參數化設計方法可以概括為三種:研究人員可以利用Revit 自帶的內置開發(fā)模塊,通過Module_Startup,Module_Shutdown 方法,進行各種軟件建模操作的編譯,運行宏腳本執(zhí)行其命令。第二種便是用戶通過第三方的Grasshopper 工具與Dynamo-Revit 功能相鏈接,對操作命令進行可視化編譯。最后一種方法是基于Visual Studio 平臺,利用編程語言進行更細致的參數化程序開發(fā)。
本文研究是以Visual Studio Community 2019 作為開發(fā)平臺,通過選用.NET Framework4.6 作為目標框架,以自動生成綁定重定向替代程序集統(tǒng)一,進行模型參數化設計程序編譯工作。
Revit 建模軟件面向用戶提供了豐富的API 命令,開發(fā)者可以通過API 中集成的控制命令,直接創(chuàng)建、修改或刪除模型元素,實現預期的功能[12]。
本文基于RevitAPI2018 版本以及C#語言進行開發(fā),過程中主要以元素為單位進行展開。圖1 列出了RevitAPI 中族與族類別、族實例的基本繼承關系。
圖1 元素繼承關系
(1)Revit Lookup Tables
Revit Lookup Tables 方便用戶直接查看選定元素的各項屬性,包括ID、原點、法向向量、族、族類別等隱藏信息。
(2)Revit 2018 SDK
SDK 文檔中包含了每一部分API 代碼,針對不同編程語言的程序案例與說明,方便開發(fā)人員進一步理解并合理使用API。本文運用Revit 2018.2 SDK 版本進行開發(fā)。
通過設計UI 互動窗體使程序獲取木屋模型自定義參數,針對一般形狀模型以其關鍵點確定各個連接線段,并利用元素集合組成模型輪廓。根據特定的空間向量方向對模型構件進行拉伸生成工作。對于特殊形態(tài)的組成部分,便利用代碼實現旋轉、放樣等手段來加以合成。
特殊凹槽、孔槽等部位利用空心與實體模型的剪切關系進行創(chuàng)造。材質紋理等模型信息通過收集元素、篩選過濾、賦予屬性的方法予以實現。
本文利用程序生成的addin 文件與Revit 外部應用接口相配合來進行插件功能的實現。
木屋頂由屋面、木屋架、椽條與必要的水平橫向支撐組成,其中椽條與水平橫向支撐的構造相對簡單,而木屋架的結構構造復雜多樣,存在各種挖孔、錨固、連接和加固措施,下面將以三角形木屋架的參數化建模為主,詳細闡述實現自動化建模過程。
對木屋頂實現參數化自動建模,首先需要確定各項關鍵性數據。本文依據《木結構設計手冊》、木結構設計標準: GB50005-2017的要求設計相關程序代碼,對木結構屋頂尺寸與構造進行了有效計算與控制,其中包括屋面長度、屋架榀數、屋架高度等重要信息[13,14]。
在宏觀結構尺寸設計方面,控制三角形木屋架跨度不超過18m、限制高跨比1/4、以及桁架間距不宜大于6m 等規(guī)范要求。從構件連接部位設計中,兩兩螺栓的最小間距根據木材的紋理方向進行設置,不可小于規(guī)定的數額,以防止其產生應力集中現象。假設螺栓直徑為d,順紋對齊排列與錯行排列的最小間距分別為7d 與10d,端距7d。橫紋時分別為3.5d 與2.5d,端距3d。
通過在Visual Studio 中設計Winform 窗體應用,并在程序中創(chuàng)建窗體對象,呈現窗體,使用戶可以在之后的插件中直接輸入這些參數,初始輸入的參數屬于string 類型,利用Convert.ToDouble 方法使程序接收用戶輸入,關閉窗口,如圖2 所示。
圖2 設計木屋參數UI 窗體界面
初始時,用戶輸入的參數與最終生成模型的尺寸存在偏差,本文經過測試,為了使參數與模型尺寸擁有整數倍的比例,在程序中將每一項數值換算一致,并考慮到模型生成后的比例太小,不足以直接觀察模型細節(jié),本文經過測試,將生成木屋頂的模型整體橫縱方向比例增加到2 倍。
需要注意的是,窗體應用設計中擁有填寫功能的textBox 控件,其Modifiers 屬性需要設為Public,否則程序將接受不到用戶輸入的參數。
木屋頂的結構構造相對復雜,細分為螺栓、暗銷、長圓釘、棱條、附木、枕木、木夾板、墊板、墊塊、上弦、下弦與屋面等部分,如圖3 所示。
圖3 木屋頂組成構件
為了優(yōu)化模型生成后呈現的效果,對以上基本單元部分進行細節(jié)化控制,其中上下弦、附木和枕木等相對規(guī)則物體,首先建立每個關鍵點的坐標,之后利用line 中的CreateBound 方法進行兩點間的連線工作,并把線段包裹在Curvearrarray 的序列中,利用NewExtrusion 方法,在由點到線,由線到體的同時,選定平面拉伸完成。
如圖4 所示,墊塊這類變截面模型生成過程需要使用FamilyCreate 中的NewBlend 方法,通過創(chuàng)建上下兩端截面輪廓,沿特定的路徑對其進行放樣融合。此方法的具體設計架構如圖5 所示。
圖4 程序自動化生成的墊塊模型
圖5 變截面構件模型程序設計架構
對于暗銷與長圓釘模型,由于其不規(guī)則的形狀限制,建模時無法對其進行拉伸與融合操作.這里對這些構件使用NewRevolution 方法,編輯線段輪廓,通過與輪廓的旋轉軸Axis 對其旋轉一定角度生成。需要注意的是,旋轉所需的輪廓與拉伸融合都要求必須閉合且旋轉軸與輪廓線段必須在同一平面上。
為了方便操作,分別在項目文件中新建暗銷與長圓釘的類,并在類中寫入返回值為Revolution 類型的方法,最后在屋架類中聲明變量進行接收,把輪廓關鍵點中的兩點連線當作旋轉軸,使線段輪廓圍繞軸旋轉360°生成模型。
木屋頂與其他材料的屋頂相比,突出的不同點在于其為了保證結構穩(wěn)定性與構造要求,存在數量繁多的凹槽與孔洞。
以螺栓帽和腹桿兩端凹槽為例,首先按照參數將原拉伸體生成出來,之后通過計算,在螺栓與螺栓帽、腹桿與上下弦的接觸位置分別進行空心建模操作,把NewExtrusion 方法中的IsSolid 屬性填為false,表示創(chuàng)建的模型屬于剪切體,最后通過創(chuàng)建合并元素集合,把空心部分與螺栓帽、上下弦收集到集合里,進行實體與空心模型的連接,即生成凹槽與孔洞,下面為部分代碼。圖6 為具體程序設計流程,生成后的凹槽模型效果如圖7~圖9 所示。
圖6 自動化生成凹槽孔洞程序設計流程
圖7 自動化生成墊塊凹槽模型圖
圖8 程序生成螺栓帽孔洞模型圖
圖9 程序生成上弦桿凹槽模型展示圖
圖10為此次參數化建模過程中涉及到的編輯命令匯總,由于木屋頂的對稱性以及重復的構件種類繁多,于是涉及到了很多Revit.DB 命名空間下ElementTransformUtils 類中的編輯元素命令,每一種命令都需要提供元素的ID 才能實現預期的操作。其中移動、復制與鏡像命令輸入的坐標變量,是相對原實例id 的坐標,并且這些命令都有獨自對應的批量操作方法,把需要編輯的元素ID 打包成集合,利用ICollection 收集器進行統(tǒng)一操作。
圖10 編輯命令匯總
傳統(tǒng)手動設置項目中的模型材質,需要對構件的每一族類別分別進行設置,且遇到特殊實例需要個別調整,使人工操作時間大大增加。
此次研究目標材質是固定的木材材料和螺栓、圓釘和暗銷等其他金屬構件。為了使木材模型與其他構件在可視化方面區(qū)別開來,本文設計出了完成自動設置模型材質的系列方法,下面為實現方法過程的關鍵代碼。圖11 為實現方法過程的設計流程與思路。
圖11 自動匹配材質信息程序設計流程圖
通過上述流程,用戶可以通過winform 彈窗,在“木材材質”后面填寫需要設置的材質類型,之后程序會自動通過材質瀏覽器搜索輸入過的材質名稱,完成模型材質設置。
由于通過代碼自動生成模型的過程中存在復雜的細節(jié)處理與精細坐標比對等工作,在調試代碼運行成果時,Revit 會默認識別出距離極近的兩個線段或模型邊緣并沒有重合,并誤報“圖元稍微偏離了軸”警告,嚴重影響程序代碼的可執(zhí)行性與用戶界面觀感。
為了解決這一問題,本文設計并編寫了繼承IFailuresPreprocessor 預處理程序接口的FailureSolution類, 遍歷并接收錯誤信息并建立if 語句, 當GetDescriptionText 描述文字接收到“圖元稍微偏離了軸……”的警告文字,即可禁止消息框的出現。同時,針對此程序繼續(xù)編寫與之對應的FailedHandler 方法,通過定義相應的處理器,并在代碼中輸入構筑體名稱參數來實現此方法,最終消除誤報彈窗。
編輯后臺API 代碼文件成功后,在Revit 中利用外部應用接口進行插件功能的實現。本文通過重建一個項目,其中的類繼承Autodesk.Revit.UI 命名空間IExternalApplication 的接口,利用OnStartup 函數進行插件模塊的生成。接下來,需要把編輯好的addin 文件放入對應版本的文件目錄中,指引Revit 通過Assembly路徑識別GUID 識別碼,尋找外部應用接口dll 項目文件,再重新打開Revit 應用程序。如插件沒有設置簽名,則點擊“總是載入”,完成制作。
本文選取某地方一座紅松方木屋頂為建模實例。其屋頂24m 長,八榀屋架,每一屋架12m 寬、3m 高,其中輸入的數據以毫米為單位。
在程序接口代碼方面,建模時生成每一屋架的左半邊,再通過程序代碼中的MirrorElements 實例方法對其進行鏡像,生成完整的單一屋架模型。需要注意的是,鏡像后發(fā)現右半模型中的原空心剪切情況已不復存在,于是需要在程序中的空心模型進行鏡像與連接的循環(huán)操作,鞏固右半部分的模型凹槽效果,圖13~圖14 為程序生成的單一木屋架模型線框透析圖與渲染圖。
圖13 木屋架線框透析圖
圖14 木屋架仿真渲染圖
創(chuàng)建公制輪廓豎梃族,設計出瓦片輪廓,并將族載入項目中,利用拉伸屋頂命令初步建造屋頂頂板,并把其屬性改為玻璃斜窗,利于后期鋪墊瓦片。將玻璃斜窗屬性中的網絡1 內部類型以及邊界1、2 類型設置為載入的瓦片豎梃族,并設計好間距距離與布局,模擬生成木屋頂瓦片效果圖,如圖15 所示。
圖15 木屋頂瓦片模型圖
在Revit 插件操作方面,新建族文件,打開“木屋頂”模塊,點擊插件,如圖16 所示,根據用戶輸入的屋頂長度Distan 與榀數在程序中建立for 循環(huán),實現對應數量的屋架排列、棱條以及椽條。在對應的榀數上添加橫向支撐、與屋面,方木屋頂建模完成,如圖17 為最終木屋頂3D 圖。
圖16 參數化木屋架部分構件模型
圖17 生成木屋頂模型
該實例建模時,以木屋頂為重點組成部位,宏觀上呈現了包含木屋跨度、寬度、屋頂木屋架榀數與分布、上下弦桿和拉桿尺寸等結構,精確到上弦與下弦端部連接處、上下弦木夾板螺栓錨固排列數量與方式、墊塊和暗銷的固定、檁條與三角木的搭接等部分,如圖18~圖19 所示。
圖18 暗銷連接處
圖19 弦桿連接處
生成后的整體模型呈現完整,且本身擁有銜接木屋墻體的檁條與螺栓,滿足尺寸要求的下方主體結構可直接與模型連接,該模型并無缺件情況。由于部分靜態(tài)方法的循環(huán)執(zhí)行,使下弦中間墊板部分在原位置處重復生成,不可避免的產生了多件情況,但經過程序后期的材質自動匹配功能,賦予重復墊板模型同樣的材質信息后,對模型外觀的表現無影響。
本文基于木屋頂的結構特點,通過winform 窗口收集UI 過程中輸入的設計參數,利用RevitAPI 與C#編程技術設計程序,簡化了木屋頂建模的設計思路,實現木屋頂參數化自動建模過程,研究結果表明:
(1)在設計并完成木結構房屋的控制參數窗口之后,需要更改textBox 控件信息中Modifiers 屬性的公開性,以保證輸入后的參數能夠在程序項目的類中共享。木屋模型的控制參數眾多,當設計接收數據的窗體較多時,可利用DialogResult 等方法使其先后連續(xù)自動出現;
(2)區(qū)別于Revit 軟件手動繪制或剪切生成木屋凹槽孔洞結構的做法,通過C#編程技術與RevitAPI配合生成相應空心實體,根據接收的自定義參數數據,再運用元素連接的方式自動形成所需位置的凹槽構造模型,提升了坐標點位的精準度,也有效提高了木結構房屋的建模效率;
(3)根據設計者在窗體中輸入的木材或金屬材質名稱,可以運用構件過濾器在材質瀏覽器中遍歷材質類型,通過if 語句判別內部名稱并匹配,自動將木材材質附著于對應的模型構件上,大幅度減少手動操作時的重復性工作;
(4)通過FailureSolution 類與FailedHandler 方法的搜索信息與數據處理等功能,可以設計程序代碼辨識誤報信息內容來自動阻止消息窗體的彈出,避免其影響自動建模時的連貫性與交互觀感。
本文運用API 命令與外部編程語言編寫了大量功能性程序方法,這有利于設計者擺脫人工繪制大量重復性工作,提高了木結構房屋設計的工作效率,希望在木結構建筑的建模與施工進度可視化研究方面,可以給予一定的參考與思路。