Open Cascade DataExchange DXF

eryar@163.com

摘要Abstract:对DXF文本格式进行详细介绍,并介绍了如何使用开源库dxflib对DXF文件进行读写操作,并将DXF文件中图形导入到OpenCascade。

关键字Key Words:DXF、Open Cascade、Data Exchange, dxflib

一、引言 Introduction

目前市面上的CAD系统都有自己的数据文件,各个系统之间的数据结构和格式各不相同,这样极大影响了设计和制造部门之间或企业之间的数据传输和程序衔接的自动化,同样给CMM和CAD/CAM的数据通信带来困难。因此,迫切需要数据交换文件格式的标准化。

产品数据的正确交换可以使双方不必重建数据,提高效率。产品数据交换的通常做法是使用数据交换接口,即需要交换的每一系统与标准数据格式(中性格式)之间开发双向转换接口,两系统通过中性格式进行交换。

DXF是Drawing eXchange File的缩写,意思为图形交换文件,在工程制图中有广泛的应用,掌握了DXF文件的读写对编写CAD软件时的图形信息的交换有重要意义。它有两种格式:一种是ASCII DXF格式;一种是二进制DXF格式。ASCII DXF文件格式是ASCII 文字格式的AutoCAD图形的完整表示,这种文件格式易于被其它程序处理。二进制格式的DXF文件与ASCII格式的DXF文件包含的信息相同,但格式上二进制格式比ASCII格式更精简,能够节省百分之二十五的文件空间。AutoCAD能够更快地对其执行读写操作(通常能快五倍)。这可能是对ASCII格式的DXF文件操作时有ASCII与二进制形式的转换,因而花费时间较多。ASCII格式的DXF文件可读性强。

OpenCascade也有数据交换接口DataExchange,可对主流图形交换格式进行读写。

Figure 1.1 DataExchange Module of OpenCascade

其中对STEP、IGES、STL、VRML的程序是开源的,对ACIS的SAT、Parasolid的X_T和DXF数据交换的程序是收费的,对DXF读写的是DXF-Import-Export,详情可参考:

http://www.opencascade.org/support/products/dataex/,也可直接和OpenCascade进行联系。

二、DXF格式简介 DXF Introduction

一个完整的ASCII格式的DXF文件结构如下:

l HEADER段。它包含图形的基本信息。它由AutoCAD数据库版本号和一些系统变量组成。每个参数都包含一个变量名称及其关联的值。

l CLASSES段。包含应用程序定义的类的信息,这些类的实例出现在数据库的BLOCKS、ENTITIES和OBJECTS段中。类定义在类的层次结构中是固定不变的。

l TABLES段。包含以下符号表的定义:

APPID(应用程序标识表)

BLOCK_RECORD(块参照表)

DIMSTYLE(标注样式表)

LAYER(图层表)

LTYPE(线型表)

STYLE(文字样式表)

UCS(用户坐标系表)

VIEW(视图表)

VPORT(视口配置表)

l BLOCKS段。包含构成图形中每个块参照的块定义和图形图元。

l ENTITIES段。包含图形中的图形对象(图元),其中包括块参照(插入图元)。这里的信息很重要。

l OBJECTS段。包含图形中的非图形对象。除图元、符号表记录以及符号表以外的所有对象都存储在此段。OBJECTS段中的条目样例是包含多线样式和组的词典。

l THUMBNAILIMAGE段。包含图形的预览图像数据。此段为可选。

每个段都以一个后跟字符串SECTION的组码0开始,其后是组码2和表示该段名称的字符串(例如,HEADER)。每个段都由定义其元素的组码和值组成。每个段都以一个后跟字符串ENDSEC的组码0结束。

关于DXF文件更详细内容可参考我08年写的一篇文章《用C读取DXF文件》,可以从网上下载,网址:http://blog.csdn.net/eryar/article/details/2371755。在11年又写了一个《Read DXF File》,虽然使用了继承,但是读入时的很多判断的处理感觉还不是很满意,文章代码网址:

http://www.cppblog.com/eryar/archive/2013/03/26/162303.html

参考这些代码,可以完全理解文本格式的DXF文件,并可自己动手来处理DXF文件了。

三、使用dxflib与OpenCascade交换数据 Wrap dxflib for OpenCascade DataExchange

