熊 毅,孫育竹,王 蕾
(1.河南工業(yè)職業(yè)技術學院,河南 南陽 473009;2.河南省材料成形裝備智能技術工程研究中心,河南 南陽 473009)
模具零件的坯料尺寸、體積及表面積等數(shù)據(jù)是制造中的重要信息[1,2]。在求取零件信息中,基于最小包圍盒坯料尺寸的快速、準確計算是關鍵。一般可利用CAD軟件中的計算功能人工獲取,隨著模具零件的種類和數(shù)量增多,工作量急劇增加,人工方法步驟多、效率低、易遺漏,制約了模具生產(chǎn)周期。
包圍盒在零件下料、物流包裝、圖像處理、模式識別、碰撞檢測、模具分型等方面都有廣泛應用[3-8]。CAD軟件自帶的計算工具依賴于零件在坐標系中的形態(tài),需要人工反復調(diào)整零件的空間位置,才能得到準確的結(jié)果,耗時費力?,F(xiàn)有的最小包圍盒算法主要有兩類:①基于點云或三角面片模型的包圍盒算法[9-14];②迭代旋轉(zhuǎn)算法:旋轉(zhuǎn)物體或坐標系,將其AABB(axis-aligned-bounding-box)包圍盒的最小值作為最小包圍盒[15,16]。雖然上述算法計算精確,但其復雜度高,一般在O(n3/2)~O(n3),計算時間通常在幾十秒到幾百秒不等,并且有些算法需要先對模型進行離散,工程應用困難。
現(xiàn)提出一種基于零件特征快速計算包圍盒的方法,在三維CAD軟件siemens NX中,基于NX Open二次開發(fā)接口,以C++編程實現(xiàn)零件包圍盒、體積、表面積等制造信息的批量自動計算并輸出到Excel表格。
總體框架如圖1所示,計算工具包括用戶界面、批量計算模塊、輸出模塊和顯示模塊。用戶界面主要接收用戶拾取部件、輸入的約束條件、Excel電子表格輸出路徑。批量計算模塊包括根據(jù)ID分組、求解包圍盒、計算零件屬性、格式化屬性信息。輸出模塊包括調(diào)用顯示模塊、將屬性信息逐條寫入Excel文件。顯示模塊主要負責在指定的屏幕位置顯示零件及包圍盒。

圖1 功能總體框架
界面設計包括菜單設計和對話框設計,在NX二次開發(fā)中,通過NX Open Menu Script制作菜單,一般用記事本編寫代碼,另存為*.men的腳本文件,將*.men文件放在二次開發(fā)的startup目錄。系統(tǒng)的菜單腳本代碼如下:

UI界面如圖2所示,對話框分3個部分,“選擇對象”用于用戶選擇待求解的批量組件,定義包圍盒放置點?!昂凶娱g距”用于設置包圍盒間距。“輸出盒子信息”主要用于指定Excel文件存放路徑,文件名為“box_info.xlsx”。

圖2 UI界面
完全相同的零件具有相同的幾何信息,只需計算其中一個即可,避免重復計算,浪費時間。NX中,零件的幾何模型稱為部件(或組件),其ID是其唯一識別號,將相同ID的零件分為一組,建立屬性數(shù)據(jù)結(jié)構(gòu):

