吳 昊,蘇瑞東,項(xiàng) 陸,王 帥
(1.今創(chuàng)集團(tuán)股份有限公司,江蘇 常州 213102;2.中南大學(xué) 粉末冶金研究院,湖南 長沙 410083)
對(duì)于一般的制造企業(yè)來說,標(biāo)準(zhǔn)件種類、規(guī)格較多,常規(guī)做法是技術(shù)人員首先通過手工填寫標(biāo)準(zhǔn)件的相關(guān)信息,比如標(biāo)準(zhǔn)代號(hào)、規(guī)格名稱、材料(等級(jí))、備注(表面處理和狀態(tài))等,然后憑借這些信息到系統(tǒng)數(shù)據(jù)庫中查找對(duì)應(yīng)物料代碼,最終將物料代碼反填到圖紙的明細(xì)表中。但是,由于項(xiàng)目交期緊迫,加之技術(shù)人員的出圖習(xí)慣、出圖技能、細(xì)心程度等各方面的差異,造成圖紙明細(xì)表的標(biāo)準(zhǔn)件數(shù)據(jù)填寫質(zhì)量參差不齊。常見問題有:標(biāo)準(zhǔn)代號(hào)誤寫,比如“GB/T 6170”寫成“GB6170”或“GBT6170”;規(guī)格名稱隨意采用簡寫或者縮寫,比如,“標(biāo)準(zhǔn)型彈簧墊圈6”簡寫成“彈墊6”或者“彈簧墊圈6”;規(guī)格名稱中的“×”被“*”或者“x”替代,比如,“內(nèi)六角圓柱頭螺釘M6×15”寫成“內(nèi)六角圓柱頭螺釘M6*15”等。同時(shí),系統(tǒng)數(shù)據(jù)庫經(jīng)過長時(shí)間的運(yùn)行,積累了大量數(shù)據(jù),部分?jǐn)?shù)據(jù)信息填寫不規(guī)范。綜合上述兩方面的原因,所造成的后果就是圖紙的數(shù)據(jù)無法直接與系統(tǒng)標(biāo)準(zhǔn)件代碼數(shù)據(jù)庫進(jìn)行對(duì)接,不方便物料代碼的匹配與查找。據(jù)初步統(tǒng)計(jì),技術(shù)人員在標(biāo)準(zhǔn)件數(shù)據(jù)填寫上所花的時(shí)間占出圖總時(shí)間的10%~15%。
CAXA CAD電子圖板是一個(gè)開放的二維CAD平臺(tái)[1],是數(shù)碼大方自主開發(fā)的國產(chǎn)CAD核心產(chǎn)品,具有上手快、出圖快、專業(yè)規(guī)范、穩(wěn)定可靠、兼容性好等特點(diǎn),已經(jīng)廣泛應(yīng)用于航空航天、裝備制造、電子電器、汽車及零部件、國防軍工、教育等行業(yè)。同時(shí),CAXA擁有強(qiáng)大的二次開發(fā)能力,結(jié)合Microsoft Visual Studio 2010,可以方便、快捷地定制出具有公司特色的二次開發(fā)軟件。
由于系統(tǒng)數(shù)據(jù)庫里的標(biāo)準(zhǔn)件數(shù)據(jù)不規(guī)范,因此程序不能直接對(duì)接系統(tǒng)數(shù)據(jù)庫。這里采用拆分的方法,對(duì)系統(tǒng)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行清洗和整理。根據(jù)標(biāo)準(zhǔn)件數(shù)據(jù)類型特點(diǎn),將其拆分為規(guī)范圖號(hào)(標(biāo)準(zhǔn)代號(hào))、規(guī)格名稱、材料、備注、物料代碼等部分,如圖1所示。注意,一個(gè)包含圖號(hào)、名稱、材料、備注這四方面信息的物料,有且只能對(duì)應(yīng)一個(gè)物料代碼,不能出現(xiàn)一個(gè)物料對(duì)應(yīng)多個(gè)物料代碼(一物對(duì)多碼)或者多個(gè)物料對(duì)應(yīng)一個(gè)物料代碼(多物對(duì)一碼)等異常情況。最后形成規(guī)范的標(biāo)準(zhǔn)件代碼庫文件StdPartsDatabase.xlsx。

