周 彬, 吳 優(yōu)
(中船澄西船舶修造有限公司, 江蘇 江陰 214433)
船舶產(chǎn)品設(shè)計(jì)(Ship Product Design, SPD)軟件是能滿足船體結(jié)構(gòu)、機(jī)裝、電裝、居裝和甲裝等專業(yè)設(shè)計(jì)的三維全數(shù)字化產(chǎn)品模型軟件平臺(tái)。隨著SPD應(yīng)用的不斷深入,用戶對SPD的開放性提出了更高的要求,因此SPD V4.0新增數(shù)據(jù)查詢二次開發(fā)接口,使用戶可在獲取數(shù)據(jù)后根據(jù)實(shí)際需要對數(shù)據(jù)進(jìn)行篩選、排序、統(tǒng)計(jì)并輸出數(shù)據(jù)報(bào)表等,大大提升用戶與SPD間的交互能力。由于SPD已在船廠長期使用,船廠的物量及管理數(shù)據(jù)結(jié)構(gòu)已趨于穩(wěn)定,與之配套的軟件也已形成,如果更換船舶設(shè)計(jì)軟件,會(huì)對原有的管理造成沖擊,船廠基本不會(huì)愿意更換。而且,幾乎沒有SPD二次開發(fā)的交流平臺(tái),開發(fā)人員無法方便地獲取資料,這也會(huì)對SPD獲取更多用戶造成影響。
中船澄西船舶修造有限公司現(xiàn)行船舶設(shè)計(jì)軟件為SPD V4.0,在載重量82 000 t船的生產(chǎn)設(shè)計(jì)中,利用C#語言對SPD進(jìn)行軟件的二次開發(fā),主要為突破生產(chǎn)設(shè)計(jì)瓶頸,提高設(shè)計(jì)人員效率,同時(shí)獲取實(shí)際需要的數(shù)據(jù)。
SPD V4.0提供SpdCustomization.dll和SpdArxCustomization.dll等2個(gè)DLL文件作為數(shù)據(jù)查詢二次開發(fā)接口,提供基于模型和基于產(chǎn)品數(shù)據(jù)庫的2種數(shù)據(jù)提取方式。2種提取方式的特點(diǎn)有:模型數(shù)據(jù)完整,提取效率較低;產(chǎn)品數(shù)據(jù)庫的數(shù)據(jù)不完整,提取效率較高。用戶可根據(jù)不同需求選擇提取方式。SPD軟件的管子模型數(shù)據(jù)提取流程如圖1所示(產(chǎn)品數(shù)據(jù)結(jié)構(gòu)樹和其他模型數(shù)據(jù)均類似)。

