DXF結構解析以及坐標讀取(非常清晰)_第1頁
DXF結構解析以及坐標讀取(非常清晰)_第2頁
DXF結構解析以及坐標讀取(非常清晰)_第3頁
DXF結構解析以及坐標讀取(非常清晰)_第4頁
DXF結構解析以及坐標讀取(非常清晰)_第5頁
已閱讀5頁,還剩2頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、DXF結構解析以及坐標讀取(非常清晰)DXF文件的結構很清楚,具體如下:1 .標題段(HEADER )有關圖形的一般信息都可以DXF文件的這一節找到,每一個參數具有一個變量名和一個相關值。2 .表段這一段包含的指定項的定義,它包括:a、線形表(LTYPE)b、層表(LYER)c、字體表(STYLE )d、視圖表(VIEW )e、用戶坐標系統表(UCS )f、視窗配置表(VPORT )g、標注字體表(DIMSTYLE )h、申請符號表(APPID )3 .塊段(BLOCKS )這一段含有塊定義實體,這些實體描述了圖形種組成每個塊的實體。4 .實體段(ENTITIES )這一段含有實體,包括任何塊

2、的調用。5 . END OF FILE (文件結束)下面是對DXF的基本結構舉一實例進行說明:0 0 后接 SECTIONSECTION 表明這是一個段的開始2 2后接的是段名HEADER說明該段是HEADER 段(標題段)9$ACADVER 文件是由AUTOCAD 產生的1AC10089 9 后接 $UCSORG$UCSORG用戶坐標系原點在世界坐標系中的坐標10 10 對應X0.0 X 的值20 20 對應Y0.0 Y 的值30 30 對應Z0.0 Z 的值9$UCSXDIR 這是一段不太相關的部分,略去101.0 .9 9 后接 $EXTMIN $EXTMIN 說明三維實體模型在世界坐標

3、系中的最小值10 10 對應X-163.925293 X 的值20 20 對應Y -18.5415860.0 Y 的值30 30 對應Z78.350945 Z 的值9 9 后接 $EXTMAN $EXTMAX說明三維實體模型在世界坐標系中的最大值10 10 對應X202.492279 X 的值20 20 對應Y 112.634300 Y 的值30 30 對應Z 169.945602 Z 的值0 0 后接 ENDSEC ENDSEC 說明這一段結束了0 0 后接 SECTIONSECTION 表明這是一個段的開始2 2后接的是段名TABLES說明該段是TABLES段(表段) 該段對我們不太相關,

4、此處略去不進行說明 0 0 后接 ENDSECENDSEC 說明這一段結束了0 0 后接 SECTIONSECTION 表明這是一個段的開始2 2后接的是段名ENTITIES 說明該段是 ENTITIES 段(實體段)這是我0們要詳細說明的段,該段包含了所有實體的POLYLINE點的坐標和組成面的點序。 0后接POLYLINE8表明以下數據是對于一個新的實體;OBJECT01 8 后接的字符串是這個實體的名稱 66 1 70 從 66 1 到 70 6464說明該實體是由許多小平面組成的 7138 71 38 說明該實體共有38個點 7272 72 72 說明該實體由72個三角形構成 0 0

5、VERTEXVERTEX表明后面緊跟著的是實體的數據 8 OBJECT0110對應X坐標-163.925293 X 的值20對應Y坐標-17.772665 Y 的值30對應Z坐標128.929947 Z 的值70 70 192192表明上面的數據信息是點的坐標0每一個從0 VERTEX 至U 70 192 之間VERTEX的一小段是點的坐標 701920VERTEX8OBJECT01100200300當70后跟128時,表明該實體的每個點的坐標數據已經記錄70完了,下面緊跟著的是記錄這些點是以什么樣的方式組合成各128個三角形。71 71、72、73后面跟著的值表明某一個三角形是第二個、第2

