田榴敏 , 張世超, 王德禹, 崔進舉
(1.上海交通大學 船舶海洋與建筑工程學院, 上海200240;2.上海外高橋造船有限公司, 上海 200137)
國內大型郵船目標三維生產設計系統的應用通常依據造船企業的生產要素能力和生產建造組織方式等展開,在軟件應用過程中需要在充分利用其原有功能和優勢的基礎上進行二次開發,實現符合造船企業實際要求的、有針對性的功能擴展,增強軟件適應性,并根據造船企業實際生產設計需求開發各類輔助功能模塊,提高生產設計效率。鷹圖船舶設計軟件Smart 3D(以下簡稱S3D)作為國內大型郵船設計的備選軟件,需對其在郵船生產設計二次開發功能方面的適用性進行驗證,其中非常重要的一環就是針對S3D軟件二次開發技術的研究。
面向海事行業的鷹圖PP&M S3D是近20年來較先進的海洋資產和船舶設計軟件,也是新一代數據中心規則驅動型解決方案,能在保護現有數據并提高現有數據的可用性/再用性的同時簡化海洋資產的設計流程。S3D是鷹圖PP&M的新一代三維工程設計解決方案,在鷹圖PP&M超過30年工程經驗積累的基礎上,采用新穎的軟件技術進行核心構架。從2014版本開始,將原有針對不同領域獨立封裝的Smart Plant 3D、Smart Marine 3D和Smart Plant 3D Material Handling Edition統一封裝為S3D 產品[1]。
文獻[2-5]對S3D二次開發進行研究分析:文獻[2]對S3D軟件中的PCF文件進行解析,利用Linq編程技巧匯總單管材料數據,生成綜合材料報表,對軟件自帶的傳統報表起到了很好的補充作用;文獻[3-5]在S3D軟件中利用Automation進行管子二次開發設計、管子出圖和管子命名程序的二次開發,可提高設計效率、減少人為失誤。分析文獻[2-5]可知,目前S3D二次開發的主要方向是設計優化,可通過保證設計準確率,提出相應算法,利用S3D的二次開發技術實現該算法,從而達到優化設計的目的。文獻[6]主要介紹S3D在化工項目中異地協同設計方面的功能。文獻[7-10]主要介紹S3D軟件在管子設計中的應用。國內船舶設計單位應用S3D軟件并不廣泛,鮮見相關的二次開發應用,缺少相關報道和分析說明,且二次開發主要涉及管系專業,船舶設計單位尚未從產品全生命周期方面綜合考慮二次開發的應用。
本文從S3D軟件系統架構、開發工具和語言等方面進行二次開發技術分析,對開發接口、數據庫和開發調試方法進行研究,結合郵船生產設計實際需求,最終形成S3D二次開發的有效技術路徑和技術架構,為郵船生產設計的S3D二次開發提供技術支撐。
S3D軟件系統二次開發功能基于Microsoft .NET框架進行技術構建,具有面向對象并基于三層架構的分層結構。S3D軟件的三層架構包括客戶層、中間層和服務器層,將客戶層中的圖形用戶界面與中間層中的業務邏輯分開,將業務邏輯與服務器層中的物理數據庫進一步分離。S3D軟件采用關系型數據庫Microsoft SQL Server和Oracle數據庫,服務層依賴數據庫提供的相關功能。涉及的二次開發客戶層與中間層的關系架構如圖1所示。