圖1 管子模型數(shù)據(jù)提取流程
源代碼如下:
Project m_proj = new Project();
m_proj.Open(string projectname);
ModelFile mdf = m_proj.OpenModelFile
(string modelname,SpecialityIdx.Pipe) ;
For (mdf.RewindRec(); mdf.GetRecState (out rectype, out recnum) == 0; mdf.NextRec());
MddRec rec = mdf.GetMddRec(recnum) ;
其他主要數(shù)據(jù)接口如下:
(1) SpdtRecord類:數(shù)據(jù)表基類,主要存儲(chǔ)SQL數(shù)據(jù)庫數(shù)據(jù);
(2) Component類:實(shí)體部件記錄基類,主要存儲(chǔ)管子部件、實(shí)體部件和參數(shù)化部件;
(3) PpdRec類:原理記錄基類,主要存儲(chǔ)管子原理和電氣原理數(shù)據(jù)。
部件庫是SPD設(shè)計(jì)系統(tǒng)中管子、電氣、舾裝專業(yè)設(shè)計(jì)的基礎(chǔ),沒有部件庫,設(shè)計(jì)師無法在SPD設(shè)計(jì)系統(tǒng)實(shí)現(xiàn)快速建模。SPD部件分為參數(shù)化部件、實(shí)體部件和管子部件。SPD部件提供的接口有基類和拓展類,其中基類為空體部件記錄基類(Component),擴(kuò)展類分別為參數(shù)化部件(ParaComponent)、實(shí)體部件(PartComponent)和管子部件(PipeComponent)。
SPD參數(shù)化建模系統(tǒng)支持用戶自定義計(jì)算、報(bào)表生成和模型瀏覽,為用戶提供良好的設(shè)計(jì)模式、數(shù)據(jù)瀏覽和管理方式。參數(shù)化部件按專業(yè)分為管子、電氣、舾裝和通用,按用途分為基礎(chǔ)型材和組合部件,按標(biāo)準(zhǔn)又分為標(biāo)準(zhǔn)件和非標(biāo)件。對復(fù)雜部件物量的抽取,原SPD接口需要在每個(gè)部件中單獨(dú)計(jì)算并定義物量,才能實(shí)現(xiàn)物量輸出。通過二次開發(fā)參數(shù)化部件數(shù)據(jù)查詢工具,實(shí)現(xiàn)對參數(shù)化部件建模準(zhǔn)確性的檢查,完成參數(shù)化部件建模數(shù)據(jù)的提取程序。完善后的接口可以根據(jù)底層基礎(chǔ)型材定義的物量信息實(shí)現(xiàn)復(fù)雜部件物量信息的完整提取,復(fù)雜部件無需再單獨(dú)計(jì)算和定義物量,提高了參數(shù)化部件的設(shè)計(jì)效率。SPD參數(shù)化部件可以用其他部件組合為復(fù)雜的部件,參數(shù)化部件物量提取流程如圖2所示。

圖2 參數(shù)化部件物量提取流程圖
主要源代碼如下:
List
MddSstru recsstru = (MddSstru)rec;
ParaComponent paracomponent = new ParaComponent(recsstru.ParaCompNum, recsstru.ParaValues);
listpara.Add(paracomponent);
組合件判斷源代碼如下:
if (listpara[i].RefParaComps[j].ParaNum < 9000)
{
listpara.Add(listpara[i].RefParaComps[j]);
}
通過ParaComponent屬性輸出物量信息如下:
(1) SubSpecs:組件規(guī)格描述($MSPEC),如:型材規(guī)格;
(2) SubSpecLengths:組件規(guī)格長度($LENS),如:型材長度、電氣基座的螺栓個(gè)數(shù);
(3) SubSpecNums:組件數(shù)量($NUMS),如:型材數(shù)量、電氣導(dǎo)架的螺栓個(gè)數(shù);
(4) SubWeights:組件基準(zhǔn)質(zhì)量($WETS)。
本文通過SubSpecs判斷部件是否為組合件,參數(shù)化部件組合件無需定義和計(jì)算物量信息,原參數(shù)化部件的物量數(shù)據(jù)抽取不受影響,提高了參數(shù)化部件基礎(chǔ)庫的建模效率,降低了參數(shù)化部件基礎(chǔ)庫的維護(hù)難度。
對管子專業(yè)的實(shí)體部件進(jìn)行優(yōu)化。管子專業(yè)物資種類多,標(biāo)準(zhǔn)件多,管子專業(yè)的實(shí)體部件如果處理不好,后期會(huì)對物資采購需求產(chǎn)生較大影響。物資編碼是物資管理的基礎(chǔ),每個(gè)企業(yè)均有自己的物資編碼體系,由于各個(gè)企業(yè)的物資編碼體系差異性較大,SPD軟件無法為每個(gè)企業(yè)建立完善的物資編碼系統(tǒng)。通過對SPD數(shù)據(jù)的深入了解,開發(fā)了物資編碼系統(tǒng)。該系統(tǒng)采用的是基礎(chǔ)數(shù)據(jù)配置,實(shí)現(xiàn)全自動(dòng)復(fù)雜結(jié)構(gòu)編碼。以管子為例,介紹物資編碼系統(tǒng)的結(jié)構(gòu)和原理,管子編碼結(jié)構(gòu)如圖3所示。系統(tǒng)設(shè)計(jì)原理為提取每個(gè)結(jié)構(gòu)信息單獨(dú)的編碼,通過數(shù)據(jù)庫中的組合規(guī)則將單獨(dú)的編碼組合成完整的物資編碼,如圖4所示。

