殷健良,仲梁維
(200093 上海市 上海理工大學機械學院)
標準化、智能化、網絡化成為工業發達國家注塑模具制造業的基本特征。近些年我國注塑模具的制造水平得到了很大提高[1]。熱流道(Hot Runner Systems)是在注塑模具中使用的、將融化的塑料粒子注入模具型腔中的加熱組件系統。熱流道模具是將傳統式模具或三板式模具的澆道與流道經過加熱,于每一成形時不需要取出流道和澆道的一種嶄新構造[2]。對注塑制造行業而言,熱流道技術是行業發展中的一次重大技術革命,能夠節約資源、提升生產效率、提高產品質量以及延長模具使用年限,同時有很好的經濟效益[3]。
目前,一些生產商使用軟管作為熱流道系統的管道。軟管靈活性高、可伸展、可壓縮,可維護性好,但軟管存在比較致命的缺點——成本高,因此有些熱流道系統生產商使用硬管替代軟管以節約成本,同時還能提高熱流道系統的外觀和品質。
由于企業在熱流道系統管路設計過程中涉及大量管路建模和排布操作,尤其是建模,管路路數眾多,需要做分層排布等操作,實際過程中工程技術人員耗費大量時間反復修改以完善管路排布,但企業需要快速給出管路排布方案和全部精確的三維管路模型,用于自動折彎機的工藝環節。因此考慮借助 SolidWorks 開發一款能夠實現基于熱流道系統的基礎框架模型,自動排布熱流道管路以提高設計效率。雖然系統基于注塑行業熱流管管道系統開發,但其他需要進行路徑連接的系統,如液壓系統管道或電路的排布亦可參照本算法思路進行開發。
系統可實現3 個功能模塊:信息的提取與轉換,按距離最短確定路徑,進行管路排布和干涉處理。輸入為SolidWorks 熱流道注塑系統3D 圖,輸出為管道的SolidWorks 零件文件。軟件流程圖如圖1 所示。

圖1 軟件流程圖Fig.1 Software flow chart
借助vs2012 開發平臺使用vb.net 作為開發語言實現軟件算法編寫及功能開發,并基于SolidWorks 三維CAD 軟件以及其為用戶提供的API開發接口,實現管路的數據采集和排布的三維顯示。SolidWorks API 對象模型如圖2 所示,是一個自上而下的樹形結構。

圖2 SolidWorks API 對象模型Fig.2 SolidWorks API object model
SolidWorks 的二次開發主要分為2 種,一種是基于COM 開發,使用官方提供的Addin 模板生成的dll 插件;另一種是基于EXE 可執行文件[4]。前者會運行在SolidWorks 主進程之下,與SolidWorks內聚性較高,運行速度也會更快,用戶安裝和使用更加方便。后者運行在單獨的進程中,耦合性較高,運行速度慢,但可擴展性更強,所以一般在開發擴展性不強的產品軟件時,會優先使用第一種開發方式。軟件界面如圖3 所示,用戶輸入參數,點擊繪圖按鈕即可完成管道排布方式的計算和展示。

圖3 軟件界面Fig.3 Software interface
在計算管道路徑之前,必須對熱流道系統的三維坐標進行數據采集。需要采集的數據分別為管道的起點、終點和表示哪里可以經過管道的中間線。本文使用xml 配置文件結合SolidWorks 的API 接口(以下簡稱SWAPI)進行數據點的獲取。其中熱流道系統的三維模型是一個裝配體,由于裝配體中不能獲取零件的特征,所以要在特征中獲取點后按照草圖→零件圖→裝配體的順序向上進行坐標變換。
xml 是一種可擴展標記語言(Extensible Markup Language),常被用來傳輸和存儲數據[5]。本文使用xml 作為配置文件,使用DTD 文件對xml 文檔的書寫規則進行簡單約束。軟件使用xml 文檔傳輸、持久化SolidWorks 應用信息和采集的信息點的特征樹結構及特征名稱,如圖4 所示。

