劉麗莉,李麗芳,周燕芳
(上汽通用汽車有限公司,上海 201206)
確定沖壓零件的沖壓方向是沖壓工藝排布過(guò)程中的第一步,沖壓方向的選擇是否合理直接影響了工藝質(zhì)量的好壞,因此是非常重要的一個(gè)步驟。目前,沖壓件的沖壓方向一般是在Autoform里確定好后,再將沖壓坐標(biāo)系導(dǎo)出至NX中。沖壓坐標(biāo)系相對(duì)于絕對(duì)坐標(biāo)系的繞軸旋轉(zhuǎn)順序以及旋轉(zhuǎn)角度僅在Autoform軟件中記錄顯示,導(dǎo)出后在NX中并無(wú)信息記錄,信息的傳遞一般為人工記錄。另外,一旦在NX中發(fā)現(xiàn)需要重新調(diào)整沖壓方向時(shí),仍需回到Autoform中對(duì)零件進(jìn)行旋轉(zhuǎn)調(diào)整并再次導(dǎo)出至NX中,反復(fù)操作導(dǎo)致效率相對(duì)較低。
因此,非常有必要在NX中開發(fā)一款能自動(dòng)計(jì)算出指定沖壓坐標(biāo)系相對(duì)絕對(duì)坐標(biāo)系在某一特定旋轉(zhuǎn)順序下的旋轉(zhuǎn)角度值,并且可以支持直接在NX中繼續(xù)優(yōu)化調(diào)整沖壓方向的插件。本文基于C++對(duì)NX進(jìn)行二次開發(fā),利用Visual Studio編程工具,開發(fā)了一款能自動(dòng)計(jì)算指定坐標(biāo)系相對(duì)于絕對(duì)坐標(biāo)系在特定旋轉(zhuǎn)順序下的旋轉(zhuǎn)角度值,同時(shí)還在NX中建立交互界面,可以實(shí)現(xiàn)對(duì)沖壓坐標(biāo)系繞指定坐標(biāo)軸進(jìn)一步旋轉(zhuǎn)調(diào)整,建立新的沖壓坐標(biāo)系,并實(shí)時(shí)顯示調(diào)整之后的坐標(biāo)系的旋轉(zhuǎn)角度值,避免了用戶在兩款軟件之間來(lái)回切換操作,提高了用戶在NX內(nèi)處理沖壓方向的效率。
假定絕對(duì)坐標(biāo)系按照X軸旋轉(zhuǎn)α°,根據(jù)三角函數(shù)計(jì)算可得繞X軸旋轉(zhuǎn)的旋轉(zhuǎn)矩陣TX,同理得到繞Y軸旋轉(zhuǎn)β°,繞Z軸旋轉(zhuǎn)γ°的旋轉(zhuǎn)矩陣TY和TZ。
沖壓坐標(biāo)系的旋轉(zhuǎn)過(guò)程屬于圍繞當(dāng)下自身坐標(biāo)系某軸轉(zhuǎn)動(dòng),即每次旋轉(zhuǎn)都固定被圍繞的某一軸,另兩軸動(dòng)。同時(shí),由于旋轉(zhuǎn)順序不固定,可以隨意組合,例如可以先繞X軸,再繞Y軸,最后繞Z軸旋轉(zhuǎn),也可根據(jù)需要調(diào)整為先繞Y軸,再繞Z軸,最后繞X軸旋轉(zhuǎn)。根據(jù)歐拉旋轉(zhuǎn)公式,只需根據(jù)旋轉(zhuǎn)順序,將先旋轉(zhuǎn)的矩陣放前面,即可推算出在不同旋轉(zhuǎn)順序繞多個(gè)軸旋轉(zhuǎn)的旋轉(zhuǎn)矩陣。以旋轉(zhuǎn)順序?yàn)閄、Y、Z為例:
根據(jù)以上公式推斷,不難看出,若已知旋轉(zhuǎn)順序及旋轉(zhuǎn)角度,可以根據(jù)旋轉(zhuǎn)矩陣推算出旋轉(zhuǎn)后坐標(biāo)系的矩陣方程,通過(guò)NX二次開發(fā)過(guò)程中的坐標(biāo)系創(chuàng)建即可以得到我們所希望的坐標(biāo)系。這就為在NX二次開發(fā)中實(shí)現(xiàn)通過(guò)旋轉(zhuǎn)順序和旋轉(zhuǎn)角度的輸入更新沖壓坐標(biāo)系提供了依據(jù)。
同時(shí),若已知最終坐標(biāo)系的矩陣,根據(jù)不同的旋轉(zhuǎn)順序,亦可推算出每次旋轉(zhuǎn)的旋轉(zhuǎn)角度。還是以旋轉(zhuǎn)順序?yàn)閄、Y、Z為例,具體計(jì)算過(guò)程如下。
如 果β=90°,則α=0°,γ=atan2(r21,r22),如 果β=-90°,則α=0°,γ=-atan2(r21,r22)。
在NX二次開發(fā)過(guò)程中,通過(guò)NXopen數(shù)據(jù)庫(kù)的調(diào)用,求出當(dāng)前制件的工作坐標(biāo)系即沖壓坐標(biāo)系的矩陣,再根據(jù)上述公式,即可計(jì)算出當(dāng)前沖壓坐標(biāo)系相對(duì)于絕對(duì)坐標(biāo)系的旋轉(zhuǎn)角度值。
界面設(shè)計(jì)主要考慮界面簡(jiǎn)潔,操作簡(jiǎn)單,靈活方便等原則,UI界面如圖1所示。打開dll調(diào)用應(yīng)用程序后,會(huì)自動(dòng)計(jì)算出當(dāng)前工作坐標(biāo)系相對(duì)于絕對(duì)坐標(biāo)系按先X軸,再Y軸,再Z軸的旋轉(zhuǎn)順序的各自旋轉(zhuǎn)的角度,并在下側(cè)信息欄同步顯示。同時(shí)用戶也可以通過(guò)Tip Order指令選擇旋轉(zhuǎn)先后順序,系統(tǒng)會(huì)自動(dòng)計(jì)算出當(dāng)前順序下的各自旋轉(zhuǎn)角度,并在信息窗口欄處更新輸出。
圖1 程序UI界面設(shè)計(jì)
如果用戶對(duì)當(dāng)前的沖壓坐標(biāo)方向不滿意,仍可繼續(xù)調(diào)整當(dāng)前坐標(biāo)系??梢酝ㄟ^(guò)Tip Vector控件對(duì)其進(jìn)行修正,首先在Rotate By中選擇此次調(diào)整的角度值,然后在相應(yīng)的旋轉(zhuǎn)軸(X軸/Y軸/Z軸)處選擇所需調(diào)整的“+”或“-”按鈕作相應(yīng)的調(diào)整(“+”表示順時(shí)針旋轉(zhuǎn),“-”表示逆時(shí)針旋轉(zhuǎn)),并在信息欄中實(shí)時(shí)顯示當(dāng)前工作坐標(biāo)系相對(duì)于絕對(duì)坐標(biāo)系的旋轉(zhuǎn)角度。
本次二次開發(fā)為了盡可能減少用戶的選擇,打開該程序后,會(huì)自動(dòng)識(shí)別出當(dāng)前工作坐標(biāo)系,默認(rèn)旋轉(zhuǎn)順序?yàn)閄-Y-Z,通過(guò)2.3節(jié)中的角度計(jì)算關(guān)系通過(guò)當(dāng)前沖壓坐標(biāo)系矩陣計(jì)算出旋轉(zhuǎn)角度,并實(shí)時(shí)顯示在信息欄中,實(shí)現(xiàn)信息的自動(dòng)識(shí)別和顯示。
當(dāng)用戶選擇調(diào)整當(dāng)前坐標(biāo)系時(shí),程序讀取當(dāng)前工作坐標(biāo)系的旋轉(zhuǎn)順序以及旋轉(zhuǎn)角度,根據(jù)用戶選擇的調(diào)整角度,結(jié)合已有的旋轉(zhuǎn)角度值,計(jì)算出新的坐標(biāo)系的旋轉(zhuǎn)角度。根據(jù)2.2旋轉(zhuǎn)矩陣計(jì)算公式推算出坐標(biāo)系的新的矩陣值,并在NX中更新沖壓坐標(biāo)系,實(shí)現(xiàn)對(duì)零件沖壓方向的優(yōu)化調(diào)整。
程序核心算法流程圖如圖2所示。
圖2 程序核心算法流程
本案例是針對(duì)UI界面的NX二次開發(fā),首先在NX中設(shè)計(jì)出圖1所示的UI界面,在代碼生成模塊語(yǔ)言選擇C++,保存后生成dlx、hpp和cpp文件。
在Visual Studio中創(chuàng)建工程項(xiàng)目文件,選擇NXOpen C++Wizard模板,選擇相應(yīng)的設(shè)置后完成工程項(xiàng)目創(chuàng)建,并將之前生成的hpp和cpp復(fù)制到工程項(xiàng)目中,即可完成項(xiàng)目框架的搭建工作?;旧纤写a均使用C++程序語(yǔ)言編寫在hpp和cpp中,通過(guò)編譯和調(diào)試后生成后綴名為dll的文件,在NX中通過(guò)Ctrl+U命令調(diào)用dll文件即可實(shí)現(xiàn)二次開發(fā)的功能。NX二次開發(fā)需特別注意NX版本和Visual Studio版本的匹配。
C++相對(duì)于C的增強(qiáng),表現(xiàn)在兩個(gè)方面:①在原來(lái)基于過(guò)程的機(jī)制基礎(chǔ)上,對(duì)C語(yǔ)言做了不少的擴(kuò)充;②增加了面向?qū)ο蟮臋C(jī)制。面向?qū)ο蟪绦蛟O(shè)計(jì),是針對(duì)開發(fā)較大規(guī)模的程序而提出來(lái)的,目的是為了提高軟件開發(fā)的效率[1]。其最大特性是增加了面向?qū)ο蟪绦蛟O(shè)計(jì)的“類(class)”,通過(guò)設(shè)計(jì)類的成員及成員函數(shù),實(shí)現(xiàn)功能的封裝與調(diào)用,可以盡可能地提升程序的執(zhí)行效率。
本文整個(gè)程序的主要類及函數(shù)功能包括工作坐標(biāo)系角度計(jì)算、旋轉(zhuǎn)角度計(jì)算、根據(jù)角度設(shè)置坐標(biāo)系等等,部分代碼如下:
void Tip::Calculate_WCS_Angles()
{
tag_t wcs_id;
tag_t matrix_id_new;
double matrix_values[9];
UF_CSYS_ask_wcs(&wcs_id);
UF_CSYS_ask_matrix_of_object(wcs_id,&matrix_id_new);
UF_CSYS_ask_matrix_values(matrix_id_new,matrix_values);
double degree_x;
double degree_y;
double degree_z;
double degree_x_float;
double degree_y_float;
double degree_z_float;
degree_y = atan2(-matrix_values[2],sqrt(matrix_values[0]*matrix_values[0]+matrix_values[1]*matrix_values[1]));
if(degree_y!=PI/2||degree_y!=-PI/2)
{
degree_z = atan2(matrix_values[1]/cos(degree_y),matrix_values[0]/cos(degree_y));
degree_x = atan2(matrix_values[5]/cos(degree_y),matrix_values[8]/cos(degree_y));
}
else if(degree_y==PI/2)
{
degree_z=0;
degree_x=atan2(matrix_values[3],matrix_values[4]);
}
else if(degree_y==-PI/2)
{
degree_z=0;
degree_x=-atan2(matrix_values[3],matrix_values[4]);
}
degree_x_float=degree_x/PI*180;
degree_y_float=degree_y/PI*180;
degree_z_float=degree_z/PI*180;
double03->SetValue(degree_x_float);
double04->SetValue(degree_y_float);
double05->SetValue(degree_z_float);
}
void View_CSYS_set(int n,tag_t csys_tag)
{
tag_t object_id;
tag_t matrix_id_new;
double matrix_values[9];
UF_CSYS_ask_matrix_of_object(csys_tag,&matrix_id_new);
UF_CSYS_ask_matrix_values(matrix_id_new,matrix_values);
double axes[6];
if(n==1)
{
axes[0]=matrix_values[3];
axes[1]=matrix_values[4];
axes[2]=matrix_values[5];
axes[3]=matrix_values[6];
axes[4]=matrix_values[7];
axes[5]=matrix_values[8];
}
if(n==2)
{
axes[0]=matrix_values[0];
axes[1]=matrix_values[1];
axes[2]=matrix_values[2];
axes[3]=matrix_values[6];
axes[4]=matrix_values[7];
axes[5]=matrix_values[8];
}
if(n==3)
{
axes[0]=matrix_values[0];
axes[1]=matrix_values[1];
axes[2]=matrix_values[2];
axes[3]=matrix_values[3];
axes[4]=matrix_values[4];
axes[5]=matrix_values[5];
}
UF_VIEW_set_rotation(NULL_TAG,axes);
NXOpen::Session*theSession=NXOpen::Session::GetSession();
NXOpen::Part*workPart(theSession->Parts()->Work());
NXOpen::Part*displayPart(theSession->Parts()->Display());
workPart->ModelingViews()->WorkView()->Fit();
}
在NX中打開某車型翼子板的零件數(shù)模,調(diào)用此應(yīng)用程序,系統(tǒng)自動(dòng)計(jì)算出在默認(rèn)的先繞X軸、再Y軸、再Z軸的旋轉(zhuǎn)順序下的旋轉(zhuǎn)角度并顯示在信息區(qū)域,如圖3所示。當(dāng)用戶在Tip Order控件中選擇旋轉(zhuǎn)順序先Y軸、再Z軸、再X軸后,系統(tǒng)再次計(jì)算出新的旋轉(zhuǎn)順序下的旋轉(zhuǎn)角度并顯示在信息區(qū)域,如圖4所示。當(dāng)用戶使用Tip Vector控件對(duì)工作坐標(biāo)系進(jìn)行調(diào)整時(shí),調(diào)整后的繞各坐標(biāo)軸的旋轉(zhuǎn)角度會(huì)在信息區(qū)域?qū)崟r(shí)更新,同時(shí)程序也會(huì)自動(dòng)執(zhí)行將NX中的工作坐標(biāo)系調(diào)整至相應(yīng)位置的操作。最后,程序?qū)X界面的視圖調(diào)整至當(dāng)前工作坐標(biāo)系下主視圖。對(duì)比前后兩個(gè)工作坐標(biāo)系下的零件,可見(jiàn)零件的沖壓方向已發(fā)生變化,如圖5所示。
圖3 首次調(diào)用程序
圖4 調(diào)整旋轉(zhuǎn)順序后
圖5 調(diào)整旋轉(zhuǎn)角度前后對(duì)比
本文通過(guò)Visual Studio2019搭建了NX二次開發(fā)環(huán)境,基于C++開發(fā)了自動(dòng)識(shí)別當(dāng)前工作坐標(biāo)系相對(duì)于絕對(duì)坐標(biāo)系的旋轉(zhuǎn)角度,并通過(guò)UI界面的設(shè)計(jì),實(shí)現(xiàn)了在UI界面內(nèi)對(duì)當(dāng)前坐標(biāo)系進(jìn)行旋轉(zhuǎn)調(diào)整并能計(jì)算最新的旋轉(zhuǎn)角度,同時(shí)更新沖壓坐標(biāo)系,并且可以讓用戶自定義選擇旋轉(zhuǎn)順序,增加了該程序的使用柔性。通過(guò)此程序,在制件沖壓方向設(shè)定過(guò)程中可以減少?gòu)腘X到Autoform的轉(zhuǎn)換,同時(shí)若前后工序的沖壓方向存在偏差或希望繼續(xù)優(yōu)化沖壓方向,也可以在NX中進(jìn)行靈活的調(diào)整,大大提高了工作效率,拓展了NX應(yīng)用范圍。