圖3 管子編碼結(jié)構(gòu)

圖4 自動(dòng)編碼設(shè)計(jì)原理
SPD的原理定義是其短板,定義效率不高。SPD原理提供的接口為原理記基類(PpdRec)和擴(kuò)展類,擴(kuò)展類包括閥附件原理(PpdValve)、管路原理(PpdPipeline)和設(shè)備原理(PpdDevice)等。主要對管路原理定義進(jìn)行優(yōu)化,實(shí)現(xiàn)管路原理以詳細(xì)設(shè)計(jì)的DWG原理圖直接輸入到SPD系統(tǒng)。其主要原理為:定義各系統(tǒng)基礎(chǔ)信息,如法蘭、處理、壓力等信息,然后抓取詳細(xì)設(shè)計(jì)的DWG原理圖的管路信息(管路號(hào)、管子規(guī)格、管子材質(zhì)、管子等級(jí)),在定義每條原理數(shù)據(jù)的過程中自動(dòng)選取法蘭、處理和壓力等信息,最終實(shí)現(xiàn)管路原理自動(dòng)定義功能。自動(dòng)定義設(shè)計(jì)原理如圖5所示。

圖5 自動(dòng)定義設(shè)計(jì)原理
主要源代碼如下:
PrincipleFile principlefile = m_proj.GetPipePpdFile();
PpdPipeline ppdpipeline = new PpdPipeline();
// ppdpipeline屬性賦值
ppdpipeline.SysCode= "管路名";
ppdpipeline.PipeCompCode="管子部件代號(hào)";
……
principlefile.WriteRec(ppdpipeline);
物量提取是建立在中船澄西船舶修造有限公司自主研發(fā)的綜合數(shù)據(jù)管理平臺(tái)和SPD二次開發(fā)基礎(chǔ)上的,可以實(shí)現(xiàn)將SPD模型數(shù)據(jù)無縫導(dǎo)入綜合數(shù)據(jù)管理平臺(tái),然后通過該平臺(tái)對外發(fā)布數(shù)據(jù)。
SPD雖然提供了大量報(bào)表,但是報(bào)表中部分?jǐn)?shù)據(jù)并不完整,無法滿足實(shí)際需求,因此對SPD模型數(shù)據(jù)進(jìn)行準(zhǔn)確的提取和重組是有必要的。管子制作托盤提取界面如圖6所示。通過該模塊提取的管子材料明細(xì)有材料來源信息、物資編碼信息和需要的備注信息。

圖6 管子制作托盤提取
主要源代碼如下:
if ((mdf = m_proj.OpenModelFile(modelname, SpecialityIdx.Pipe)) != null)//判斷模型是否為管子專業(yè)
{
for (mdf.RewindRec(); mdf.GetRecState(out rectype, out recnum) == 0; mdf.NextRec())//遍歷模型
{
if ((rec = mdf.GetMddRec(recnum)) != null)
{
recspool = (MddSpool)mdf.GetMddRec((uint)Math.Abs(SPD_Pipe.spoolrecno(rec)));//獲取零件
if (recspool != null && recspool.Pallet == Listview.SelectedItems[0].SubItems[0].Text && recspool.PalletOrderNumber < 3000)//判斷零件托盤
{
spoolname = recspool.SpoolName;
ArrayList pipedetail = new ArrayList();//管子材料
pipedetail = SPD_Pipe.PipeDetail(rec, mdf, m_proj);//讀取管子部件詳細(xì)信息(自己寫的接口)
}
}
}
}
物量需求是指在設(shè)計(jì)端建立出庫和入庫數(shù)據(jù)庫,將設(shè)計(jì)下發(fā)的采購需求作為入庫數(shù)據(jù),模型提取的數(shù)據(jù)作為出庫數(shù)據(jù),通過對出入庫數(shù)據(jù)的對比分析,動(dòng)態(tài)顯示物量需求,指導(dǎo)設(shè)計(jì)人員進(jìn)行材料采購。目前完成了管子專業(yè)模塊的開發(fā),主要功能有基礎(chǔ)物資庫、材料請購、材料比對、材料查詢和材料請購單。物量需求模塊程序設(shè)計(jì)原理如圖7所示。