圖4 存儲SolidWorks 應用和特征信息的xml 文檔Fig.4 SolidWorks application and feature information in XML document
使用
通過程序解析XML 的方式通常有兩2 種:第一種為DOM 的方式,將標記語言文檔一次性加載進內存,在內存中形成一棵DOM 樹,其優點是操作方便,可以對文檔進行CRUD 的所有操作;另一種是SAX 的方式進行逐行讀取,基于事件驅動,優點是不占內存。由于本文的XML 大小較小,功能簡單,故采用比較方便的dom 讀取方式。vb.net開發語言System.XML 類庫下提供了十分方便的XML 解析類XMLDocument。
讀取XML 配置文件模塊在軟件業務邏輯開始時被執行,將解析后的結果進行一定的處理和封裝,比如字符串替換雙花括號中的變量,存儲到內存中。
SWAPI 獲取三維模型點的信息的模塊隨后被執行,該模塊需要通過SWAPI 接口找到XML 配置文件中所定義的各個裝配體、零件、特征,對應方式為字符串匹配名稱。其中,由總裝配體獲取到子裝配體所對應的SWAPI 接口中的方法為IAssemblyDoc.GetComponents();由裝配體獲取零件所使用的方法為IComponent2.GetChildren();由零件獲取特征時使用IComponent2.FirstFeature(),該方法返回一個指向第一個特征的引用,可以使用Feature.GetNextFeature()方法進行零件特征樹的遍歷,遍歷的方法參照圖的深度優先搜索,將圖4 中XML 文件中線架主體和接線板的裝配——零件——特征信息映射成圖的表示形式,如圖5 所示。

圖5 XML 文件中特征樹結構的圖的映射Fig.5 Using XML-Graph map to express feature tree structure
通過上文方法獲取了起點、終點、可經過點的信息,但通過該方法獲取的這些點的坐標的坐標系是其所在草圖的坐標系,而計算管路路徑、彎折點和三維導出是在裝配體中完成的,需要進行坐標的轉換統一成裝配體坐標系下。
使用SWAPI 實現坐標轉換,無論是從草圖到零件還是從零件到裝配體,都需要存放2 個不同坐標系之間的關系的MathTransform 對象,該對象通過草圖接口(ISketch)中的ModelToSketchTransform屬性可以獲得草圖到零件的MathTransform 對象,或者通過組件接口(IComponent)的Transform2 屬性可以獲得零件到裝配體的MathTransform 對象。另一個需要的對象是需要變換的點的對象,類型為MathPoint。將MathTransform 作為參數傳入
MathPoint MathPoint.MultiplyTransform(MathTransform mathTransform)方法,即可完成SolidWorks 中不同坐標系下的坐標轉換
SolidWorks 中的坐標變換是通過變換矩陣來完成的[6],矩陣如式(1)所示

式中:(Xa,Ya,Za)——原始坐標,對應的是MathPoint 對象;a-i——4 階變換矩陣,為旋轉矩陣;(j,k,l)——平移矢量;(n,o,p)——無實際意義。上面獲得的MathTransform 對象封裝了該變換矩陣表示的信息。最后返回的MathPoint 對象為(Xb,Yb,Zb)。
將零件中的點轉換到裝配體中的方法與草圖轉到零件中的方法類似,只不過MathTransform 對象是通過裝配體中零件的對象中的Transform2 屬性獲取的。提取的信息數據如圖6 所示,字段x,y,z 表示位置信息,direction 字段表示方向向量。

圖6 部分信息提取結果Fig.6 Partial Point Information
完成信息采集后,按照點的信息,需要確定每一條起點到終點的路徑,路徑的確定原則考慮到成本問題采用最短路徑原則,主要應用Dijkstra 算法。由于Dijkstra 算法生成最短路徑需要3 個必要參數:起點、終點以及由n 個結點組成的n 階鄰接矩陣,所以在使用圖的最短路徑算法之前,需要進行數據預處理以確定這3 個參數。
在生成路徑之前需要對點的信息進行預處理,生成Dijkstra 中需要的結點信息。當前不能直接生成結點的原因是從線架草圖提取的線都是不連續的,如圖7 所示,因此首先需要將不連續的線按照一定算法連接形成結點。

