新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论SVG, GML, X3D, VRML, VML, XAML, AVALON, Batik等基于XML的图形技术,以及有关GIS的应用。
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - 高级XML应用『 SVG/GML/VRML/X3D/XAML 』 → 请问有没有人做过将DXF格式的数据转换成GML数据? 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 5682 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 请问有没有人做过将DXF格式的数据转换成GML数据? 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     crystall 美女呀,离线,快来找我吧!
      
      
      等级:大一(高数修炼中)
      文章:8
      积分:108
      门派:XML.ORG.CN
      注册:2005/1/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给crystall发送一个短消息 把crystall加入好友 查看crystall的个人资料 搜索crystall在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看crystall的博客楼主
    发贴心情 请问有没有人做过将DXF格式的数据转换成GML数据?

    大体的流程如何?有没有已经实现的代码?

       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/26 20:27:00
     
     瓢虫虫 美女呀,离线,快来找我吧!
      
      
      等级:大一新生
      文章:5
      积分:78
      门派:XML.ORG.CN
      注册:2006/5/18

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给瓢虫虫发送一个短消息 把瓢虫虫加入好友 查看瓢虫虫的个人资料 搜索瓢虫虫在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看瓢虫虫的博客2
    发贴心情 
    我也想知道,期待中
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/6/1 10:47:00
     
     yuelongming 美女呀,离线,快来找我吧!
      
      
      等级:大一(猛啃高等数学)
      文章:24
      积分:202
      门派:XML.ORG.CN
      注册:2005/4/22

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给yuelongming发送一个短消息 把yuelongming加入好友 查看yuelongming的个人资料 搜索yuelongming在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看yuelongming的博客3
    发贴心情 
    以前收集的资料,不知道对你有没有帮助,我觉得首先要从DXF中读出数据,然后按照GML格式写入即可.

    读取DXF格式文件
    OpenGL是美国SGI公司最新推出的一套开放式的三维图形软件接口,适用于广泛的计算机
    环境,从个人计算机到工作站,OpenGL都能实现高性能的三维图形功能。OpenGL本身不
    仅提供对简单图元的操作和控制,还提供了许多函数用于复杂物体的建模。但是,我们
    通常喜欢使用AutoCAD和3DS及3Dmax等工具来建立模型,并且我们已经有了很多这样的模
    型,那么我们如何才能资源共享,避免重复劳动呢?利用CAD图形标准数据交换格式—D
    XF格式,我们就能很容易地实现资源共享,而不需要重复建模。
    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 来写一个读取DX
    F文件的小程序。
    在实际应用中,模型中实体的数目以及实体中点和面的数目都是不定的,为了有效地利
    用内存,我们选择MFC类库中的聚合类CobArray类所创建的对象vertex, sequence来存储
    和管理实体的点坐标和点序。
    CObArray类是一个用来存放数组类的聚合类,它能根据要存进来的数组(或结构)多少
    自动进行自身大小的高速,而且这个类本身具有的成员函数使得我们对它的对象的操作
    更加方便、快捷,用它编的程序也易于读懂。
    三维实体模型的模型信息中的一部分信息可以在标题段中读出,通过读取变量名为$UC
    SORG的三个变量,可以得到三维实体在世界坐标系中自身所定义的用户坐标系原点的三
    维坐标。通过读取$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);
    }

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/6/1 14:57:00
     
     crystall 美女呀,离线,快来找我吧!
      
      
      等级:大一(高数修炼中)
      文章:8
      积分:108
      门派:XML.ORG.CN
      注册:2005/1/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给crystall发送一个短消息 把crystall加入好友 查看crystall的个人资料 搜索crystall在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看crystall的博客4
    发贴心情 
    谢谢!今天刚看到消息,还没得试验呢,
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/6/4 19:43:00
     
     ahuzhichao 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:59
      门派:XML.ORG.CN
      注册:2007/5/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给ahuzhichao发送一个短消息 把ahuzhichao加入好友 查看ahuzhichao的个人资料 搜索ahuzhichao在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看ahuzhichao的博客5
    发贴心情 ding
    楼上的朋友,可否把你的原代码发给我研究研究,很有兴趣啊!!
    ahuzhichao_2004@126.com
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/5/5 21:13:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/29 21:47:36

    本主题贴数5,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    3,750.000ms