殷健良,仲梁維
(200093 上海市 上海理工大學(xué)機(jī)械學(xué)院)
標(biāo)準(zhǔn)化、智能化、網(wǎng)絡(luò)化成為工業(yè)發(fā)達(dá)國(guó)家注塑模具制造業(yè)的基本特征。近些年我國(guó)注塑模具的制造水平得到了很大提高[1]。熱流道(Hot Runner Systems)是在注塑模具中使用的、將融化的塑料粒子注入模具型腔中的加熱組件系統(tǒng)。熱流道模具是將傳統(tǒng)式模具或三板式模具的澆道與流道經(jīng)過(guò)加熱,于每一成形時(shí)不需要取出流道和澆道的一種嶄新構(gòu)造[2]。對(duì)注塑制造行業(yè)而言,熱流道技術(shù)是行業(yè)發(fā)展中的一次重大技術(shù)革命,能夠節(jié)約資源、提升生產(chǎn)效率、提高產(chǎn)品質(zhì)量以及延長(zhǎng)模具使用年限,同時(shí)有很好的經(jīng)濟(jì)效益[3]。
目前,一些生產(chǎn)商使用軟管作為熱流道系統(tǒng)的管道。軟管靈活性高、可伸展、可壓縮,可維護(hù)性好,但軟管存在比較致命的缺點(diǎn)——成本高,因此有些熱流道系統(tǒng)生產(chǎn)商使用硬管替代軟管以節(jié)約成本,同時(shí)還能提高熱流道系統(tǒng)的外觀和品質(zhì)。
由于企業(yè)在熱流道系統(tǒng)管路設(shè)計(jì)過(guò)程中涉及大量管路建模和排布操作,尤其是建模,管路路數(shù)眾多,需要做分層排布等操作,實(shí)際過(guò)程中工程技術(shù)人員耗費(fèi)大量時(shí)間反復(fù)修改以完善管路排布,但企業(yè)需要快速給出管路排布方案和全部精確的三維管路模型,用于自動(dòng)折彎?rùn)C(jī)的工藝環(huán)節(jié)。因此考慮借助 SolidWorks 開發(fā)一款能夠?qū)崿F(xiàn)基于熱流道系統(tǒng)的基礎(chǔ)框架模型,自動(dòng)排布熱流道管路以提高設(shè)計(jì)效率。雖然系統(tǒng)基于注塑行業(yè)熱流管管道系統(tǒng)開發(fā),但其他需要進(jìn)行路徑連接的系統(tǒng),如液壓系統(tǒng)管道或電路的排布亦可參照本算法思路進(jìn)行開發(fā)。
系統(tǒng)可實(shí)現(xiàn)3 個(gè)功能模塊:信息的提取與轉(zhuǎn)換,按距離最短確定路徑,進(jìn)行管路排布和干涉處理。輸入為SolidWorks 熱流道注塑系統(tǒng)3D 圖,輸出為管道的SolidWorks 零件文件。軟件流程圖如圖1 所示。
圖1 軟件流程圖Fig.1 Software flow chart
借助vs2012 開發(fā)平臺(tái)使用vb.net 作為開發(fā)語(yǔ)言實(shí)現(xiàn)軟件算法編寫及功能開發(fā),并基于SolidWorks 三維CAD 軟件以及其為用戶提供的API開發(fā)接口,實(shí)現(xiàn)管路的數(shù)據(jù)采集和排布的三維顯示。SolidWorks API 對(duì)象模型如圖2 所示,是一個(gè)自上而下的樹形結(jié)構(gòu)。
圖2 SolidWorks API 對(duì)象模型Fig.2 SolidWorks API object model
SolidWorks 的二次開發(fā)主要分為2 種,一種是基于COM 開發(fā),使用官方提供的Addin 模板生成的dll 插件;另一種是基于EXE 可執(zhí)行文件[4]。前者會(huì)運(yùn)行在SolidWorks 主進(jìn)程之下,與SolidWorks內(nèi)聚性較高,運(yùn)行速度也會(huì)更快,用戶安裝和使用更加方便。后者運(yùn)行在單獨(dú)的進(jìn)程中,耦合性較高,運(yùn)行速度慢,但可擴(kuò)展性更強(qiáng),所以一般在開發(fā)擴(kuò)展性不強(qiáng)的產(chǎn)品軟件時(shí),會(huì)優(yōu)先使用第一種開發(fā)方式。軟件界面如圖3 所示,用戶輸入?yún)?shù),點(diǎn)擊繪圖按鈕即可完成管道排布方式的計(jì)算和展示。
圖3 軟件界面Fig.3 Software interface
在計(jì)算管道路徑之前,必須對(duì)熱流道系統(tǒng)的三維坐標(biāo)進(jìn)行數(shù)據(jù)采集。需要采集的數(shù)據(jù)分別為管道的起點(diǎn)、終點(diǎn)和表示哪里可以經(jīng)過(guò)管道的中間線。本文使用xml 配置文件結(jié)合SolidWorks 的API 接口(以下簡(jiǎn)稱SWAPI)進(jìn)行數(shù)據(jù)點(diǎn)的獲取。其中熱流道系統(tǒng)的三維模型是一個(gè)裝配體,由于裝配體中不能獲取零件的特征,所以要在特征中獲取點(diǎn)后按照草圖→零件圖→裝配體的順序向上進(jìn)行坐標(biāo)變換。
xml 是一種可擴(kuò)展標(biāo)記語(yǔ)言(Extensible Markup Language),常被用來(lái)傳輸和存儲(chǔ)數(shù)據(jù)[5]。本文使用xml 作為配置文件,使用DTD 文件對(duì)xml 文檔的書寫規(guī)則進(jìn)行簡(jiǎn)單約束。軟件使用xml 文檔傳輸、持久化SolidWorks 應(yīng)用信息和采集的信息點(diǎn)的特征樹結(jié)構(gòu)及特征名稱,如圖4 所示。
圖4 存儲(chǔ)SolidWorks 應(yīng)用和特征信息的xml 文檔Fig.4 SolidWorks application and feature information in XML document
使用
通過(guò)程序解析XML 的方式通常有兩2 種:第一種為DOM 的方式,將標(biāo)記語(yǔ)言文檔一次性加載進(jìn)內(nèi)存,在內(nèi)存中形成一棵DOM 樹,其優(yōu)點(diǎn)是操作方便,可以對(duì)文檔進(jìn)行CRUD 的所有操作;另一種是SAX 的方式進(jìn)行逐行讀取,基于事件驅(qū)動(dòng),優(yōu)點(diǎn)是不占內(nèi)存。由于本文的XML 大小較小,功能簡(jiǎn)單,故采用比較方便的dom 讀取方式。vb.net開發(fā)語(yǔ)言System.XML 類庫(kù)下提供了十分方便的XML 解析類XMLDocument。
讀取XML 配置文件模塊在軟件業(yè)務(wù)邏輯開始時(shí)被執(zhí)行,將解析后的結(jié)果進(jìn)行一定的處理和封裝,比如字符串替換雙花括號(hào)中的變量,存儲(chǔ)到內(nèi)存中。
SWAPI 獲取三維模型點(diǎn)的信息的模塊隨后被執(zhí)行,該模塊需要通過(guò)SWAPI 接口找到XML 配置文件中所定義的各個(gè)裝配體、零件、特征,對(duì)應(yīng)方式為字符串匹配名稱。其中,由總裝配體獲取到子裝配體所對(duì)應(yīng)的SWAPI 接口中的方法為IAssemblyDoc.GetComponents();由裝配體獲取零件所使用的方法為IComponent2.GetChildren();由零件獲取特征時(shí)使用IComponent2.FirstFeature(),該方法返回一個(gè)指向第一個(gè)特征的引用,可以使用Feature.GetNextFeature()方法進(jìn)行零件特征樹的遍歷,遍歷的方法參照?qǐng)D的深度優(yōu)先搜索,將圖4 中XML 文件中線架主體和接線板的裝配——零件——特征信息映射成圖的表示形式,如圖5 所示。
圖5 XML 文件中特征樹結(jié)構(gòu)的圖的映射Fig.5 Using XML-Graph map to express feature tree structure
通過(guò)上文方法獲取了起點(diǎn)、終點(diǎn)、可經(jīng)過(guò)點(diǎn)的信息,但通過(guò)該方法獲取的這些點(diǎn)的坐標(biāo)的坐標(biāo)系是其所在草圖的坐標(biāo)系,而計(jì)算管路路徑、彎折點(diǎn)和三維導(dǎo)出是在裝配體中完成的,需要進(jìn)行坐標(biāo)的轉(zhuǎn)換統(tǒng)一成裝配體坐標(biāo)系下。
使用SWAPI 實(shí)現(xiàn)坐標(biāo)轉(zhuǎn)換,無(wú)論是從草圖到零件還是從零件到裝配體,都需要存放2 個(gè)不同坐標(biāo)系之間的關(guān)系的MathTransform 對(duì)象,該對(duì)象通過(guò)草圖接口(ISketch)中的ModelToSketchTransform屬性可以獲得草圖到零件的MathTransform 對(duì)象,或者通過(guò)組件接口(IComponent)的Transform2 屬性可以獲得零件到裝配體的MathTransform 對(duì)象。另一個(gè)需要的對(duì)象是需要變換的點(diǎn)的對(duì)象,類型為MathPoint。將MathTransform 作為參數(shù)傳入
MathPoint MathPoint.MultiplyTransform(MathTransform mathTransform)方法,即可完成SolidWorks 中不同坐標(biāo)系下的坐標(biāo)轉(zhuǎn)換
SolidWorks 中的坐標(biāo)變換是通過(guò)變換矩陣來(lái)完成的[6],矩陣如式(1)所示
式中:(Xa,Ya,Za)——原始坐標(biāo),對(duì)應(yīng)的是MathPoint 對(duì)象;a-i——4 階變換矩陣,為旋轉(zhuǎn)矩陣;(j,k,l)——平移矢量;(n,o,p)——無(wú)實(shí)際意義。上面獲得的MathTransform 對(duì)象封裝了該變換矩陣表示的信息。最后返回的MathPoint 對(duì)象為(Xb,Yb,Zb)。
將零件中的點(diǎn)轉(zhuǎn)換到裝配體中的方法與草圖轉(zhuǎn)到零件中的方法類似,只不過(guò)MathTransform 對(duì)象是通過(guò)裝配體中零件的對(duì)象中的Transform2 屬性獲取的。提取的信息數(shù)據(jù)如圖6 所示,字段x,y,z 表示位置信息,direction 字段表示方向向量。
圖6 部分信息提取結(jié)果Fig.6 Partial Point Information
完成信息采集后,按照點(diǎn)的信息,需要確定每一條起點(diǎn)到終點(diǎn)的路徑,路徑的確定原則考慮到成本問題采用最短路徑原則,主要應(yīng)用Dijkstra 算法。由于Dijkstra 算法生成最短路徑需要3 個(gè)必要參數(shù):起點(diǎn)、終點(diǎn)以及由n 個(gè)結(jié)點(diǎn)組成的n 階鄰接矩陣,所以在使用圖的最短路徑算法之前,需要進(jìn)行數(shù)據(jù)預(yù)處理以確定這3 個(gè)參數(shù)。
在生成路徑之前需要對(duì)點(diǎn)的信息進(jìn)行預(yù)處理,生成Dijkstra 中需要的結(jié)點(diǎn)信息。當(dāng)前不能直接生成結(jié)點(diǎn)的原因是從線架草圖提取的線都是不連續(xù)的,如圖7 所示,因此首先需要將不連續(xù)的線按照一定算法連接形成結(jié)點(diǎn)。
圖7 數(shù)據(jù)預(yù)處理前的草圖Fig.7 Sketch before data preprocessing
針對(duì)不同的情況形成結(jié)點(diǎn)的算法如下:比較所有線段與線段之間的距離關(guān)系,找出距離十分相近的2 條線段。這2 條線段有如下2 種情況:
(1)兩條線段延長(zhǎng)線的交點(diǎn)在其中一條線段上,如圖7 中3 號(hào)和5 號(hào)線段。對(duì)于這種線段,首先確定交點(diǎn)在哪條線段上,3 號(hào)線段和5 號(hào)線段中,交點(diǎn)在5 號(hào)線段上,沿著3 號(hào)線段的方向新建線段連接3 號(hào)線段端點(diǎn)和兩線段交點(diǎn),并將交點(diǎn)記為5號(hào)線段的打斷點(diǎn)。其中還有一種特殊情況:兩條線的交點(diǎn)為其中一條線段的端點(diǎn),如圖7 中7 號(hào)和6號(hào)或8 號(hào)線段,與非特殊情況不同之處在于不用將交點(diǎn)記為打斷點(diǎn);
(2)兩條線段的交點(diǎn)在兩條直線的延長(zhǎng)線上,如圖7 中2 號(hào)和4 號(hào)線段。首先找到交點(diǎn),連接交點(diǎn)與2 號(hào)線段,4 號(hào)線段距離較近的端點(diǎn)即可。
上述程序完成后將有打斷點(diǎn)的直線在打斷點(diǎn)進(jìn)行打斷,并進(jìn)行去重。通過(guò)SWAPI 中IModelDoc.SketchManager.CreateLine() 方法將處理后的結(jié)果可視化(軟件中沒有這一步,這里僅為方便展示),得到的結(jié)果如圖8 所示。
圖8 數(shù)據(jù)預(yù)處理后的草圖Fig.8 Sketch after data preprocessing
有了所有結(jié)點(diǎn)的連接信息之后,需要生成鄰接矩陣。先將n 個(gè)結(jié)點(diǎn)組成的n 階鄰接矩陣初始化,每個(gè)結(jié)點(diǎn)的值設(shè)置為10 000(替代正無(wú)窮,需要遠(yuǎn)大于正常數(shù)值,但不能過(guò)大,否則進(jìn)行計(jì)算時(shí)會(huì)超出int 的范圍),再雙重循環(huán)遍歷各個(gè)可以連接的結(jié)點(diǎn),將結(jié)點(diǎn)之間的距離作為權(quán)重寫入鄰接矩陣。
Dijkstra 算法是從一個(gè)頂點(diǎn)到其余各頂點(diǎn)的最短路徑算法,解決的是有權(quán)圖中最短路徑問題,算法主要特點(diǎn)是以起始點(diǎn)為中心向外層層擴(kuò)展,直到擴(kuò)展到終點(diǎn)為止。迪杰斯特拉算法采用的是貪心算法的策略,貪心策略體現(xiàn)在每次都選擇一個(gè)距離源點(diǎn)最近的節(jié)點(diǎn)加入最短路徑節(jié)點(diǎn)集合,算法只支持非負(fù)權(quán)圖,時(shí)間復(fù)雜度為O(n2),比較適合作為熱流管系統(tǒng)求解最短路徑的算法[7]。
對(duì)于一條路徑,路徑中的每個(gè)結(jié)點(diǎn)將維護(hù)2 個(gè)數(shù)據(jù)結(jié)構(gòu):shortest 和visited,shortest 存儲(chǔ)起點(diǎn)到該節(jié)點(diǎn)的最短路徑。visited 存儲(chǔ)起點(diǎn)到該節(jié)點(diǎn)的最短路徑是否求出,用0 和1 表示,1 表示已經(jīng)訪問過(guò)(求出)[8]。
Dijkstra 算法一次遍歷可以獲得從某一個(gè)起點(diǎn)到所有節(jié)點(diǎn)的最短路徑以及線路所經(jīng)過(guò)的結(jié)點(diǎn),在所有結(jié)點(diǎn)中找到終點(diǎn)對(duì)應(yīng)的結(jié)點(diǎn)即可獲得起點(diǎn)到終點(diǎn)的相關(guān)信息。圖9 顯示了在所有路徑中第4 個(gè)節(jié)點(diǎn)和第11 個(gè)節(jié)點(diǎn)的位置,圖10 顯示了將4 號(hào)節(jié)點(diǎn)作為起點(diǎn)、11 號(hào)節(jié)點(diǎn)作為終點(diǎn)的管路經(jīng)過(guò)Dijkstra算法計(jì)算得到的最短路徑。
圖9 4 號(hào)點(diǎn)和11 號(hào)點(diǎn)在草圖中的位置Fig.9 Positions of Point 4 and Point 11 in sketch
圖10 Dijkstra 算法計(jì)算得到的4 號(hào)點(diǎn)到11 號(hào)點(diǎn)的路徑Fig.10 The path from Point 4 to Point 11 calculated by Dijkstra algorithm
本文已介紹了獲得到管路起點(diǎn)、終點(diǎn)、可經(jīng)過(guò)點(diǎn)的位置和方向,以及每條管路需要經(jīng)過(guò)的中間點(diǎn)。程序在此需要這些信息確定管路安裝的順序、排布方式、干涉檢查。此部分算法的策略為在安裝順序、排布方式確定過(guò)程中盡最大可能避免干涉,如果在干涉檢查時(shí)發(fā)現(xiàn)管路之間有干涉再進(jìn)行調(diào)整。
確定每根管道的安裝順序是整個(gè)管路排布中最重要的步驟之一。確定管路安裝順序的主要的:(1)如果不按照指定順序進(jìn)行管路排放,在管理排布時(shí)極易在管道轉(zhuǎn)彎、線路分支和合并處出現(xiàn)管路互相干涉現(xiàn)象;(2)防止出現(xiàn)安裝困難或者安裝不上的問題。在多管道且管道都比較長(zhǎng)的情況下,在計(jì)算出合適的排布方式后,很容易出現(xiàn)管道之間相互卡住的,導(dǎo)致安裝困難甚至完全不能安裝。
確定管道安裝順序的步驟如下:
第1 步:將所有管道按照最后一個(gè)經(jīng)過(guò)點(diǎn)的不同進(jìn)行分類,按照類別的不同安裝的不同排序。這樣做的原因是:任意空間中的多條線路,當(dāng)它們規(guī)劃路徑的要求一致并終點(diǎn)相同時(shí),路線的走向總是趨同的,即多條終點(diǎn)相同管路遇到一個(gè)分岔路口時(shí),它們所選擇的方向總是相同的。但由于每根管道的閥接口點(diǎn)(終點(diǎn))不同,所以不能按照閥接口點(diǎn)進(jìn)行分類,而要按照路徑在線架上的最后一個(gè)經(jīng)過(guò)點(diǎn)進(jìn)行分類。
第2 步:遍歷每個(gè)經(jīng)過(guò)點(diǎn),判斷在所有路徑中該點(diǎn)前一個(gè)點(diǎn)是不是有多個(gè),若有則稱此點(diǎn)為合并點(diǎn),將新管路成為合并管路。合并的情況又分為2種:一種是起點(diǎn)型的合并,即該經(jīng)過(guò)點(diǎn)是作為合并的新管路的線架上第一個(gè)經(jīng)過(guò)點(diǎn);另一種是中途型的合并,如圖8 所示。
第3 步:按照前2 步得到的信息,找出當(dāng)前情況下所有能進(jìn)行安裝的管道,管道需滿足如下條件:(1)管路的類別為所有尚未計(jì)算安裝的管路中類別的最小值;(2)管路中所有的合并點(diǎn)都沒有尚未安裝的但又不是合并管路的管路。
排布方式的確定概述如下:
首先按照管道的外徑和間距要求,將在管道路徑的經(jīng)過(guò)點(diǎn)處將管路的橫截面分為網(wǎng)格,如圖11所示。
圖11 管路橫截面網(wǎng)格化Fig.11 Meshing tubes cross section
此部分的貪心策略體現(xiàn)在管路在各個(gè)橫截面之間時(shí)是互不干涉的,因此一條管路在每個(gè)橫截面之間只能上下移動(dòng)(改變所在行),不能左右移動(dòng)(改變所在列),管路在到達(dá)第一個(gè)橫截面時(shí)其所在的列就是它在后面所有橫截面所在的列。列的確定只要按照某個(gè)順序(從左往右或從右往左)即可。
對(duì)于行的確定,在安裝順序確定中獲取管道的類別和每個(gè)經(jīng)過(guò)點(diǎn)橫截面所在處是不是合并點(diǎn)。先將橫截面按高度分為非合并管路層的和合并管路層的,合并管路層通過(guò)的管路是新合并進(jìn)來(lái)的管路,非合并管路層通過(guò)原來(lái)就在這條路線上的管路。在2 種分類中,管路的類別不同,管路的高度不同,每條新的管路的行都為其所在列上最小行。
干涉檢查采用圖的深度優(yōu)先搜索策略,其過(guò)程簡(jiǎn)要來(lái)說(shuō)是對(duì)每一個(gè)可能的分支路徑深入到不能再深入為止,而且每個(gè)節(jié)點(diǎn)只能訪問一次。在干涉檢查環(huán)節(jié)中節(jié)點(diǎn)存放的是線路2 個(gè)相鄰經(jīng)過(guò)點(diǎn)之間的連線的信息,具體實(shí)現(xiàn)為:從每條管路的第一個(gè)節(jié)點(diǎn)開始,遍歷每一個(gè)未被訪問的結(jié)點(diǎn),每遍歷到一個(gè)新的結(jié)點(diǎn),計(jì)算它與其他管路結(jié)點(diǎn)間距離的最小值,如果小于管路的外徑,則認(rèn)為發(fā)生干涉,處理的方法為將管路這兩個(gè)結(jié)點(diǎn)向上移動(dòng),移動(dòng)距離為管路的外徑(行+1),直到所有管路均不發(fā)生干涉為止。
為了讓工程師快速給出管路排布方案,用于自動(dòng)折彎?rùn)C(jī)的工藝環(huán)節(jié),需要基于 SolidWorks 實(shí)現(xiàn)精確化的三維管路模型繪制功能以提高效率。
在總裝配圖中繪制管道的步驟:(1)在總裝配體下選取一個(gè)平面作為3D 草圖的基準(zhǔn)平面;(2)在基準(zhǔn)平面上插入3D 草圖;(3)將上文獲取的管道路徑的結(jié)點(diǎn)連成直線,繪制草圖直線;(4)對(duì)草圖直線進(jìn)行掃描,設(shè)置參數(shù)。最終結(jié)果如圖12 所示。
圖12 管路排布結(jié)果Fig.12 The result of tube arrangement
針對(duì)實(shí)際注塑系統(tǒng)熱流道中大量的硬管設(shè)計(jì)和排布操作,使用三維軟件結(jié)合二次開發(fā)技術(shù)實(shí)現(xiàn)管道的計(jì)算機(jī)輔助設(shè)計(jì),設(shè)計(jì)導(dǎo)出三維的管道零件,從中獲取彎折點(diǎn)的信息和管道的長(zhǎng)度。
本研究存在的缺點(diǎn)和不足:(1)當(dāng)前在管路排布中,每2 個(gè)截面進(jìn)行分析,保證管路在二截面中的合理,但是從整個(gè)管道路徑角度來(lái)看,并不一定是最合理的排布;(2)對(duì)于實(shí)際環(huán)境中的復(fù)雜情況,例如管路中有障礙需要繞開、線架為上下多層的立體結(jié)構(gòu),在實(shí)際中需要進(jìn)行人工交互,不能實(shí)現(xiàn)自動(dòng)化設(shè)計(jì)。
從實(shí)際應(yīng)用和效果出發(fā),該程序已經(jīng)能適用于大部分的熱流道管路的智能快速設(shè)計(jì),大大提高加工效率,較少人工成本和出錯(cuò)概率。