CadLib 用于创建 DXF(绘图交换格式)文件






4.90/5 (116投票s)
一个链接库及其接口类,用于创建、加载和修改 DXF 文件。
引言
什么是 DXF?
绘图交换格式 (DXF) 文件使得在 AutoCAD 和其他程序之间交换绘图成为可能。DXF 文件可以是 ASCII 或二进制格式。由于 ASCII DXF 文件比二进制格式更常见,CadLib 使用 ASCII DXF 格式。
什么是 CadLib?
CadLib 不是计算机辅助设计 (CAD) 程序。它是一个用于创建 CAD 程序中使用的 DXF 文件的工具。它由两部分组成。其中一部分是用于创建 DXF 文件的动态链接库。另一部分是编程接口。它是一个类,集成了 cadio.dll 函数。它可以在 Microsoft Visual C++ 项目中使用。此外,cadio.dll 也可以在其他 Win32 程序中使用。
为什么使用 CadLib?
在某些程序中,需要创建绘图输出以供 AutoCad 等其他程序使用。例如,在一个“建筑详图生成器程序”中,程序需要创建绘图输出。而最标准的用于交换绘图数据格式是 DXF。
DXF 文件结构
DXF 格式是绘图文件中所有信息的标记数据表示。标记数据 意味着文件中的每个数据元素前面都有一个称为 组代码 的整数。组代码的值指示了后面数据元素的类型。对于给定的对象(或记录)类型,此值还指示了数据元素的含义。绘图文件中几乎所有用户指定的信息都可以用 DXF 格式表示。(摘自 AutoCad 的 DXF 参考)
DXF 文件由一些部分组成。每个部分本身包含一些绘图数据。CadLib 使用以下部分
- HEADER
- TABLES
- BLOCKS
- ENTITIES
CadLib 使用的 DXF 文件结构的主要参考是 AutoCad 的 DXF 参考。您可以在 此处 找到有关 DXF 文件结构的更多信息。
类
这些类是 CadIO.dll 和主程序之间的接口。“Test”程序随 CadLib 一起提供,用于演示如何使用 CDxfFileWrite
和 CDrawing
类生成 DXF 文件。
CDxfFileWrite 类
CDxfFileWrite
收集直接创建 DXF 文件所需的所有命令。CDxfFileWrite
的用法如下
- 创建 DXF 文件
CDxfFileWrite dxffile; dxffile.Create( "d:\\test.dxf" );
- 开始和结束 HEADER 部分。此部分是为了兼容某些 CAD 程序。其他程序在没有 HEADER 部分的情况下也能工作。
// Header Section ------------------------------------------ dxffile.BeginSection(SEC_HEADER); dxffile.EndSection(); // close HEADER section ------------------------------------
- 开始 TABLES 部分,然后放入任意数量的 LAYER、LTYPE、STYLE、DIMSTYLE 表类型,然后关闭该部分
// Tables Section ------------------------------------------ dxffile.BeginSection(SEC_TABLES); // LTYPE table type ------------------------- dxffile.BeginTableType(TAB_LTYPE); DXFLTYPE ltype; double elem[4]; // Continuous ZeroMemory(<ype, sizeof(ltype)); ltype.Name = "Continuous"; ltype.DescriptiveText = "Solid line"; dxffile.AddLinetype(<ype); // DASHDOT2 ZeroMemory(<ype, sizeof(ltype)); ltype.Name = "DASHDOT2"; ltype.DescriptiveText = "Dash dot (.5x) _._._._._._._._._._._._._._._."; ltype.ElementsNumber = 4; ltype.TotalPatternLength = 0.5; ltype.Elements = elem; elem[0] = 0.25; elem[1] = -0.125; elem[2] = 0.0; elem[3] = -0.125; dxffile.AddLinetype(<ype); dxffile.EndTableType(); // close LTYPE table type ------------------- // LAYER table type ------------------------- result &= dxffile.BeginTableType(TAB_LAYER); result &= dxffile.AddLayer("Layer1", 1, "Continuous"); result &= dxffile.AddLayer("Layer2", 2, "Continuous"); result &= dxffile.AddLayer("Layer3", 3, "Continuous"); result &= dxffile.AddLayer("Layer4", 4, "Continuous"); result &= dxffile.EndTableType(); // close LAYER table type ------------------- // STYLE table type ------------------------- dxffile.BeginTableType(TAB_STYLE); DXFSTYLE tstyle; ZeroMemory(&tstyle, sizeof(tstyle)); tstyle.Name = "Style1"; tstyle.PrimaryFontFilename = "TIMES.TTF"; tstyle.Height = 0.3; tstyle.WidthFactor = 1; dxffile.AddTextStyle(&tstyle); dxffile.EndTableType(); // close STYLE table type ------------------- // DIMSTYLE table type ---------------------- dxffile.BeginTableType(TAB_DIMSTYLE); DXFDIMSTYLE dimstyle; // DIM1 ZeroMemory(&dimstyle, sizeof(dimstyle)); dimstyle.Name = "DIM1"; // DimStyle Name dimstyle.DIMCLRD = 2; // Dimension line & Arrow heads color dimstyle.DIMDLE = 0.0000; // Dimension line size after Extensionline dimstyle.DIMCLRE = 2; // Extension line color dimstyle.DIMEXE = 0.1800; // Extension line size after Dimline dimstyle.DIMEXO = 0.0625; // Offset from origin dimstyle.DIMBLK1 = "ClosedFilled";// 1st Arrow head dimstyle.DIMBLK2 = "ClosedFilled";// 2nd Arrow head dimstyle.DIMASZ = 0.1800; // Arrow size dimstyle.DIMTXSTY = "Style1"; // Text style dimstyle.DIMCLRT = 3; // Text color dimstyle.DIMTXT = 0.1800; // Text height dimstyle.DIMTAD = 1; // Vertical Text Placement dimstyle.DIMGAP = 0.0900; // Offset from dimension line dxffile.AddDimStyle(&dimstyle); dxffile.EndTableType(); // close DIMSTYLE table type ---------------- dxffile.EndSection(); // close TABLES section ------------------------------------
- 开始 ENTITIES 部分,然后放入实体数据(LINE、CIRCLE、SOLID、TEXT、ARC、POINT、DIMLINEAR),最后关闭该部分
// Entities Section ------------------------------------------ dxffile.BeginSection(SEC_ENTITIES); // set current layer to Layer2 dxffile.SetCurrentLayer("Layer2"); // draw a line dxffile.Line(1.2, 3.3, 7.5, 7.7); // draw a circle dxffile.Circle(7.8, 4.3, 1.75); // set current layer to Layer4 dxffile.SetCurrentLayer("Layer4"); // draw a solid REALPOINT points[4]; points[0].x = 10.4; points[0].y = 7.2; points[1].x = 13.6; points[1].y = 7.4; points[2].x = 13.1; points[2].y = 4.9; points[3].x = 10.9; points[3].y = 5.9; Solid(4, points); // set current textstyle to Style1 dxffile.SetCurrentTextStyle("Style1"); // draw text dxffile.Text("Sample Text", 5.9, 6.7, 0.3, 35); // draw a dimension line dxffile.SetCurrentDimStyle("DIM1"); dxffile.DimLinear(6.05, 3, 9.55, 3, 9.55, 2, 0, "3.50"); dxffile.EndSection(); // close ENTITIES section ----------------------------------
- 关闭 DXF 文件
dxffile.Close();
CDrawing 类
CDrawing
类拥有在内存中创建绘图并将其保存为 DXF 文件所需的所有命令。CDrawing
的用法如下
- 创建内存中的绘图
CDrawing drw; drw.Create( );
- 创建任意数量的新的 LAYER、LTYPE、STYLE、DIMSTYLE 表类型。
// Tables Section ------------------------------------------ // LTYPE table type ------------------------- LTYPE ltype; OBJHANDLE objhandle1; // Continuous ZeroMemory(<ype, sizeof(ltype)); strcpy(ltype.Name, "Continuous"); strcpy(ltype.DescriptiveText, "Solid line"); objhandle1 = drw.AddLinetype(<ype); // DASHDOT2 ZeroMemory(<ype, sizeof(ltype)); strcpy(ltype.Name, "DASHDOT2"); strcpy(ltype.DescriptiveText, "Dash dot (.5x) _._._._._._._._._._._._._._._."); ltype.ElementsNumber = 4; ltype.PatternLength = 0.5; ltype.Elements[0] = 0.25; ltype.Elements[1] = -0.125; ltype.Elements[2] = 0.0; ltype.Elements[3] = -0.125; drw.AddLinetype(<ype); // LAYER table type ------------------------- LAYER layer; // Layer1 ZeroMemory(&layer, sizeof(layer)); strcpy(layer.Name, "Layer1"); layer.Color = 1; layer.LineTypeObjhandle = objhandle1; // Continuous drw.AddLayer(&layer); // Layer2 ZeroMemory(&layer, sizeof(layer)); strcpy(layer.Name, "Layer2"); layer.Color = 2; layer.LineTypeObjhandle = objhandle1; // Continuous drw.AddLayer(&layer); // STYLE table type ------------------------- STYLE style; ZeroMemory(&style, sizeof(style)); strcpy(style.Name, "Style1"); strcpy(style.PrimaryFontFilename, "TIMES.TTF"); style.LastHeightUsed = 0.3; style.WidthFactor = 1; objhandle1 = drw.AddTextStyle(&style); // DIMSTYLE table type ---------------------- DIMSTYLE dimstyle; // DIM1 ZeroMemory(&dimstyle, sizeof(dimstyle)); strcpy(dimstyle.Name, "DIM1"); // DimStyle Name dimstyle.dimclrd = 2; // Dimension line & Arrow heads color dimstyle.dimdle = 0.0000; // Dimension line size after Extensionline dimstyle.dimclre = 2; // Extension line color dimstyle.dimexe = 0.1800; // Extension line size after Dimline dimstyle.dimexo = 0.0625; // Offset from origin strcpy(dimstyle.dimblk1, "ClosedFilled");// 1st Arrow head strcpy(dimstyle.dimblk2, "ClosedFilled");// 2nd Arrow head dimstyle.dimasz = 0.1800; // Arrow size dimstyle.dimtxstyObjhandle = objhandle1;// Text style dimstyle.dimclrt = 3; // Text color dimstyle.dimtxt = 0.1800; // Text height dimstyle.dimtad = 1; // Vertical Text Placement dimstyle.dimgap = 0.0900; // Offset from dimension line drw.AddDimStyle(&dimstyle);
- 制作实体数据(LINE、CIRCLE、SOLID、TEXT、ARC、POINT、DIMLINEAR、POLYLINE)。
// Entities Section ------------------------------------------ // set current layer to Layer2 drw.SetLayer("Layer2"); // draw a line drw.Line(1.2, 3.3, 7.5, 7.7); // draw a circle drw.Circle(7.8, 4.3, 1.75); // set current layer to Layer1 drw.SetLayer("Layer1"); // draw a solid REALPOINT points[4]; points[0].x = 10.4; points[0].y = 7.2; points[1].x = 13.6; points[1].y = 7.4; points[2].x = 13.1; points[2].y = 4.9; points[3].x = 10.9; points[3].y = 5.9; drw.Solid(points[0], points[1], points[2], points[3]); // set current textstyle to Style1 drw.SetTextStyle("Style1"); // draw text drw.Text("Sample Text", 5.9, 6.7, 0.3, 35); // draw a dimension line drw.SetDimStyle("DIM1"); drw.DimLinear(6.05, 3, 9.55, 3, 9.55, 2, 0, "3.50");
- 将数据保存到 DXF 文件。
drw.SaveDXFFile(DxfFileName);
- 销毁
CDrawing
并释放分配的内存。drw.Destroy();
从 DXF 文件加载数据
- 创建内存中的绘图。
CDrawing drw; drw.Create( );
- 使用
LoadDXFFile
成员函数将 DXF 文件加载到内存中。drw.LoadDXFFile("Sample.dxf");
就是这样!
结论
作为一名土木工程师,我决定编写一个程序,在不使用 AutoCAD 的情况下生成梁或柱的详图。我编写了一个程序,只需少量关于梁或柱的数据,即可自动生成详图。此程序的输出是 DXF 文件,可以在 AutoCAD 中查看或进行打印。此程序可以节省使用 AutoCAD 绘制详图的时间。如果您是 AutoCAD 操作员,您将理解本文中使用的词语的含义;或者,如果您是想要编写程序创建 DXF 文件的程序员,首先您需要对 AutoCAD 或上述绘图程序有一些了解。此代码对于需要从其程序创建 DXF 文件的程序员可能很有用。CadLib 不是最好的,也有许多商业软件用于创建 DXF 文件,但它们不是开源的。欢迎随意修改代码。您对本文的评论将有助于改进 CadLib。
历史
- 2002 年 12 月 20 日
- CadLib 的首次发布
- 2003 年 1 月 19 日
- 一些错误修复
- 添加了尺寸线支持。它是其他实体命令(如“Line”和“Solid”)的组合
- 添加了 BLOCKS 部分支持
- 为 ENTITIES 部分添加了
Arc
、Point
和InsertBlock
命令 - 文本命令已得到改进
- 2003 年 5 月 11 日
- 添加了
CDrawing
类,用于在内存中存储绘图数据,并在将其保存为 DXF 文件之前更改数据。
- 添加了
- 2003 年 6 月 28 日
- 为
CDrawing
类添加了 DXF 读取功能 CDrawing
类在将数据写入 DXF 文件时的一些错误修复
- 为
- 2003 年 11 月 22 日 (CadLib 版本 2.00)
- 添加了绘图视图功能
- 添加了
PolyLine
命令(由 Tran duy Dung 提供) - 改进了 DXF 加载速度
- 绘图内存管理函数的一些错误修复
- 2004 年 8 月 24 日 (CadLib 版本 2.10)
- 添加了 ZoomExtents 功能
- 改进了显示虚线的视图功能
- 添加了“ChangeEntity”和“DeleteEntity”命令
- 添加了尺寸视图功能
- 修复了查看旋转块时出现的错误
- 改进了文本的视图显示