圖1 經(jīng)過整理后的系統(tǒng)標(biāo)準(zhǔn)件數(shù)據(jù)效果
該算法實(shí)現(xiàn)了對(duì)文件夾所有圖紙明細(xì)表中標(biāo)準(zhǔn)件信息的批量識(shí)別和提取。首先,初始化結(jié)構(gòu)體鏈表為空、文件序號(hào)為0,該鏈表包含有標(biāo)準(zhǔn)件的標(biāo)準(zhǔn)代號(hào)、規(guī)格名稱、材料、備注以及在所在圖紙明細(xì)表中的件號(hào)、所在圖紙的路徑等信息;然后程序會(huì)對(duì)文件夾中的每張圖紙進(jìn)行讀取,如果圖紙中包含明細(xì)表,則遍歷明細(xì)表,若出現(xiàn)有標(biāo)準(zhǔn)件信息,則將該標(biāo)準(zhǔn)件信息追加入鏈表的末尾;最后,遍歷該鏈表,將各標(biāo)準(zhǔn)件信息顯示在主窗口的相應(yīng)控件ListViewCtrl中,并導(dǎo)出為xlsx或csv等格式文件,方便后續(xù)的操作。標(biāo)準(zhǔn)件信息的識(shí)別與提取算法流程如圖2所示。

圖2 標(biāo)準(zhǔn)件信息的識(shí)別與提取算法流程
上述算法中,判斷一條明細(xì)是否為標(biāo)準(zhǔn)件的方法,是通過檢測該明細(xì)圖號(hào)列的字符串是否包含有常用標(biāo)準(zhǔn)代號(hào)的縮寫,比如”GB/T”、”ISO”、”DIN”,如果包含,則判斷為標(biāo)準(zhǔn)件,反之,則為非標(biāo)件。
按照前述分析,問題主要出在標(biāo)準(zhǔn)代碼和規(guī)格名稱這兩部分,因此,針對(duì)這兩部分的整理算法的設(shè)計(jì)就顯得尤為重要。在介紹算法前,首先準(zhǔn)備格式為csv的標(biāo)準(zhǔn)件信息文件StdPartInfoFile,該文件的格式是每行數(shù)據(jù)包含規(guī)范標(biāo)準(zhǔn)代號(hào)RegStdNO、規(guī)范名稱前綴RegStdNamePrefix、標(biāo)準(zhǔn)代號(hào)的正則字符串StdNORegExp、規(guī)格名稱的正則字符串StdNameRegExp等內(nèi)容,并且用逗號(hào)分割。后續(xù)如需新增標(biāo)準(zhǔn)件信息,也按照此順序逐行增加。
算法的具體實(shí)現(xiàn)方法如下:首先,遍歷讀取該標(biāo)準(zhǔn)件信息文件的每行內(nèi)容,并且存入結(jié)構(gòu)體鏈表StdPartsInfoList中;然后,遍歷讀取上述2.1中的控件ListViewCtrl各行內(nèi)容,獲取臨時(shí)標(biāo)準(zhǔn)代號(hào)StdNO、臨時(shí)規(guī)格名稱StdName;接著遍歷上述結(jié)構(gòu)體鏈表StdPartsInfoList,如果StdNO與結(jié)構(gòu)體鏈表中某一條數(shù)據(jù)SPI的標(biāo)準(zhǔn)代號(hào)正則字符串SPI→StdNORegExp相匹配,則將該數(shù)據(jù)的規(guī)范標(biāo)準(zhǔn)代號(hào)SPI→RegStdNO填寫到控件ListViewCtrl所在行的相應(yīng)列中,進(jìn)一步地,將StdName與規(guī)格名稱的正則字符串SPI→StdNameRegExp相匹配,將其純規(guī)格信息Spec提取出來并進(jìn)行相應(yīng)的處理;再接著將規(guī)范名稱前綴SPI→RegStdNamePrefix與經(jīng)過處理的純規(guī)格信息Spec’進(jìn)行連接并形成新的規(guī)格信息NewStdName;最后將NewStdName填入到控件ListViewCtrl所在行的相應(yīng)列中。標(biāo)準(zhǔn)件信息的整理算法流程如圖3所示。

圖3 標(biāo)準(zhǔn)件信息的整理算法流程
上述算法中,標(biāo)準(zhǔn)代號(hào)正則字符串StdNORegExp是根據(jù)前述常見問題來設(shè)計(jì)的,比如,GB(‘?|?)T?s?93可以用來識(shí)別GB/T 93這條標(biāo)準(zhǔn)代號(hào)[2];規(guī)格名稱正則字符串StdNameRegExp是用來匹配物料純規(guī)格信息的,比如,Md+(*|x|×)d+可以用來識(shí)別常用螺釘和螺栓的規(guī)格;規(guī)格名稱的前綴RegStdNamePrefix是指除去純規(guī)格信息而比較固定的內(nèi)容,比如,規(guī)格名稱“標(biāo)準(zhǔn)型彈簧墊圈 6”中的“6”就是該物料的純規(guī)格信息,而前綴就是“標(biāo)準(zhǔn)型彈簧墊圈”。
搜索算法是實(shí)現(xiàn)物料代碼自動(dòng)填寫的關(guān)鍵,算法如下:遍歷讀取ListViewCtrl的各行,獲取規(guī)范標(biāo)準(zhǔn)代號(hào)StdNO1、規(guī)范規(guī)格名稱StdName1、材料Material1、備注Memo1各信息;然后遍歷規(guī)范標(biāo)準(zhǔn)件代碼庫文件StdPartsDatabase,將上述StdNO1、StdName1、Material1、Memo1與代碼庫相應(yīng)各信息進(jìn)行一一比較,如果都符合,則說明已經(jīng)找到;最后將物料代碼填入ListViewCtrl相應(yīng)行的物料代碼列中,如果有一項(xiàng)不符合,則說明沒有找到,跳過并讀取代碼庫的下一條數(shù)據(jù),如果都沒有找到,則在對(duì)應(yīng)的物料代碼列中填入“未找到物料代碼”信息,以提醒技術(shù)員需要后續(xù)人工干預(yù)。物料代碼搜索算法流程如圖4所示。

圖4 物料代碼搜索算法流程
該算法實(shí)現(xiàn)物料代碼導(dǎo)入進(jìn)圖紙的功能,即遍歷讀取ListViewCtrl每行物料代碼、所在圖紙的序號(hào)、所在圖紙的路徑等列數(shù)據(jù),然后填入相應(yīng)的圖紙中。因功能比較簡單,現(xiàn)不再贅述,具體可以參考CAXA電子圖板 ObjectCRX二次開發(fā)指南[3]之相關(guān)章節(jié)內(nèi)容。
考慮到技術(shù)員的操作習(xí)慣,程序的GUI界面設(shè)計(jì)[4]較為簡潔,操作步驟也較為簡單,達(dá)到了技術(shù)員“一看就懂大概、一用就會(huì)操作”的效果。二次開發(fā)程序運(yùn)行界面如圖5所示。

圖5 二次開發(fā)程序運(yùn)行界面
經(jīng)過10張圖紙共30條明細(xì)數(shù)據(jù)的人工填寫與程序填寫的測試比對(duì),結(jié)果如表1所示。可以看出,通過二次開發(fā)程序,節(jié)省的時(shí)間還是很可觀的。經(jīng)過初步試用,能夠有效縮短出圖時(shí)間,提高出圖效率。

表1 人工填寫與程序填寫比對(duì)結(jié)果
針對(duì)目前存在的標(biāo)準(zhǔn)件數(shù)據(jù)填寫時(shí)間長、數(shù)據(jù)的填寫質(zhì)量不高等一系列問題,本文介紹了一種解決方法。首先對(duì)系統(tǒng)數(shù)據(jù)庫中的標(biāo)準(zhǔn)件物料數(shù)據(jù)進(jìn)行整理,形成規(guī)范標(biāo)準(zhǔn)件代碼庫文件StdPartsDatabase,然后進(jìn)行二次程序開發(fā),通過算法來實(shí)現(xiàn)圖紙標(biāo)準(zhǔn)件數(shù)據(jù)的識(shí)別、提取、整理等功能,最終實(shí)現(xiàn)了物料代碼的搜索與反填。經(jīng)過技術(shù)人員初步使用,可以有效縮短技術(shù)員的出圖時(shí)間,提高工作效率,為圖紙標(biāo)準(zhǔn)件數(shù)據(jù)精細(xì)化管理提供了一種切實(shí)可行的解決方案。另外,因?yàn)槎伍_發(fā)程序不受圖紙的限制,模塊化程度較高,可拓展性較好,后續(xù)可以向選碼等其他功能拓展,從而進(jìn)一步減少人工填寫的內(nèi)容和人工填寫所花費(fèi)的時(shí)間。