每組零件用一個結(jié)構(gòu)體partBoxInfo數(shù)據(jù)記錄,成員變量包含零件及其包圍盒的信息,其中part-Number記錄零件數(shù)量。
零件分組的基本方法:將用戶拾取的部件ID收集到容器1,定義partBoxInfo類型的容器2;逐條讀取容器1中的ID,與容器2中的ID匹配,若匹配成功,容器2中相應數(shù)據(jù)項的零件數(shù)量加1;匹配失敗,新建一個partBoxInfo數(shù)據(jù),零件數(shù)量置為1。分組算法如下:
算法 按ID對零件進行分組。
輸入 組件ID容器1。
輸出 分組后的partBoxInfo容器2。
(1)容器1為空或達到容器尾部,跳轉(zhuǎn)到(8)。
(2)讀取容器1的一個ID。
(3)遍歷容器2,找到與(1)中容器1的ID相等的數(shù)據(jù),數(shù)據(jù)中的partNumber加1,返回到(1)。
(4)新建一個partBoxInfo數(shù)據(jù),將partNumber置為1。
(5)計算該零件的包圍盒信息、零件體積和表面積。
(6)將該零件的信息賦值給(4)中數(shù)據(jù),part-Number加1。
(7)將該partBoxInfo數(shù)據(jù)存入容器2,迭代器加1,返回到(1)。
(8)結(jié)束。
某批模具零件分組前后的ID序列如表1所示,分組前,零件ID排列與用戶拾取順序一致,序列無規(guī)律,分組后,相同ID的零件被分為一組,零件數(shù)量更新。

表1 某批模具零件分組前后的ID序列
模具零件一般需要在銑床上加工,這類零件至少有一個基準平面和一條直線邊。根據(jù)這些特征,構(gòu)造快速計算包圍盒的算法,該算法依據(jù)零件的平直面、直線邊特征確定3個主方向,并以此構(gòu)建空間直角坐標系;在新建坐標系下調(diào)用AABB算法,快速計算近似最小包圍盒,算法的時間復雜度為O(n),計算時間通常在0.1 s以內(nèi)。算法如下:
算法 物體最小包圍盒計算。
輸入 部件ID。
輸出 包圍盒參數(shù)。
(1)打開部件,記錄工作坐標系。
(2)遍歷部件的體,記錄最長直邊ID、存儲平直面ID到鏈表。
(3)以最長直邊構(gòu)造Z軸矢量。
(4)在鏈表中查找Z軸的垂直面,若找到,轉(zhuǎn)到(5),否則轉(zhuǎn)到(6)。
(5)遍歷面的最長邊,以此構(gòu)造Y軸矢量,轉(zhuǎn)到(7)。
(6)以Z軸對應邊的相鄰平面法向為Y軸矢量。
(7)創(chuàng)建坐標矩陣和坐標系。
(8)以新建坐標系調(diào)用AABB函數(shù),得到包圍盒尺寸及位置參數(shù)。
(9)結(jié)束。
圖3所示為幾種模具零件的包圍盒計算結(jié)果,求解時間在0.02~0.06 s,效率高,包圍盒的致密度好,精度滿足實際的工程需求。
NX二次開發(fā)中提供了3種計算體積和表面積的方式:①調(diào)用UF_MODL_ask_mass_props_3d函數(shù),優(yōu)點是通用性好,編程容易,缺點是計算效率低,且計算前需要從體中抽取面;②利用UFUN調(diào)KF(知識熔接)中的函數(shù),計算速度比①快,但KF中的函數(shù)格式復雜,編程困難;③利用NX Open C++中的MeasureManager測量類處理,其效率最高,代碼簡單,可以通過NX日志的代碼錄制功能實現(xiàn)。
現(xiàn)采用方式③,通過NX中[分析]/[測量體]功能查詢零件的屬性,錄制過程代碼,并在Visual Studio中將代碼改成通用格式,修改后的關鍵代碼如下:


一些大型的應用軟件有讀寫Excel表格的接口,針對Excel的數(shù)據(jù)讀寫也有一些具體方法[17,18]。NX可以調(diào)用KF中的函數(shù)讀寫Excel文件,KF是內(nèi)嵌于NX的知識工程應用技術,用“規(guī)則”(Rule)表示零件的幾何參數(shù)和工程屬性之間的相互關系。用戶可使用KF語言建立自己的規(guī)則,并利用規(guī)則添加知識數(shù)據(jù)。
零件信息輸出到Excel的基本過程:在本地新建電子表格模板文件,通過NX Open的文件處理函數(shù)將模板文件另存到用戶指定目錄,讀取零件信息結(jié)構(gòu)體中的數(shù)據(jù),通過KF語言創(chuàng)建規(guī)則將這些數(shù)據(jù)寫入表格中的指定區(qū)域,算法如下:
算法 NX信息寫入Excel。
輸入 存儲部件信息的容器。
輸出 Excel電子表格數(shù)據(jù)。
(1)復制本地模板文件到UI指定的路徑。
(2)打開電子表格文件。
(3)初始化容器迭代器。