如果程序中只用到DXF简单的图形,如直线、圆弧、圆等,可以自己写个处理的程序;如果要处理DWG格式的文件,有些库可以使用,如openDWG Toolkit,虽然带有Open字样,但是这个工具并不是免费的,免费的有LibreDWG;如果只处理文本格式的DXF文件,可以使用库dxflib。当然dxflib也是有不足之处的,如只能处理文本格式的DXF,不能处理二进制格式,不能处理包含的ACIS三维实体等。如果程序只处理简单的图形、三维面片等,dxflib还是很好用的。

dxflib的使用方法很简单,通过调用 DL_Dxf 对象的 in 函数并将指针传递给一个继承 DL_CreationAdapter 抽象类来打开此文件。in 函数运行时,会调用传递给它的类中的几个函数。如今,有数十个这样的函数(参阅DXFLib程序员手册),但是在大多数情况下,受关注最多的有如下这几个函数:addPoint、addLine、 addCircle 和 addVertex。您只需实现您所关注的那些函数;剩下的您可以忽略。

下面给出一个使用dxflib读取形状并转换到OpenCascade中的具体例子。

四、程序示例 Example Code

这里给出具体的程序示例,当然目前只实现部分形状到OpenCascade的转换,如果有兴趣可以实现其他形状的实现。程序代码如下所示:

类声明文件:DxfReader.h

/*
* Copyright (c) 2013 eryar All Rights Reserved.
*
* File : DxfReader.h
* Author : eryar@163.com
* Date : 2013-12-22 14:40
* Version : 1.0v
*
* Description : Use dxflib to import entities from DXF to OpenCascade.
*
* Key Words : OpenCascade, dxflib, DXF, DataExchange
*
*/ #pragma once #define WNT
#include <TopoDS_Shape.hxx>
#include <BRep_Builder.hxx> #include <memory> #include "dl_dxf.h"
#include "dl_creationadapter.h" /**
* @breif Facade dxflib for OpenCascade DataExchange with DXF.
*/
class DxfReader : public DL_CreationAdapter
{
public:
/**
* @brief constructor.
* @param fileName [in] dxf file name with path.
*/
DxfReader(const std::string& fileName);
~DxfReader(void); /**
* @brief Get the shape of the dxf.
* @return OpenCascade topology shape.
*/
const TopoDS_Shape& GetShape(void) const; public:
virtual void addPoint(const DL_PointData&);
virtual void addLine(const DL_LineData& line);
virtual void addArc(const DL_ArcData& arc);
virtual void addCircle(const DL_CircleData& circle);
virtual void addEllipse(const DL_EllipseData&); virtual void addPolyline(const DL_PolylineData& polyline);
virtual void addVertex(const DL_VertexData&); virtual void addSpline(const DL_SplineData&);
virtual void addKnot(const DL_KnotData&);
virtual void addControlPoint(const DL_ControlPointData&); virtual void add3dFace(const DL_3dFaceData&);
virtual void addSolid(const DL_SolidData& solid); private:
std::auto_ptr<DL_Dxf> mDxf; TopoDS_Compound mShape; BRep_Builder mBuilder;
};

类定义文件:DxfReader.cpp

