王維高,李邦國
(四川省交通勘察設(shè)計(jì)研究院有限公司,四川 成都 610017)
在過去的十年間,“插件+框架”[1]的軟件設(shè)計(jì)架構(gòu)(如圖1所示)廣泛應(yīng)用于較大規(guī)模的軟件開發(fā)過程中,該框架的應(yīng)用能夠有效的促進(jìn)團(tuán)隊(duì)合作,提高開發(fā)效率。軟件需求確定后,針對(duì)功能對(duì)軟件進(jìn)行模塊化分工,團(tuán)隊(duì)成員獨(dú)立完成功能模塊,在軟件運(yùn)行時(shí)將各個(gè)模塊的DLL注入到主程序,實(shí)現(xiàn)功能的聚合[2]。這種方法不僅僅提高了框架的易用性、可擴(kuò)展性[3]、靈活性、代碼復(fù)用性,還能有效的降低軟件開發(fā)成本,提高軟件的面向領(lǐng)域性、封裝性、代碼復(fù)用性[4]等。插件框架本身可以做到專注于計(jì)算機(jī)軟件領(lǐng)域,將結(jié)合的行業(yè)知識(shí)分解到模塊中去,目前主流的插件框架分為:1)腳本式插件框架。2)二進(jìn)制調(diào)用方式的插件框架。3)基于COM組件的插件框架。4)動(dòng)態(tài)函數(shù)庫DLL插件框架等幾種形式[5]。
針對(duì)領(lǐng)域的插件框架研究有張毅的《插件式GIS應(yīng)用框架關(guān)鍵技術(shù)研究》[6]、肖強(qiáng)等的《插件式無人機(jī)任務(wù)規(guī)劃軟件框架設(shè)計(jì)》[7]、鄭振浩等的《電網(wǎng)水電站水庫群調(diào)度插件式應(yīng)用框架設(shè)計(jì)》[8]、陳志飚的《基于.NET平臺(tái)的插件式船舶工程計(jì)算系統(tǒng)應(yīng)用框架開發(fā)》[9],以上研究都在各自領(lǐng)域通過“插件+框架”的方式,實(shí)現(xiàn)了相應(yīng)的軟件產(chǎn)品,并顯著提高了開發(fā)效率,提升了軟件產(chǎn)品質(zhì)量。
在BIM領(lǐng)域,常用的軟件產(chǎn)品主要來源于Autodesk,Bentley,Graphisoft,Trimble等幾家公司,詳細(xì)內(nèi)容見表1。
表1 BIM相關(guān)公司及主要產(chǎn)品
BIM領(lǐng)域的軟件,大部分開放了二次開發(fā)能力,提供了讓開發(fā)者針對(duì)領(lǐng)域定制的能力。目前BIM行業(yè)內(nèi)的開發(fā)僅僅停留在有針對(duì)性的二次開發(fā)水平,一般根據(jù)平臺(tái)規(guī)則,單人負(fù)責(zé)單模塊,缺少系統(tǒng)性,難以形成公共知識(shí)庫。在金瑞的《基于Civil 3D的航道整治BIM設(shè)計(jì)平臺(tái)開發(fā)》[10]、朱致遠(yuǎn)的《Revit二次開發(fā)在水閘工程擋土墻設(shè)計(jì)中的應(yīng)用》[11]、喬恩懋的《基于Revit二次開發(fā)的空間網(wǎng)架結(jié)構(gòu)BIM建模技術(shù)》[12]等作品中,都是針對(duì)功能做了二次開發(fā)的方式,未提及“框架”的概念。
BIM領(lǐng)域每個(gè)平臺(tái)都具有自己獨(dú)立的二次開發(fā)規(guī)則,例如:1)Revit一般采用Addins的方式進(jìn)行開發(fā)。2)Civil 3D則一般采用Netload的方式進(jìn)行開發(fā)。雖然每個(gè)BIM軟件開發(fā)方式不同,但是BIM軟件在某個(gè)領(lǐng)域中使用時(shí),卻又具有相同的知識(shí)庫,例如在交通領(lǐng)域的BIM行業(yè)中,橋梁隧道等結(jié)構(gòu)物的設(shè)計(jì)一般采用Revit,路面路基等帶狀構(gòu)筑物設(shè)計(jì)一般采用Civil 3D,雖然其開發(fā)平臺(tái)不同,但是他們擁有著共同的路線、地形、坐標(biāo)轉(zhuǎn)換、合同工段等知識(shí)信息。因此針對(duì)BIM行業(yè)開發(fā)特定的“框架”有助于盡快建立知識(shí)庫、提高開發(fā)效率?;谝陨蠁栴},筆者提出了一種針對(duì)BIM行業(yè)的插件框架,并介紹了其在具體工程實(shí)踐中的應(yīng)用,通過插件框架的推廣使用,建立了BIM+交通行業(yè)專有知識(shí)庫,降低了業(yè)務(wù)插件的耦合,提高了系統(tǒng)的穩(wěn)定性。
筆者所描述的系統(tǒng),整體架構(gòu)繼承了當(dāng)前主流的插件框架思路,保留一個(gè)主程序?yàn)槠脚_(tái)入口,在主程序運(yùn)行時(shí)將所有的插件動(dòng)態(tài)加載到主程序中,但又在該基礎(chǔ)上進(jìn)行了改進(jìn),將各個(gè)插件按照不同的項(xiàng)目、不同的功能、不同的版本、不同的依賴、不同的運(yùn)行環(huán)境在服務(wù)端進(jìn)行了統(tǒng)一管理,主程序運(yùn)行時(shí),按需實(shí)時(shí)更新插件,最終形成一個(gè)可運(yùn)行的程序。傳統(tǒng)的插件架構(gòu)解決的是單個(gè)大型軟件產(chǎn)品的開發(fā)模式,通過編寫一個(gè)入口主程序,將其余的功能按照“框架套路”寫成插件,從而實(shí)現(xiàn)對(duì)主程序的不斷擴(kuò)展。而筆者所描述的框架不僅僅是單個(gè)軟件,由于它擁有后臺(tái)對(duì)插件進(jìn)行統(tǒng)一的管理,所以更容易形成一個(gè)“軟件模塊”工廠,通過將“軟件模塊”進(jìn)行組裝,則形成不同的軟件產(chǎn)品(見圖2)。
該系統(tǒng)中,采用C/S的設(shè)計(jì)架構(gòu),整個(gè)軟件工廠的管理分為客戶端和服務(wù)器端,服務(wù)器端主要實(shí)現(xiàn)軟件模塊的源文件存儲(chǔ),以及軟件工廠中模塊的記錄管理,而客戶端主要對(duì)接服務(wù)器提供的接口,實(shí)現(xiàn)軟件模塊的上傳、下載、刪除及其他管理功能。軟件工廠的總體設(shè)計(jì)分為三部分:1)軟件工廠部分。軟件工廠中的模塊通過客戶端程序上傳到服務(wù)器,然后進(jìn)行分項(xiàng)目、分版本的管理。2)產(chǎn)品組裝層。產(chǎn)品組裝的主要功能是完成模塊的組裝,通過編寫配置,確定軟件模塊的版本,以及引用關(guān)系提供給產(chǎn)品。3)產(chǎn)品部分。產(chǎn)品部分的主要功能是通過組裝邏輯集成軟件模塊,從而形成一個(gè)標(biāo)準(zhǔn)的軟件產(chǎn)品。
筆者描述的框架實(shí)現(xiàn),基于Nacos的微服務(wù)架構(gòu)(見圖3),采用主流的C/S架構(gòu),在系統(tǒng)所必須的業(yè)務(wù)之外,還獨(dú)立搭建了公共服務(wù),包括文件上傳下載管理、權(quán)限驗(yàn)證等,實(shí)現(xiàn)了系統(tǒng)的快速擴(kuò)容,并且考慮了高并發(fā)需求,保證系統(tǒng)前后端分離的前提下,又能為客戶端提供高一致性的接口服務(wù),避免了今后可能新增的其他訪問端口對(duì)服務(wù)層進(jìn)行大面積的重構(gòu)[13-14]。
總體架構(gòu)共分為以下4層:
1)基礎(chǔ)層。
基礎(chǔ)層是整個(gè)系統(tǒng)運(yùn)行的基石,本系統(tǒng)運(yùn)行采用的是私有云部署方式,硬件采用的華為的超融合服務(wù)器,虛擬化采用的FusionSphere,通訊部分采用的是萬兆交換網(wǎng)絡(luò)。
2)存儲(chǔ)層。
存儲(chǔ)層解決了服務(wù)器結(jié)構(gòu)化數(shù)據(jù)、非結(jié)構(gòu)化數(shù)據(jù)以及緩存數(shù)據(jù)的存儲(chǔ)問題,其中非結(jié)構(gòu)化數(shù)據(jù)采用的開源產(chǎn)品MinIO進(jìn)行分布式存儲(chǔ),結(jié)構(gòu)化數(shù)據(jù)采用MYSQL進(jìn)行存儲(chǔ),緩存數(shù)據(jù)的存儲(chǔ)采用Redis進(jìn)行存儲(chǔ)。并且在設(shè)計(jì)時(shí)考慮了數(shù)據(jù)的熱備份及災(zāi)備。
3)服務(wù)層。
服務(wù)層采用市面比較流行的基于Nacos的微服務(wù)架構(gòu),包含了通用服務(wù)注冊中心、配置中心、消息隊(duì)列、監(jiān)控和管理、日志服務(wù)等,也針對(duì)本系統(tǒng)需求考慮了負(fù)載均衡、認(rèn)證、OSS管理、軟件模塊管理等功能。
4)配置層。
配置層主要是針對(duì)插件進(jìn)行配置,包括插件版本配置,啟動(dòng)運(yùn)行方式配置,環(huán)境依賴配置等,為應(yīng)用層對(duì)插件的使用進(jìn)行定制,滿足在不同運(yùn)行方式下,不同環(huán)境下插件的適配能力。
5)應(yīng)用層。
應(yīng)用層是軟件模塊通過配置形成的一個(gè)個(gè)產(chǎn)品,包括獨(dú)立的BIM建模軟件、基于C3D的軟件,基于Revit的軟件等。
筆者描述的架構(gòu),主要思路為,開發(fā)者針對(duì)需求定制開發(fā)代碼,形成pack.dll,然后通過frp.xml進(jìn)行客戶端調(diào)用配置,包括pack.dll的引用以及一些加載順序,加載方法的配置。開發(fā)者針對(duì)pack.dll和frp.xml進(jìn)行打包,打包后形成類似1846-0000-00-00-0002-13.zip的軟件包,其中1846-0000-00標(biāo)識(shí)軟件包的項(xiàng)目號(hào),00-0002-13標(biāo)識(shí)軟件包的版本號(hào)。打包完成后,將軟件包通過管理器提交到服務(wù)器,管理器包含了配置校驗(yàn)、項(xiàng)目管理、版本管理的基本增刪查改功能,形成軟件工廠中的模塊。開發(fā)者針對(duì)軟件模塊配置cfg.xml,生成不同環(huán)境下可運(yùn)行的軟件,如圖4所示。
某高速公路全長203.21 km,沿線包含丘陵、谷地、山地及高原前緣,因此設(shè)計(jì)過程中橋隧比高達(dá)41.73%。該項(xiàng)目信息化部分試點(diǎn)引入了BIM和GIS技術(shù),該項(xiàng)目建模主要采用的是Revit和C3D產(chǎn)品,目標(biāo)是實(shí)現(xiàn)DEM,DOM,BIM數(shù)據(jù)在同一個(gè)電子沙盤中進(jìn)行融合,其中功能包括,Revit和C3D的快速建模,數(shù)據(jù)格式轉(zhuǎn)換為GIS格式,以及地形、影像、路基、路面、橋梁、隧道等不同數(shù)據(jù)的數(shù)據(jù)格式轉(zhuǎn)換,為了更加方便的功能復(fù)用、提高開發(fā)者效率、建立共享知識(shí)庫,本框架成功的在該項(xiàng)目進(jìn)行了運(yùn)用,并實(shí)現(xiàn)了預(yù)期目標(biāo)。
在該項(xiàng)目中,框架主要分為管理器、數(shù)據(jù)轉(zhuǎn)換平臺(tái)、C3D產(chǎn)品、Revit產(chǎn)品等幾個(gè)部分。具體功能分解如圖5所示。
1)管理器。
管理器部分是開發(fā)者開發(fā)插件主要管理工具,其提供了開發(fā)的插件打包規(guī)范、版本規(guī)范等,并且標(biāo)識(shí)插件調(diào)用方應(yīng)該使用的調(diào)用方法。如圖6,圖7所示,用戶可以通過管理器對(duì)打包的插件按照項(xiàng)目和版本進(jìn)行管理。
2)數(shù)據(jù)轉(zhuǎn)換平臺(tái)。
數(shù)據(jù)轉(zhuǎn)換平臺(tái)主要解決BIM數(shù)據(jù)到GIS數(shù)據(jù)轉(zhuǎn)換的功能,從數(shù)據(jù)格式上分為Rvt數(shù)據(jù)、DWG數(shù)據(jù)、FBX數(shù)據(jù)、IFC數(shù)據(jù)等,從專業(yè)角度分為路基、路面、橋梁、隧道等結(jié)構(gòu)無數(shù)據(jù)。該平臺(tái)通過將軟件分解為主程序部分、路基轉(zhuǎn)換插件、路面轉(zhuǎn)換插件、橋梁轉(zhuǎn)換插件、隧道轉(zhuǎn)換插件及其他插件等方法,將功能分解到不同插件中,實(shí)現(xiàn)了由插件+主程序組成產(chǎn)品的邏輯,見圖8。
3)C3D產(chǎn)品。
C3D產(chǎn)品主要解決路線、路基、路面的快速建模以及部分?jǐn)?shù)據(jù)提取工作,為轉(zhuǎn)換為GIS數(shù)據(jù)做準(zhǔn)備。在C3D中通過配置管理器上傳的C3D專有插件,包括C3D核心開發(fā)包、快速建模插件、數(shù)據(jù)轉(zhuǎn)換插件、紅線插件、征拆插件等,形成了基于C3D的BIM特有產(chǎn)品(見圖9)。
4)Revit產(chǎn)品。
Revit產(chǎn)品主要解決橋梁、隧道等結(jié)構(gòu)物的快速建模問題以及導(dǎo)出FBX等標(biāo)準(zhǔn)數(shù)據(jù),為轉(zhuǎn)換為GIS數(shù)據(jù)做準(zhǔn)備。在Revit中通過配置管理器上的Revit專有插件,包括Revit核心包插件、Revit快速建模插件、數(shù)據(jù)提取轉(zhuǎn)換插件形成了基于Revit的BIM特有產(chǎn)品(見圖10)。
筆者描述的這種適用于BIM行業(yè)的“平臺(tái)+插件”的框架,在設(shè)計(jì)思路上率先提出軟件工廠的概念,總體架構(gòu)上扎根BIM行業(yè),能夠有效實(shí)現(xiàn)知識(shí)共享、系統(tǒng)易擴(kuò)展、系統(tǒng)靈活、系統(tǒng)易用等特點(diǎn)。軟件模塊的管理和調(diào)用由平臺(tái)統(tǒng)一考慮,能更好的統(tǒng)一開發(fā)者開發(fā)規(guī)范,提高開發(fā)者效率。這種框架結(jié)合BIM行業(yè),思路比較新穎,對(duì)BIM技術(shù)的發(fā)展具有重要意義。
該系統(tǒng)目前僅用在指定的項(xiàng)目上,并沒有在BIM行業(yè)普適,如果系統(tǒng)考慮為BIM行業(yè)開發(fā)者提供服務(wù),那么該系統(tǒng)將會(huì)成長為一個(gè)行業(yè)及軟件,市場前景廣闊,但同樣也對(duì)整個(gè)系統(tǒng)的架構(gòu)提出更高的挑戰(zhàn),在存儲(chǔ)和計(jì)算上要考慮更多的穩(wěn)定性、擴(kuò)展性、可靠性,在客戶端體驗(yàn)上要有更友好的界面、更快的加載速度、更簡單的使用方法等。隨著BIM技術(shù)的發(fā)展,專注BIM行業(yè)的開發(fā)人才不斷積累,可以暢想在不久的將來“插件+框架”的開發(fā)思想必將迎來一波熱潮,而筆者描述的框架正是BIM行業(yè)“插件+框架”的一個(gè)全新定制,也必將發(fā)揮其重要意義。