圖3 幾種模具零件的包圍盒計算結(jié)果
(4)從容器中讀取一條信息并格式化為KF函數(shù)所需格式。
(5)調(diào)用KF寫Excel函數(shù),在表格的指定區(qū)域?qū)懭敫袷交畔ⅰ?/p>
(6)強制需求,更新模型,刪除屬性。
(7)若迭代器未達到容器末尾,迭代器加1,轉(zhuǎn)到(4)。
(8)更新模型,關閉電子表格,刪除屬性。
(9)結(jié)束。
利用UF_KF_create_rule_no_update函數(shù)創(chuàng)建規(guī)則,分別實現(xiàn)對電子表格的打開、數(shù)據(jù)寫入及關閉電子表格。其中,寫入的信息需要格式化,存放在字符組數(shù)write_buf中,寫入的具體規(guī)則如下:

以某大型注射模中的斜推組件為例,如圖4所示,測試自動工具的計算效果。在NX 10.0中啟動系統(tǒng)菜單,設置零件間距、零件組間距及Excel輸出目錄。批量選擇斜推組件,該批零件共12種,91個零件,形態(tài)各異,計算總時間為3.776 s。圖5所示為計算結(jié)果,零件被分為12個組,如圖5(a)所示;系統(tǒng)自動建立裝配目錄H289-BOX,零件按組被裝配12個目錄,如圖5(b)所示。表2所示為輸出的電子表格數(shù)據(jù),表格中的A列數(shù)據(jù)是根據(jù)分組數(shù)動態(tài)編號自動生成,B~K列是零件屬性信息格式化后的輸出結(jié)果,L、M列是利用Excel自帶公式計算所得的派生數(shù)據(jù),避免了在NX中編寫代碼,節(jié)省時間。

圖4 某模具的斜推組件
表3所示為圖4案例采用人工和自動計算耗時比較。手工計算時,坐標調(diào)整耗時最多,平均為30 s,調(diào)整時根據(jù)零件的形狀特征將其擺正,使零件最長方向與Z軸平行,第二長邊的方向與Y軸平行。其次是查詢零件表面積和體積的時間,平均為3 s,主要消耗在調(diào)用查詢命令窗口、拾取幾何對象。手工計算后的數(shù)據(jù)還需用戶記錄,而自動計算時,用戶一次拾取所有零件,計算工具自動調(diào)整零件姿態(tài)、計算零件信息,最后自動輸出到Excel表格,提高計算效率和數(shù)據(jù)準確性。自動計算時間不到手工計算的1%,且計算規(guī)模越大,自動計算的效率優(yōu)勢越明顯。

表2 批量信息輸出到Excel

圖5 自動計算結(jié)果

表3 不同方式計算圖4案例信息的時間 s
通過實例驗證,批量求解工具能在數(shù)秒內(nèi)實現(xiàn)大批量模具零件的快速分組、零件信息輸出到Excel表格,計算規(guī)模越大,自動計算的效率越高。
(1)通過分組算法,以零件ID作為匹配項,對同種零件進行了快速數(shù)量統(tǒng)計和分組,避免了零件信息的重復計算。
(2)以零件的幾何特征快速構(gòu)造主方向,在以主方向建立的坐標系下調(diào)用AABB包圍盒算法,計算時間控制在0.1 s內(nèi),算法的復雜程度降低到O(n),結(jié)果準確。
(3)利用NX中NX Open C++中的MeasureManager類和日志功能,實現(xiàn)了復雜零件體積和表面積的快速自動計算。
(4)利用NX中的KF函數(shù),完成了零件的ID、數(shù)量、體積、表面積及包圍盒等數(shù)據(jù)關聯(lián)輸出到Excel表格,實現(xiàn)了零件信息的批量輸出。