A. DXF文件結構(在線等!!!!)
DXF文件實際上是ASCII編碼文件,可以用記事本打開。
DXF 文件本質上由代碼及關聯值對組成。 代碼(通常稱為組碼)表明其後的值的類型。 使用這些組碼和值對,可以將 DXF 文件組織到由記錄組成的區域中,這些記錄由組碼和數據項目組成。 在 DXF 文件中,每個組碼和值都各佔一行。
DXF 文件由多個段組成,每段都以一個0和後跟字元串 SECTION 的組碼開始, 其後是組碼 2 和表示該段名稱的字元串(例如,HEADER)。 每段都由定義其元素的組碼和值組成。 每段都以一個0和後跟字元串 ENDSEC 的組碼結束。
完整的結構如下:
HEADER 段。 包含圖形的基本信息。 它由 AutoCAD 資料庫版本號和一些系統變數組成。 每個參數都包含一個變數名稱及其關聯的值。
CLASSES 段。包含應用程序定義的類的信息,這些類的實例出現在資料庫的 BLOCKS、ENTITIES 和 OBJECTS 段中。 類定義在類的層次結構中是固定不變的。
TABLES 段。包含以下符號表的定義:
APPID(應用程序標識表)
BLOCK_RECORD(塊參照表)
DIMSTYLE(標注樣式表)
LAYER(圖層表)
LTYPE(線型表)
STYLE(文字樣式表)
UCS(用戶坐標系表)
VIEW(視圖表)
VPORT(視口配置表)
BLOCKS 段。包含構成圖形中每個塊參照的塊定義和圖形圖元。
ENTITIES 段。包含圖形中的圖形對象(圖元),其中包括塊參照(插入圖元)。一般屏幕上顯示的圖形對像如直線,圓,弧等都在ENTITIES 段
OBJECTS 段。包含圖形中的非圖形對象。 除圖元、符號表記錄以及符號表以外的所有對象都存儲在此段。 OBJECTS 段中的條目樣例是包含多線樣式和組的詞典。
THUMBNAILIMAGE 段。包含圖形的預覽圖像數據。 此段為可選
你所問的是立體(3DSOLID),它的編碼比較復雜,建議你先把平面圖元的DXF格式搞明白,再研究三維圖元的格式,以下是一個500*150的矩形ENTITIES 段代碼:
0
SECTION 段
2 段名稱
ENTITIES 實體段
0 圖元名稱
LWPOLYLINE 優化多段線
5 圖元名柄
B51
330
1F
100 子類標記
AcDbEntity
8 圖層名
0
100 子類標記
AcDbPolyline
90 頂點數
4
70 多段線標志(按位編碼);默認值為 0。1 = 閉合;128 = Plinegen
1
43 固定寬度(可選;默認值 = 0)。
0.0
10 頂點坐標X值(在 OCS 中),多個條目;每個頂點一個條目
134.0867442224547
20 頂點坐標Y值
111.6472309466625
10
634.0867442224547
20
111.6472309466625
10
634.0867442224547
20
-38.35276905333746
10
134.0867442224547
20
-38.35276905333746
0 段結束標記
ENDSEC
上面4組10,20的值分別是矩形的4個頂點的X和Y坐標
3DSOLID 三維實體組碼
組碼
說明
100
子類標記 (AcDbModelerGeometry)
70
建模格式版本號(當前值 = 1)
1
所有權數據(多行,每行 < 255 個字元)
3
所有權數據的附加行(如果前一個組 1 的字元串長度大於 255 個字元)(可選)
下面的是500*150*10的長方體ENTITIES 段代碼,可能難看懂了,呵呵
0
SECTION
2
ENTITIES
0
3DSOLID
5
B51
330
1F
100
AcDbEntity
8
0
100
AcDbModelerGeometry
70
1
1
mogoo gi m o
1
ni ^ *+0;:,4 ^ *+0\^ [ nh ^ LR iqoqjqhook QK mk L*1 [:< mg nkekgeln moog
1
n fqfffffffffffffffj:rooh n:rono
1
>,27:>;:- {rn rn _nm mogqoqjqhook |
1
=0;& {rn rn {rn {m {rn {rn |
1
3*2/ {rn rn {rn {rn {l {n |
1
,7:33 {rn rn {rn {rn {rn {k {rn {m |
1
9><: {rn rn {rn {j {i {l {rn {h 90-(>-; ,6183: |
1
9><: {rn rn {rn {g {f {l {rn {no -:):-,:; ,6183: |
1
300/ {rn rn {rn {rn {nn {k |
1
/3>1:r,*-9><: {rn rn {rn mjkqjlknojiglkjmij flqnkggiklojhohlm no o o n n o o 90-(>-;@) V V V V |
1
9><: {rn rn {rn {nm {nl {l {rn {nk -:):-,:; ,6183: |
1
300/ {rn rn {rn {rn {nj {j |
1
/3>1:r,*-9><: {rn rn {rn mjkqjlknojiglkjmij flqnkggiklojhohlm o o o n n o o 90-(>-;@) V V V V |
1
<0:;8: {rn rn {rn {ni {nh {ng {nf 90-(>-; {i {rn |
1
9><: {rn rn {rn {mo {mn {l {rn {mm -:):-,:; ,6183: |
1
300/ {rn rn {rn {rn {ml {g |
1
/3>1:r,*-9><: {rn rn {rn mjkqjlknojiglkjmij ngqnkggiklojhohlm j o n o o o n 90-(>-;@) V V V V |
1
<0:;8: {rn rn {rn {mk {mj {mi {mh 90-(>-; {f {rn |
1
<0:;8: {rn rn {rn {mg {nn {mf {lo 90-(>-; {i {rn |
1
<0:;8: {rn rn {rn {nn {mg {ln {lm 90-(>-; {i {rn |
1
<0:;8: {rn rn {rn {ll {lk {nn {nf -:):-,:; {lj {rn |
1
:;8: {rn rn {rn {li rhj {lh hj {ng {lg 90-(>-; _h *1410(1 |
1
9><: {rn rn {rn {lf {ko {l {rn {kn -:):-,:; ,6183: |
1
300/ {rn rn {rn {rn {km {nm |
1
/3>1:r,*-9><: {rn rn {rn kqjlknojiglkjmijnm flqnkggiklojhohlm j n o o o o rn 90-(>-;@) V V V V |
1
<0:;8: {rn rn {rn {kl {ln {kk {kj 90-(>-; {nl {rn |
1
<0:;8: {rn rn {rn {ki {nj {kl {kh 90-(>-; {f {rn |
1
<0:;8: {rn rn {rn {nj {ki {kg {kf 90-(>-; {f {rn |
1
<0:;8: {rn rn {rn {lk {ll {nj {mh -:):-,:; {lj {rn |
1
:;8: {rn rn {rn {jo rhj {jn hj {mi {jm 90-(>-; _h *1410(1 |
1
<0:;8: {rn rn {rn {nh {ni {jl {jk 90-(>-; {i {rn |
1
<0:;8: {rn rn {rn {jj {ji {ni {lo -:):-,:; {ko {rn |
1
:;8: {rn rn {rn {lh rmjo {jh mjo {mf {jg 90-(>-; _h *1410(1 |
1
<0:;8: {rn rn {rn {ml {jf {nh {lm -:):-,:; {nl {rn |
1
:;8: {rn rn {rn {io rmjo {li mjo {ln {in 90-(>-; _h *1410(1 |
1
<0:;8: {rn rn {rn {mi {ng {jf {im 90-(>-; {lj {rn |
1
<0:;8: {rn rn {rn {ng {mi {jj {il -:):-,:; {lj {rn |
1
300/ {rn rn {rn {rn {ll {lf |
1
):-+:' {rn rn {rn {nf {ik |
1
):-+:' {rn rn {rn {nf {ij |
1
,+->687+r<*-): {rn rn {rn jokqjlknojiglkjmij flqnkggiklojhohlm no o n o V V |
1
9><: {rn rn {rn {rn {lj {l {rn {ii -:):-,:; ,6183: |
1
300/ {rn rn {rn {rn {jj {mo |
1
/3>1:r,*-9><: {rn rn {rn mjkqjlknojiglkjmij nigqnkggiklojhohlm j o rn o o o rn 90-(>-;@) V V V V |
1
<0:;8: {rn rn {rn {ih {jl {ji {ig 90-(>-; {mn {rn |
1
<0:;8: {rn rn {rn {jf {ml {mk {kh -:):-,:; {nl {rn |
1
<0:;8: {rn rn {rn {jl {ih {ml {kj -:):-,:; {mn {rn |
1
:;8: {rn rn {rn {io rj {if j {kk {ho 90-(>-; _h *1410(1 |
1
<0:;8: {rn rn {rn {mj {mk {ih {hn 90-(>-; {f {rn |
1
:;8: {rn rn {rn {jn rmjo {if mjo {kl {hm 90-(>-; _h *1410(1 |
1
<0:;8: {rn rn {rn {ji {jj {mj {kf -:):-,:; {ko {rn |
1
:;8: {rn rn {rn {hl rmjo {jo mjo {kg {hk 90-(>-; _h *1410(1 |
1
):-+:' {rn rn {rn {mh {hj |
1
):-+:' {rn rn {rn {im {hi |
1
,+->687+r<*-): {rn rn {rn jokqjlknojiglkjmij flqnkggiklojhohlm o o rn o V V |
1
<0:;8: {rn rn {rn {km {kk {mg {jk -:):-,:; {mn {rn |
1
:;8: {rn rn {rn {jh rhj {io hj {jl {hh 90-(>-; _h *1410(1 |
1
<0:;8: {rn rn {rn {kg {mf {lk {il 90-(>-; {ko {rn |
1
<0:;8: {rn rn {rn {mf {kg {km {ig -:):-,:; {ko {rn |
1
):-+:' {rn rn {rn {lo {hg |
1
,+->687+r<*-): {rn rn {rn mjkqjlknojiglkjmij nigqnkggiklojhohlm no rn o o V V |
1
<0:;8: {rn rn {rn {ln {kl {ll {im -:):-,:; {nl {rn |
1
):-+:' {rn rn {rn {jk {hf |
1
,+->687+r<*-): {rn rn {rn mjkqjlknojiglkjmij ngqnkggiklojhohlm no n o o V V |
1
:;8: {rn rn {rn {li rj {jn j {ll {go 90-(>-; _h *1410(1 |
1
:;8: {rn rn {rn {lh rj {jo j {lk {gn 90-(>-; _h *1410(1 |
1
/061+ {rn rn {rn jokqjlknojiglkjmij ngqnkggiklojhohlm no |
1
/061+ {rn rn {rn jokqjlknojiglkjmij nigqnkggiklojhohlm no |
1
/3>1:r,*-9><: {rn rn {rn jokqjlknojiglkjmij flqnkggiklojhohlm j rn o o o o n 90-(>-;@) V V V V |
1
<0:;8: {rn rn {rn {kk {km {ki {hn -:):-,:; {mn {rn |
1
:;8: {rn rn {rn {jh rj {hl j {ji {gm 90-(>-; _h *1410(1 |
1
):-+:' {rn rn {rn {hn {gl |
1
,+->687+r<*-): {rn rn {rn kqjlknojiglkjmijnm ngqnkggiklojhohlm j o o rn V V |
1
:;8: {rn rn {rn {if rhj {hl hj {ih {gk 90-(>-; _h *1410(1 |
1
,+->687+r<*-): {rn rn {rn mjkqjlknojiglkjmij ngqnkggiklojhohlm o rn o o V V |
1
):-+:' {rn rn {rn {kf {gj |
1
,+->687+r<*-): {rn rn {rn mjkqjlknojiglkjmij nigqnkggiklojhohlm o n o o V V |
1
/061+ {rn rn {rn jokqjlknojiglkjmij nigqnkggiklojhohlm o |
1
/061+ {rn rn {rn jokqjlknojiglkjmij ngqnkggiklojhohlm o |
1
,+->687+r<*-): {rn rn {rn kqjlknojiglkjmijnm flqnkggiklojhohlm no o rn o V V |
1
/061+ {rn rn {rn kqjlknojiglkjmijnm nigqnkggiklojhohlm no |
1
/061+ {rn rn {rn kqjlknojiglkjmijnm ngqnkggiklojhohlm no |
1
,+->687+r<*-): {rn rn {rn jokqjlknojiglkjmij ngqnkggiklojhohlm j o o rn V V |
1
,+->687+r<*-): {rn rn {rn jokqjlknojiglkjmij nigqnkggiklojhohlm j o o rn V V |
1
,+->687+r<*-): {rn rn {rn kqjlknojiglkjmijnm nigqnkggiklojhohlm j o o rn V V |
1
/061+ {rn rn {rn kqjlknojiglkjmijnm ngqnkggiklojhohlm o |
1
,+->687+r<*-): {rn rn {rn kqjlknojiglkjmijnm flqnkggiklojhohlm o o n o V V |
1
/061+ {rn rn {rn kqjlknojiglkjmijnm nigqnkggiklojhohlm o |
0
ENDSEC
B. dxf文件格式詳解
dxf最初是Autodesk公司開發的用於AutoCAD與其它軟體之間進行CAD數據交換的文件格式,是一種開源的CAD數據文件格式。dxf文件是一種矢量圖像文件,是以二進制格式保存的,分為ASCII格式和二進制格式。兩者格式區別就是佔用空間大小的區別。
dxf文件是一個2D轉換的格式,它是是由很多的「代碼」和「值」組成的「數據對」構造而成,這里的代碼稱為「組碼」,指定其後的值的類型和用途。每個組碼和值必須為單獨的一行的。
dxf文件使用任何制圖軟體都可以打開,方法就是(文件--導入),注意不是用打開的方式而是導入!ASCII格式的dxf文件可以用文本編輯器進行查看,比如DWG/DWF/DXF查看器,Free DWG Viewer。
C. 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 )
這一段含有實體,包括任何塊的調用。
5. END OF FILE(文件結束)
下面是對DXF的基本結構舉一實例進行說明:
0 0 後接SECTION
SECTION 表明這是一個段的開始
2 2 後接的是段名
HEADER 說明該段是HEADER 段(標題段)
9
$ACADVER 文件是由AUTOCAD 產生的
1
AC1008
9 9 後接 $UCSORG
$UCSORG 用戶坐標系原點在世界坐標系中的坐標
10 10 對應 X
0.0 X 的值
20 20 對應 Y
0.0 Y 的值
30 30 對應 Z
0.0 Z 的值
9
$UCSXDIR 這是一段不太相關的部分,略去
10
1.0
... ....
9 9 後接 $EXTMIN
$EXTMIN 說明三維實體模型在世界坐標系中的最小值
10 10 對應 X
-163.925293 X 的值
20 20 對應 Y
-18.5415860.0 Y 的值
30 30 對應 Z
78.350945 Z 的值
9 9 後接 $EXTMAN
$EXTMAX 說明三維實體模型在世界坐標系中的最大值
10 10 對應 X
202.492279 X 的值
20 20 對應 Y
112.634300 Y 的值
30 30 對應 Z
169.945602 Z 的值
0 0 後接 ENDSEC
ENDSEC 說明這一段結束了
0 0 後接SECTION
SECTION 表明這是一個段的開始
2 2 後接的是段名
TABLES 說明該段是TABLES 段(表段)
... ... ... ... 該段對我們不太相關,此處略去不進行說明
0 0 後接 ENDSEC
ENDSEC 說明這一段結束了
0 0 後接SECTION
SECTION 表明這是一個段的開始
2 2 後接的是段名
ENTITIES 說明該段是ENTITIES 段(實體段)這是我
0 們要詳細說明的段,該段包含了所有實體的
POLYLINE 點的坐標和組成面的點序。0後接POLYLINE
8 表明以下數據是對於一個新的實體;
OBJECT01 8後接的字元串是這個實體的名稱
66
1
70 從66 1 到70 64
64 說明該實體是由許多小平面組成的
71
38 71 38說明該實體共有38 個點
72
72 72 72 說明該實體由72 個三角形構成
0 0 VERTEX
VERTEX 表明後面緊跟著的是實體的數據
8
OBJECT01
10 對應X 坐標
-163.925293 X 的值
20 對應Y 坐標
-17.772665 Y 的值
30 對應Z 坐標
128.929947 Z 的值
70 70 192
192 表明上面的數據信息是點的坐標
0 每一個從0 VERTEX 到70 192 之間
VERTEX 的一小段是點的坐標
... ... ...
70
192
0
VERTEX
8
OBJECT01
10
0
20
0
30
0 當70 後跟128 時,表明該實體的每個點的坐標數據已經記錄
70 完了,下面緊跟著的是記錄這些點是以什麼樣的方式組合成各
128 個三角形。
71 71、72、73 後面跟著的值表明某一個三角形是第二個、第
2 一個、第四個點構成的,點的順序是按照記入DXF 文件的順
72 序。當某一值為負數時,則表明該點到下一點的線不要畫出,
1 如果要畫三維實體的線型圖,就必須使用這一特性,否則線條
73 將會出現紊亂。
-4
0
VERTEX
... ... ... ...
0 0 後接SEQEND 表明該實體的數據已經全部記錄完了
SEQEND
8
OBJECT01
0
POLYLINE 0 後接POLYLINE 表明以下又是一個新的實體
... ... ... ...
0
ENDSEC 0 後接ENDSEC 表明這是該段的結尾
0
EOF 0後接EOF 表明這個DXF 文件結束了
在 DXF文件中,我們最關心的是如何得到模型上各個點的坐標,並且用這些點連成許多個三用形,構成面,進而繪制出整個模型。在DXF文件的結構中,我們已經看到,DXF文件先敘述實體上各個點的坐標,然後敘述實體上有多少個面,每個面由哪些點構成。這樣,我們至少需要2個數組來存儲一個實體的信息,一個用於存儲點的坐標,一個用於存儲點序,我們可以把這2個數組放到一個結構中,如果模型中實體的數目不止一個是,我們就用這個結構來定義一個數組。在本文中,我們使用 Visual C++ 6.0 來寫一個讀取DXF文件的小程序。
在實際應用中,模型中實體的數目以及實體中點和面的數目都是不定的,為了有效地利用內存,我們選擇MFC類庫中的聚合類CobArray類所創建的對象vertex, sequence來存儲和管理實體的點坐標和點序。
CObArray類是一個用來存放數組類的聚合類,它能根據要存進來的數組(或結構)多少自動進行自身大小的高速,而且這個類本身具有的成員函數使得我們對它的對象的操作更加方便、快捷,用它編的程序也易於讀懂。
三維實體模型的模型信息中的一部分信息可以在標題段中讀出,通過讀取變數名為$UCSORG的三個變數,可以得到三維實體在世界坐標系中自身所定義的用戶坐標系原點的三維坐標。通過讀取$EXTMAX,$EXTMIN可以獲知三維實體在世界坐標系中的范圍,而其它部分的信息只有讀完了全部DXF文件後才可以通過計算確定。對於三維實體模型的全部點坐標、點序,可以在實體段中按照前面介紹的DXF文件基本結構讀出。現在我們開始寫這個程序。
先建立一個頭文件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 obName[20]; 定義結構myVertex來存儲實體的名字,點的坐標以及面的組成,
CObArray Vertex; 其中,點的坐標和面的組成是由聚合類CObArray定義的對象來
CObArray Sequence; 在存儲的,我們可以把VERTEX結構和SEQUENCE結構加入到
}myVertex; 這兩個對象中保存
class CVertex : public CObject
{ 因為CObArray類的對象中只能加入由CObject派生的對象,所以
protected: 我們還需要建立一個由CObject類派生的CVertex類。在CVertex類
CVertex(); 中有一個VERTEX結構的變數:m_vertex,信息實際上是存儲在這
DECLARE_DYNCREATE(CVertex) 個變數中的。
virtual ~CVertex();
// Attributes
public: 我們還需要建立一個由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();
DECLARE_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; 它是這個類中最重要的一環。
}
IMPLEMENT_DYNCREATE(CSequence,CObject)
CSequence::CSequence()
{
} Csequence類的定義與CVertex類的定義差不多,只是其中的參數
m_sequence的類型和CVertex類中的參數my_vertex的類型不一樣
CSequence::~CSequence()
{
}
CSequence::CSequence(SEQUENCE& sequ)
{
m_sequence=sequ;
}
然後用結構myVertex(如前所定義)定義一個指針*myData,目的在於根據模型中實體的多少來給指針分配合適的內存,使之成為結構數組。
定義一個函數,用於確定模型中有多少個實體,函數的返回值就是實體的個數。
int CJupiterView::getObjectNumber()
{
char str1[10],str2[10];
char name[]="theFirst";
int num;
num=0;
FILE* fp;
fp=fopen("data.dxf","r"); 打開DXF文件,data.dxf
while(! feof(fp) && ! ferror(fp)) 這個函數是根據實體的名字來判斷實體的個數的
{ 所以函數只讀取實體的名字,一旦出現新的實體名字,
fscanf(fp,"%s\n",str1); 實體數就加一。
if(strcmp(str1,"VERTEX")==0)
{
fscanf(fp,"%s\n",str2); 打開DXF文件,data.dxf
fscanf(fp,"%s\n",str2) ;這個函數是根據實體的名字來判斷實體的個數的
if(strcmp(name,str2) != 0) 所以函數只讀取實體的名字,一旦出現新的實體名字,
{實體數就加一。
strcpy(name,str2);
num++;
}
}
}
fclose(fp);
return num;
}
以下是讀取實體點的坐標以及點序的程序代碼,在這個程序中,讀取了模型中點的坐標的最大值與最小值、實體的名字、點的坐標,以及點序。
void CJupiterView::OnFileInput()
{
// TODO: Add your command handler code here
FILE* fp,*fp2;
int i,k,j;
float tempX,tempY,tempZ;
float xMin,yMin,zMin,xMax,yMax,zMax,Max;
int lab;
char str1[20],str2[20],str[20],HT;
char myName[20];
int myNumber;
VERTEX tempVertex;
SEQUENCE tempSequence;
typedef struct {
float x,y,z,max;
}MAX;
MAX max;
HT=9;
objectNumber=getObjectNumber();
myData=new myVertex[objectNumber];
fp=fopen(FileName,"r");
i=0;
j=0;
k=0;
myNumber=-1;
strcpy(myName,"ObjectName");
while(! feof(fp) && ! ferror(fp))
{
fscanf(fp,"%s\n",str);
if(strcmp(str,"$EXTMIN")==0)
{
fscanf(fp,"%s\n",str1);
fscanf(fp,"%f\n",&xMin);
fscanf(fp,"%s\n",str1);
fscanf(fp,"%f\n",&yMin);
fscanf(fp,"%s\n",str1);
fscanf(fp,"%f\n",&zMin);
}
if(strcmp(str,"$EXTMAX")==0)
{
fscanf(fp,"%s\n",str1);
fscanf(fp,"%f\n",&xMax);
fscanf(fp,"%s\n",str1);
fscanf(fp,"%f\n",&yMax);
fscanf(fp,"%s\n",str1);
fscanf(fp,"%f\n",&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,"%s\n",str1);
fscanf(fp,"%s\n",str1);
if(strcmp(myName,str1) != 0)
{
myNumber++;
strcpy(myName,str1);
strcpy((myData+myNumber)->obName,myName);
}
fscanf(fp,"%s\n",str2);
fscanf(fp,"%f\n",&tempX);
fscanf(fp,"%s\n",str2);
fscanf(fp,"%f\n",&tempY);
fscanf(fp,"%s\n",str2);
fscanf(fp,"%f\n",&tempZ);
fscanf(fp,"%d\n",&lab);
fscanf(fp,"%d\n",&lab);
if(lab == 192)
{
tempVertex.x=tempX / max.max;
tempVertex.y=tempY / max.max;
tempVertex.z=tempZ / max.max;
(myData+myNumber)->Vertex.Add(new CVertex(tempVertex));
}
if(lab == 128)
{
fscanf(fp,"%s\n",str1);
fscanf(fp,"%f\n",&tempX);
fscanf(fp,"%s\n",str1);
fscanf(fp,"%f\n",&tempY);
fscanf(fp,"%s\n",str1);
fscanf(fp,"%f\n",&tempZ);
tempSequence.a=abs(tempX);
tempSequence.b=abs(tempY);
tempSequence.c=abs(tempZ);
(myData+myNumber)->Sequence.Add(new CSequence(tempSequence));
}
}
}
fclose(fp);
}
D. dxf文件怎麼打開
dxf文件是一個2D轉換的格式,它是是由很多的「代碼」和「值」組成的「數據對」構造而成,這里的代碼稱為「組碼」,指定其後的值的類型和用途。每個組碼和值必須為單獨的一行的。下面和我一起看看吧!
使用autocad軟體打開
1dxf文件默認打開方式為autocad。可在autocad中執行命令:dxfin,即可打開dxf文件。
使用caxa電子圖版打開
方法一:點擊文件按鈕,在下拉菜單中點擊打開,在打開的對話框中選擇dxf文件,雙擊打開即可。
方法二:直接雙擊dxf文件,在打開方式里選擇其他程序,找到「caxa電子圖版」後雙擊,即可打開dxf文件了。
相關閱讀:什麼是dxf文件
DXF是Autodesk(歐特克)公司開發的用於AutoCAD與其它軟體之間進行CAD數據交換的CAD數據文件格式,DXF文件打開的具體操作步驟如下:
1、首先我們打開電腦里的`瀏覽器在網路中搜索下載CAD編輯器,選擇任意一款CAD編輯器進行下載及安裝。
2、安裝並打開任意一款CAD編輯器工具,點擊「打開」按鈕以選擇相應的DXF圖紙文檔進行打開。
3、待打開DXF圖紙文檔後,我們可能更喜歡在黑色背景下進行編輯操作,對此切換到「查看器」選項卡,點擊「黑色背景」按鈕即可。
4、有時為了對DXF圖紙的細節部分進行編輯操作,我們可以在「位置」列表中選擇相應的「區域縮放」工具,對圖紙細節部分進行放大。
5、之後切換到「編輯器」選項卡,開啟「捕捉」功能後,點擊圖紙對象進行選中操作,就可以對其參數進行修改了。
6、選中DXF的圖形的情況下,就可以在其「屬性」窗口中對「線條顏色」和「線條寬度」進行設置了。
7、當然,也可以對DXF的圖形進行填充操作,點擊「繪圖」列表中的「填充圖案」按鈕,即可對封閉區域進行填充。
dxf文件怎麼轉換成dwg
1、將風雲CAD轉換器安裝在電腦上之後(可以在瀏覽器或軟體管家中搜索找到),點開主界面,點擊「DWG DXF互轉」。
2、點擊進入之後,點擊界面證件的「添加文件」,也可以通過點擊左下方的「添加文件夾」將文件批量導入(如果需要批量轉換可以這樣操作)。
3、將需要轉換的dxf文件導入之後,設置輸出目錄,保持默認設置就可以了,這樣比較方便找到。
4、就可以點擊右下角「開始轉換」,稍等幾秒鍾,轉換就會完成啦!
5、轉換完成之後,點擊「打開文件」,就可以看到轉換完成的文件。
6、可以在原文件夾找到轉換之後變成dwg格式的文件。
E. DXF是什麼格式 DXF文件用什麼軟體打開
DXF是AutoCAD的繪圖交換文件,可以用迅捷CAD編輯器打開。請參照以下步驟。
1、首先在電版腦上雙擊迅捷CAD編輯器軟體快權捷方式,打開軟體。
F. dxf文件讀取
dxf是AutoCAD ® DXFTM (Drawing eXchange Format) 向量抄圖型文件。
JPEG 是 JPEG 工作組的 圖像 文件 格式。
Opengl 可以讀取 SGI 圖像文件 和 BMP 圖像文件,不直接支持 dxf和JPEG。
你需要自己寫程序。
dxf文件是 ASCII, 可識別,例如 讀 Arc (弧)和弧線參數,然後你用Opengl畫弧線,讀 Spline (樣條曲線),和樣條曲線參數,然後你用Opengl畫曲線,讀 3DLine,然後你用Opengl畫三維線,。。。。
工作量很大。不如買現成軟體。
G. DXF格式文件數據提取
圖元信息提取:
下面具體介紹該工程中讀取的幾種圖元。
對圖元信息的提取需要結合DXF參考手冊以及庫文件(主要涉及【dl_entities.h】和【dl_dxf.cpp】),選取實際所需數據進行自定義圖元信息構造,比如說繪制二維平面圖形,則不需要z軸坐標,此時只需要讀取data中x,y值即可,而在繪制ARC時,需要考慮到OCS到WCS的變化,而庫文件讀取的data中沒有涉及到拉伸方向的讀取,所以此時需要對庫文件進行一定修改,也主要是修改前面提及到的兩個文件(這一點將在介紹繪制ARC時進行具體介紹)
首先在庫文件【dl_entities.h】中可以看到每一種圖元信息數據格式的定義,每一個數據代表的具體信息在【dl_dxf.cpp】中可以看到它的組碼,再結合DXF參考手冊,就可以理解數據含義並進行繪制。
【POINT】
void MyDXFReader::addPoint(const DL_PointData & data)
{
}
點的構造非常簡單,只需要data.x, data.y
【LINE】
void MyDXFReader::addLine(const DL_LineData & data)
{
}
線的構造也非常簡單,直接讀取開始點和結束點,組成一條線,data.x1, data.y1; data.x2, data.y2
【CIRCLE】
void MyDXFReader::addCircle(const DL_CircleData & data)
{
}
圓的構造需要圓心和半徑。讀取data.cx, data.cy,data.radius
【ELLIPSE】
void MyDXFReader::addEllipse(const DL_EllipseData & data)
{
}
橢圓的構造需要中心點,相對於中心點的主軸點,起始角和終止角(非整橢圓)所以讀取的參數有data.cx, data.cy,data.mx, data.my,data.angle1, data.angle2
【ARC】
void MyDXFReader::addArc(const DL_ArcData& data)
{
}
圓弧所需數據主要有圓心,半徑,起始角,終止角以及三個方向的拉伸方向值。因為其中心點是在OCS中表示的坐標值,而在繪制時應該使用WCS,所以此時需要根據拉伸方向進行坐標轉換。對於拉伸方向的值原dxflib庫並沒有進行提取,直接認為使用的是默認值。所以需要自行在DL_ArcData構造函數和讀取函數中進行值的添加。
【文檔參考】
【OCS與WCS介紹】
http://bbs.xdcad.net/forum.php?mod=viewthread&tid=667490&highlight=trans
【OCS到WCS的具體轉換】
文獻:潘曉. 基於CAD圖的提取運動控制信息方法的研究與實現[D]. 燕山大學, 2006.(重要)
參考上述文獻中的演算法就能夠進行坐標的轉換。
【POLYLINE 和 LWPOLYLINE】
void MyDXFReader::addPolyline(const DL_PolylineData& data)
{
}
void MyDXFReader::addVertex(const DL_VertexData& data)
{
}
在dxflib庫中多段線圖元和優化多段線圖元均是通過這兩者讀出,首先在addPolyline(const DL_PolylineData& data)中獲得點數(data.number)和標志位(data.flags),其中點數表示了addVertex中的點數,而標志位則表示了該多段線的閉合。需要注意的是在讀寫LWPOLYLINE時所構成的點需要考慮點的凸度,如果凸度不為0,則需要進行弧的繪制。查看參考手冊可知,此時也需要考慮坐標點OCS到WCS的轉換。
【文檔參考】
【DXF文件中將多段線凸度轉換成圓弧】
https://blog.csdn.net/eickandy/article/details/48317855
【DIMENSION】
DXF文件中有多種標注。根據DXF參考手冊可以為每種標注構造相應結構。標注的繪制主要是得到插入點與插入值,然後再結合標注點繪制出標注信息。
比如對齊標注。
void MyDXFReader:: addDimAlign(const DL_DimensionData & data1,
const DL_DimAlignedData & data2)
{
}
由DXF參考手冊可知其標注插入點為data1.dpx, data1.dpy,插入值的中點為data1.mpx,data1.mpy。再由data2得到標注點信息data2.epx1, data2.epy1和data2.epx2, data2.epy2。再根據DXF參考手冊該頁面最下面提供給的標注圖形參考,既可繪制出標注信息。其他幾個標注類似於此進行添加。
【TEXT和MTEXT】
對於文本信息的添加,TEXT指單行文本,MTEXT指多行文本。在本工程中只讀出了文本內容並顯示在所指定處,並不設定其相應文本樣式。下面簡單介紹添加多行文本。
void MyDXFReader::addMText(const DL_MTextData & data)
{
}
主要讀取插入點data.ipx, data.ipy以及文本內容data.text。然後將文本顯示在指定點附近。
【INSERT】
對於插入塊的讀取,需要藉助於Block段的讀取,即將所有的Block進行存儲,在插入塊時,遍歷存儲的Block,找到對應名字的塊進行插入,因為塊中的圖元與實體段中的圖元種類類似,所以本工程將實體段中的圖元與塊段中的圖元進行分別存儲,只有插入塊的圖元能夠被繪制,而實體段中所有的圖元都將被繪制。
void MyDXFReader::addInsert(const DL_InsertData & data)
{
}
void MyDXFReader:: addBlock(const DL_BlockData & data)
{
}
選取data.name,遍歷存儲的Block,找到需要插入的塊。