圖7 數據預處理前的草圖Fig.7 Sketch before data preprocessing
針對不同的情況形成結點的算法如下:比較所有線段與線段之間的距離關系,找出距離十分相近的2 條線段。這2 條線段有如下2 種情況:
(1)兩條線段延長線的交點在其中一條線段上,如圖7 中3 號和5 號線段。對于這種線段,首先確定交點在哪條線段上,3 號線段和5 號線段中,交點在5 號線段上,沿著3 號線段的方向新建線段連接3 號線段端點和兩線段交點,并將交點記為5號線段的打斷點。其中還有一種特殊情況:兩條線的交點為其中一條線段的端點,如圖7 中7 號和6號或8 號線段,與非特殊情況不同之處在于不用將交點記為打斷點;
(2)兩條線段的交點在兩條直線的延長線上,如圖7 中2 號和4 號線段。首先找到交點,連接交點與2 號線段,4 號線段距離較近的端點即可。
上述程序完成后將有打斷點的直線在打斷點進行打斷,并進行去重。通過SWAPI 中IModelDoc.SketchManager.CreateLine() 方法將處理后的結果可視化(軟件中沒有這一步,這里僅為方便展示),得到的結果如圖8 所示。

圖8 數據預處理后的草圖Fig.8 Sketch after data preprocessing
有了所有結點的連接信息之后,需要生成鄰接矩陣。先將n 個結點組成的n 階鄰接矩陣初始化,每個結點的值設置為10 000(替代正無窮,需要遠大于正常數值,但不能過大,否則進行計算時會超出int 的范圍),再雙重循環遍歷各個可以連接的結點,將結點之間的距離作為權重寫入鄰接矩陣。
Dijkstra 算法是從一個頂點到其余各頂點的最短路徑算法,解決的是有權圖中最短路徑問題,算法主要特點是以起始點為中心向外層層擴展,直到擴展到終點為止。迪杰斯特拉算法采用的是貪心算法的策略,貪心策略體現在每次都選擇一個距離源點最近的節點加入最短路徑節點集合,算法只支持非負權圖,時間復雜度為O(n2),比較適合作為熱流管系統求解最短路徑的算法[7]。
對于一條路徑,路徑中的每個結點將維護2 個數據結構:shortest 和visited,shortest 存儲起點到該節點的最短路徑。visited 存儲起點到該節點的最短路徑是否求出,用0 和1 表示,1 表示已經訪問過(求出)[8]。
Dijkstra 算法一次遍歷可以獲得從某一個起點到所有節點的最短路徑以及線路所經過的結點,在所有結點中找到終點對應的結點即可獲得起點到終點的相關信息。圖9 顯示了在所有路徑中第4 個節點和第11 個節點的位置,圖10 顯示了將4 號節點作為起點、11 號節點作為終點的管路經過Dijkstra算法計算得到的最短路徑。

圖9 4 號點和11 號點在草圖中的位置Fig.9 Positions of Point 4 and Point 11 in sketch

