陳旭東++劉伯穎
在數(shù)控機床的操作過程中,編程工作是枯燥而乏味的,指令測試往往伴隨著工件的浪費。以 Visual C++為開發(fā)工具,使用 ObjectARX開發(fā)接口,可直接讀出 AutoCAD數(shù)據(jù)庫中的設計圖形數(shù)據(jù)。由設計圖形數(shù)據(jù)出發(fā),實現(xiàn)數(shù)控機床指令的自動編碼與仿真,將大大提高工作的效率和準確性。本文提出的算法用可以將復雜的圖形數(shù)據(jù)拆分為簡單圖形序列,從而提高自動編碼系統(tǒng)的準確性,使系統(tǒng)自動編制出的數(shù)控機床機器指令達到最優(yōu)。
一、引言
沖裁成型技術是工業(yè)中應用廣泛的板材加工技術,一般是使用數(shù)控機床進行加工,數(shù)控機床使用特定的語句指令進行編程。這種編程一般使用數(shù)控系統(tǒng)高級語言FAGOR,通常稱為G代碼,如:G00 G90 X400 Y300,表示快速定位,G90表示絕對坐標。數(shù)控機床工作的過程就是執(zhí)行 G代碼的過程。使用 G代碼不僅要控制加工位置,還要控制模具的切換,代碼量較大。例如沖壓 100個間隔相等的孔,通常需要編制至少200條指令。編寫G代碼的過程往往是繁瑣枯燥的,正確性難以保證,進行指令的測試往往伴隨著原材料的浪費。使用計算機輔助設計系統(tǒng)可以實現(xiàn)數(shù)控機床所需 G代碼的自動化編程。
AutoCAD是美國 Autodesk公司推出的計算機輔助設計軟件,廣泛用于二維繪圖、設計文檔和基本的三維設計。其開放的體系結構,允許用戶進行二次開發(fā),根據(jù)自己的需要擴充新的功能。ObjectARX(Object AutoCAD Runtime eXtension)是 AutoCAD系統(tǒng)配套的面向對象的 C++應用程序開發(fā)接口,使用 ObjectARX可以在運行狀態(tài)下直接訪問 AutoCAD的內部數(shù)據(jù)庫,圖形系統(tǒng)及幾何造型核心。使用 VC++開發(fā)基于 ObjectARX的應用,還可充分利用Windows系統(tǒng)資源,包括MFC基本類庫和Visual C++開發(fā)環(huán)境??梢栽谶\行時從 AutoCAD中讀取設計圖形數(shù)據(jù)。通過分析這些圖形數(shù)據(jù),可以實現(xiàn)沖床指令的自動編程與仿真,從而可以大大提高工作效率,降低甚至杜絕板材的測試浪費,提高經濟效益。
二、問題的提出
數(shù)控機床對于簡單的圖形,如三角形、矩形、圓形及長圓孔等(以下稱為基本圖形),都有成熟的加工指令或指令序列。而工業(yè)中需要加工的形狀要復雜得多,包括凸多邊形,凹多邊形,甚至可能包括曲線邊在內(以下稱之為復雜圖形),如圖 1所示為典型的復雜圖形示意圖。這些圖形在機床上無法簡單的加工出來,需要編寫機床控制程序。如果能將這些圖形做一定的拆分,將其分解為多個矩形,就可以使用矩形的加工指令組成復雜多邊形的加工指令。
通過 ObjectARX接口,可以讀出 AutoCAD中的設計圖形數(shù)據(jù),并進行分析處理。本文提出的拆分算法的目的就是將各種各樣的復雜形狀拆分為較簡單的基本圖形,即把復雜圖形看成是由基本圖形拼成的,為復雜圖形找到一組合理的基本圖形序列,從而可以使用基本圖形的加工指令進行復雜圖形的加工。
三、復雜圖形拆分算法描述
圖形拆分算法的程序流程如圖2所示。簡要敘述如下。
(1)讀取 AutoCAD中的設計圖形數(shù)據(jù),數(shù)據(jù)的順序和設計圖繪制過程有關,在數(shù)據(jù)排序鏈接模塊中,需要對讀出的數(shù)據(jù)進行預處理,按順序依次排列組成封閉圖形。因為工件上一般需要加工多處孔,所以此處得到的是一個封閉圖形的序列。
(2)對序列中的圖形依次進行處理,每次取出一個封閉圖形。檢測圖形數(shù)據(jù)的轉向,確保封閉圖形數(shù)據(jù)按逆時針轉向排列。否則對圖形數(shù)據(jù)進行翻轉處理。
(3)在圖形數(shù)據(jù)逆時針轉向的基礎上,可以確定各頂點的內角。對凹多邊形來講,內角值有可能會大于 180°,確定圖形內角對圖形拆分模塊有重要意義。
(4)圖形拆分模塊。這一部分將綜合使用圖形數(shù)據(jù)的各種信息進行圖形的拆分,拆分的結果是形成一個基本圖形的序列。
(5)最后輸出拆分后的基本幾何圖形序列。
四、算法的實現(xiàn)
下面以L形圖形的拆分為例,介紹復雜圖形拆分的執(zhí)行過程。本文的介紹是針對由直線段組成的多邊形,在實際的應用中,可以根據(jù)具體的需要對算法進行擴展。
1.圖形邊框的數(shù)據(jù)定義
通過 ObjectARX接口,從 AutoCAD中讀出數(shù)據(jù)后,將邊框用以下數(shù)據(jù)結構來表示: b(x1,y1,x2,y2,angle)
式中, x1,y1表示邊 b的起點坐標; x2,y2表示邊 b的終點坐標;angle表示其與下一條邊的內夾角。
設 L形的坐標數(shù)據(jù)如圖 3所示。
以圖 1中L形的分析為例,假設坐標如圖 3所示,邊框依次定義為 b1、b2、b3、b4、b5和 b6,數(shù)據(jù)自 AutoCAD中讀出后,按點坐標檢測數(shù)據(jù)是否組成封閉圖形。經過處理后,邊框數(shù)據(jù)表示如下:
2.封閉圖形轉向檢測
由于在進行圖形數(shù)據(jù)封閉連接的運算中,無法確定圖形數(shù)據(jù)的順序是按逆時針排序,還是順時針排序。進行數(shù)據(jù)轉向檢測可以使用向量法,選取任一頂點,計算其指向其他各頂點的向量,如圖 4所示。
計算各向量的向量角——即各向量與x軸的夾角。角度取值范圍為 0~360°。向量角計算如下: v1:(370-120)+i(100-100)=250 向量角:arctan(0/250)=0° v2:(370-120)+i(300-100)=250+i200 向量角:arctan(200/250)]=38.70° v3:(270-120)+i(300-100)=150+i200 向量角:arctan(200/150)=53.1° v4:(270-120)+i(200-100)=150+i100 向量角:arctan(100/150)=33.69° v5:(120-120)+i(200-100)=i100 向量角:90°
由此可見,向量角從 0°增大到 90°,則可以確定封閉圖形的旋轉方向為逆時針方向,符合數(shù)據(jù)處理的要求。如果向量角檢測的結果為減小,則說明數(shù)據(jù)的順序為順時針方向,需要對圖形邊框數(shù)據(jù)進行反向處理。
3.計算頂點對應的內角值
在封閉圖形數(shù)據(jù)轉向確定的情況下,無論是凸多邊形,還是凹多邊形,都很容易確定圖形每個頂點所對應的內角大小。如圖5所示。
4.圖形拆分處理
將復雜圖形拆分為基本圖形是本算法的核心內容,前面的處理都是為這一步做準備。首先應該確定拆分的最終結果有幾種基本圖形。然后才能確定圖形分割的具體過程如何。在此假設圖形分割的最終目的是得到一個三角形和矩形的序列。該過程是一個循環(huán),步驟簡述如下。
(1)首先檢測剩余邊數(shù),如果等于0,表示已沒有剩余邊框數(shù)據(jù)需要處理,轉(8);如果剩余邊數(shù)小于 3且不等于0,則輸出錯誤信息。
(2)如果等于三,則得到一個三角形。將三角形加入到基本圖形列表,轉(8)。
(3)查找內角值最大的邊,取其下一條邊作為起始邊。檢測其與末端頂點的內角,如果大于 180°,則繼續(xù)選取下一條邊。
(4)檢測當前邊與下一條邊的夾角,如果為 90°,則繼續(xù)讀取下一條邊。
(5)查看已讀取到的邊數(shù),如果已讀取到4條邊,則轉6,否則轉(4)繼續(xù)讀取。
(6)檢測讀取到的四條邊是否組成封閉矩形。如果是則將矩形合并到數(shù)據(jù)序列,轉(1)開始下一次循環(huán),否則轉(7)進行圖形運算。
(7)已讀取的四條邊,因為自第一條邊起,到第四條邊都是 90度,而圖形現(xiàn)在沒有封閉。必然是第一條邊的起點和第四邊的終點沒有重合??梢詫⒌谝粭l邊和第四條邊轉化為直線方程,求其交點。求出的矩形輸出到基本圖形列表。然后轉(1)繼續(xù)執(zhí)行。
(8)得到基本圖形序列后,按一定的規(guī)則進行優(yōu)化,對于不符合最終要求的基本圖形進行優(yōu)化運算。
(9)最后輸出優(yōu)化后的所有矩形。
仍以 L形為例。首先查找到內夾角最大的點為p5,對應內角值為 270°;然后逆時針讀取到b5、b6、b1和 b2共 4條邊;進行圖形封閉檢測,可發(fā)現(xiàn)起點和終點不重合。以第一條邊 b5和第四條邊 b2為直線接方程,可求得交點p7,其坐標為(250,100)。
以點 p7為分割點,將原有線段 p2-p3分割為兩個線段,將線段 p2-p7插入到輸出矩形中,p7-p3插入到原始數(shù)據(jù);線段p5-p7插入到原始數(shù)據(jù)組成新的封閉圖形;插入p7-p5到輸出矩形數(shù)據(jù),由于 p7-p5和 p5-p6直線方程完全相同,可以合并為線段 p7-p6。繼續(xù)循環(huán),可得 p1-p7-p3-p4為一個矩形,輸出到基本圖形列表。 然后可按照一定的規(guī)則進行優(yōu)化,使最終的分割結果近似最優(yōu),程序成功退出。至此一個圖形拆分完成,如圖 6所示。
同理,對圖 1中的(b)的工字型執(zhí)行該算法,可得拆分結果如圖 7所示。對圖1中的(c)執(zhí)行該算法,可得拆分結果如圖8所示。對于該任意形的拆分,由于拆分后所得矩形 4的寬度太小,不符合加工的最小寬度要求??梢詫⑵渑c并列的矩形 2進行優(yōu)化運算,得矩形 5和矩形6,如圖8(b)所示。
五、結語
使用 VC++程序開發(fā)語言,通過 ObjectARX接口對AutoCAD系統(tǒng)進行二次開發(fā),是擴展 AutoCAD系統(tǒng)功能的重要手段。本文所提供的算法是在進行轉塔沖床輔助設計制造系統(tǒng)的基礎上總結出來的圖形分析處理方法。在本文的敘述中,針對的是由線段組成的多邊形,一般可拆分為矩形和三角形。如果出現(xiàn)更復雜的圖形情況,如包含任意內角值的頂點,有圓弧或任意曲線的邊,則需要對該算法進行擴展??墒紫葘μ厥膺呥M行處理,再對其兩側的直線段延長,求其交點,便可得到曲線圖形和直線段組成的復雜多邊形。本算法的目的不是提供萬能的算法,而是提供一種解決問題的思路,在實際應用中,還需根據(jù)實際情況做相應的處理。IM