李愛(ài)國(guó)
(陜西工業(yè)職業(yè)技術(shù)學(xué)院 陜西 咸陽(yáng) 712000)
AutoCAD是目前使用非常廣泛的計(jì)算機(jī)輔助設(shè)計(jì)系統(tǒng),據(jù)AutoDesk公司的統(tǒng)計(jì)數(shù)據(jù),目前全世界有200多萬(wàn)設(shè)計(jì)者使用AutoCAD來(lái)定義和設(shè)計(jì)各種工程方案,有20多億的AutoCAD圖形文件存儲(chǔ)于計(jì)算機(jī)中[1-2]。由于其文檔格式使用廣泛,AutoDesk公司為了適應(yīng)目前網(wǎng)絡(luò)應(yīng)用的需求,也實(shí)現(xiàn)了通過(guò)互聯(lián)網(wǎng)對(duì)其圖形文件的顯示。早期采用Whip!插件在瀏覽器上瀏覽DWF專用格式文件。DWF文件格式支持圖層、超級(jí)鏈接、背景顏色、距離測(cè)量、線寬、比例等圖形特性。但同時(shí)也存在很多問(wèn)題,AutoCAD本身不能顯示DWF文件,而如果將DWF文件轉(zhuǎn)換回到DWG格式需使用第三方供應(yīng)商的文件轉(zhuǎn)換軟件。因此,這種方式只適合通過(guò)網(wǎng)絡(luò)顯示圖形文件,不適合進(jìn)行數(shù)據(jù)的交換。Autodesk提供的第二種在非AutoCAD環(huán)境下顯示其圖形文件的方法是Voloview控件。Voloview控件可以在支持ActiveX的軟件中作為插件使用,這樣就可以通過(guò)它對(duì)DWG文件進(jìn)行瀏覽甚至簡(jiǎn)單的編輯。由于它的實(shí)現(xiàn)借助了ActiveX技術(shù),因此對(duì)瀏覽器有著很強(qiáng)的依賴性,對(duì)于非IE核心的瀏覽器來(lái)說(shuō),無(wú)法使用該控件進(jìn)行顯示圖形文件。其次,Voloview對(duì)中文的支持也存在一定的問(wèn)題。
通過(guò)將AutoCAD的圖形文件轉(zhuǎn)換成能夠在瀏覽器上查看的數(shù)據(jù)文件,也可以做到在瀏覽器上顯示圖形數(shù)據(jù)。通常使用的方式是將AutoCAD的圖形文件數(shù)據(jù)轉(zhuǎn)換成SVG格式文件,然后在安裝了SVG插件的瀏覽器上進(jìn)行瀏覽。SVG(Scalable Vector Graphics)是 World Wide Web Consortium(W3C)組織開(kāi)發(fā)和維護(hù)的一種開(kāi)放的矢量圖形標(biāo)準(zhǔn),它提供了制作復(fù)雜元素的工具,如漸變、嵌入字體、透明效果、動(dòng)畫(huà)和濾鏡效果,并且可使用平常的字體命令插入到HTML編碼中。由于SVG基于XML語(yǔ)言,因此有著非常良好的通用性,因此容易被推廣使用。但使用SVG也必須使用專用的插件,在瀏覽器中安裝這種插件的很少,因此其廣泛使用受到一定程度的限制。
在瀏覽器中普遍安裝并能夠顯示矢量圖形的是Flash Player插件。Flash是Web頁(yè)面上矢量動(dòng)畫(huà)的事實(shí)標(biāo)準(zhǔn),因此在瀏覽器上安裝Flash Player幾乎是大多數(shù)用戶必做的事情。Flash Player可以通過(guò)其Action Script腳本程序?qū)嶋H上是一種富客戶端(Rich Client)技術(shù),采用這種技術(shù)開(kāi)發(fā)的富因特網(wǎng)應(yīng)用程序(Rich Internet Applications,RIA)可以通過(guò)很強(qiáng)的交互性的富客戶端技術(shù)為用戶創(chuàng)建一個(gè)更為全面的網(wǎng)絡(luò)體驗(yàn)[2]。
近年來(lái)富客戶端技術(shù)的發(fā)展越來(lái)越繁榮,很多種不同技術(shù)背景的富客戶端技術(shù)都在利用自身的優(yōu)勢(shì)推廣到Web應(yīng)用中。由于98%以上的瀏覽器都安裝了Flash Player插件,并且有著很好的跨平臺(tái)特性,因此基于Flash技術(shù)的富客戶端技術(shù)也因此得到很好的推廣。
RIA集成了桌面應(yīng)用的交互性和傳統(tǒng)Web應(yīng)用的部署靈活性與成本分析,以創(chuàng)建單一而完整的用戶體驗(yàn)。富客戶端技術(shù)使創(chuàng)建RIA成為可能,它提供一個(gè)運(yùn)行時(shí)的環(huán)境以承載被編譯的客戶端應(yīng)用程序,該客戶端應(yīng)用程序是一個(gè)使用HTTP協(xié)議發(fā)布的文件[3]。由于富客戶端技術(shù)可以支持運(yùn)動(dòng)的圖像、視頻、音頻、雙向的數(shù)據(jù)通信和創(chuàng)建復(fù)雜的窗體,它為創(chuàng)建應(yīng)用程序用戶接口提供了一個(gè)高效而完善的開(kāi)發(fā)環(huán)境[4]。
隨著Flash技術(shù)不斷地發(fā)展變化,Action Script腳本已經(jīng)發(fā)展成為一種擁有自己的語(yǔ)法體系的面向?qū)ο蟮摹⒔换スδ軓?qiáng)大的腳本語(yǔ)言。它是構(gòu)建基于Flash富客戶端應(yīng)用的一項(xiàng)重要技術(shù)基礎(chǔ)。
Flash使用 ActionScript的MovieClip類的方法繪制直線、曲線、形狀和進(jìn)行填充。使用這些基本的圖像元素就可以完成在Flash中顯示AutoCAD圖形的要求。
DXF(Drawing Interchange Format,圖形交換格式)是AutoCAD圖形文件中包含的所有信息的一種帶標(biāo)記數(shù)據(jù)的表示方式。這種格式的文件最初是用于共享圖形數(shù)據(jù),由于其良好的結(jié)構(gòu)和通用性,因此被大量使用。DXF可以以文本形式存儲(chǔ)矢量數(shù)據(jù),且文件結(jié)構(gòu)簡(jiǎn)單、清晰,讀取方便,因此是有使用更為廣泛。
DXF文件的組成采用類似標(biāo)記語(yǔ)言(如:HTML和XML)的方式記錄數(shù)據(jù)。以下用AutoCAD R2000版DXF為例分析其組成。文件中的每個(gè)數(shù)據(jù)元素前面都帶有一個(gè)稱為組碼的整數(shù)。組碼的值表明了隨后的數(shù)據(jù)元素的類型,同時(shí)這個(gè)組碼也指出了數(shù)據(jù)元素對(duì)于給定對(duì)象(或記錄)類型的含義。一個(gè)DXF文件由若干段組成,每一段又由一些記錄組成,而記錄又由若干組碼和數(shù)據(jù)條目組成。在DXF文件中,每個(gè)組碼和每個(gè)數(shù)據(jù)條目都各占一行。文件總是以一行組碼和一行組值組成,因此規(guī)定組值的最大長(zhǎng)度不能超過(guò)255個(gè)字節(jié)(AutoCAD2000以后組碼 0~9及 1 000~1 009已經(jīng)去除了255個(gè)字符的限制,但通常小于2 049個(gè)字節(jié)),這種規(guī)律使得編程設(shè)計(jì)更加方便[5]。
完整的DXF文件由七個(gè)段(SECTION)組成,以下列出的是主要段的段名及段中包含的信息:
1)HEADER段 DXF文件的HEADER段記錄了與圖形相關(guān)聯(lián)的一些信息,其中包括AutoCAD圖形數(shù)據(jù)庫(kù)的版本號(hào)以及大量的系統(tǒng)變量。
2)CLASSES段 CLASSES段存儲(chǔ)了應(yīng)用程序定義的類的信息,這些類的實(shí)例將會(huì)出現(xiàn)在數(shù)據(jù)庫(kù)的 BLOCKS、ENTITIES和 OBJECTS段中[6]。
3)BLOCKS段 本段描述圖形中每個(gè)塊的引用以及塊中的實(shí)體。
4)ENTITIES段 本段描述構(gòu)成圖形的所有的圖形實(shí)體和塊的引用,但不包括塊內(nèi)的實(shí)體。
在Flash中讀取并顯示AutoCAD文件過(guò)程相對(duì)較為復(fù)雜,采用DXF文件進(jìn)行數(shù)據(jù)共享是一種很通用的方法。
文本格式的DXF文件很容易被其他的系統(tǒng)讀取和使用。Flash雖然提供了loadVariables和loadVariablesNum函數(shù)從外部讀取數(shù)據(jù)并將其存入Flash中的某個(gè)影片剪輯或者某個(gè)特定的級(jí)別中,但其處理數(shù)據(jù)的方式是通過(guò)“&”將數(shù)據(jù)分開(kāi),并采用“UserName=tom&Age=20”這樣的方式將數(shù)據(jù)規(guī)格化,這樣的格式與DXF的差別太大,處理起來(lái)非常麻煩。因此需要借助其他工具進(jìn)行讀取。
由于Flash插件是在Web頁(yè)面上工作,因此可以利用Web頁(yè)面上提供的現(xiàn)有工具進(jìn)行DXF數(shù)據(jù)的讀取。這里使用Java Script讀取DXF文件的數(shù)據(jù),同時(shí)利用DOM接口,將這些數(shù)據(jù)轉(zhuǎn)換成XML文件。這樣也可以將DXF數(shù)據(jù)存儲(chǔ)在XML文件中,用于其他方面的數(shù)據(jù)交換。Java Script提供FSO(File System Object)對(duì)象通過(guò)大量的屬性、方法和事件來(lái)處理文件夾和文件。由于DXF文件中的數(shù)據(jù)單元都是占用單獨(dú)一行,因此從DXF文件中讀取數(shù)據(jù),可以使用 Text Stream對(duì)象的Read Line方法,一次讀取一行內(nèi)容,并可以將其存儲(chǔ)之變量中。
圖1 讀取DXF文件流程圖Fig.1 Flow chart of reading DXF files
讀出來(lái)的DXF數(shù)據(jù)包含組碼以及圖形元素的數(shù)據(jù),需要進(jìn)一步將其提取和規(guī)劃,鑒于Flash Action Script有很強(qiáng)的處理XML文件的能力,另一方面XML文件也非常適合在網(wǎng)絡(luò)上傳輸和共享,因此在讀出DXF文件的數(shù)據(jù)之后,將其轉(zhuǎn)換成XML文件。在XML的體系中,XML Schema的作用是定義XML文檔的合法構(gòu)建模塊,通過(guò)Schema模板,程序可以驗(yàn)證外部接收到的數(shù)據(jù)的正確性。下面給出Schema文件中關(guān)于直線的相關(guān)定義,其他實(shí)體的數(shù)據(jù)模板與直線的定義相似。
3.3.1 讀取XML文件中的圖形數(shù)據(jù)
Flash Player在5.0以后的版本中提供一個(gè)XML類,使用XML類的load方法將指定XML文件的數(shù)據(jù)讀取至數(shù)組中,然后通過(guò)childnode以及firstchild等屬性獲取指定位置數(shù)據(jù)。接下來(lái)將數(shù)據(jù)交由 Movie Clip類提供的繪圖方法在Flash的舞臺(tái)上繪制相應(yīng)的圖形。
3.3.2 繪制圖形元素
Flash的Action Script腳本中提供一個(gè)Movie Clip類,該類的方法主要提供的功能與定位影片剪輯的動(dòng)作所提供的功能相同,除此之外還提供在Flash動(dòng)畫(huà)中實(shí)時(shí)繪圖。利用其提供的這些繪圖方法將DXF中的圖形數(shù)據(jù)繪制在Flash的動(dòng)畫(huà)舞臺(tái)上。Movie Clip類提供的繪圖方法只提供基本的移動(dòng)繪制點(diǎn)、直線、填充、設(shè)置線型樣式和曲線,這些只能滿足CAD圖形元素中的一部分要求,對(duì)于圓和圓弧以及橢圓Movie Clip類都沒(méi)有提供相應(yīng)的繪制方法,但其提供的曲線的實(shí)質(zhì)就是二次貝賽爾曲線,因此可以采用這個(gè)方法擬合所需要的圖形元素。二次貝賽爾曲線包含兩個(gè)錨點(diǎn)和一個(gè)控制點(diǎn)。該曲線內(nèi)插這兩個(gè)錨點(diǎn),并向控制點(diǎn)彎曲。二次貝賽爾曲線的數(shù)據(jù)點(diǎn)只有3個(gè)因此便于存儲(chǔ),也便于快速繪制圖形,但缺點(diǎn)也是顯而易見(jiàn)的,如果要精確擬合成圓或者圓弧,就需要較多段的曲線。以下給出分8段繪制擬合一個(gè)圓的函數(shù)。
圖2 二次貝塞爾曲線Fig.2 Quadratic Bezier curves
Movie Clip.curveTo(controlX,controlY,anchorX,anchorY)方法的4個(gè)參數(shù)都是整數(shù),前兩個(gè)分別用于指定控制點(diǎn)的水平位置、垂直位置。后兩個(gè)指定下一個(gè)錨記點(diǎn)的水平位置、垂直位置。但在CAD系統(tǒng)中圓的信息存儲(chǔ)形式往往是圓心坐標(biāo)以及半徑值,因此在使用這個(gè)方法擬合圓的時(shí)候需要進(jìn)行換算。
圓弧雖然是圓的一部分,但在繪制的時(shí)候卻不完全一致。繪制圓弧分兩種情況,一種是小于等于45°的圓弧,此種圓弧較為簡(jiǎn)單,只需要繪制一段曲線擬合即可,由于圓弧的起點(diǎn)是任意位置因此需要對(duì)其進(jìn)行計(jì)算轉(zhuǎn)換。另一種是小于等于360°,其畫(huà)法與繪制圓的方法類似。以下是繪制小于等于45°的圓弧的方法,其中mc是創(chuàng)建的的剪輯對(duì)象,ox與oy是圓心的坐標(biāo),r表示半徑origin_angle表示圓弧的起始角度,angle是弧的角度,正數(shù)順時(shí)針畫(huà)弧,負(fù)數(shù)逆時(shí)針畫(huà)弧。thickness、rbg、alpha為設(shè)置線型的參數(shù)。返回值為圓弧終點(diǎn)坐標(biāo),終點(diǎn)為角度大的點(diǎn),與angle符號(hào)無(wú)關(guān)。
對(duì)于擬合小于等于360°的圓弧,也采用分段方式進(jìn)行,由于擬合是從任意角度開(kāi)始,因此起點(diǎn)需要計(jì)算而不能采用繪制圓時(shí)的方法,
以上代碼中sinD與cosD是以角度值為參數(shù)計(jì)算正弦值和余弦值的函數(shù)[7]。
通過(guò)在Web方式下顯示DXF文件可以跟進(jìn)一步促進(jìn)CAD圖形文件的交流,同樣也可以通過(guò)企業(yè)內(nèi)部網(wǎng)提供一種新的工藝文件在線傳遞的方法,以及進(jìn)一步促進(jìn)企業(yè)信息化。同時(shí)這也為實(shí)現(xiàn)在線CAD系統(tǒng)的實(shí)現(xiàn)提供了一種切實(shí)可行的方法。
[1]魏建軍,歐陽(yáng)一鳴,杜曉榮,等.基于XML的AutoCAD圖形與SVG圖形轉(zhuǎn)換研究[J].微電子學(xué)與計(jì)算機(jī),2005(2):58-62.WEI Jian-Jun, OUYANG Yi-ming, DU Xiao-rong, et al.XML-based SVG graphics convert AutoCAD drawing and research[J].Microelectronics and Computer,2005(2):58-62.
[2]張衛(wèi)峰,林端敏.AutoCAD軟件的DXF接口技術(shù)[J].機(jī)械與電子,2004(11):45-47.ZHANG Wei-feng,LIN Duan-min.AutoCAD DXF software interface technology[J].Machinery and Electronic,2004(11):45-47.
[3]孫放,陳云芳,林杭鋒.適用于富客戶端的云計(jì)算模型[J].計(jì)算機(jī)技術(shù)與發(fā)展,2010(8):23-25.SUN Fang, CHEN Yun-fang, LIN Hang-feng.Suitable for rich client cloud computing model[J].Computer Technology and Development,2010(8):23-25.
[4]百度百科.富客戶端[EB/OL].[2011-12-267]http://baike.baidu.com/view/1330363.htm.
[5]劉傳亮,陸建德.AutoCAD DXF文件格式與二次開(kāi)發(fā)圖形軟件編程[J].微機(jī)發(fā)展,2004(9):78-79.LIU Chuan-liang,LU Jian-de.AutoCAD DXF file format and the secondary development of graphics software programming[J].Microcomputer Development,2004(9):78-79.
[6]郭朝勇.AutoCAD R14(中文版)二次開(kāi)發(fā)技術(shù)[M].北京:清華大學(xué)出版社,1999.
[7]boenlee.制作隨機(jī)畫(huà)圓弧動(dòng)畫(huà)[EB/OL].(2008-3)http://www.webjx.com/flash/example-4886.html.