圖1 S3D軟件二次開發架構
客戶層的客戶化開發必須在S3D的運行環境下進行,基于客戶層的二次開發必須打開S3D軟件,通過任務、服務等形式加載。客戶層主要包含菜單、工具箱、可視化視圖工具和對話框等,可使用Select Set和Graphic View Mgr等服務軟件提供的組件進行人機交互開發,例如在S3D軟件界面中對船舶設計模型選擇、視圖窗口,以及標注工具、視角操作等進行客戶化開發。
中間層又稱邏輯層,郵船設計客戶化業務規則的制定、業務流程的實現等與業務需求有關的系統設計都集中在該層,是系統架構中的核心部分,開發人員甚至可利用中間層提供的API接口,重新開發WEB界面的CAD設計系統。中間層處于數據層與客戶層中間,在數據交換中起承上啟下的作用,因此:首先需理解S3D軟件對船舶設計中各業務對象類數據結構和關聯接口的設計(業務對象對應于船舶設計過程中各類對象,貫穿于三層,在三層之間傳遞數據);其次,通過相關API接口命令對底層數據進行操作。
S3D軟件開發技術采用面向對象編程的思想,類的繼承與多態應用廣泛,3D .NET對象模型提供了一個名為BusinessObject的基類,使用Business-Object的類繼承來實現單個業務對象。Business-Object提供了使用字典方法訪問和修改屬性的方法,應用程序通過繼承該基類子類化來擴展對象模型和開發接口。繼承關系與設計對象之間聯系緊密,當一個設計對象發生變化時,通過繼承關系能夠確保設計數據的完整性和連續性。S3D軟件中常見的船舶設計對象類如圖2所示。
通過對S3D軟件二次開發架構進行分析,可知基本的開發方法分為3種:(1)在S3D環境中對客戶層進行二次開發,直接參與用戶交互操作;(2)Standalone程序,通過中間層啟動運行二次開發的方式,不需打開S3D軟件界面;(3)S3D軟件配置符號庫、命名規則和IFC規則開發。
生產設計軟件系統的應用落地是一項浩大的工程,涉及設計、生產、管理的方方面面。在投入實船生產設計之前,必須對軟件進行全面的測試和評估。通過測試工程,從實際使用的角度確認軟件各個方面的性能。一方面,設計軟件不僅需具備生產設計單方面的功能,而且還應具備信息一體化的集成能力;另一方面,設計軟件需滿足郵船設計的特殊要求。測試需求的特點是基礎測試點數量大、角度廣、關聯測試項目多,測試主要內容包括郵船生產設計的三維建模、生產設計圖紙設繪、生產信息輸出、二次開發能力等。
S3D軟件的測試工作覆蓋設計的各個相關專業(結構、管系、鐵舾、電氣和涂裝),包括出圖、報表和功能點評測等方面,須達成2個目標:(1)功能測試與定制,全面考查目標軟件能力;(2)模式整合,旨在根據目標軟件現有能力和船廠現有模式,探索目標軟件生產設計落地方案。測試以真實項目為背景,出具各專業全面設計平臺詳細測試報告和分析報告,并提出軟件系統改進需求。
船體結構模塊測試項共86項,其中S3D軟件開發需求共27項,主要涉及出圖和報表相關內容的開發;管系專業模塊測試項共66項,包括資源庫配置、原理圖、三維建模、圖紙出圖和數據輸出接口等5個方面,其中開發需求共9項,主要涉及標準庫、規則類和出圖報表類的開發;電裝專業模塊測試項共68項,包括資源庫配置、系統原理圖設計、三維建模(電纜通道、電纜、電纜托架)、圖紙出圖和數據輸出接口、電裝工藝仿真、設備廠商資料管理等6個方面,提出20項開發需求,主要涉及出圖報表類開發;鐵舾專業模塊測試項共32項,包括資源庫配置、三維建模、出圖和數據接口,以及模型更改等4個方面,提出8項開發需求,主要涉及參數化建模類開發;涂裝專業模塊測試項共10項,包括資源庫配置、三維建模、出圖和數據接口等3個方面,提出8項開發需求,主要涉及報表開發。
在郵船二次開發中,開發人員主要集中于客戶層和中間層的開發,系統管理員則主要集中于符號庫和規則庫的開發。下文從客戶層和中間層的開發方面分析S3D的具體開發手段,即Command和Standalone開發。
Command主要應用于客戶層命令對象的開發,以創建基于.NET的命令為主要方式,開發人員通過創建一個從S3D提供的基本命令類繼承方式進行開發,嵌入S3D運行環境。這種方式與一般CAD系統軟件調用COM接口的開發方式不同,是基于對象的命令開發。通過CommandManager服務創建該類實例,并將控件傳遞給對象,該對象執行相關命令,控制命令的執行。開發人員通過繼承命令基類提供的OnStart、OnStop、OnSuspend和OnResume方法重寫的方式,進行定制化的二次開發。Command開發的主要思路是通過對基類進行繼承,修改成員變量及重寫相應的功能函數實現二次開發,包括3種類型:Base、Graphic和Step。
Base類型主要在調用OnStart方法之后,S3D的界面操作命令立即終止。在通常情況下,該模式可通過命令基類提出一個與用戶進行交互的對話框。首先調用OnStart方法,在OnStart方法運行結束后立即調用OnStop方法,然后刪除命令對象,命令的所有工作都在OnStart方法中完成。在實際開發中,開發人員一般利用Base類型命令作為開發入口,再編寫相關交互界面進行一系列郵船業務相關的邏輯處理。通過創建對BaseModalCommand繼承的類重寫OnStart的方法,嵌入S3D環境中進行二次開發邏輯處理。
GraphicCommands與StepCommands的區別僅僅是繼承的類不同,開發方式相同。
GraphicCommands是事件驅動命令,與ModalCommands的主要區別在于調用Start方法之后,S3D的界面操作命令不終止,而由Command-Manager將控制權放回3D軟件,比如S3D設計界面上的MouseDown、MouseMove和MouseUp等,該命令使用這些事件驅動其內部邏輯。開發人員通常在圖形顯示中進行定位和限制圖形,動態移動設計對象或者在構建新的3D設計對象時利用該方法。例如,在通過開發進行設備的建模,并由開發人員進行設備的具體布置時,就需要用該方法進行開發。
StepCommands是GraphicCommands的一種特殊情況事件響應,可以額外定義一些步驟或狀態,分步驟執行命令并記錄,可進行操作的撤銷。StepCommands的運行方式在S3D軟件中很常見,如在船體板架建模時,經定義基面—定義邊界—定義產品信息等步驟,可以終止建模流程,也可以撤銷返回上一步驟。在實際開發中,該方法使用較多,需求可能比較復雜,開發人員可控制步驟和邏輯,使開發容易處理。例如,在特殊管支架布置中,開發人員可利用該方法分步驟,即選擇管子—計算并選擇管支架類型—選擇管支架連接基面—添加拓撲關系,并在每個步驟下進行邏輯開發。
Commands的3種類型對比如表1所示。