圖10 Dijkstra 算法計算得到的4 號點到11 號點的路徑Fig.10 The path from Point 4 to Point 11 calculated by Dijkstra algorithm
本文已介紹了獲得到管路起點、終點、可經過點的位置和方向,以及每條管路需要經過的中間點。程序在此需要這些信息確定管路安裝的順序、排布方式、干涉檢查。此部分算法的策略為在安裝順序、排布方式確定過程中盡最大可能避免干涉,如果在干涉檢查時發現管路之間有干涉再進行調整。
確定每根管道的安裝順序是整個管路排布中最重要的步驟之一。確定管路安裝順序的主要的:(1)如果不按照指定順序進行管路排放,在管理排布時極易在管道轉彎、線路分支和合并處出現管路互相干涉現象;(2)防止出現安裝困難或者安裝不上的問題。在多管道且管道都比較長的情況下,在計算出合適的排布方式后,很容易出現管道之間相互卡住的,導致安裝困難甚至完全不能安裝。
確定管道安裝順序的步驟如下:
第1 步:將所有管道按照最后一個經過點的不同進行分類,按照類別的不同安裝的不同排序。這樣做的原因是:任意空間中的多條線路,當它們規劃路徑的要求一致并終點相同時,路線的走向總是趨同的,即多條終點相同管路遇到一個分岔路口時,它們所選擇的方向總是相同的。但由于每根管道的閥接口點(終點)不同,所以不能按照閥接口點進行分類,而要按照路徑在線架上的最后一個經過點進行分類。
第2 步:遍歷每個經過點,判斷在所有路徑中該點前一個點是不是有多個,若有則稱此點為合并點,將新管路成為合并管路。合并的情況又分為2種:一種是起點型的合并,即該經過點是作為合并的新管路的線架上第一個經過點;另一種是中途型的合并,如圖8 所示。
第3 步:按照前2 步得到的信息,找出當前情況下所有能進行安裝的管道,管道需滿足如下條件:(1)管路的類別為所有尚未計算安裝的管路中類別的最小值;(2)管路中所有的合并點都沒有尚未安裝的但又不是合并管路的管路。
排布方式的確定概述如下:
首先按照管道的外徑和間距要求,將在管道路徑的經過點處將管路的橫截面分為網格,如圖11所示。

圖11 管路橫截面網格化Fig.11 Meshing tubes cross section
此部分的貪心策略體現在管路在各個橫截面之間時是互不干涉的,因此一條管路在每個橫截面之間只能上下移動(改變所在行),不能左右移動(改變所在列),管路在到達第一個橫截面時其所在的列就是它在后面所有橫截面所在的列。列的確定只要按照某個順序(從左往右或從右往左)即可。
對于行的確定,在安裝順序確定中獲取管道的類別和每個經過點橫截面所在處是不是合并點。先將橫截面按高度分為非合并管路層的和合并管路層的,合并管路層通過的管路是新合并進來的管路,非合并管路層通過原來就在這條路線上的管路。在2 種分類中,管路的類別不同,管路的高度不同,每條新的管路的行都為其所在列上最小行。
干涉檢查采用圖的深度優先搜索策略,其過程簡要來說是對每一個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。在干涉檢查環節中節點存放的是線路2 個相鄰經過點之間的連線的信息,具體實現為:從每條管路的第一個節點開始,遍歷每一個未被訪問的結點,每遍歷到一個新的結點,計算它與其他管路結點間距離的最小值,如果小于管路的外徑,則認為發生干涉,處理的方法為將管路這兩個結點向上移動,移動距離為管路的外徑(行+1),直到所有管路均不發生干涉為止。
為了讓工程師快速給出管路排布方案,用于自動折彎機的工藝環節,需要基于 SolidWorks 實現精確化的三維管路模型繪制功能以提高效率。
在總裝配圖中繪制管道的步驟:(1)在總裝配體下選取一個平面作為3D 草圖的基準平面;(2)在基準平面上插入3D 草圖;(3)將上文獲取的管道路徑的結點連成直線,繪制草圖直線;(4)對草圖直線進行掃描,設置參數。最終結果如圖12 所示。

圖12 管路排布結果Fig.12 The result of tube arrangement
針對實際注塑系統熱流道中大量的硬管設計和排布操作,使用三維軟件結合二次開發技術實現管道的計算機輔助設計,設計導出三維的管道零件,從中獲取彎折點的信息和管道的長度。
本研究存在的缺點和不足:(1)當前在管路排布中,每2 個截面進行分析,保證管路在二截面中的合理,但是從整個管道路徑角度來看,并不一定是最合理的排布;(2)對于實際環境中的復雜情況,例如管路中有障礙需要繞開、線架為上下多層的立體結構,在實際中需要進行人工交互,不能實現自動化設計。
從實際應用和效果出發,該程序已經能適用于大部分的熱流道管路的智能快速設計,大大提高加工效率,較少人工成本和出錯概率。