/*
* Copyright (c) 2013 eryar All Rights Reserved.
*
* File : DxfReader.cpp
* Author : eryar@163.com
* Date : 2013-12-22 14:40
* Version : 1.0v
*
* Description : Use dxflib to import entities from DXF to OpenCascade.
*
* Key Words : OpenCascade, dxflib, DXF, DataExchange
*
*/ #include "DxfReader.h" #include <Degrees.hxx> #include <gp_Circ.hxx>
#include <gp_Elips.hxx> #include <GC_MakeSegment.hxx>
#include <GC_MakeCircle.hxx>
#include <GC_MakeArcOfCircle.hxx>
#include <GC_MakeEllipse.hxx> #include <TopoDS.hxx>
#include <TopoDS_Edge.hxx> #include <BRepBuilderAPI_MakeVertex.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>
#include <BRepBuilderAPI_MakePolygon.hxx> DxfReader::DxfReader(const std::string& fileName)
: mDxf(new DL_Dxf())
{
mBuilder.MakeCompound(mShape); mDxf->in(fileName, this);
} DxfReader::~DxfReader(void)
{
} const TopoDS_Shape& DxfReader::GetShape() const
{
return mShape;
} void DxfReader::addPoint(const DL_PointData& point)
{
mBuilder.Add(mShape, BRepBuilderAPI_MakeVertex(gp_Pnt(point.x, point.y, point.z)));
} void DxfReader::addLine(const DL_LineData& line)
{
Handle_Geom_Curve theSegment = GC_MakeSegment(gp_Pnt(line.x1, line.y1, line.z1), gp_Pnt(line.x2, line.y2, line.z2)); mBuilder.Add(mShape, BRepBuilderAPI_MakeEdge(theSegment));
} void DxfReader::addArc(const DL_ArcData &arc)
{
gp_Circ theCircle;
theCircle.SetRadius(arc.radius);
theCircle.SetLocation(gp_Pnt(arc.cx, arc.cy, arc.cz)); Handle_Geom_Curve theArc = GC_MakeArcOfCircle(theCircle, DEG(arc.angle1), DEG(arc.angle2), false); mBuilder.Add(mShape, BRepBuilderAPI_MakeEdge(theArc));
} void DxfReader::addCircle(const DL_CircleData& circle)
{
gp_Circ aCircle;
aCircle.SetRadius(circle.radius);
aCircle.SetLocation(gp_Pnt(circle.cx, circle.cy, circle.cz)); Handle_Geom_Curve theCircle = GC_MakeCircle(aCircle); mBuilder.Add(mShape, BRepBuilderAPI_MakeEdge(theCircle));
} void DxfReader::addEllipse(const DL_EllipseData& ellipse)
{
} void DxfReader::addPolyline(const DL_PolylineData& polyline)
{
} void DxfReader::addVertex(const DL_VertexData& vertex)
{
} void DxfReader::addSpline(const DL_SplineData& spline)
{
} void DxfReader::addKnot(const DL_KnotData& knot)
{
} void DxfReader::addControlPoint(const DL_ControlPointData& cp)
{
} void DxfReader::add3dFace(const DL_3dFaceData& face)
{
BRepBuilderAPI_MakePolygon polygon(
gp_Pnt(face.x[], face.y[], face.z[]),
gp_Pnt(face.x[], face.y[], face.z[]),
gp_Pnt(face.x[], face.y[], face.z[]),
gp_Pnt(face.x[], face.y[], face.z[]), true); BRepBuilderAPI_MakeFace makeFace(polygon.Wire()); if (makeFace.IsDone())
{
mBuilder.Add(mShape, makeFace.Face());
} //mBuilder.Add(mShape, polygon.Wire());
} void DxfReader::addSolid(const DL_SolidData &solid)
{
add3dFace(solid);
}

类DxfReader的使用也很简单,程序如下所示:

/*
* Copyright (c) 2013 eryar All Rights Reserved.
*
* File : Main.cpp
* Author : eryar@163.com
* Date : 2013-12-22 15:00
* Version : 1.0v
*
* Description : Use dxflib to import entities from DXF to OpenCascade.
*
* Key Words : OpenCascade, dxflib, DXF, DataExchange
*
*/ #include "DxfReader.h" #include <BRepTools.hxx> #pragma comment(lib, "TKernel.lib")
#pragma comment(lib, "TKMath.lib")
#pragma comment(lib, "TKBRep.lib")
#pragma comment(lib, "TKGeomBase.lib")
#pragma comment(lib, "TKTopAlgo.lib") int main(int argc, char* argv[])
{
std::string strFile = ((argc > ) ? argv[] : "test.dxf"); DxfReader dxfReader(strFile); ofstream brepFile("dxf.brep"); BRepTools::Write(dxfReader.GetShape(), brepFile); return ;
}

程序效果还不错,给出几个程序处理的例子如下图所示:

Figure 4.1 Use DxfReader import DXF to OpenCascade

Figure 4.2 Use DxfReader import DXF to OpenCascade

五、结论 Conclusion

DXF格式是图形数据交换的一种常见格式,DXF文件的读写对CAD/CAM程序很有意义。本文通过把dxflib简单封装把DXF中图形转换为OpenCascade中的形状,为免费在OpenCascade中进行DXF数据交换提供了一个思路。希望本文对你有所帮助。

六、参考资料 References

1. 使用开源库读取DWG和DXF文件,

http://www.ibm.com/developerworks/cn/opensource/os-autocad/

2. eryar, 用C读取DXF文件, http://blog.csdn.net/eryar/article/details/2371755

3. eryar, Read DXF File, http://www.cppblog.com/eryar/archive/2013/03/26/162303.html

4. openDWG, http://www.opendesign.com/