6、一個、第四個點構成的,點的順序是按照記入DXF文件的順72序。當某一值為負數時,則表明該點到下一點的線不要畫出,1如果要畫三維實體的線型圖,就必須使用這一特性,否則線條73將會出現紊亂。-40VERTEX 0 0后接SEQEND表明該實體的數據已經全部記錄完了SEQEND8OBJECT010POLYLINE 0 后接POLYLINE表明以下又是一個新的實體0ENDSEC 0 后接ENDSEC表明這是該段的結尾 0EOF 0后接EOF表明這個DXF文件結束了在DXF文件中,我們最關心的是如何得到模型上各個點的坐標,并且用這些點連成許多個三用形,構成面,進而繪制出整個模型。在 DXF文件的結構中,

7、我們已經看到,DXF文件先敘述實體上各個點的坐標,然后敘述實體上有多少個面,每個面由哪些點構成。這 樣,我們至少需要 2個數組來存儲一個實體的信息,一個用于存儲點的坐標,一個用于存 儲點序,我們可以把這 2個數組放到一個結構中,如果模型中實體的數目不止一個是,我 們就用這個結構來定義一個數組。在本文中,我們使用Visual C+ 6.0來寫一個讀取DXF文件的小程序。在實際應用中,模型中實體的數目以及實體中點和面的數目都是不定的,為了有效地利用 內存,我們選擇 MFC類庫中的聚合類 CobArray 類所創建的對象 vertex, sequence 來 存儲和管理實體的點坐標和點序。CObAr

8、ray 類是一個用來存放數組類的聚合類,它能根據要存進來的數組(或結構)多少 自動進行自身大小的高速,而且這個類本身具有的成員函數使得我們對它的對象的操作更 加方便、快捷,用它編的程序也易于讀懂。三維實體模型的模型信息中的一部分信息可以在標題段中讀出,通過讀取變量名為 $UCSORG的三個變量,可以得到三維實體在世界坐標系中自身所定義的用戶坐標系原 點的三維坐標。通過讀取$EXTMAX , $ EXTMIN 可以獲知三維實體在世界坐標系中的范圍,而其它部分的信息只有讀完了全部DXF文件后才可以通過計算確定。對于三維實體模型的全部點坐標、點序,可以在實體段中按照前面介紹的DXF文件基本結構讀出。

9、現在我們開始寫這個程序。先建立一個頭文件 HEAD.H定義如下的結構:VERTEX, SEQUENCE 和類CVertex, Csequence 。typedef struct float x,y,z;VERTEX; 結構VERTEX用來存儲點的坐標typedef struct int a,b,c;SEQUENCE; 結構SEQUENCE用來存儲實體的面的組成typedef struct char obName20;定義結構myVertex 來存儲實體的名字,點的坐標以及面的組成,CObArray Vertex;其中,點的坐標和面的組成是由聚合類CObArray 定義的對象來CObArray

10、Sequence;在存儲的,我們可以把VERTEX結構和SEQUENCE 結構加入到myVertex;這兩個對象中保存class CVertex : public CObject因為CObArray 類的對象中只能加入由CObject派生的對象,所以protected:我們還需要建立一個由 CObject類派生的CVertex 類。在CVertex類CVertex();中有一個VERTEX結構的變量:m_vertex ,信息實際上是存儲在這DECLARE_DYNCREATE(CVertex)個變量中的。virtual CVertex();/ Attributespublic: 我們還需要建立一

11、個由 CObject類派生的CVertex 類。在CVertex 類 CVertex(VERTEX& ver);中有一個VERTEX結構的變量:m_vertex ,信息實際上是存儲在這個變量中的,函數 CVertex(VERTEX& ver) 把VERTEX 結構的變量 VERTEX m_vertex; 存入 CObArray 對象中。;class CSequence : public CObject這也是一個由 CObject類派生的類,作用和剛才 CVertex 類一樣, protected:只不過Csequence 類是用來存儲實體中面的組成(點序)的。CSequence();DECLA

