熊 毅,孫育竹,王 蕾
(1.河南工業(yè)職業(yè)技術(shù)學(xué)院,河南 南陽(yáng) 473009;2.河南省材料成形裝備智能技術(shù)工程研究中心,河南 南陽(yáng) 473009)
模具零件的坯料尺寸、體積及表面積等數(shù)據(jù)是制造中的重要信息[1,2]。在求取零件信息中,基于最小包圍盒坯料尺寸的快速、準(zhǔn)確計(jì)算是關(guān)鍵。一般可利用CAD軟件中的計(jì)算功能人工獲取,隨著模具零件的種類(lèi)和數(shù)量增多,工作量急劇增加,人工方法步驟多、效率低、易遺漏,制約了模具生產(chǎn)周期。
包圍盒在零件下料、物流包裝、圖像處理、模式識(shí)別、碰撞檢測(cè)、模具分型等方面都有廣泛應(yīng)用[3-8]。CAD軟件自帶的計(jì)算工具依賴(lài)于零件在坐標(biāo)系中的形態(tài),需要人工反復(fù)調(diào)整零件的空間位置,才能得到準(zhǔn)確的結(jié)果,耗時(shí)費(fèi)力?,F(xiàn)有的最小包圍盒算法主要有兩類(lèi):①基于點(diǎn)云或三角面片模型的包圍盒算法[9-14];②迭代旋轉(zhuǎn)算法:旋轉(zhuǎn)物體或坐標(biāo)系,將其AABB(axis-aligned-bounding-box)包圍盒的最小值作為最小包圍盒[15,16]。雖然上述算法計(jì)算精確,但其復(fù)雜度高,一般在O(n3/2)~O(n3),計(jì)算時(shí)間通常在幾十秒到幾百秒不等,并且有些算法需要先對(duì)模型進(jìn)行離散,工程應(yīng)用困難。
現(xiàn)提出一種基于零件特征快速計(jì)算包圍盒的方法,在三維CAD軟件siemens NX中,基于NX Open二次開(kāi)發(fā)接口,以C++編程實(shí)現(xiàn)零件包圍盒、體積、表面積等制造信息的批量自動(dòng)計(jì)算并輸出到Excel表格。
總體框架如圖1所示,計(jì)算工具包括用戶(hù)界面、批量計(jì)算模塊、輸出模塊和顯示模塊。用戶(hù)界面主要接收用戶(hù)拾取部件、輸入的約束條件、Excel電子表格輸出路徑。批量計(jì)算模塊包括根據(jù)ID分組、求解包圍盒、計(jì)算零件屬性、格式化屬性信息。輸出模塊包括調(diào)用顯示模塊、將屬性信息逐條寫(xiě)入Excel文件。顯示模塊主要負(fù)責(zé)在指定的屏幕位置顯示零件及包圍盒。
圖1 功能總體框架
界面設(shè)計(jì)包括菜單設(shè)計(jì)和對(duì)話框設(shè)計(jì),在NX二次開(kāi)發(fā)中,通過(guò)NX Open Menu Script制作菜單,一般用記事本編寫(xiě)代碼,另存為*.men的腳本文件,將*.men文件放在二次開(kāi)發(fā)的startup目錄。系統(tǒng)的菜單腳本代碼如下:
UI界面如圖2所示,對(duì)話框分3個(gè)部分,“選擇對(duì)象”用于用戶(hù)選擇待求解的批量組件,定義包圍盒放置點(diǎn)。“盒子間距”用于設(shè)置包圍盒間距?!拜敵龊凶有畔ⅰ敝饕糜谥付‥xcel文件存放路徑,文件名為“box_info.xlsx”。
圖2 UI界面
完全相同的零件具有相同的幾何信息,只需計(jì)算其中一個(gè)即可,避免重復(fù)計(jì)算,浪費(fèi)時(shí)間。NX中,零件的幾何模型稱(chēng)為部件(或組件),其ID是其唯一識(shí)別號(hào),將相同ID的零件分為一組,建立屬性數(shù)據(jù)結(jié)構(gòu):
每組零件用一個(gè)結(jié)構(gòu)體partBoxInfo數(shù)據(jù)記錄,成員變量包含零件及其包圍盒的信息,其中part-Number記錄零件數(shù)量。
零件分組的基本方法:將用戶(hù)拾取的部件ID收集到容器1,定義partBoxInfo類(lèi)型的容器2;逐條讀取容器1中的ID,與容器2中的ID匹配,若匹配成功,容器2中相應(yīng)數(shù)據(jù)項(xiàng)的零件數(shù)量加1;匹配失敗,新建一個(gè)partBoxInfo數(shù)據(jù),零件數(shù)量置為1。分組算法如下:
算法 按ID對(duì)零件進(jìn)行分組。
輸入 組件ID容器1。
輸出 分組后的partBoxInfo容器2。
(1)容器1為空或達(dá)到容器尾部,跳轉(zhuǎn)到(8)。
(2)讀取容器1的一個(gè)ID。
(3)遍歷容器2,找到與(1)中容器1的ID相等的數(shù)據(jù),數(shù)據(jù)中的partNumber加1,返回到(1)。
(4)新建一個(gè)partBoxInfo數(shù)據(jù),將partNumber置為1。
(5)計(jì)算該零件的包圍盒信息、零件體積和表面積。
(6)將該零件的信息賦值給(4)中數(shù)據(jù),part-Number加1。
(7)將該partBoxInfo數(shù)據(jù)存入容器2,迭代器加1,返回到(1)。
(8)結(jié)束。
某批模具零件分組前后的ID序列如表1所示,分組前,零件ID排列與用戶(hù)拾取順序一致,序列無(wú)規(guī)律,分組后,相同ID的零件被分為一組,零件數(shù)量更新。
表1 某批模具零件分組前后的ID序列
模具零件一般需要在銑床上加工,這類(lèi)零件至少有一個(gè)基準(zhǔn)平面和一條直線邊。根據(jù)這些特征,構(gòu)造快速計(jì)算包圍盒的算法,該算法依據(jù)零件的平直面、直線邊特征確定3個(gè)主方向,并以此構(gòu)建空間直角坐標(biāo)系;在新建坐標(biāo)系下調(diào)用AABB算法,快速計(jì)算近似最小包圍盒,算法的時(shí)間復(fù)雜度為O(n),計(jì)算時(shí)間通常在0.1 s以?xún)?nèi)。算法如下:
算法 物體最小包圍盒計(jì)算。
輸入 部件ID。
輸出 包圍盒參數(shù)。
(1)打開(kāi)部件,記錄工作坐標(biāo)系。
(2)遍歷部件的體,記錄最長(zhǎng)直邊ID、存儲(chǔ)平直面ID到鏈表。
(3)以最長(zhǎng)直邊構(gòu)造Z軸矢量。
(4)在鏈表中查找Z軸的垂直面,若找到,轉(zhuǎn)到(5),否則轉(zhuǎn)到(6)。
(5)遍歷面的最長(zhǎng)邊,以此構(gòu)造Y軸矢量,轉(zhuǎn)到(7)。
(6)以Z軸對(duì)應(yīng)邊的相鄰平面法向?yàn)閅軸矢量。
(7)創(chuàng)建坐標(biāo)矩陣和坐標(biāo)系。
(8)以新建坐標(biāo)系調(diào)用AABB函數(shù),得到包圍盒尺寸及位置參數(shù)。
(9)結(jié)束。
圖3所示為幾種模具零件的包圍盒計(jì)算結(jié)果,求解時(shí)間在0.02~0.06 s,效率高,包圍盒的致密度好,精度滿(mǎn)足實(shí)際的工程需求。
NX二次開(kāi)發(fā)中提供了3種計(jì)算體積和表面積的方式:①調(diào)用UF_MODL_ask_mass_props_3d函數(shù),優(yōu)點(diǎn)是通用性好,編程容易,缺點(diǎn)是計(jì)算效率低,且計(jì)算前需要從體中抽取面;②利用UFUN調(diào)KF(知識(shí)熔接)中的函數(shù),計(jì)算速度比①快,但KF中的函數(shù)格式復(fù)雜,編程困難;③利用NX Open C++中的MeasureManager測(cè)量類(lèi)處理,其效率最高,代碼簡(jiǎn)單,可以通過(guò)NX日志的代碼錄制功能實(shí)現(xiàn)。
現(xiàn)采用方式③,通過(guò)NX中[分析]/[測(cè)量體]功能查詢(xún)零件的屬性,錄制過(guò)程代碼,并在Visual Studio中將代碼改成通用格式,修改后的關(guān)鍵代碼如下:
一些大型的應(yīng)用軟件有讀寫(xiě)Excel表格的接口,針對(duì)Excel的數(shù)據(jù)讀寫(xiě)也有一些具體方法[17,18]。NX可以調(diào)用KF中的函數(shù)讀寫(xiě)Excel文件,KF是內(nèi)嵌于NX的知識(shí)工程應(yīng)用技術(shù),用“規(guī)則”(Rule)表示零件的幾何參數(shù)和工程屬性之間的相互關(guān)系。用戶(hù)可使用KF語(yǔ)言建立自己的規(guī)則,并利用規(guī)則添加知識(shí)數(shù)據(jù)。
零件信息輸出到Excel的基本過(guò)程:在本地新建電子表格模板文件,通過(guò)NX Open的文件處理函數(shù)將模板文件另存到用戶(hù)指定目錄,讀取零件信息結(jié)構(gòu)體中的數(shù)據(jù),通過(guò)KF語(yǔ)言創(chuàng)建規(guī)則將這些數(shù)據(jù)寫(xiě)入表格中的指定區(qū)域,算法如下:
算法 NX信息寫(xiě)入Excel。
輸入 存儲(chǔ)部件信息的容器。
輸出 Excel電子表格數(shù)據(jù)。
(1)復(fù)制本地模板文件到UI指定的路徑。
(2)打開(kāi)電子表格文件。
(3)初始化容器迭代器。
圖3 幾種模具零件的包圍盒計(jì)算結(jié)果
(4)從容器中讀取一條信息并格式化為KF函數(shù)所需格式。
(5)調(diào)用KF寫(xiě)Excel函數(shù),在表格的指定區(qū)域?qū)懭敫袷交畔ⅰ?/p>
(6)強(qiáng)制需求,更新模型,刪除屬性。
(7)若迭代器未達(dá)到容器末尾,迭代器加1,轉(zhuǎn)到(4)。
(8)更新模型,關(guān)閉電子表格,刪除屬性。
(9)結(jié)束。
利用UF_KF_create_rule_no_update函數(shù)創(chuàng)建規(guī)則,分別實(shí)現(xiàn)對(duì)電子表格的打開(kāi)、數(shù)據(jù)寫(xiě)入及關(guān)閉電子表格。其中,寫(xiě)入的信息需要格式化,存放在字符組數(shù)write_buf中,寫(xiě)入的具體規(guī)則如下:
以某大型注射模中的斜推組件為例,如圖4所示,測(cè)試自動(dòng)工具的計(jì)算效果。在NX 10.0中啟動(dòng)系統(tǒng)菜單,設(shè)置零件間距、零件組間距及Excel輸出目錄。批量選擇斜推組件,該批零件共12種,91個(gè)零件,形態(tài)各異,計(jì)算總時(shí)間為3.776 s。圖5所示為計(jì)算結(jié)果,零件被分為12個(gè)組,如圖5(a)所示;系統(tǒng)自動(dòng)建立裝配目錄H289-BOX,零件按組被裝配12個(gè)目錄,如圖5(b)所示。表2所示為輸出的電子表格數(shù)據(jù),表格中的A列數(shù)據(jù)是根據(jù)分組數(shù)動(dòng)態(tài)編號(hào)自動(dòng)生成,B~K列是零件屬性信息格式化后的輸出結(jié)果,L、M列是利用Excel自帶公式計(jì)算所得的派生數(shù)據(jù),避免了在NX中編寫(xiě)代碼,節(jié)省時(shí)間。
圖4 某模具的斜推組件
表3所示為圖4案例采用人工和自動(dòng)計(jì)算耗時(shí)比較。手工計(jì)算時(shí),坐標(biāo)調(diào)整耗時(shí)最多,平均為30 s,調(diào)整時(shí)根據(jù)零件的形狀特征將其擺正,使零件最長(zhǎng)方向與Z軸平行,第二長(zhǎng)邊的方向與Y軸平行。其次是查詢(xún)零件表面積和體積的時(shí)間,平均為3 s,主要消耗在調(diào)用查詢(xún)命令窗口、拾取幾何對(duì)象。手工計(jì)算后的數(shù)據(jù)還需用戶(hù)記錄,而自動(dòng)計(jì)算時(shí),用戶(hù)一次拾取所有零件,計(jì)算工具自動(dòng)調(diào)整零件姿態(tài)、計(jì)算零件信息,最后自動(dòng)輸出到Excel表格,提高計(jì)算效率和數(shù)據(jù)準(zhǔn)確性。自動(dòng)計(jì)算時(shí)間不到手工計(jì)算的1%,且計(jì)算規(guī)模越大,自動(dòng)計(jì)算的效率優(yōu)勢(shì)越明顯。
表2 批量信息輸出到Excel
圖5 自動(dòng)計(jì)算結(jié)果
表3 不同方式計(jì)算圖4案例信息的時(shí)間 s
通過(guò)實(shí)例驗(yàn)證,批量求解工具能在數(shù)秒內(nèi)實(shí)現(xiàn)大批量模具零件的快速分組、零件信息輸出到Excel表格,計(jì)算規(guī)模越大,自動(dòng)計(jì)算的效率越高。
(1)通過(guò)分組算法,以零件ID作為匹配項(xiàng),對(duì)同種零件進(jìn)行了快速數(shù)量統(tǒng)計(jì)和分組,避免了零件信息的重復(fù)計(jì)算。
(2)以零件的幾何特征快速構(gòu)造主方向,在以主方向建立的坐標(biāo)系下調(diào)用AABB包圍盒算法,計(jì)算時(shí)間控制在0.1 s內(nèi),算法的復(fù)雜程度降低到O(n),結(jié)果準(zhǔn)確。
(3)利用NX中NX Open C++中的MeasureManager類(lèi)和日志功能,實(shí)現(xiàn)了復(fù)雜零件體積和表面積的快速自動(dòng)計(jì)算。
(4)利用NX中的KF函數(shù),完成了零件的ID、數(shù)量、體積、表面積及包圍盒等數(shù)據(jù)關(guān)聯(lián)輸出到Excel表格,實(shí)現(xiàn)了零件信息的批量輸出。