表1 Commands類型比較
Standalone主要用于中間層接口的開發,即在獨立程序中調用中間層S3D .NET API接口,不需打開S3D軟件即可獨立訪問S3D軟件工程項目數據,包括模型和目錄,操作所有重要的S3D軟件中間層數據。由于開發三層架構具有解耦性,開發人員在進行獨立程序開發時,并不會直接操作底層數據庫,可通過中間層TransactionMgr類對相關數據進行提交和撤銷。
開發人員可以進行如下操作:批量更改模型數據庫中的一組對象,自動按客戶規則進行工程項目初始化設置(如創建產品結構樹、用戶和權限組定義,以及模型過濾器定義等),設計數據可與船廠信息化系統連接,甚至能將數據導入第三方軟件進行操作,該開發技術對S3D軟件拓展性的提升非常明顯。
中間層開發的關鍵技術是如何在不啟動S3D軟件時調用和訪問S3D軟件中的工程。開發人員需了解.NET框架下程序集的概念(程序集是.NET應用程序的基本單元,一個軟件可以是一個程序集),可通過.NET框架提供Assembly類操縱程序集,并獲取程序集內部信息。在獨立程序開發時,可利用Assembly類將S3D中間層的程序集加載進來,這樣開發人員就可調用中間層的API接口。
在S3D軟件項目工程數據庫中,Catalog數據庫是S3D進行工程設計的基礎,記錄了設計內容的大部分重要信息。但設計對象數量龐大以及對象之間關系錯綜復雜導致在開發過程中對模型數據結構的理解和熟悉十分困難。設計人員可通過3個方面獲取模型數據結構信息:S3D系統模型屬性界面;S3D數據庫數據信息;常見的Microsoft Visual Studio開發工具集提供的對象接口瀏覽。面對龐大的設計對象和復雜的對象關系,介紹2種方法供開發人員參考使用:
(1) S3D系統提供數據結構瀏覽器工具,其位于安裝目錄下($Smart3DCoreToolsAdministratorBinMetaDataBrowser.exe)。開發人員可通過該工具查看模型數據對應對象、接口和屬性等。S3D軟件數據結構瀏覽器如圖3所示。

圖3 S3D軟件數據結構瀏覽器
(2) 在S3D運行界面中點選需查看的模型,按Ctrl+Shift+R組合功能鍵即可彈出點選對象的接口和屬性等信息,如圖4所示。