12、RE_DYNCREATE(CSequence) virtual CSequence();public:CSequence(SEQUENCE& sequ);SEQUENCE m_sequence;;一聲明好結構與類后,我們還需要建立一個.CPP文件,來定義幾個函數。IMPLEMENT_DYNCREATE(CVertex,CObject)CVertex:CVertex()CVertex:CVertex()構造函數和銷毀函數都是空的 CVertex:CVertex(VERTEX& ver)這個函數的作用是:把一個 VERTEX結構的數據存入變量 m_vertex 中 m_vertex = ver;它

13、是這個類中最重要的一環。IMPLEMENT_DYNCREATE(CSequence,CObject)CSequence:CSequence() Csequence類的定義與CVertex類的定義差不多,只是其中的參數m_sequence的類型和CVertex 類中的參數my_vertex的類型不一樣CSequence:CSequence() CSequence:CSequence(SEQUENCE& sequ)m_sequence=sequ; 一然后用結構myVertex(如前所定義)定義一個指針*myData ,目的在于根據模型中實體的多少來給指針分配合適的內存,使之成為結構數組。定義一個函

14、數,用于確定模型中有多少個實體,函數的返回值就是實體的個數。int CJupiterView:getObjectNumber() char str110,str210;char name=theFirst;int num;num=0;FILE* fp;fp=fopen(data.dxf,r);打開 DXF 文件,data.dxfwhile(! feof(fp) & ! ferror(fp)這個函數是根據實體的名字來判斷實體的個數的所以函數只讀取實體的名字,一旦出現新的實體名字,fscanf(fp,%sn,str1); 實體數就加一。if(strcmp(str1,VERTEX)=0)fscanf

15、(fp,%sn,str2);打開 DXF 文件,data.dxffscanf(fp,%sn,str2);這個函數是根據實體的名字來判斷實體的個數的if(strcmp(name,str2) != 0)所以函數只讀取實體的名字,一旦出現新的實體名字,實體數就加一。strcpy(name,str2);num+;fclose(fp);return num;以下是讀取實體點的坐標以及點序的程序代碼,在這個程序中,讀取了模型中點的坐標的 最大值與最小值、實體的名字、點的坐標,以及點序。void CJupiterView:OnFileInput()/ TODO: Add your command handl

16、er code hereFILE* fp,*fp2;int i,k,j;float tempX,tempY,tempZ;float xMin,yMin,zMin,xMax,yMax,zMax,Max;int lab;char str120,str220,str20,HT;char myName20;int myNumber;VERTEX tempVertex;SEQUENCE tempSequence;typedef struct float x,y,z,max;MAX;MAX max;HT=9;objectNumber=getObjectNumber();myData=new myVerte

17、xobjectNumber;fp=fopen(FileName,r);i=0;j=0;k=0;myNumber=-1;strcpy(myName,ObjectName);while(! feof(fp) & ! ferror(fp)fscanf(fp,%sn,str);if(strcmp(str,$EXTMIN)=0)fscanf(fp,%sn,str1);fscanf(fp,%fn,&xMin);fscanf(fp,%sn,str1);fscanf(fp,%fn,&yMin);fscanf(fp,%sn,str1); fscanf(fp,%fn,&zMin);if(strcmp(str,$E

18、XTMAX)=0)fscanf(fp,%sn,str1);fscanf(fp,%fn,&xMax);fscanf(fp,%sn,str1);fscanf(fp,%fn,&yMax);fscanf(fp,%sn,str1);fscanf(fp,%fn,&zMax);max.x=max(abs(xMax),abs(xMin); max.y=max(abs(yMax),abs(yMin); max.z=max(abs(zMax),abs(zMin); max.max=max(max.x,max.y);max.max=max(max.max,max.z);if(strcmp(str,VERTEX) =0)fscanf(fp,%sn,str1);fscanf(fp,%sn,str1);if(strcmp(myName,str1) != 0)myNumber+;strcpy(myName,str1);strcpy(myData+myNumber)-obName,my

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論