dxf格式.docx

上传人:b****6 文档编号:3260150 上传时间:2022-11-21 格式:DOCX 页数:12 大小:18.76KB
下载 相关 举报
dxf格式.docx_第1页
第1页 / 共12页
dxf格式.docx_第2页
第2页 / 共12页
dxf格式.docx_第3页
第3页 / 共12页
dxf格式.docx_第4页
第4页 / 共12页
dxf格式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

dxf格式.docx

《dxf格式.docx》由会员分享,可在线阅读,更多相关《dxf格式.docx(12页珍藏版)》请在冰豆网上搜索。

dxf格式.docx

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.ENDOFFILE(文件结束)

下面是对DXF的基本结构举一实例进行说明:

00后接SECTION

SECTION表明这是一个段的开始

22后接的是段名

HEADER说明该段是HEADER段(标题段)

9

$ACADVER文件是由AUTOCAD产生的

1

AC1008

99后接$UCSORG

$UCSORG用户坐标系原点在世界坐标系中的坐标

1010对应X

0.0X的值

2020对应Y

0.0Y的值

3030对应Z

0.0Z的值

9

$UCSXDIR这是一段不太相关的部分,略去

10

1.0

.......

99后接$EXTMIN

$EXTMIN说明三维实体模型在世界坐标系中的最小值

1010对应X

-163.925293X的值

2020对应Y

-18.5415860.0Y的值

3030对应Z

78.350945Z的值

99后接$EXTMAN

$EXTMAX说明三维实体模型在世界坐标系中的最大值

1010对应X

202.492279X的值

2020对应Y

112.634300Y的值

3030对应Z

169.945602Z的值

00后接ENDSEC

ENDSEC说明这一段结束了

00后接SECTION

SECTION表明这是一个段的开始

22后接的是段名

TABLES说明该段是TABLES段(表段)

............该段对我们不太相关,此处略去不进行说明

00后接ENDSEC

ENDSEC说明这一段结束了

00后接SECTION

SECTION表明这是一个段的开始

22后接的是段名

ENTITIES说明该段是ENTITIES段(实体段)这是我

0们要详细说明的段,该段包含了所有实体的

POLYLINE点的坐标和组成面的点序。

0后接POLYLINE

8表明以下数据是对于一个新的实体;

OBJECT018后接的字符串是这个实体的名称

66

1

70从661到7064

64说明该实体是由许多小平面组成的

71

387138说明该实体共有38个点

72

727272说明该实体由72个三角形构成

00VERTEX

VERTEX表明后面紧跟着的是实体的数据

8

OBJECT01

10对应X坐标

-163.925293X的值

20对应Y坐标

-17.772665Y的值

30对应Z坐标

128.929947Z的值

7070192

192表明上面的数据信息是点的坐标

0每一个从0VERTEX到70192之间

VERTEX的一小段是点的坐标

.........

70

192

0

VERTEX

8

OBJECT01

10

0

20

0

30

0当70后跟128时,表明该实体的每个点的坐标数据已经记录

70完了,下面紧跟着的是记录这些点是以什么样的方式组合成各

128个三角形。

7171、72、73后面跟着的值表明某一个三角形是第二个、第

2一个、第四个点构成的,点的顺序是按照记入DXF文件的顺

72序。

当某一值为负数时,则表明该点到下一点的线不要画出,

1如果要画三维实体的线型图,就必须使用这一特性,否则线条

73将会出现紊乱。

-4

0

VERTEX

............

00后接SEQEND表明该实体的数据已经全部记录完了

SEQEND

8

OBJECT01

0

POLYLINE0后接POLYLINE表明以下又是一个新的实体

............

0

ENDSEC0后接ENDSEC表明这是该段的结尾

0

EOF0后接EOF表明这个DXF文件结束了

在DXF文件中,我们最关心的是如何得到模型上各个点的坐标,并且用这些点连成许多个三用形,构成面,进而绘制出整个模型。

在DXF文件的结构中,我们已经看到,DXF文件先叙述实体上各个点的坐标,然后叙述实体上有多少个面,每个面由哪些点构成。

这样,我们至少需要2个数组来存储一个实体的信息,一个用于存储点的坐标,一个用于存储点序,我们可以把这2个数组放到一个结构中,如果模型中实体的数目不止一个是,我们就用这个结构来定义一个数组。

在本文中,我们使用VisualC++6.0来写一个读取DXF文件的小程序。

在实际应用中,模型中实体的数目以及实体中点和面的数目都是不定的,为了有效地利用内存,我们选择MFC类库中的聚合类CobArray类所创建的对象vertex,sequence来存储和管理实体的点坐标和点序。

CObArray类是一个用来存放数组类的聚合类,它能根据要存进来的数组(或结构)多少自动进行自身大小的高速,而且这个类本身具有的成员函数使得我们对它的对象的操作更加方便、快捷,用它编的程序也易于读懂。

三维实体模型的模型信息中的一部分信息可以在标题段中读出,通过读取变量名为$UCSORG的三个变量,可以得到三维实体在世界坐标系中自身所定义的用户坐标系原点的三维坐标。

通过读取$EXTMAX,$EXTMIN可以获知三维实体在世界坐标系中的范围,而其它部分的信息只有读完了全部DXF文件后才可以通过计算确定。

对于三维实体模型的全部点坐标、点序,可以在实体段中按照前面介绍的DXF文件基本结构读出。

现在我们开始写这个程序。

先建立一个头文件HEAD.H定义如下的结构:

VERTEX,SEQUENCE和类CVertex,Csequence。

typedefstruct{

floatx,y,z;

}VERTEX;结构VERTEX用来存储点的坐标

typedefstruct{

inta,b,c;

}SEQUENCE;结构SEQUENCE用来存储实体的面的组成

typedefstruct{

charobName[20];定义结构myVertex来存储实体的名字,点的坐标以及面的组成,

CObArrayVertex;其中,点的坐标和面的组成是由聚合类CObArray定义的对象来

CObArraySequence;在存储的,我们可以把VERTEX结构和SEQUENCE结构加入到

}myVertex;这两个对象中保存

classCVertex:

publicCObject

{因为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结构的变量

VERTEXm_vertex;存入CObArray对象中。

};

classCSequence:

publicCObject

{这也是一个由CObject类派生的类,作用和刚才CVertex类一样,

protected:

只不过Csequence类是用来存储实体中面的组成(点序)的。

CSequence();

DECLARE_DYNCREATE(CSequence)

virtual~CSequence();

public:

CSequence(SEQUENCE&sequ);

SEQUENCEm_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,目的在于根据模型中实体的多少来给指针分配合适的内存,使之成为结构数组。

定义一个函数,用于确定模型中有多少个实体,函数的返回值就是实体的个数。

intCJupiterView:

:

getObjectNumber()

{

charstr1[10],str2[10];

charname[]="theFirst";

intnum;

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);

returnnum;

}

以下是读取实体点的坐标以及点序的程序代码,在这个程序中,读取了模型中点的坐标的最大值与最小值、实体的名字、点的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1