圖4 S3D設計數據資源庫瀏覽器
利用(2)的方式,給出S3D管子屬性相關抽取示例代碼。
public void getPipelineInfo(BusinessObject oBO, ref string strInfo)
{
string strTmp = "";
PropertyValueString oStrPropVal;
PropertyValueCodelist oCLPropVal;
PropertyValueDouble oDouPropVal;
//Name
oStrPropVal = (PropertyValueString)oBO.GetPropertyValue("IJNamedItem", "Name");
strTmp = oStrPropVal.PropValue;
strInfo += "Name : " + strTmp + " ";
//Description
oStrPropVal = (PropertyValueString)oBO. ("IJPipelineSystem", "Description");
strTmp = oStrPropVal.PropValue;
strInfo += "Description : " + strTmp + " ";
//Sequence Number
oStrPropVal = (PropertyValueString)oBO.GetPropertyValue("IJPipelineSystem", "SequenceNumber");
strTmp = oStrPropVal.PropValue;
strInfo += "Sequence Number : " + strTmp + " ";
//Fluid Requirement
oCLPropVal = (PropertyValueCodelist)oBO.GetPropertyValue("IJPipelineSystem", "FluidSystem");
strTmp = oCLPropVal.PropertyInfo.CodeListInfo.GetCodelistItem(oCLPropVal.PropValue).Name;
strInfo += "Fluid Requirement : " + strTmp + " ";
//Fluid Type
oCLPropVal = (PropertyValueCodelist)oBO.GetPropertyValue("IJPipelineSystem", "FluidCode");
strTmp = oCLPropVal.PropertyInfo.CodeListInfo.GetCodelistItem(oCLPropVal.PropValue).Name;
strInfo += "Fluid Type : " + strTmp + " ";
對于船舶其他專業(船體、風管、舾裝、電氣等)的數據抽取,利用S3D軟件提供數據結構瀏覽器工具,結合S3D建模環境中模型數據結構查看功能,開發人員能夠將各個專業的數據進行提取。
結合船舶二次開發的特點(設計標準多樣化、生產管理主導和產品全生命周期長)與郵船產品的建造特點(工程管理復雜、總段化與模塊化建造、建造過程控制嚴格和全過程精度控制技術要求高等[11]),郵船設計軟件S3D的二次開發,需圍繞業務特點設計一個具備良好伸縮性的軟件架構。下文簡要說明當前通用的2種軟件架構:分層架構和微核架構,并提出適合船舶業務特點和S3D設計軟件的軟件構架。
分層架構是最常見的軟件架構[12],也是事實上的標準架構。該架構將軟件分成若干個水平層,每一層都有清晰的角色和分工,不需要知道其他層的細節,層與層之間通過接口通信。分層架構的優點是:結構簡單,容易理解和開發,每一層都可以獨立測試,其他層的接口通過模擬解決,可并行開發,便于組織分工。其缺點是:擴展性差,增加或變更功能必須依次擴展每一層,由于每一層內部是耦合的,擴展很困難。
微核架構又稱"插件架構",指的是軟件的內核相對較小,主要功能和業務邏輯都通過插件實現。內核通常只包含系統運行的最小功能[13],插件互相獨立,插件之間的接口通信減少到最低,避免出現互相依賴的問題。微核架構的優點是:功能延伸性良好,業務上需要什么功能,開發一個插件即可,功能之間是隔離的,插件可獨立加載和卸載,容易部署,可定制性高,適應不同的開發需求,可以漸進式地進行開發,逐步增加功能。其缺點是: 開發難度相對較高, 對于內核設計的要求高。
根據船舶建造和S3D軟件二次開發的特點,提出以微核框架為主體,內核為分層架構的軟件架構。S3D郵船二次開發架構如圖5所示:內核采用分層結構,核心內容為郵船建模規范的數字化層,以WORD、EXCEL和PDF文件形式作為設計建模指導的建模規范進行數字化,直接在前端S3D設計軟件進行約束指導;同時,對S3D的中間層和客戶層進行封裝,形成郵船S3D系統數據層作為系統的內核,將郵船相關業務以插件模塊形式進行組合。內核采用分層結構便于理解開發,設計標準的變更對于企業來說相對固化,擴展性不是關鍵點。二次開發最重要的依據是設計標準,嵌入郵船設計標準作為內核的一部分可為郵船設計業務相關使用場景、規則和復雜條件的處理定義通用的業務邏輯;而整體采用微核框架則是從郵船產品建造特點出發,以良好的功能延伸線與各種外部系統對接,適應不同的開發需求。

圖5 S3D郵輪二次開發架構
基于上述軟件架構,利用內核API接口,開發郵船報表系統-結構專業組立清單程序,要求按船廠的格式在圖紙上添加重量與重量中心和裝配報表即組立清單,包括各裝配的頁碼信息,且能通過刷新自動更新報表和頁碼。圖6為系統組立清單主界面。用戶可選擇同步工程數據、組立重量中心和零件報表功能,右側主界面顯示對應裝配結構樹下分段的組立清單,包含組立名,干重,重量中心x、y、z等。

圖6 系統組立清單主界面
該系統主要技術路線為:利用內核提供功能,用戶設置S3D工程連接,程序后臺連接S3D工程數據,加載顯示主界面上的裝配結構樹,用戶點擊相應裝配節點,后臺抽取對應節點下的結構屬性信息,獲取組立名、重量與重量中心,自動計算該節點下所有結構模型的面積和基面投影面積,最終組織形成組立清單并導出EXCEL文件,如圖7所示。

圖7 導出的EXCEL組立清單文件
對S3D軟件系統架構、開發工具和語言進行分析,對開發接口、數據庫以及開發調試方法進行論述,歸納S3D提供的二次開發技術手段,并提出二次開發軟件架構,結合國產大型郵船生產設計在S3D軟件上的需求,通過二次開發技術進行定制化的二次開發應用,開發符合國產大型郵船設計的二次開發軟件,既可加強拓展基于S3D系統的國產大型郵船的設計功能,又可降低設計人員的工作量,提高設計質量,從而縮短設計周期,保證國產大型郵船的設計工作順利開展。