搜档网
当前位置:搜档网 › 用VC++读取DXF文件格式的源代码和相关资料

用VC++读取DXF文件格式的源代码和相关资料

用VC++读取DXF文件格式的源代码和相关资料
用VC++读取DXF文件格式的源代码和相关资料

我刚找到的:大家先看看做好了

告诉我一声

我也正准备做这个!!

我们使用 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;

}

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

asd123asd

asd123asd

等级: #7 得分:0回复于: 2004-12-15 11:45:34

然后用结构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",str1); 实体数就加一。

if(strcmp(str1,"VERTEX")==0)

{

fscanf(fp,"%s",str2); 打开DXF文件,data.dxf

fscanf(fp,"%s",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",str);

if(strcmp(str,"$EXTMIN")==0) {

fscanf(fp,"%s",str1);

fscanf(fp,"%f",&xMin);

fscanf(fp,"%s",str1);

fscanf(fp,"%f",&yMin);

fscanf(fp,"%s",str1);

fscanf(fp,"%f",&zMin);

}

if(strcmp(str,"$EXTMAX")==0) {

fscanf(fp,"%s",str1);

fscanf(fp,"%f",&xMax);

fscanf(fp,"%s",str1);

fscanf(fp,"%f",&yMax);

fscanf(fp,"%s",str1);

fscanf(fp,"%f",&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",str1);

fscanf(fp,"%s",str1);

if(strcmp(myName,str1) != 0)

{

myNumber++;

strcpy(myName,str1);

strcpy((myData+myNumber)->obName,myName); }

fscanf(fp,"%s",str2);

fscanf(fp,"%f",&tempX);

fscanf(fp,"%s",str2);

fscanf(fp,"%f",&tempY);

fscanf(fp,"%s",str2);

fscanf(fp,"%f",&tempZ);

fscanf(fp,"%d",&lab);

fscanf(fp,"%d",&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",str1);

fscanf(fp,"%f",&tempX);

fscanf(fp,"%s",str1);

fscanf(fp,"%f",&tempY);

fscanf(fp,"%s",str1);

fscanf(fp,"%f",&tempZ);

tempSequence.a=abs(tempX);

tempSequence.b=abs(tempY);

tempSequence.c=abs(tempZ);

(myData+myNumber)->Sequence.Add(new CSequence(tempSequenc

}

}

}

fclose(fp);

}

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

#8得分:0回复于:2004-12-15 11:45:51

DXF数据接口

每个CAD系统都有自己的数据文件,数据文件分图形数据文件、几何模型文件和产品系统自己的内部数据模式密切相关,而每个CAD系统自己内部的数据模式一般是不公

asd123asd asd123asd 等级:就有数据交换文件概念的出现。

DXF为AutoCAD系统的图形数据文件,DXF虽然不是标准,但由于AutoCAD系统的标准。DXF是具有专门格式的ASCII码文本文件,它易于被其它程序处理,主要用于实接,或其它CAD系统与AutoCAD系统交换图形文件。

1 DXF文件结构

一个完整的DXF文件是由四个段和一个文件结尾组成的。其顺序如下:

(1)标题段,记录AutoCAD系统的所有标题变量的当前值或当前状态。这些标题变量AutoCAD版本号、插入基点、绘图界限、SNAP捕捉的当前状态、珊格间距、式样、(2)表段,包含了四个表,每个表又包含可变数目的表项。按照这些表在文件中出现和视图表;

(3)块段,记录定义每一块时的块名、当前图层名、块的种类、块的插入基点及组成属性的块和无名块三种。无名块包括用HATCH命令生成的剖面线和用DIM命令完成的(4)元素段,记录了每个几何元素的名称、所在图层的名称、线型名、颜色号、基面(5)文件结束,标识文件结束。

DXF文件每个段由若干个组构成,每个组在DXF文件中占有两行。组的第一行为组代代码,每个组代码的含义是由AutoCAD系统约定好的,以FORTRAN “I3”格式(即向右输出。组的第二行为组值,相当于数据的值,采用的格式取决于组代码指定的组的类型它的值。组代码范围见下表。需要注意的是,在AutoCAD系统中组代码既用于指出如应用。组代码的具体含义取决于实际变量、表项或元素描述,但“固定”的组代码总具有组代码范围跟随值的类型

0-9 串

10-59 浮点

60-79 整数

210-239 浮点

999 注释

1000-1009 串

1010-1059 浮点

1060-1079 整数

表6.3 组代码范围

一个DXF文件的框架如下:

0 ......段开始

SECTION

2

HEADER ......该段为标题段

9

$ACADVER ......下面依次描述所有标题变量

AC1003

.

.

.

ENDSEC ......标题段结束0

SECTION ......段开始

2

TABLES ......该段为表段0

TABLE ......表开始

2

LTYPE ......该表为线型表.

.

.

ENDTAB ......线型表结束0

TABLE

2

LAYER ......图层表开始.

.

.

ENDTAB ......图层表结束0

TABLE

2

STYLE ......字样表开始.

.

.

ENDTAB ......字样表开始

TABLE

2

VIEW ......视图表开始

.

.

.

ENDTAB ......视图表结束

ENDSEC ......表段结束

SECTION

2

BLOCKS ......块段开始

BLOCK ......块开始

.

.

.

ENDBLK ......块结束

.

.

.

ENDSEC ......块段结束

SECTION

2

ENTITIES ......元素表开始0

xxxxxxx ......开始的元素

.

.

.

xxxxxxx ......又一个元素开始.

.

ENDSEC ......元素段结束

EOF ......文件结束

2 DXF文件接口程序设计

DXF文件格式的设计充分考虑了接口程序的需要,它能够容易地跳过没有必要关心的信要记住按何顺序处理各个组并跳过不关心的组即可。但编写一个输出DXF文件的程序使AutoCAD系统接受它。AutoCAD系统允许在一个DXF文件中省略许多项并且仍可题变量,那么整个HEADER段都可以省略。在TABLES段中的任何一个表,在不需要处理时,整个表段也可以去掉。如果在LTYPE表中定义了线型,则该表必须在LAYE 可以省略BLOCKS段。如果有,那么它必须出现在ENTITIES段之前。EOF必须出现3 DXF文件格式存在的问题

(1)由于DXF文件制定的较早,存在很多的不足。不能完整地描述产品信息模型,产品的几何模型,由于仅仅保留了原有系统数据结构中的几何和部分属性信息,大量的拓(2)DXF文件格式也不合理,文件过于冗长,使得文件的处理、存放、传递和交换不读、写完整的DXF数据文件的程序接口是件不容易的工作。

随着CAD/CAM技术的发展和CAD/CAM系统应用的日益广泛,不同系统和系统不同子直接推动国家或国际上通用的数据交换文件标准的制定。

DXF文件实际上是ASCII编码文件讲解

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格式搞明白,再研究三维图

HALCON如何读取DXF文件

HALCON如何读取DXF文件 read_contour_xld_dxf (Contours, 'D:/D1.dxf', [], [], DxfStatus) 读入DXF文件装载到Contours中 disp_obj (Contours, 200000) 显示读入的内容 segment_contours_xld (Contours, ContoursSplit, 'lines_circles', 50, 40, 20) 分割圆和直线 count_obj (ContoursSplit, Number) for i := 1 to Number by 1 select_obj (ContoursSplit, ObjectSelected, i) get_contour_global_attrib_xld (ObjectSelected, 'cont_approx', Attrib) if(Attrib==1) fit_circle_contour_xld (ObjectSelected, 'ahuber', -1, 2, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder) gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, rad(360), 'positive', 1.0) dev_display (ContCircle) write_string (200000, 'R:'+Radius) else * fit_line_contour_xld (ContCircle, 'tukey', -1, 0, 5, 2,

如何读取DXF格式文件

如何读取DXF格式文件? -------------------------------------------------------------------------------- OpenGL是美国SGI公司最新推出的一套开放式的三维图形软件接口,适用于广泛的计算机环境,从个人计算机到工作站,OpenGL都能实现高性能的三维图形功能。OpenGL本身不仅提供对简单图元的操作和控制,还提供了许多函数用于复杂物体的建模。但是,我们通常喜欢使用AutoCAD和3DS及3Dmax等工具来建立模型,并且我们已经有了很多这样的模型,那么我们如何才能资源共享,避免重复劳动呢?利用CAD图形标准数据交换格式—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 的值

C# 读取DXF文件 (2)

u s i n g S y s t e m; using using https://www.sodocs.net/doc/fa6950864.html,ponentModel; using System.Data; using System.Drawing; using System.Text; using using System.IO; using System.Collections; namespace DXF { public partial class Form1 : Form { private FileStream fs; private StreamReader sr; private ArrayList LayerList = new ArrayList(); private ArrayList LineList = new ArrayList(); private ArrayList ArcList=new ArrayList(); private ArrayList EllipseList = new ArrayList(); private ArrayList LwopolylineList = new ArrayList(); private ArrayList SplineList=new ArrayList(); private string[] str = new string[2]; private int count; private double leftx; private double lefty;

private double rightx; private double righty; public Form1() { InitializeComponent(); } private string[] ReadPair() { string code = sr.ReadLine().Trim(); string codedata = sr.ReadLine().Trim(); count += 2; string[] result = new string[2] { code, codedata }; return result; } private void Read() { while (sr.Peek() != -1) { str = ReadPair(); if (str[1] == "SECTION") { str = ReadPair(); switch (str[1]) { case"HEADER": ReadHeader(); break;

DXF数据文件格式及接口

每个CAD系统都有自己的数据文件,数据文件分图形数据文件、几何模型文件和产品模型文件几种。数据文件的格式与每个CAD系统自己的内部数据模式密切相关,而每个CAD系统自己内部的数据模式一般是不公开的,也是各不相同的。由于用户使用的需要,就有数据交换文件概念的出现。 DXF为AutoCAD系统的图形数据文件,DXF虽然不是标准,但由于AutoCAD系统的普遍应用,使得DXF成为事实上的数据交换标准。DXF是具有专门格式的ASCII 码文本文件,它易于被其它程序处理,主要用于实现高级语言编写的程序与AutoCAD系统的连接,或其它CAD系统与AutoCAD系统交换图形文件。 1 、DXF文件结构 一个完整的DXF文件是由四个段和一个文件结尾组成的。其顺序如下: (1)标题段,记录AutoCAD系统的所有标题变量的当前值或当前状态。这些标题变量记录了AutoCAD系统的当前工作环境。例如,AutoCAD版本号、插入基点、绘图界限、SNAP捕捉的当前状态、珊格间距、式样、当前图层名、当前线型和当前颜色等; (2)表段,包含了四个表,每个表又包含可变数目的表项。按照这些表在文件中出现的顺序,它们依次为线型表、图层表、字样表和视图表; (3)块段,记录定义每一块时的块名、当前图层名、块的种类、块的插入基点及组成该块的所有成员。块的种类分为图形块、带有属性的块和无名块三种。无名块包括用HATCH命令生成的剖面线和用DIM命令完成的尺寸标注; (4)元素段,记录了每个几何元素的名称、所在图层的名称、线型名、颜色号、基面高度、厚度以及有关几何数据; (5)文件结束,标识文件结束。 DXF文件每个段由若干个组构成,每个组在DXF文件中占有两行。组的第一行为组代码,它是一个非零的正整数,相当于数据类型代码,每个组代码的含义是由AutoCAD系统约定好的,以FORTRAN “I3”格式(即向右对齐并且用三字符字段填满空格的输出格式)输出。组的第二行为组值,相当于数据的值,采用的格式取决于组代码指定的组的类型。组代码和组值合起来表示一个数据的含义和它的值。组代码范围见下表。需要注意的是,在AutoCAD系统中组代码既用于指出如下表所示的组值的类型,又用来指出组的一般应用。组代码的具体含义取决于实际变量、表项或元素描述,但“固定”的组代码总具有相同的含义,如组代码“8”总表示图层名。 组代码范围跟随值的类型 0-9 串 10-59 浮点 60-79 整数 210-239 浮点 999 注释 1000-1009 串 1010-1059 浮点 1060-1079 整数 表6.3 组代码范围 一个DXF文件的框架如下:

C#读取DXF文件

using System; using System.Collections.Generic; using https://www.sodocs.net/doc/fa6950864.html,ponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Collections; namespace DXF { public partial class Form1 : Form { private FileStream fs; private StreamReader sr; private ArrayList LayerList = new ArrayList(); private ArrayList LineList = new ArrayList(); private ArrayList ArcList=new ArrayList(); private ArrayList EllipseList = new ArrayList(); private ArrayList LwopolylineList = new ArrayList(); private ArrayList SplineList=new ArrayList(); private string[] str = new string[2]; private int count; private double leftx; private double lefty;

private double rightx; private double righty; public Form1() { InitializeComponent(); } private string[] ReadPair() { string code = sr.ReadLine().Trim(); string codedata = sr.ReadLine().Trim(); count += 2; string[] result = new string[2] { code, codedata }; return result; } private void Read() { while (sr.Peek() != -1) { str = ReadPair(); if (str[1] == "SECTION") { str = ReadPair(); switch (str[1])

DXF格式文件解析

dxf文件是AutoCad的交换文件,可以直接用AutoCad打开。dxf文件是明码文件,在vb环境下按顺序文件读取就可以了。 例如:在C盘根目录下有一个文件“1.dxf” 启动vb后,建立一个按钮:Command1 并双击此按钮,对其输入以下代码: Private Sub Command1_Click() Dim a As String '读取文件一行的内容 Dim i As Long '用于记录行数 Dim j As Long '用于记录用户如何响应提示 Open "c:\1.dxf" For Input As #1 i = 0 While Not EOF(1) Line Input #1, a i = i + 1 j = MsgBox("第 " & i & " 行内容为:" & a, vb OKCancel + vbInformation) '运行到此步时,如果用户输入“确定”则继续,如果用户输入“取消”则结束本程序 '用户可以在此输入处理代码,对读入的字串进行处理 If j = vbCancel Then End End If W end close #1 End Sub 读取DXF格式文件 OpenGL是美国SGI公司最新推出的一套开放式的三维图形软件接口,适用于广泛的计算机环境,从个人计算机到工作站,OpenGL都能实现高性能的三维图形功能。OpenGL本身不仅提供对简单图元的操作和控制,还提供了许多函数用于复杂物体的建模。但是,我们通常喜欢使用AutoCAD和3DS及3Dmax等工具来建立模型,并且我们已经有了很多这样的模型,那么我们如何才能资源共享,避免重复劳动呢?利用CAD图形标准数据交换格式—DXF 格式,我们就能很容易地实现资源共享,而不需要重复建模。

在AutoCAD中正确应用DXF图形文件格式

在AutoCAD中正确应用DXF图形文件格式 一、DXF文件格式分析 DXF文件由标题段、表段、块段、实体段和文件结束段5部分组成,其内容如下。 ☆标题段(HEADER)标题段记录AutoCAD系统的所有标题变量的当前值或当前状态。标题变量记录了AutoCAD系统的当前工作环境,如SNAP捕捉当前状态、栅格间距式样、当前图层层名及线型、颜色等。 ☆表段(TABLES)表段共包含4个表,每个表又包含可变数目的表项。这些表在文件中出现的顺序是线型表(LTYPE)、图层表(LAYER)、字样表(STYLE)、视图表(VIEW)。 ☆块段(BLOCK)块段记录了所用块的块名,当前图层层名、块的种类、块的插入基点及组成该块的所有成员。块的种类分为图形块、带有属性的块和无名块三种。无名块包括用HATCH 命令生成的剖面线和用DIM命令所完成的尺寸标准。 ☆实体段(ENTITIES)实体段记录了每个实体的名称、所在图层及其名字、线型、颜色等。☆文件结束段(EOF OF FILE)DXF文件的结束标志。 一个DXF文件由若干个组构成,每个组占两行,第一行为组的代码,第二行为组值。组代码相当于数据类型的代码,它由CAD图形系统所规定,而组值为具体的数值,二者结合起来表示一个数据的含义和值。例如,代码10代表一个点的X坐标,占一行,而其第二行4.5425则是点X坐标的具体数值,二者结合表示一点,其X坐标值为4.5425。 (1)组代码和组值的类型组代码为一个非负的不超过三位的整数,而组值由组代码的类型决定。例如: 代码0~9组值类型为字符型。 代码10~59组值类型为实型。 代码60~79组值类型为整型。 代码999表示解释行。 (2)组代码的含义每个组代码均有规定的含义,有些代码含义是固定的,而有些组代码则因应用场合不同而有多个含义,应具体分析。另外,一些代码是备用的,目前版本尚未用到,现将他们的含义举例介绍如下。 0:表示一个事物的开始,如一个块、表、图层、实体等。 1:字符型数据的值,如TEXT的字符串、文件名、属性值等。 2:一个事物的名字,如段、表、块、线型、视图等的名字。 3~5:字符型数据的值,如文件名、线型说明等。 6:线型名(固定类型)。 8:图层名(固定类型)。 关于实体的坐标与相应的组代码10~18、20~28、30~38的用法应根据实体所用到点的数量,按组代码个位的0、1、2、……的顺序使用。例如LINE的起点组代码为10、20、30,而11、21、31为其终点。其他类似。 DXF文件的结构相当复杂,完整读取DXF文件也是一项异常繁琐的工程。在实际应用中,为了提取图形的实体信息,可以省略DXF文件中的许多项,只要获取其中的层表、块段和实体段,就可以完成相应几何图形的描述。在层表中说明每一层的颜色、线型,在块段中说明块所在的层、属性及其在图形中的位置,在实体段中说明直线的起点、终点及圆的圆心、半径等几何信息和各实体所在的层。根据实体所在的层,在层表中搜索每一层的颜色、线型并将其添加到实体对象中。在利用CAD进行绘图时,需将变量参数DIMASO设为ON,以保证块段中定义的尺寸块为一个整体,并可被正确无误地获取。根据尺寸类型名、尺寸定义的起点、终点坐标与实体类型名、实体空间坐标是否匹配,对实体对象进行尺寸附加。在绘图时,如对自定义的粗糙度、形位公差等块不进行“EXPLODE”炸开操作,也可通过增加相应读取函数提取其属性。 下面举例说明实体段在DXF文件中的格式。 圆弧(ARC)

DXF文件格式读取(VC例子)

Download demo project - 167 Kb Introduction What is DXF? Drawing Interchange Format (DXF) files enable the interchange of drawings between AutoCAD and other programs. DXF files can be either ASCII or binary formats. Because ASCII DXF files are more common than the binary format, CadLib uses ASCII DXF format. What is CadLib? The CadLib is not a Computer Aided Design (CAD) program. It is a tool for creating DXF files that are used in the CAD programs. It consists of two parts. One of them is a Dynamic Link Library to create the DXF file. The other part is the programming interface. It is a class that integrates the cadio.dll functions. It can be used in Microsoft Visual C++ projects. In addition, the cadio.dll can be used in other Win32 programs. Why use CadLib? In some programs, it is needed to create a drawing output for use in other programs such as AutoCad. For example, in a "Building Detail Sheet Generator Program", the program needs to create a drawing output. And the most standard format for communicating drawing data is DXF.

dxf文件格式

dxf格式解析 OpenGL是美国SGI公司最新推出的一套开放式的三维图形软件接口,适用于广泛的计算机环境,从个人计算机到工作站,OpenGL都能实现高性能的三维图形功能。OpenGL本身不仅提供对简单图元的操作和控制,还提供了许多函数用于复杂物体的建模。但是,我们通常喜欢使用AutoCAD和3DS及3Dmax等工具来建立模型,并且我们已经有了很多这样的模型,那么我们如何才能资源共享,避免重复劳动呢?利用CAD图形标准数据交换格式—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

读取dxf文件的vb代码

读取dxf文件的vb代码 ' ReadDXF从DXF文件中提取指定代码/值对。 ' 该函数需要4个字符串参数,一个有效的DXF文件名、 ' 一个DXF区域名称、一个在该区域中对象的名称以及 ' 一个列出代码的逗号分隔符。 ' Function ReadDXF( _ ByVal dxfFile As String, ByVal strSection As String, _ ByVal strObject As String, ByVal strCodeList As String) Dim tmpCode, lastObj As String Open dxfFile For Input As #1 ' 获得第一个代码/值对 codes = ReadCodes ' 在整个文件中循环直到找到"EOF"行 While codes(1) <> "EOF" ' 如果该组码为"0"并且其值为"SECTION" .. If codes(0) = "0" And codes(1) = "SECTION" Then ' 这必定是一个新的区域,所以获取下一个代码/值对 codes = ReadCodes() ' 如果该区域为所要寻找的区域.. If codes(1) = strSection Then ' 取得下一代码/值对并且.. codes = ReadCodes ' 在该区域中循环直到找到"ENDSEC" While codes(1) <> "ENDSEC" ' 在这个区域中,所有"0"代码表示一个对象。 ' 如果发现"0"就可保存对象名以便以后使用。 If codes(0) = "0" Then lastObj = codes(1) ' 如果该对象是所需要的对象 If lastObj = strObject Then ' 在代码的前后加上逗号 tmpCode = "," & codes(0) & "," ' 如果该代码为列表中的代码.. If InStr(strCodeList, tmpCode) Then ' 添加它的返回值。

DXF文件分析

DXF文件分析 一、DXF文件数据总览 DXF是AutoCAD的一种绘图交换文件,可以与其他软件进行数据较换的一种文件格式。 DXF是一种开放的矢量数据格式,可以分为两类:ASCII格式和二进制格式;ASCII具有可读性好的特点,但占有空间较大;二进制格式则占有空间小、读取速度快。 DXF文件是由很多的“代码”和“值”组成的“数据对”构造而成,这里的代码称为“组码”(group code),指定其后的值的类型和用途。每个组码和值必须为单独的一行的。 DXF文件被组织成为多个“段”(section),每个段以组码“0”和字符串“SECTION”开头,紧接着是组码“2”和表示段名的字符串(如HEADER)。段的中间,可以使用组码和值定义段中的元素。段的结尾使用组码“0”和字符串“ENDSEC”来定义。 二、DXF文件数据格式分析 图1.1为DXF文件数据格式的总体框图 图2.1DXF数据格式框图 由图1.1可知,DXF的数据格式有HEADER(标题段)、CLASSES(类段)、TABLES (表段)、BLOCKS(块段)、ENTITIES(实体段)、OBJECTS(对象段)、EOF(结束)。出了这七个段之外还有一个THUMBNAILIMAGE段。

类/子类,组码,组值的格式如下: 类/子类 组码 组值 比如: AcDbCircle ARC的子类 10 组码,起点的X坐标 2860.382264303673 组值X的坐标为2860.382264303673 组码比起类/子类以及组值有一个空格的缩进。 2.1 HEADER(标题段) DXF 文件的HEADER 段包含与图形关联的变量的设置。它由AutoCAD 数据库版本号和一些系统变量组成。每个变量由给出变量名称的组码9 指定,其后是提供变量值的组。下面给出了HEADER段的一般格式。 0 HEADER 段的开始 SECTION 2 HEADER 9 变量名称标识符(仅在DXF 文件的HEADER 段中使用) 为每个标题变量重复一次 $<变量> <组码> <值> 0 HEADER 段的结束 ENDSEC 2.2 CLASSES(类段) CLASSES 段。包含应用程序定义的类的信息,这些类的实例出现在数据库的BLOCKS、ENTITIES 和OBJECTS 段中。类定义在类的层次结构中是固定不变的。

解析DXF图形文件格式

解析DXF图形文件格式 一、DXF文件格式分析 DXF文件由标题段、表段、块段、实体段和文件结束段5部分组成,其内容如下。 ☆标题段(HEADER)标题段记录AutoCAD系统的所有标题变量的当前值或当前状态。标题变量记录了AutoCAD系统的当前工作环境,如SNAP捕捉当前状态、栅格间距式样、当前图层 层名及线型、颜色等。 ☆表段(TABLES)表段共包含4个表,每个表又包含可变数目的表项。这些表在文件中出现的顺序是线型表(LTYPE)、图层表(LAYER)、字样表(STYLE)、视图表(VIEW)。 ☆块段(BLOCK)块段记录了所用块的块名,当前图层层名、块的种类、块的插入基点及组成该块的所有成员。块的种类分为图形块、带有属性的块和无名块三种。无名块包括用HATCH

命令生成的剖面线和用DIM命令所完成的尺寸标准。 ☆实体段(ENTITIES)实体段记录了每个实体的名称、所在图层及其名字、线型、颜色等。 ☆文件结束段(EOF OF FILE)DXF文件的结束标志。 一个DXF文件由若干个组构成,每个组占两行,第一行为组的代码,第二行为组值。组代码相当于数据类型的代码,它由CAD图形系统所规定,而组值为具体的数值,二者结合起来表示一个数据的含义和值。例如,代码10代表一个点的X坐标,占一行,而其第二行4.5425则是点X坐标的具体数值,二者结合表示一点,其X坐标值为4.5425。 (1)组代码和组值的类型组代码为一个非负的不超过三位的整数,而组值由组代码的类型决 定。例如: 代码0~9组值类型为字符型。 代码10~59组值类型为实型。 代码60~79组值类型为整型。 代码999表示解释行。 (2)组代码的含义每个组代码均有规定的含义,有些代码含义是固定的,而有些组代码则因应用场合不同而有多个含义,应具体分析。另外,一些代码是备用的,目前版本尚未用到, 现将他们的含义举例介绍如下。 0:表示一个事物的开始,如一个块、表、图层、实体等。 1:字符型数据的值,如TEXT的字符串、文件名、属性值等。 2:一个事物的名字,如段、表、块、线型、视图等的名字。 3~5:字符型数据的值,如文件名、线型说明等。 6:线型名(固定类型)。 8:图层名(固定类型)。 关于实体的坐标与相应的组代码10~18、20~28、30~38的用法应根据实体所用到点的数量,按组代码个位的0、1、2、……的顺序使用。例如LINE的起点组代码为10、20、30, 而11、21、31为其终点。其他类似。 DXF文件的结构相当复杂,完整读取DXF文件也是一项异常繁琐的工程。在实际应用中,为了提取图形的实体信息,可以省略DXF文件中的许多项,只要获取其中的层表、块段和实体

DXF文件读取

DXF文件读取 作者:不忍之刃 He_zhiyuan EMAIL:cb2688he2688@https://www.sodocs.net/doc/fa6950864.html, 2010-10-14 近来因为要做个项目,涉及到要做个DXF文件的读取。网上搜索DXF文件的文件结构,还搜索到一篇讲读取DXF文件的文章,相信来搜索读取DXF方面的人,一定会搜索到这篇文章的。但这篇文章里面附的源代码是有问题的。我用AUTOCAD可以导出3种版本的DXF 文件。我先用AUTOCAD画个简单的长方体, 然后用记事本打开导出来的三种版本的文件,发现很不一样,跟那篇文章里面描述的也不一样,用那篇文章里面源代码的方法是没办法读取的。然后我又用3DMAX导出DXF文件,才有正常的实体的“顶点”系列,实体的面系列,“面”里面记录的面上各个顶点在顶点系列中的位置。但我用3DMAX导出来的DXF文件里面,面是有4个顶点组成的四边形,而不是三角面片,所以这也跟那篇文章讲的不一样。 鉴于这么多,我自己写了个类来实现DXF文件的读取。且使用了OPENGL来做显示模型。列出如下: //CLoadDXF.h #include struct VERTEX { float x,y,z; }; //结构VERTEX用来存储点的坐标 struct SEQUENCE { int a,b,c,d; }; //结构SEQUENCE用来存储实体的面的组成,记录的是4个顶点在顶点序列《vertexArray》中的位置 struct ENTITY { int V ertexNumber;//实体顶点在顶点序列中开始开始的位置 int SequenceNumber;//实体在面系列中开始的位置 }; class CLoadDXF { public: void ShowDXF(float x,float y,float z,float size,float R,float G,float B); void OnFileInput(char* filename); CLoadDXF(); virtual ~CLoadDXF(); private: void norm(GLfloat v1[], GLfloat v2[], GLfloat v3[], GLfloat *nor);

用C语言程序读取CAD的dxf文件里的实体语言

wold line-dxf(FILE *fp,char layer[2],float x1,floal y1, float x2,float y2) fprintf(fp,"0\nLINE\n 8\n%s\n",1ayer); fprintf(fp,"10\n%f\n 20\n%f\n",x1,y1); fprintf(fp,"l1\n%f\n 2l\n%f\n",x2,y2); } #include ; #include < stdio.h>; #include "acad -dxf.c" main() {float r1,r2,11,12,13 x[100],y[37].Z[37]; float beta.beta1,fq,dz,w; int i; float xl,x1,y1,z1,x2,z2,x3,z3 ,x4 ,z4,xs,zs,Xe, ze; FILE*fp 摘要:本文简要介绍了一下DXF文件的组成。重点讲述了怎样使用C语言来读取DXF文件中的实体信息。 关键字:C、DXF

Abstract: The paper present the basic parts of DXF file. And focus on how to use C read the entity’s information from DXF file. Key Words: C, DXF DXF是Drawing eXchange File的缩写,意思为图形交换文件,在工程制图中有广泛的应用,掌握了DXF文件的读写对编写CAD软件时的图形信息的交换有重要意义。它有两种格式:一种是ASCII DXF 格式;一种是二进制DXF格式。ASCII DXF文件格式是ASCII 文字格式的AutoCAD图形的完整表示,这种文件格式易于被其它程序处理。二进制格式的DXF文件与ASCII格式的DXF文件包含的信息相同,但格式上二进制格式比ASCII格式更精简,能够节省百分之二十五的文件空间。AutoCAD能够更快地对其执行读写操作(通常能快五倍)。这可能是对ASCII格式的DXF文件操作时有ASCII与二进制形式的转换,因而花费时间较多。本文主要讨论ASCII格式的DXF 文件,因为它可读性强。 一、ASCII格式的DXF文件的组成

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 0 对应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 坐标

DXF文档详解

DXF文档详解 DXF的基本惯例 DXF格式是特定版本AutoCAD图形文件中所包含的全部信息的标记数据的一种表示方法。 标记数据的意思是指在每个数据元素前都带一个称为组码的整数。组码的值表明了其后数据元素的类型,也指出了数据元素对于给定对象(或记录)类型的含意。实际上,图形文件中所有用户指定的信息都能够以DXF文件格式表示。在AutoLISP和ARX应用程序中使用的DXF格式与上述格式基本相同,只是在某些数据组上存在着细微的差别。 如不作特殊说明,本节中所出现的组码都可以应用于DXF文件、AutoLISP应用程序和ARX应用程序。当组码说明对于应用程序和DXF文件有所不同时(或只适用于其中之一),在组码的说明前有如下提示符: APP只用于应用程序的说明 DXF只用于DXF文件的说明 如果组码说明对DXF文件和应用程序都适用,那么没有提示符;否则将显示适当的提示符。 组码范围 组码将与组码关联的值(组值)定义为整型、浮点数型或字符串型。具体说明如下表: 组码范围组码范围组值类型 0-9 字符串(最多255个字符,对于UNICODE字符串则更少) 10-59 双精度三维点 60-79 16位整数值 90-99 32位整数值 100 字符串(最多255个字符,对于UNICODE字符串则更少) 102 字符串(最多255个字符,对于UNICODE字符串则更少) 105 表示十六进制句柄值的字符串 140-147 双精度标量浮点值 170-175 16位整数值 280-289 8位整数值 300-309 任意文字字符串 310-319 表示二进制数据组的十六进制值的字符串 320-329 表示十六进制句柄值的字符串 330-369 表示十六进制对象标识符的字符串 999 注释(字符串) 1000-1009 字符串(最多255个字符;对于UNICODE字符串则更少) 1010-1059 浮点值 1060-1070 16位整数值 1071 32位整数值 按数字次序排列的组码 下表给出了组码(或组码范围)及其说明。在表中,“固定”表示该组码的用途固定不变,非固定组码的用途将随上下文变化。 按数字次序排列的图元组码 组码说明 -5APP:persistentreactor链表 -4APP:条件运算符(仅用于ssget) -3APP:扩展数据(XDA TA)标记(固定) -2APP:图元名引用(固定) -1APP:图元名。每次打开图形时它都改变,且不被保存。(固定) 0 表示图元类型的文字字符串(固定) 1 图元的主要文字值 2 名称(属性标记、块名称等) 3-4 其他的文字值或名称值

用VC++读取DXF文件格式的源代码和相关资料

我刚找到的:大家先看看做好了 告诉我一声 我也正准备做这个!! 我们使用 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对象中。

相关主题