西安工程技術(shù)學(xué)院 李洪聲 賀歆昉
數(shù)控銑床圖形編程系統(tǒng)零件圖元排序程序設(shè)計(jì)
西安工程技術(shù)學(xué)院 李洪聲 賀歆昉
基于autoCAD數(shù)控銑床圖形自動(dòng)編程系統(tǒng)設(shè)計(jì)中,本文利用Visual C++6.0語言設(shè)計(jì)一個(gè)比較完整的零件輪廓圖元排序程序。首先介紹了定義了存儲(chǔ)各圖元信息數(shù)據(jù)結(jié)構(gòu),定義了雙向鏈表結(jié)點(diǎn)復(fù)合結(jié)構(gòu)體類型。利用list列表容器存儲(chǔ)非均勻B樣條曲線信息。設(shè)計(jì)比較函數(shù)以及鏈表操作函數(shù),簡化了排序程序設(shè)計(jì)。
數(shù)控銑床自動(dòng)編程;排序程序;非均勻B樣條曲線;雙向鏈表
在WindowsXP操作平臺(tái)上,以Auto-CAD2004繪圖軟件為開發(fā)平臺(tái)、采用可視化程序設(shè)計(jì)語言Visual C++6.0設(shè)計(jì)開發(fā)適于PC機(jī)數(shù)控系統(tǒng)上使用的數(shù)控銑床圖形編程系統(tǒng)。系統(tǒng)框架結(jié)構(gòu)如圖1所示。
(1)讀入模塊:讀取存儲(chǔ)零件各圖元幾何信息。設(shè)計(jì)人員采用AutoCAD對(duì)加工的零件實(shí)體建摸后,將圖形信息以DXF文件格式存儲(chǔ)。讀入模塊通過分析DXF文件格式,讀取CAD圖形實(shí)體數(shù)據(jù),存儲(chǔ)零件的幾何和參數(shù)信息。(2)讀入雙向連表模塊:將存儲(chǔ)各圖元信息結(jié)構(gòu)體讀入鏈表后由排序模塊進(jìn)行排序組環(huán)。(3)工藝設(shè)置模塊:對(duì)話框交互式輸入工藝參數(shù)。(4)生成代碼模塊:對(duì)(2)中的存儲(chǔ)零件輪廓環(huán)的雙向鏈表中各結(jié)點(diǎn)結(jié)構(gòu)體中的圖元類型、環(huán)方向進(jìn)行判斷并根據(jù)輸入的工藝參數(shù)進(jìn)行相應(yīng)處理生成數(shù)控加工程序代碼。
本文主要介紹了使用Visual C++6.0語言對(duì)存儲(chǔ)數(shù)控銑床加工零件輪廓各圖元雙向鏈表排序程序設(shè)計(jì)過程。首先介紹了定義了存儲(chǔ)各圖元信息數(shù)據(jù)結(jié)構(gòu),利用list列表容器存儲(chǔ)非均勻B樣條曲線信息。設(shè)計(jì)圖元信息讀入鏈表模塊以及雙向鏈表操作函數(shù)和圖元排序程序。
3)非均勻B樣條曲線圖元結(jié)構(gòu)體
STL是最新的C++標(biāo)準(zhǔn)函數(shù)庫中的一個(gè)子集[2]。它采用泛型程序設(shè)計(jì)思想。容器是容納、包含一組元素或元素集合的對(duì)象。容器類中包含一組元素或一個(gè)元素集合,作為通用元素收集器,其list列表容器主要用于存放鏈表,其中的鏈表是雙向鏈表,可以從任意一端開始遍歷。利用雙向迭代器可以在兩個(gè)方向上對(duì)列表進(jìn)行遍歷。利用迭代和訪問方法、可變序列算法和不可變序列算法對(duì)列表容器中的元素進(jìn)行正反迭代返回元素個(gè)數(shù)、查找排序等操作[2]。
利用list
讀入雙向鏈表模塊將存儲(chǔ)各類型圖元信息結(jié)構(gòu)體讀入雙向鏈表后由排序程序進(jìn)行排序組環(huán)。數(shù)控銑床加工的零件二維平面輪廓環(huán)主要是由一系列基本圖元(直線、圓弧、樣條曲線)組成首尾相接的封閉環(huán)。
本課題基本圖元類型分別為非均勻B樣條曲線、直線和園弧。雙向鏈表結(jié)點(diǎn)結(jié)構(gòu)體用于存儲(chǔ)零件圖中組成平面輪廓環(huán)的各基本圖元,鏈接成雙向鏈表。這就要求雙向鏈表的結(jié)點(diǎn)數(shù)據(jù)域結(jié)構(gòu)體類型存儲(chǔ)各類基本圖元。由于直線、圓弧、樣條曲線等圖元的基本信息不同,故存儲(chǔ)這些圖元信息的結(jié)構(gòu)體類型也不同。為了將這些不同類型的結(jié)構(gòu)體讀入同一雙向鏈表進(jìn)行后續(xù)處理,其結(jié)構(gòu)體數(shù)據(jù)域形式必須滿足存儲(chǔ)各類基本類型圖元。定義復(fù)合結(jié)構(gòu)體DNodel,其中數(shù)據(jù)域結(jié)構(gòu)體unite包含各基本圖元結(jié)構(gòu)體類型成員。定義雙向鏈表復(fù)合結(jié)構(gòu)體結(jié)點(diǎn)類型體如下:
在讀入模塊中將存儲(chǔ)所有圖元信息結(jié)構(gòu)體對(duì)象加入集合類CPtrArray對(duì)象供后續(xù)處理使用。CptrArray類對(duì)象的容量可動(dòng)態(tài)增加。類CPtrArray對(duì)象m_PtrArray1、m_PtrArray2、m_PtrArray3分別存儲(chǔ)直線圖元結(jié)構(gòu)體、存儲(chǔ)圓弧圖元結(jié)構(gòu)體、存儲(chǔ)非均勻B樣條曲線圖元結(jié)構(gòu)體。
本課題涉及的是在AutoCAD中繪制的二維加工平面零件。由于DXF文件中圖元的排列順序不一定是按照繪制零件輪廓的拓?fù)漤樞蚺帕械?,所以讀入模塊讀入各圖元信息數(shù)據(jù)后,在生成數(shù)控刀軌時(shí)、需要將這些圖元讀入雙向鏈表后進(jìn)行排序。讀入鏈表部分Visual C++程序如下:
3.2.1 比較函數(shù)
在零件輪廓圖元排序時(shí)、需要用比較函數(shù)查找首尾相接的點(diǎn)從而組成一個(gè)首尾相接的環(huán)。直線、圓弧圖元比較函數(shù)int CDDDDoc::compare(drawing*c1,drawing*c2),直線、圓弧與非均勻B樣條曲線比較函數(shù)int CDDDDoc::copare(drawing*c1,F(xiàn)eiType *c2)…。
考慮到首尾相接的點(diǎn)由于繪圖的原因、不一定是同一點(diǎn),所以使用了容差,即相連接的某一圖元的終點(diǎn)坐標(biāo)與另一圖元的起點(diǎn)坐標(biāo)、兩點(diǎn)的坐標(biāo)值誤差在一定范圍內(nèi)就認(rèn)為兩點(diǎn)重合。直線、圓弧圖元之間比較判斷函數(shù)部分代碼如下:
3.2.2 雙向鏈表操作函數(shù)
編制并利用雙向鏈表的各種函數(shù)實(shí)現(xiàn)雙向鏈表的各種基本操作運(yùn)算:初始化、插入元素、刪除元素、釋放雙向鏈表等。部分函數(shù)名及函數(shù)參數(shù)如下:
3.2.3 設(shè)計(jì)雙向鏈表排序程序
在數(shù)控刀軌生成時(shí),需要將這些首尾相接的圖元(直線、圓弧、樣條等)組成一個(gè)整體有序的環(huán)。組環(huán)的方法分為無分支和有分支兩種情況。本課題討論無分支情況。
鏈表的最大特點(diǎn)是元素的插入或刪除僅需修改指針而不需要移動(dòng)元素。本課題使用比較函數(shù)、鏈表操作函數(shù)等設(shè)計(jì)已讀入雙向鏈表零件圖元組環(huán)排序程序。排序程序算法流程如圖2所示。取鏈表L中第i個(gè)結(jié)點(diǎn)、與i結(jié)點(diǎn)后所有的結(jié)點(diǎn)j進(jìn)行比較、如果值相等則j結(jié)點(diǎn)插入i結(jié)點(diǎn)后。本文用Visual C++6.0編制的部分組環(huán)排序程序如下:
本文定義了存儲(chǔ)各類圖元數(shù)據(jù)結(jié)構(gòu)體,對(duì)存儲(chǔ)非均勻B樣條曲線信息結(jié)構(gòu)體使用C++標(biāo)準(zhǔn)函數(shù)庫子集STL中l(wèi)ist列表容器作為成員變量存儲(chǔ)節(jié)點(diǎn)和控制頂點(diǎn)等信息,從而可簡化讀取模塊設(shè)計(jì)。利用迭代和訪問方法、可變序列算法和不可變序列算法對(duì)列表容器中的元素進(jìn)行正反迭代指向返回元素個(gè)數(shù)、查找、排序等操作,從而可大大簡化圖形編程系統(tǒng)非均勻B樣條后處理模塊設(shè)計(jì)。
用Visual C++6.0設(shè)計(jì)雙向鏈表讀入程序,設(shè)計(jì)比較函數(shù)以及雙向鏈表操作函數(shù)簡化了雙向鏈表圖元排序程序設(shè)計(jì)。經(jīng)運(yùn)行排序程序、存儲(chǔ)零件各圖元鏈表排序結(jié)果正確。
圖2 雙向鏈表排序流程
[1]譚浩強(qiáng).C++程序設(shè)計(jì)[M].北京:清華大學(xué)出版社.
[2]鄭莉,董淵,張瑞豐.C++語言程序設(shè)計(jì)(第3版)[M].北京:清華大學(xué)出版社,2004.
[3]孫鑫,余安萍.VC++深入祥解[M].北京:工業(yè)出版社,2006.
李洪聲(1962—),男,貴州貴陽人,工程碩士,西安工程技術(shù)學(xué)院講師,研究方向:數(shù)控機(jī)床編程加工。
賀歆昉(1963—),渭南技師學(xué)院講師。