CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

请教用VC++读取DXF文件格式的源代码和相关资料.急用呀.

楼主xhf_c(阿甘)2004-11-03 22:59:23 在 VC/MFC / 图形处理/算法 提问

请大侠们帮帮忙呀.急呀. 问题点数:0、回复次数:11Top

1 楼syy64(太平洋)回复于 2004-11-04 08:52:38 得分 0

不难,自己编一个,dxf是ASCII文件。Top

2 楼slbing0725(菜鸟也疯狂)回复于 2004-11-04 14:13:08 得分 0

到网上查一下,有资料。但原码没有,要自己写  
  挺繁的,Top

3 楼zylstudy(没有对象的类)回复于 2004-11-05 10:56:54 得分 0

偶手上有读去二维和三维DXF格式文件的原码.但是不能公开.你自己写吧,有问题可以交流.Top

4 楼xhf_c(阿甘)回复于 2004-11-05 14:30:30 得分 0

to     zylstudy:大侠帮帮忙吗.网上有公布的JAVA原码.可是没有VC的.我的EMAIL:xhf.c@163.com急用呀.Top

5 楼xhf_c(阿甘)回复于 2004-11-05 14:36:25 得分 0

另外请教一下:如果我想对DXF格式下的矢量数据进行属性查询,定位等等功能.其属性数据用什么数据库呀.另外属性数据和DXF之间怎么联系起来呀.Top

6 楼asd123asd(yx)回复于 2004-12-15 11:44:56 得分 0

我刚找到的:大家先看看做好了  
  告诉我一声  
  我也正准备做这个!!  
  yanxiuxiaofei@126.com  
   
  我们使用   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;  
   
    }  
  Top

7 楼asd123asd(yx)回复于 2004-12-15 11:45:34 得分 0

 
     
   
    然后用结构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(tempSequence));  
   
     
   
    }  
   
     
   
    }  
   
    }  
   
    fclose(fp);  
   
    }    
     
  Top

8 楼asd123asd(yx)回复于 2004-12-15 11:45:51 得分 0

 
   
  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文件的框架如下:  
  0   ......段开始  
  SECTION    
  2    
  HEADER   ......该段为标题段  
  9  
  $ACADVER   ......下面依次描述所有标题变量  
  1  
  AC1003  
  .  
  .  
  .  
  0  
  ENDSEC   ......标题段结束  
  0  
  SECTION   ......段开始  
  2  
  TABLES   ......该段为表段  
  0  
  TABLE   ......表开始  
  2  
  LTYPE   ......该表为线型表  
  .  
  .  
  .  
  0  
  ENDTAB   ......线型表结束  
  0  
  TABLE    
  2    
  LAYER   ......图层表开始  
  .  
  .  
  .  
  0  
  ENDTAB   ......图层表结束  
  0  
  TABLE  
  2  
  STYLE   ......字样表开始  
  .  
  .  
  .  
  0  
  ENDTAB   ......字样表开始  
  0  
  TABLE  
  2  
  VIEW   ......视图表开始  
  .  
  .  
  .  
  0  
  ENDTAB   ......视图表结束  
  0  
  ENDSEC   ......表段结束  
  0  
  SECTION    
  2  
  BLOCKS   ......块段开始  
  0  
  BLOCK   ......块开始  
  .  
  .  
  .  
  ENDBLK   ......块结束  
  .  
  .  
  .  
  0  
  ENDSEC   ......块段结束  
  0  
  SECTION  
  2  
  ENTITIES   ......元素表开始  
  0  
  xxxxxxx   ......开始的元素  
  .  
  .  
  .  
  0  
  xxxxxxx   ......又一个元素开始  
  .  
  .  
  .  
  0  
  ENDSEC   ......元素段结束  
  0  
  EOF   ......文件结束  
     
  2   DXF文件接口程序设计  
  DXF文件格式的设计充分考虑了接口程序的需要,它能够容易地跳过没有必要关心的信息,同时又能方便地提取所需要的信息。只要记住按何顺序处理各个组并跳过不关心的组即可。但编写一个输出DXF文件的程序是比较困难的,因为必须保持图形的一致性以使AutoCAD系统接受它。AutoCAD系统允许在一个DXF文件中省略许多项并且仍可获得一个合法的图形。如果不需要设置任何标题变量,那么整个HEADER段都可以省略。在TABLES段中的任何一个表,在不需要时也可以略去,并且事实上如果对它不作任何处理时,整个表段也可以去掉。如果在LTYPE表中定义了线型,则该表必须在LAYER表之前出现。如果图中没有使用块定义,则可以省略BLOCKS段。如果有,那么它必须出现在ENTITIES段之前。EOF必须出现在文件的末尾。  
  3   DXF文件格式存在的问题  
  (1)由于DXF文件制定的较早,存在很多的不足。不能完整地描述产品信息模型,产品的公差、材料等信息根本没有涉及。即使产品的几何模型,由于仅仅保留了原有系统数据结构中的几何和部分属性信息,大量的拓扑信息已不复存在,也是不完整的;  
  (2)DXF文件格式也不合理,文件过于冗长,使得文件的处理、存放、传递和交换不方便。另外,复杂的文件格式也使得编写一个读、写完整的DXF数据文件的程序接口是件不容易的工作。  
  随着CAD/CAM技术的发展和CAD/CAM系统应用的日益广泛,不同系统和系统不同子系统间的数据交换问题变得重要和迫切了,直接推动国家或国际上通用的数据交换文件标准的制定。  
   
  Top

9 楼yangxjn(一条)回复于 2004-12-21 23:27:00 得分 0

我有一个c++的例子。我给我信箱   我给你发   yangxjn@163.comTop

10 楼gdf78(yeah)回复于 2005-03-05 17:39:44 得分 0

楼上的朋友,可以给我也发个吗?   gdf78@163.com  
  谢谢了Top

11 楼gdf78(yeah)回复于 2005-03-05 21:17:46 得分 0

哪位朋友再来个如何显示的代码啊?  
  不知道怎么将DXF中的信息中心画出来Top

相关问题

  • 求VC源代码!
  • nurbs源代码(vc)
  • 求一本书的源代码!!!!!!!!!!!急用!!!急用!!!!!!
  • 求扫雷VC源代码
  • 求扫雷VC源代码
  • 有谁知道,或者有关于用VC,C/C++编写的关于TCP/IP,WINSTOCK的源代码?最好小一点的。急用!!!拜托!!!
  • 200分求index server的站内搜索asp源代码!!急用!
  • 谁有asp.net上传下载文件的源代码,急用
  • 谁有javascript 树型菜单源代码? 急用
  • 留言版'提交'按钮的源代码哪位有,急用!!!

关键词

  • 文件
  • 函数
  • 坐标
  • 数据
  • 代码
  • 结构
  • fscanf
  • dxf
  • cvertex
  • csequence

得分解答快速导航

  • 帖主:xhf_c

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo