dxflib保存dxf文件 原创

前言

在这里插入图片描述

dxflib是一个用于处理DXF文件的开源C++库。DXF(Drawing Exchange Format)文件是AutoCAD的一种二维图形格式,广泛用于CAD数据交换。dxflib通过读取和解析DXF文件,将其内容转换为可供渲染和显示的矢量图形,使得开发者能够轻松地在自己的应用程序中集成和展示DXF图形。

以下是dxflib的详细简介:

一、主要功能

读取和解析DXF文件:dxflib能够读取DXF文件,并解析其中的各种图形元素,如点、线段、圆弧、多边形等。
图形显示:通过dxflib,开发者可以将解析得到的图形元素绘制到窗口或画布上,实现图形的实时显示和操纵。
图形编辑:除了显示图形,dxflib还提供了图形编辑功能,允许开发者选择图形、测量距离、编辑图形对象的属性等。
保存DXF文件:修改后的图形可以保存为新的DXF文件,便于后续的编辑和处理。

二、特点

跨平台性:dxflib可以在多种操作系统上运行,包括Windows、Mac和Linux,提高了开发效率。
易于使用:dxflib提供了一套简单易用的API,使得开发者能够轻松地在自己的项目中集成dxflib并显示DXF图形。
功能丰富:除了基本的图形显示功能外,dxflib还支持图形编辑、选择、测量等多种功能。

三、工作原理

引入库文件:首先,需要将dxflib库引入到项目中,通常可以从dxflib的官方网站或其他渠道下载库文件,并将其导入到工程中。
创建显示窗口:然后,需要创建一个窗口或画布,用于显示DXF图形。可以使用设计好的界面组件,或者直接在代码中创建。
加载和解析DXF文件:使用dxflib提供的函数或方法加载DXF文件,并逐个读取文件中的图形元素,如线段、圆弧等。
绘制图形:将解析得到的图形元素绘制到创建的窗口或画布上,可以设置图形的颜色、线型、填充等属性。

四、使用示例

在使用dxflib时,通常需要继承DL_CreationAdapter类并重写其虚函数,以便在解析DXF文件时接收并处理图形元素。例如,可以重写addLine方法来处理线段元素:

cpp

class MyDxfFilter : public DL_CreationAdapter {  
public:  
    virtual void addLine(const DL_LineData& d) {  
        // 处理线段数据,例如将其绘制到窗口或画布上  
        std::cout << "Line: " << d.x1 << "/" << d.y1 << " " << d.x2 << "/" << d.y2 << std::endl;  
    }  
    // ... 其他需要重写的虚函数  
};  

// 使用MyDxfFilter和DL_Dxf类读取和解析DXF文件

MyDxfFilter f;  
DL_Dxf dxf;  
if (!dxf.in("drawing.dxf", &f)) {  
    std::cerr << "drawing.dxf could not be opened.\n";  
}

在这个示例中,当DL_Dxf类读取DXF文件并解析出线段元素时,会调用MyDxfFilter类的addLine方法,并将线段数据作为参数传递给该方法。开发者可以在该方法中实现自己的图形绘制逻辑。

五、总结
dxflib是一个功能强大且易于使用的开源C++库,专门用于处理DXF文件。它提供了丰富的API和灵活的接口,使得开发者能够轻松地在自己的项目中集成和展示DXF图形。无论是开发CAD软件还是其他需要处理DXF图形的项目,都可以考虑使用dxflib来提高开发效率和图形处理能力。

dxf文件写入

为了写DXF文件,你可能需要反复嵌套调用dxflib的许多函数。dxflib本身并不存储任何entities,你需要到达entities的位置,并且对每个entities调用相应的写函数。你必须确保以正确的顺序调用dxflib的函数,否则生成的DXF文件可能不符合标准。

创建一个Writer对象

为了创建Writer,你需要指定DXF文件的版本号。目前只有两种可用的DXF版本:R12和DXF 2000/2002。R12对应的dxflib编码是DL_CodesAC1009,DXF 2000/2002对应的是DL_CodesAC1015。

用两种API接口可以用于写DXF文件。DL_WriterA接口提供一种相对底层的操作key/value元祖的方式。用DL_WriterA接口创建一个有效的DXF文件是很繁琐的。因此,还有一个相对高级的DL_Dxf接口可以再不了解key/value的前提下直接写入整条线。

下面的代码创建并以写方式打开一个DXF 2000/2002文件:

1 DL_Dxf dxf;
2 DL_Codes::version exportVersion = DL_Codes::AC1015;
3 DL_WriterA* dw = dxf.out("myfile.dxf", exportVersion);
4 if (dw==NULL)
5 {
6     printf("Cannot open file 'myfile.dxf' \
7         for writing.");
8     // abort function e.g. with return
9 }
打开DXF Header

DXF Header包含了DXF文件的版本信息。因此,必须用dxf.writeHeader(*dw)再最开始写入DXF Header。下面的列表显示了一个DXF Header的典型布局:

999
dxflib 2.0.4.8
  0
SECTION
  2
HEADER
  9
$ACADVER
  1
AC1015
  9
$HANDSEED
  5
FFFF

存储附加的变量

1 // int variable:
 2 dw->dxfString(9, "$INSUNITS");
 3 dw->dxfInt(70, 4);
 4 // real (double, float) variable:
 5 dw->dxfString(9, "$DIMEXE");
 6 dw->dxfReal(40, 1.25);
 7 // string variable:
 8 dw->dxfString(9, "$TEXTSTYLE");
 9 dw->dxfString(7, "Standard");
10 // vector variable:
11 dw->dxfString(9, "$LIMMIN");
12 dw->dxfReal(10, 0.0);
13 dw->dxfReal(20, 0.0);

关闭Header在这里插入代码片

dw->sectionEnd();

打开Tables Section

dw->sectionTables();

写Viewports

dxf.writeVPort(*dw);

写Linetypes

1 dw->tableLineTypes(25);
 2 dxf.writeLineType(*dw, DL_LineTypeData("BYBLOCK", 0));
 3 dxf.writeLineType(*dw, DL_LineTypeData("BYLAYER", 0));
 4 dxf.writeLineType(*dw, DL_LineTypeData("CONTINUOUS", 0));
 5 dxf.writeLineType(*dw, DL_LineTypeData("ACAD_ISO02W100", 0));
 6 dxf.writeLineType(*dw, DL_LineTypeData("ACAD_ISO03W100", 0));
 7 dxf.writeLineType(*dw, DL_LineTypeData("ACAD_ISO04W100", 0));
 8 dxf.writeLineType(*dw, DL_LineTypeData("ACAD_ISO05W100", 0));
 9 dxf.writeLineType(*dw, DL_LineTypeData("BORDER", 0));
10 dxf.writeLineType(*dw, DL_LineTypeData("BORDER2", 0));
11 dxf.writeLineType(*dw, DL_LineTypeData("BORDERX2", 0));
12 dxf.writeLineType(*dw, DL_LineTypeData("CENTER", 0));
13 dxf.writeLineType(*dw, DL_LineTypeData("CENTER2", 0));
14 dxf.writeLineType(*dw, DL_LineTypeData("CENTERX2", 0));
15 dxf.writeLineType(*dw, DL_LineTypeData("DASHDOT", 0));
16 dxf.writeLineType(*dw, DL_LineTypeData("DASHDOT2", 0));
17 dxf.writeLineType(*dw, DL_LineTypeData("DASHDOTX2", 0));
18 dxf.writeLineType(*dw, DL_LineTypeData("DASHED", 0));
19 dxf.writeLineType(*dw, DL_LineTypeData("DASHED2", 0));
20 dxf.writeLineType(*dw, DL_LineTypeData("DASHEDX2", 0));
21 dxf.writeLineType(*dw, DL_LineTypeData("DIVIDE", 0));
22 dxf.writeLineType(*dw, DL_LineTypeData("DIVIDE2", 0));
23 dxf.writeLineType(*dw, DL_LineTypeData("DIVIDEX2", 0));
24 dxf.writeLineType(*dw, DL_LineTypeData("DOT", 0));
25 dxf.writeLineType(*dw, DL_LineTypeData("DOT2", 0));
26 dxf.writeLineType(*dw, DL_LineTypeData("DOTX2", 0));
27 dw->tableEnd();

写Layers

1 int numberOfLayers = 3;
 2 
 3 dw->tableLayers(numberOfLayers);
 4 
 5 dxf.writeLayer(*dw,
 6     DL_LayerData("0", 0),
 7     DL_Attributes(
 8         std::string(""),    // leave empty
 9         DL_Codes::black,    // default color
10         100,                // default width
11         "CONTINUOUS"));     // default line style
12 
13 dxf.writeLayer(*dw,
14     DL_LayerData("mainlayer", 0),
15     DL_Attributes(
16         std::string(""),
17         DL_Codes::red,
18         100,
19         "CONTINUOUS"));
20 
21 dxf.writeLayer(*dw,
22     DL_LayerData("anotherlayer", 0),
23     DL_Attributes(
24         std::string(""),
25         DL_Codes::black,
26         100,
27         "CONTINUOUS"));
28 
29 dw->tableEnd();

写Block Records

1 dxf.writeBlockRecord(*dw);
2 dxf.writeBlockRecord(*dw, "myblock1");
3 dxf.writeBlockRecord(*dw, "myblock2");
4 dw->tableEnd();

结束Tables Section

dw->sectionEnd();

写Blocks Section

1 dw->sectionBlocks();
 2 
 3 dxf.writeBlock(*dw,
 4     DL_BlockData("*Model_Space", 0, 0.0, 0.0, 0.0));
 5 dxf.writeEndBlock(*dw, "*Model_Space");
 6 
 7 dxf.writeBlock(*dw,
 8     DL_BlockData("*Paper_Space", 0, 0.0, 0.0, 0.0));
 9 dxf.writeEndBlock(*dw, "*Paper_Space");
10 
11 dxf.writeBlock(*dw,
12     DL_BlockData("*Paper_Space0", 0, 0.0, 0.0, 0.0));
13 dxf.writeEndBlock(*dw, "*Paper_Space0");
14 
15 dxf.writeBlock(*dw,
16     DL_BlockData("myblock1", 0, 0.0, 0.0, 0.0));
17 
18 // ...
19 // write block entities e.g. with dxf.writeLine(), ..
20 // ...
21 dxf.writeEndBlock(*dw, "myblock1");
22 
23 dxf.writeBlock(*dw,
24     DL_BlockData("myblock2", 0, 0.0, 0.0, 0.0));
25 
26 // ...
27 // write block entities e.g. with dxf.writeLine(), ..
28 // ...
29 dxf.writeEndBlock(*dw, "myblock2");
30 
31 dw->sectionEnd();

写Entities Section

 1 dw->sectionEntities();
 2 
 3 // write all your entities..
 4 
 5 dxf.writePoint(*dw,
 6     DL_PointData(10.0, 45.0, 0.0),
 7     DL_Attributes("mainlayer", 256, -1, "BYLAYER"));
 8 
 9 dxf.writeLine(*dw,
10     DL_LineData(25.0, 30.0, 0.0,   // start point
11              100.0, 120.0, 0.0),   // end point
12     DL_Attributes("mainlayer", 256, -1, "BYLAYER"));
13 dw->sectionEnd();

写Objects Section

dxf.writeObjects(*dw);
dxf.writeObjectsEnd(*dw);

结束并且关闭文件

dw->dxfEOF();
dw->close();
delete dw;

参考:

https://www.cnblogs.com/liuyunfeifei/archive/2012/11/29/2794490.html

网址
参考文档

posted @ 2024-07-12 13:42  一点灯  阅读(0)  评论(0编辑  收藏  举报  来源