- 相關(guān)推薦
基于鐵路選線CAD系統(tǒng)的圖形接口方法與交互技術(shù)
摘要:運(yùn)用Visual c++ 2005和0bjeetARX 2008開發(fā)工具,探討圖形實(shí)體的創(chuàng)建與實(shí)體屬性的設(shè)置方法。
利用結(jié)果緩沖區(qū)、DXF接口方法和ObjectARX類函數(shù),實(shí)現(xiàn)圖形數(shù)據(jù)自動提取和圖形交互功能。以此為基礎(chǔ)開發(fā)的線路設(shè)計系統(tǒng),在一些設(shè)計單位完成了多項線路工程設(shè)計,取得良好的經(jīng)濟(jì)效益。
關(guān)鍵詞:計算機(jī)輔助設(shè)計;鐵路選線;ObjeetARX開發(fā)工具;圖形交換文件
隨著計算機(jī)圖形學(xué)理論和技術(shù)的迅猛發(fā)展,針對各行備業(yè)出現(xiàn)了多種計算機(jī)繪圖和計算機(jī)輔助設(shè)計CAD(computer aided design)的軟件和開發(fā)工具,為工程設(shè)計人員提供了現(xiàn)代化的設(shè)計手段,提高了設(shè)計效率和繪圖質(zhì)量,使設(shè)計圖紙更加規(guī)范化。
20世紀(jì)90年代利用AutoCAD等軟件的交互式繪圖,已經(jīng)為工程技術(shù)和科技工作者繪圖提供了很大的便利,但繪圖速度和效率仍不能滿足設(shè)計人員的要求。為此,利用面向?qū)ο蟮某绦蛟O(shè)計方法,采用繪圖軟件的開發(fā)工具包,開發(fā)人工智能和自動繪圖的計算機(jī)輔助設(shè)計軟件,已成為設(shè)計自動化的發(fā)展趨勢。
近年來,土木、建筑、機(jī)械制造與設(shè)計行業(yè)在計算機(jī)輔助設(shè)計方面的研究工作取得了重要成果。
隨著航測和遙感技術(shù)的發(fā)展,出現(xiàn)了航測地形圖、遙感影像圖及數(shù)字地面模型等數(shù)字和圖像產(chǎn)品,為鐵路選線設(shè)計自動化和可視化奠定了基礎(chǔ)。本文基于AutoCAD 2008繪圖平臺和ObjectARX 2008開發(fā)工具,運(yùn)用Visual c++ 2005語言,探討鐵路選線設(shè)計圖形接口方法和交互技術(shù),通過對AutoCAD圖形數(shù)據(jù)庫的操作,在前臺進(jìn)行線路的平、縱斷面的交互設(shè)計,在后臺自動獲取并存儲設(shè)計數(shù)據(jù),最后調(diào)用設(shè)計數(shù)據(jù)自動繪制線路平面、縱斷面設(shè)計圖。這種鐵路選線CAD系統(tǒng)的實(shí)現(xiàn),可為設(shè)計部門提供實(shí)用、快捷、方便的現(xiàn)代化設(shè)計工具,大大提高設(shè)計效率和圖面質(zhì)量。
1、圖形接口方法
基于Visual C++ 2005和ObjectARX的圖形接口的建立是圖形生成的基礎(chǔ)。在線路設(shè)計圖中包括幾何屬性和非幾何屬性,圖形實(shí)體有直線、圓、圓弧及文字等,圖形非幾何屬性有圖層、顏色、線型等。所以,建立生成圖形的基本圖元和屬性設(shè)置接口,是圖形生成的前提。
1.1 圖形接口的建立
1.1.1 結(jié)果緩沖區(qū)接口方法
(1)結(jié)果緩沖區(qū)結(jié)構(gòu)在AutoCAD中,實(shí)體數(shù)據(jù)描述表存儲在結(jié)果緩沖區(qū)中,結(jié)果緩沖區(qū)的結(jié)構(gòu)為:
struct resbuf{struct resbuf rbnext;\\~向下一個結(jié)果緩沖區(qū)的指針變量short restype;\\用來指明resval值的類型union ads U val resval;\\“結(jié)果緩沖區(qū)”節(jié)點(diǎn)值的resval變量);resval變量是個同位union ads U val類型,成員變量有ads— real rreal,rpoint[3];short rint;charrstring等。結(jié)果緩沖區(qū)的restype字段,用來指明返回值resval的類型。ADS函數(shù)處理實(shí)體時,其返回結(jié)果緩沖區(qū)的restype字段常常是DXF(drawingexchange file)實(shí)體代碼。
(2)利用結(jié)果緩沖區(qū)創(chuàng)建實(shí)體的方法定義結(jié)果緩沖區(qū)結(jié)構(gòu):struct resbuf entlist;創(chuàng)建實(shí)體數(shù)據(jù)描述表:不同的實(shí)體數(shù)據(jù)描述表的參數(shù)不同,以下為直線、圓和文字的數(shù)據(jù)描述表的構(gòu)建方法,其他實(shí)體的數(shù)據(jù)描述表也可依此方法建立?1.entlist— ads— buildlist(RTDXF0,“LINE”,10,S—tartp,11,endp,RTNONE);entlist= ads— buildlist(RTDXF0,“CIRCLE”,10,centerp,40,r,62,color,RTNONE);將實(shí)體描述表添加到結(jié)果緩沖區(qū)中:status—ads— — entmake(entlist);釋放結(jié)果緩沖區(qū):ads relrb(entlist);1.1.2 用創(chuàng)建類對象的方法建立接口一幅AutoCAD的圖形是存儲在一個數(shù)據(jù)庫中的對象的集合。創(chuàng)建實(shí)體的過程就是向數(shù)據(jù)庫中添加對象的過程。不同的對象有其對應(yīng)的子類,如AcDbLine,AcDbCircle,AcDbArc,AcDb2dPolyline,AcDbText等。以AcDb2dPolyline對象的創(chuàng)建方法為例,建立POLYLINE實(shí)體接口函數(shù)的方法如下:
圖形接口定義:
void createPolyline(AcGePoint3dArray ptArr,double width,int color,char layer)創(chuàng)建實(shí)體對象:
AcDb2dPolyline pNewPline=new AcDb2dPoly—line(AcDb::k2dSimplePoly,ptArr,0.0,Adesk::kFalse,width,width,NULL);設(shè)置實(shí)體顏色和圖層:pNewPline一>setColor—Index(color);pNewPline——>setLayer(1ayer);以讀的方式打開當(dāng)前圖形數(shù)據(jù)庫中的塊表,建立指向塊表的指針。
acdbHostApplicationServices()——>workingData--base()->getSymbolTable(pBlockTable,AcDb::kForRead);以寫的方式打開模型空間,將塊表記錄指針指向模型空間數(shù)據(jù)庫。
pBlockTable->getAt(ACDB—MODEL—SPACE,pBlockTableRecord,AcDb::kForWrite);將實(shí)體添加到圖形數(shù)據(jù)庫的塊表記錄中,返回對象標(biāo)識。
pBlockTableRecord——>appendAcDbEntity(pline·-ObjId,pNewPline);關(guān)閉塊表指針、塊表記錄指針和對象指針。如關(guān)閉塊表指針:pBlockTable->close()[ ];其他實(shí)體創(chuàng)建可依據(jù)上述方法實(shí)現(xiàn)。
1.2 圖形非幾何特性設(shè)置為了便于圖形管理和符合制圖標(biāo)準(zhǔn),在繪制設(shè)計圖時需設(shè)置圖形的非幾何特性,主要包括圖層、顏色、線型和線寬等。
1.2.1 建立圖層若不設(shè)置圖層,則圖形畫在“0”層中。當(dāng)建立圖層時 可設(shè)置圖層的顏色、線型及圖層狀態(tài)(關(guān)閉、打開,凍結(jié)等)等特性,將設(shè)計圖中不同內(nèi)容繪制在各自的圖層中,便于圖形管理。方法如下:
(1)函數(shù)定義接口函數(shù):AcDbObjectId addLayer(char layer.namell00],char linetype[100],int layer—color);
(2)加載線型在當(dāng)前工作空間中,加載標(biāo)準(zhǔn)線型庫文件aca—diso.1in中的指定線型。acdbLoadLineTypeFne(hnetype,“…\\acadiso.1in”,pDb);
(3)建立新的層表記錄:AcDbLayerTableRe—cord pLayerTblRcd= new AcDbLayerTableRecord;
(4)設(shè)置層名:pLayerTblRcd一>setName(1ayer—name);
(5)設(shè)置圖層顏色:pLayerTblRcd一>setColor(color);f61設(shè)置線型在線型表中獲取線型標(biāo)識:pLinetypeTbl一>getAt(1inetype,ltId);在層表記錄中設(shè)置線型:pLayerTblRcd一>set—LinetypeObjectId(1tId);將層表記錄添加到層表中:pLayerTbl一>add(pLayerId,pLayerTblRcd);(7)關(guān)閉層表指針,返回層表的ID[3].
1.2.2 實(shí)體非幾何特性設(shè)置實(shí)體的非幾何特性包括所屬的圖層、顯示的顏色、線型、線寬和線型比例等 設(shè)置方法如下:
(1)當(dāng)前圖層設(shè)置在AutoCAD環(huán)境下,圖形是畫在當(dāng)前層中,所以,在繪圖時要先設(shè)置當(dāng)前圖層,方法為:pDb一>setClayer(pLayerld)。
(2)設(shè)置線型比例在AutoCAD 的模型空間設(shè)置線型總體比例方法如下:打開當(dāng)前數(shù)據(jù)庫:AcDbDatabase pDb—acdbHostApplicationSerVices()一>workingDatabase();設(shè)置線型總體比例:pDb一>setLtsca1e(Ltscale)。
(3)設(shè)置實(shí)體顏色:實(shí)體的顏色可與所在層不同,如果顏色值不是256(BYLAYER),則實(shí)體與它所在圖層的顏色不一致。實(shí)體顏色的設(shè)置方法為:pEntity一>setCo1orIndexfnewColor)。
(4)設(shè)置實(shí)體圖層:如果一個實(shí)體已經(jīng)指定了圖層,那么當(dāng)前數(shù)據(jù)庫的圖層值會被忽略。設(shè)置實(shí)體圖層的方法為:pEntity一>setLayer(pLayerId)。
2、圖形信息的提取原理和方法
2.1 圖形信息及提取原理
2.1.1 矢量圖的主要內(nèi)容
(1)工程設(shè)計圖中的幾何實(shí)體包括:點(diǎn)、直線、圓和圓弧、多段線(POLYLINE)、文字、尺寸標(biāo)注等,其幾何屬性有離散點(diǎn)的坐標(biāo),直線的端點(diǎn)坐標(biāo)和線段的長度,圓的圓心坐標(biāo)及半徑,多段線(POLYLINE)的各頂點(diǎn)坐標(biāo)、線段的長度和面積及文字的起點(diǎn)坐標(biāo)等。
(2)圖形的非幾何信息有圖層、顏色、線型、線寬及層的狀態(tài)等。
2.1.2 實(shí)體信息提取原理利用結(jié)果緩沖區(qū)和DXF接口方法,結(jié)合Obje—ctARX工具的實(shí)體獲取技術(shù),可提取對象的坐標(biāo)、圖層、線型、顏色等信息。
結(jié)果緩沖區(qū)用于存儲實(shí)體信息,根據(jù)緩沖區(qū)變量restype的返回值,結(jié)合DXF組代碼來判斷組值的類型,實(shí)體信息分類如下:
(1)DXF圖形交換文件由7個節(jié)(Section)組成,每節(jié)由0組和其組值Section開始,中間是若干個組,每組由組代碼和組值構(gòu)成,節(jié)尾由0組和其組值ENDSEC組成。不同的組代碼對應(yīng)的組值可為字符串、整型數(shù)、浮點(diǎn)數(shù)等。
(2)組代碼是0 9的整數(shù),則返回值類型為字符串(RTSTR),組值為實(shí)體名稱、圖層名和線型等。
(3)組代碼是10~19之間的整數(shù)時,返回值的類型為RT3DPOINT,這種返回值為點(diǎn)的坐標(biāo):adsreal rpoint~3],由此可獲得圖形中的散點(diǎn)坐標(biāo)值。
(4)組代碼為38~59的整數(shù)時,其返回值的類型為RTREAL,其值為實(shí)型數(shù),其中,組代碼39的組值為厚度(thickness)、組代碼40的組值為高度(如等高線的高程)、半徑等,其他組代碼的組值為角度等。
(5)組代碼是60~79的整數(shù)時,返回值為短整型RTSHORT,如顏色號碼及對齊方式等。
2.2 實(shí)體信息提取方法在AutoCAD模型空間中,圖形為矢量圖,各對象有其對應(yīng)的子類,在DXF接口中,實(shí)體的幾何與屬性信息對應(yīng)不同的組代碼和組值,根據(jù)子類的不同可提取相應(yīng)實(shí)體的幾何和屬性信息。多段線POLYLINE的子類為AcDbPolyline,DXF的組碼為0,組值為POLYLINE,以多段線的頂點(diǎn)信息提取為例,說明對象信息提取的原理和方法如下:
(1)獲取圖形實(shí)體運(yùn)用ObjectARX開發(fā)工具中的acedSSGet(“a”,NULL,NULL,NULL,ads name all entities)函數(shù)獲取圖形數(shù)據(jù)實(shí)體,然后,用acedSSLength(ads_name aii entities,long entities count)函數(shù)獲取選擇集中的實(shí)體數(shù)目。
(2)獲取實(shí)體名稱利用acedSSName(ads name all entities,longi,ads name entity)函數(shù),獲取all entities實(shí)體集合中第i個實(shí)體的名稱并存放于參數(shù)entity中。
(3)實(shí)體數(shù)據(jù)描述表在結(jié)果緩沖區(qū)中獲取實(shí)體數(shù)據(jù)的描述表:struct resbuf entitybuf=ads— entget(entity)。
獲取結(jié)果緩沖區(qū)中所存儲的entitybuf->restype為實(shí)體的DXF組代碼,entitybuf->resva1.rstring為組值,組代碼和組值分別為0和“POLYLINE”時,則該實(shí)體為P0n LINE.用acdbGetObjectId(AcDbObjectId plineObjIdads name entity)函數(shù)獲取POLYLINE實(shí)體標(biāo)識符,再用該標(biāo)識符對POLYLINE實(shí)體進(jìn)行遍歷,獲取頂點(diǎn)個數(shù)和坐標(biāo):pLine一>getPointAt(n,data—plineIn]),并將頂點(diǎn)坐標(biāo)存人數(shù)據(jù)文件中【5】。
3、圖形交互技術(shù)在線路平面和縱斷面設(shè)計線完成后,經(jīng)常需要對線路平面圖的交點(diǎn)或縱斷面變坡點(diǎn)進(jìn)行交互調(diào)整和修改,交互修改包括插入、刪除和移動點(diǎn)等方式。此處采用結(jié)構(gòu)、指針,鏈表、實(shí)體數(shù)據(jù)獲取和操作等技術(shù)完成。
(1)獲取初始數(shù)據(jù)獲取工作路徑下的初始數(shù)據(jù):設(shè)計標(biāo)準(zhǔn)、斷前和斷后里程、高程、繪圖比例等。
(2)建立縱斷面坡度線的數(shù)據(jù)結(jié)構(gòu)為了便于存儲和操作坡度線的數(shù)據(jù)信息,坡度線的頂點(diǎn)結(jié)構(gòu)體定義如下:struct podu{double k,X,h,h—Y,r;struct podu next;struct podu prior;}成員變量說明: 為變坡點(diǎn)連續(xù)里程,k 為變坡點(diǎn)X坐標(biāo),h是變坡點(diǎn)高程,h Y是變坡點(diǎn)Y坐標(biāo),r是豎曲線半徑。
(3)獲取坡度線數(shù)據(jù):先選擇對象:ads entsel(“\n請選擇坡段,然后根據(jù)需要移動變坡點(diǎn):\n”,pd— line,p0);再獲取實(shí)體標(biāo)識:acdbGetObjectId(plineObjId,pd_ line);遍歷實(shí)體PP—iterate(plineObjId);設(shè)置結(jié)構(gòu)首地址podu:podu start.
(4)判斷所選多段線是否為坡度線根據(jù)已存儲的設(shè)計坡段數(shù)據(jù)與所獲取的多段線頂點(diǎn)鏈表數(shù)據(jù)比較,運(yùn)用while(podu){}循環(huán)判斷所選多段線是否為坡度線。若是坡度線,則進(jìn)行插入操作。
(5)首先判斷該段坡度是否滿足最大限坡的要求,若滿足條件,則建立坡度線鏈表。根據(jù)坡長和坡度計算插入點(diǎn)的坐標(biāo),判斷插入點(diǎn)在鏈表中的位置,再將該點(diǎn)插入坡度線鏈表中,然后將鏈表中的數(shù)據(jù)寫入數(shù)據(jù)文件中,以備后用。
(6)獲取結(jié)果緩沖區(qū)中的實(shí)體選擇集:ads SS—get(“X”,NULL,NULL,&ebl,ssname);測量選擇集中的實(shí)體個數(shù):ads— sslength(ssname,&ilast);在選擇集中逐個刪除實(shí)體:for(k:0;
(7)重新生成坡度線根據(jù)重新生成的坡度線數(shù)據(jù),利用坡度線繪圖接口畫出新的坡度線,接口函數(shù)如下:draw— pd(path—name—pd,n—dl,dl,h~scale,st—ic,orientation,hum—dg,dg—SZ,bz~ jj);
4、應(yīng)用實(shí)例運(yùn)用以上圖形接口方法和圖形數(shù)據(jù)提取技術(shù)開發(fā)了鐵路選線CAD系統(tǒng),圖1為該系統(tǒng)生成的一段鐵路縱斷面圖[6].系統(tǒng)主要特點(diǎn)如下:
(1)實(shí)現(xiàn)了線路平面和豎向設(shè)計可視化設(shè)計功能,由設(shè)計過程產(chǎn)生設(shè)計數(shù)據(jù)和設(shè)計文件,根據(jù)設(shè)計數(shù)據(jù)生成平面、縱斷面和橫斷面圖,改變了其他軟件必須由人工輸入設(shè)計數(shù)據(jù)而后產(chǎn)生設(shè)計圖的做法,真正實(shí)現(xiàn)了計算機(jī)輔助設(shè)計的功能[7]_
(2)針對選線中的地形圖和數(shù)字地模(DEM),實(shí)現(xiàn)了數(shù)字地面模型形成與格式轉(zhuǎn)換。
(3)在平面和豎向設(shè)計過程中自動產(chǎn)生設(shè)計數(shù)據(jù),實(shí)現(xiàn)了設(shè)計圖和數(shù)據(jù)的聯(lián)動、插入、移動、合并和刪除等修改功能,實(shí)現(xiàn)了線路中的斷鏈處理等功能
5、結(jié)束語
在計算機(jī)輔助設(shè)計中,軟件平臺和開發(fā)工具雖多種多樣,但圖形接口、交互技術(shù)、數(shù)據(jù)提取和存儲是CAD開發(fā)的主要研究內(nèi)容。本文采用VisualC++2005語言和強(qiáng)大的ObjectARX 2008二次開發(fā)工具,直接對圖形數(shù)據(jù)庫進(jìn)行操作,結(jié)合鐵路選線設(shè)計原理、過程和設(shè)計經(jīng)驗,開發(fā)了符合實(shí)際設(shè)計要求的選線設(shè)計CAD系統(tǒng),解決了勘測設(shè)計的實(shí)際問題和難題,為勘測設(shè)計人員快速有效地實(shí)施設(shè)計思想提供了現(xiàn)代化的設(shè)計手段,極大地減輕了設(shè)計人員的勞動強(qiáng)度,提高了設(shè)計效率。
參考文獻(xiàn)
[1]余承飛,方勇編。AutoCAD 2000二次開發(fā)技術(shù)(ObjectARX)[M1.北京:人民郵電出版社,1999:25-30.
[2]老大中,趙占強(qiáng)。AutoCAD 2000 ARX二次開發(fā)實(shí)例精粹(ObjectARX)[M1.北京:國防工業(yè)出版社,2001:50-56.
[3]程耀東,張麗萍,韓進(jìn),等。計算機(jī)繪圖教程與二次開發(fā)方法fM】。蘭州: 甘肅科技出版社,2009:525-533.
[4]李世國。AutoCAD高級開發(fā)技術(shù):ARX編程及應(yīng)用【MI.北京:機(jī)械工業(yè)出版社,2001:50-56.
[5]程耀東;贠bjectARX 2007的地質(zhì)斷面自動填充方法fJJ.物探與物化,2010,34(5):681—685.
[6]易思蓉。鐵路選線設(shè)計(M1.成都:西南交通大學(xué)出版社,2005:75—124.
[7]葛根榮。鐵路選線三維聯(lián)動可視化CAD系統(tǒng)的開發(fā)與應(yīng)用{J】。鐵道勘察,2005,31(4):I-3.
[8]王衛(wèi)東,蔣紅斐。道路與鐵道工程計算機(jī)輔助設(shè)計【M1.北京:機(jī)械工業(yè)出版社,2004:109-130.
【基于鐵路選線CAD系統(tǒng)的圖形接口方法與交互技術(shù)】相關(guān)文章:
基于web的異地并行設(shè)計與制造系統(tǒng)研究06-02
基于PLC的斷路器型式試驗系統(tǒng)設(shè)計03-10
基于MOSFET內(nèi)阻的電流采樣及相電流重構(gòu)方法10-30
基于軍網(wǎng)的雷達(dá)遠(yuǎn)程診斷技術(shù)研究08-10
基于J2EE的遠(yuǎn)動系統(tǒng)Web實(shí)時曲線的研究05-11
基于電話網(wǎng)絡(luò)的熱網(wǎng)遠(yuǎn)程控制系統(tǒng)設(shè)計05-11
探討基于多種通信方式并存的配網(wǎng)自動化通信系統(tǒng)06-01
基于價值網(wǎng)理論的鐵路多元經(jīng)營物流企業(yè)經(jīng)營模式研究06-04