圖7 物量需求設(shè)計(jì)原理
基礎(chǔ)物資庫主要作用為將模型數(shù)據(jù)與采購數(shù)據(jù)對照,形成標(biāo)準(zhǔn)的采購數(shù)據(jù),同時(shí)也作為材料比對的標(biāo)準(zhǔn)數(shù)據(jù)。程序輸入端為托盤、基礎(chǔ)物資庫和采購單。托盤由模型直接輸出,基礎(chǔ)物資庫需要系統(tǒng)管理人員進(jìn)行維護(hù),采購單則由缺料數(shù)據(jù)直接輸出,設(shè)計(jì)師只允許進(jìn)行數(shù)量調(diào)整,修改備注等操作。該系統(tǒng)保證了采購需求物量信息的標(biāo)準(zhǔn)化。
通過該系統(tǒng),設(shè)計(jì)師能在提交模型數(shù)據(jù)后快速生成物料需求,過程中可以直觀地看到訂貨數(shù)據(jù)和模型數(shù)據(jù),通過對比分析,指導(dǎo)后續(xù)項(xiàng)目訂貨,其他專業(yè)物量需求可用類似的方法實(shí)現(xiàn)。
全套料技術(shù)指實(shí)現(xiàn)船體以外其他專業(yè)板材類零件圖形數(shù)據(jù)的提取。該技術(shù)是建立在參數(shù)化建模基礎(chǔ)上的,對參數(shù)化建模和手工建模過程作如下約定:
(1) 在建模過程中除了板材類零件可以使用軟件自帶的拉伸體功能,其余均通過參數(shù)化部件建模。
(2) 在參數(shù)化部件的組合部件中型材類均從基本型材中引用,只有板材可以引用基礎(chǔ)實(shí)體部件。
通過約定,可以實(shí)現(xiàn)自動(dòng)過濾,將舾裝件中需要套料的板材過濾出來,最終實(shí)現(xiàn)舾裝件板材零件的全套料。
實(shí)現(xiàn)過程源代碼如下:
MddSstru recsstru = (MddSstru)rec; //獲取鐵舾件零件
HdEntStretchPrism hdentstretchprism = (Hd
EntStretchPrism)recsstru.Ents[0];//獲取實(shí)體信息
hdentstretchprism.BottomSpline //獲取實(shí)體圖形信息,拉伸體底面邊界樣條
底面邊界樣條數(shù)據(jù)解析如下:
xyz
x1y1z1
……
xnynzn
其中:yn、zn為樣條節(jié)點(diǎn)的坐標(biāo);xn為連接節(jié)點(diǎn)(yn-1,zn-1)和(yn,zn)組成的樣條片段的有向半徑, 當(dāng)xn= 0時(shí)為直線段。程序通過獲取的邊界樣條自動(dòng)輸出圖形文件,該圖形文件能在中船澄西船舶修造有限公司套料軟件中直接套料。
設(shè)計(jì)軟件二次開發(fā)是打通企業(yè)信息化建設(shè)孤島的關(guān)鍵所在,能夠使設(shè)計(jì)軟件更加貼合企業(yè)實(shí)際需求。船舶設(shè)計(jì)模型數(shù)據(jù)是船廠信息化的基石,理論物量、理論工時(shí)等均以模型數(shù)據(jù)為源頭,二次開發(fā)是從模型數(shù)據(jù)中獲得基礎(chǔ)數(shù)據(jù)的必由之路。通過對SPD軟件的二次開發(fā),可以將設(shè)計(jì)模型數(shù)據(jù)轉(zhuǎn)化為其他軟件需要的信息,建立企業(yè)統(tǒng)一的數(shù)據(jù)源,打通設(shè)計(jì)、生產(chǎn)和管理之間的信息孤島。隨著SPD軟件二次開發(fā)接口的不斷完善,船廠信息化建設(shè)要求將更能滿足。