5. OpenCascade, DXF Import-Export, http://www.opencascade.org/support/products/dataex/dxf/

Open Cascade DataExchange DXF的更多相关文章

  1. Open Cascade DataExchange IGES

    Open Cascade DataExchange IGES eryar@163.com 摘要Abstract:本文结合OpenCascade和Initial Graphics Exchange Sp ...

  2. Open Cascade Data Exchange STL

    Open Cascade Data Exchange STL eryar@163.com 摘要Abstract:介绍了三维数据交换格式STL的组成,以及Open Cascade中对STL的读写.并将O ...

  3. OpenCASCADE DataExchange DWG

    OpenCASCADE DataExchange DWG eryar@163.com Abstract. DWG is a file format created in the 70’s for th ...

  4. Open CASCADE Technology(OCCT)概述

    OCCT模块结构图 基础类: Foundation Classes module underlies all other OCCT classes; 模型数据: Modeling Data modul ...

  5. OPEN CASCADE编译视频

    为了帮助OPEN CASCADE新手顺利编译OPEN CASCADE源码,特录制了一个视频, 有了这个视频,OPEN CASCADE的编译再也不麻烦啦!

  6. Function Set in OPEN CASCADE

    Function Set in OPEN CASCADE eryar@163.com Abstract. The common math algorithms library provides a C ...

  7. Apply Newton Method to Find Extrema in OPEN CASCADE

    Apply Newton Method to Find Extrema in OPEN CASCADE eryar@163.com Abstract. In calculus, Newton’s me ...

  8. 《A Convolutional Neural Network Cascade for Face Detection》

    文章链接:   http://pan.baidu.com/s/1bQBJMQ  密码:4772 作者在这里提出了基于神经网络的Cascade方法,Cascade最早可追溯到Haar Feature提取 ...

  9. OPEN CASCADE Multiple Variable Function

    OPEN CASCADE Multiple Variable Function eryar@163.com Abstract. Multiple variable function with grad ...

随机推荐

  1. android camera 自定义开发

    1.检测是否有摄像头 /** Check if this device has a camera */ private boolean checkCameraHardware(Context cont ...

  2. C2解题报告合集~

    定时更新~ http://www.cnblogs.com/newbe/ http://www.cnblogs.com/newbe/p/4069834.html http://www.cnblogs.c ...

  3. Android 客户端设计之解决方案

    解决方案,是正对与需求来谈的.一个抽象的需求,需要一个较为上层抽象的解决方案来处理,这是病和药的关系.但是一个解决方案,可能会包含多个功能,每个功能都是解决方案上的一个节点.一个优秀的解决方案必然需要 ...

  4. Docker Machine v1.11.2安装与使用

    官方文档:Docker Machine 官方文档:Docker Toolbox boot2docker安装包官网下载链接:Docker Toolbox-1.11.1b.exe 此安装包包含的“boot ...

  5. .NET跨平台实践:用C#开发Linux守护进程(转)

    Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...

  6. javascript的执行和预解析

    很久以前遇到过一个面试题目,的的确确是面试官问我的问题,下面是这个问题的代码部分.由于年少无知,没有回答上,被无情pass了. var u ='hello world'; ;(function(){ ...

  7. Silverlight4中实现Theme的动态切换

    Silverlight一般用来开发一些企业的应用系统,如果用户一直面对同一种风格的页面,时间长了难免厌烦,所以一般都会提供好几种风格及Theme供用户选中,下面就来说一下如何在不重新登录系统的情况下, ...

  8. [体感游戏] 1、MPU6050数据采集传输与可视化

    最近在研究体感游戏,到目前为止实现了基于51单片机的MPU6050数据采集.利用蓝牙模块将数据传输到上位机,并利用C#自制串口数据高速采集软件,并且将数据通过自制的折线图绘制模块可视化地展示出来等功能 ...

  9. 深入CSS,让网页开发少点“坑”

    通常我们在学习CSS的时候,感觉语法很容易掌握,实际应用中却碰到各式各样难以填补的“坑”,为避免大家受到同样的困惑与不解,本文详细讲解了CSS中优先级和Stacking Context等高级特性.让你 ...

  10. IOS Animation-CAKeyframeAnimation例子(简单动画实现)

    在阅读本文之前,可以看看 CABasicAnimation的例子 也可以看看IOS Animation-CABasicAnimation.CAKeyframeAnimation详解&区别&am ...