CDxfFileWrite类,用CabLib创建DXF(绘图交换格式)文件
来源:互联网 发布:云数据交换 软硬一体 编辑:程序博客网 时间:2024/06/16 06:45
CadLib for creating DXF(Drawing Interchange Format) files
Introduction
What is DXF?
Drawing Interchange Format (DXF) files enable the interchange of drawings between AutoCAD and other programs. DXF files can be either ASCII or binary formats. Because ASCII DXF files are more common than the binary format, CadLib uses ASCII DXF format.
What is CadLib?
The CadLib is not a Computer Aided Design (CAD) program. It is a tool for creating DXF files that are used in the CAD programs. It consists of two parts. One of them is a Dynamic Link Library to create the DXF file. The other part is the programming interface. It is a class that integrates the cadio.dll functions. It can be used in Microsoft Visual C++ projects. In addition, the cadio.dll can be used in other Win32 programs.
Why use CadLib?
In some programs, it is needed to create a drawing output for use in other programs such as AutoCad. For example, in a "Building Detail Sheet Generator Program", the program needs to create a drawing output. And the most standard format for communicating drawing data is DXF.
DXF file structure
The DXF format is a tagged data representation of all the information contained in a drawing file. Tagged data means that each data element in the file is preceded by an integer number that is called a group code. A group code's value indicates what type of data element follows. This value also indicates the meaning of a data element for a given object (or record) type. Virtually all user-specified information in a drawing file can be represented in DXF format. (from AutoCad's DXF reference)
A DXF file consists of some sections. Each section has some drawing data in itself. The CadLib uses the following sections:
- HEADER
- TABLES
- BLOCKS
- ENTITIES
The main reference for DXF file structure that is used for CadLib is the AutoCad's DXF reference. You can find more information about DXF file structure here.
Classes
The classes are interfaces between CadIO.dll and the main program. "Test" has come with CadLib to demonstrate how to generate a DXF file with CDxfFileWrite
and CDrawing
classes.
CDxfFileWrite class
CDxfFileWrite
gathers all the commands needed to directly create a DXF file. Usage of CDxfFileWrite
is as follows:
- Create the DXF fileCollapse | Copy Code
CDxfFileWrite dxffile;dxffile.Create( "d:\\test.dxf" );
- Begin and end the HEADER section. It's here for compatibility with some CAD programs. Others work without having HEADER section.Collapse | Copy Code
// Header Section ------------------------------------------dxffile.BeginSection(SEC_HEADER);dxffile.EndSection();// close HEADER section ------------------------------------
- Begin the TABLES section and put the LAYER, LTYPE, STYLE, DIMSTYLE table-types as many as you want and then close the sectionCollapse | Copy Code
// Tables Section ------------------------------------------dxffile.BeginSection(SEC_TABLES);// LTYPE table type -------------------------dxffile.BeginTableType(TAB_LTYPE);DXFLTYPE ltype;double elem[4];// ContinuousZeroMemory(<ype, sizeof(ltype));ltype.Name = "Continuous";ltype.DescriptiveText = "Solid line";dxffile.AddLinetype(<ype);// DASHDOT2ZeroMemory(<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;// DIM1ZeroMemory(&dimstyle, sizeof(dimstyle));dimstyle.Name = "DIM1"; // DimStyle Namedimstyle.DIMCLRD = 2; // Dimension line & Arrow heads colordimstyle.DIMDLE = 0.0000; // Dimension line size after Extensionlinedimstyle.DIMCLRE = 2; // Extension line colordimstyle.DIMEXE = 0.1800; // Extension line size after Dimlinedimstyle.DIMEXO = 0.0625; // Offset from origindimstyle.DIMBLK1 = "ClosedFilled";// 1st Arrow headdimstyle.DIMBLK2 = "ClosedFilled";// 2nd Arrow headdimstyle.DIMASZ = 0.1800; // Arrow sizedimstyle.DIMTXSTY = "Style1"; // Text styledimstyle.DIMCLRT = 3; // Text colordimstyle.DIMTXT = 0.1800; // Text heightdimstyle.DIMTAD = 1; // Vertical Text Placementdimstyle.DIMGAP = 0.0900; // Offset from dimension linedxffile.AddDimStyle(&dimstyle);dxffile.EndTableType();// close DIMSTYLE table type ----------------dxffile.EndSection();// close TABLES section ------------------------------------
- Begin ENTITIES section and put entities data (LINE, CIRCLE, SOLID, TEXT, ARC, POINT, DIMLINEAR) and finally close the sectionCollapse | Copy Code
// Entities Section ------------------------------------------dxffile.BeginSection(SEC_ENTITIES);// set current layer to Layer2dxffile.SetCurrentLayer("Layer2");// draw a linedxffile.Line(1.2, 3.3, 7.5, 7.7);// draw a circledxffile.Circle(7.8, 4.3, 1.75);// set current layer to Layer4dxffile.SetCurrentLayer("Layer4");// draw a solidREALPOINT 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 Style1dxffile.SetCurrentTextStyle("Style1");// draw textdxffile.Text("Sample Text", 5.9, 6.7, 0.3, 35);// draw a dimension linedxffile.SetCurrentDimStyle("DIM1");dxffile.DimLinear(6.05, 3, 9.55, 3, 9.55, 2, 0, "3.50");dxffile.EndSection();// close ENTITIES section ----------------------------------
- Close the DXF fileCollapse | Copy Code
dxffile.Close();
CDrawing class
CDrawing
class has all the commands to create a drawing in memory and save it as a DXF file. Usage of CDrawing
is as follows:
- Create the on-memory drawingCollapse | Copy Code
CDrawing drw;drw.Create( );
- Create new LAYER, LTYPE, STYLE, DIMSTYLE table-types as many as you want.Collapse | Copy Code
// Tables Section ------------------------------------------// LTYPE table type -------------------------LTYPE ltype;OBJHANDLE objhandle1;// ContinuousZeroMemory(<ype, sizeof(ltype));strcpy(ltype.Name, "Continuous");strcpy(ltype.DescriptiveText, "Solid line");objhandle1 = drw.AddLinetype(<ype);// DASHDOT2ZeroMemory(<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;// Layer1ZeroMemory(&layer, sizeof(layer));strcpy(layer.Name, "Layer1");layer.Color = 1;layer.LineTypeObjhandle = objhandle1; // Continuousdrw.AddLayer(&layer);// Layer2ZeroMemory(&layer, sizeof(layer));strcpy(layer.Name, "Layer2");layer.Color = 2;layer.LineTypeObjhandle = objhandle1; // Continuousdrw.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;// DIM1ZeroMemory(&dimstyle, sizeof(dimstyle));strcpy(dimstyle.Name, "DIM1"); // DimStyle Namedimstyle.dimclrd = 2; // Dimension line & Arrow heads colordimstyle.dimdle = 0.0000; // Dimension line size after Extensionlinedimstyle.dimclre = 2; // Extension line colordimstyle.dimexe = 0.1800; // Extension line size after Dimlinedimstyle.dimexo = 0.0625; // Offset from originstrcpy(dimstyle.dimblk1, "ClosedFilled");// 1st Arrow headstrcpy(dimstyle.dimblk2, "ClosedFilled");// 2nd Arrow headdimstyle.dimasz = 0.1800; // Arrow sizedimstyle.dimtxstyObjhandle = objhandle1;// Text styledimstyle.dimclrt = 3; // Text colordimstyle.dimtxt = 0.1800; // Text heightdimstyle.dimtad = 1; // Vertical Text Placementdimstyle.dimgap = 0.0900; // Offset from dimension linedrw.AddDimStyle(&dimstyle);
- Make entities data (LINE, CIRCLE, SOLID, TEXT, ARC, POINT, DIMLINEAR, POLYLINE).Collapse | Copy Code
// Entities Section ------------------------------------------// set current layer to Layer2drw.SetLayer("Layer2");// draw a linedrw.Line(1.2, 3.3, 7.5, 7.7);// draw a circledrw.Circle(7.8, 4.3, 1.75);// set current layer to Layer1drw.SetLayer("Layer1");// draw a solidREALPOINT 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 Style1drw.SetTextStyle("Style1");// draw textdrw.Text("Sample Text", 5.9, 6.7, 0.3, 35);// draw a dimension linedrw.SetDimStyle("DIM1");drw.DimLinear(6.05, 3, 9.55, 3, 9.55, 2, 0, "3.50");
- Save data to a DXF file.Collapse | Copy Code
drw.SaveDXFFile(DxfFileName);
- Destroy
CDrawing
and free allocated memory.Collapse | Copy Codedrw.Destroy();
Loading data from a DXF file
- Create the on-memory drawing.Collapse | Copy Code
CDrawing drw;drw.Create( );
- Use
LoadDXFFile
member function to load DXF file into memory.Collapse | Copy Codedrw.LoadDXFFile("Sample.dxf");
That's all!
Conclusion
Since I am a Civil Engineer, I decided to write a program to generate a beam or columns detail sheet without the use of AutoCAD. I have written a program that, with a little data about beam or column, will create the detail sheet automatically. Output of this program is a DXF file and it can be shown in AutoCAD or it can be plotted with it. This program can save the time for drawing the detail sheet with AutoCAD. If you are an AutoCAD operator, you will understand the meaning of words that are used in this article, or if you are a programmer who wants to write a program to create DXF files, first you need a little knowledge about AutoCAD or the drawing programs such as is mentioned above. This code can be useful for programmers who need to create DXF files from their programs. CadLib is not the best one and also there are many commercial software for creating DXF files but they are not open source. Feel free to change the code. Your comments in regards to this article will cause the improvement of CadLib.
History
- 20 Dec 2002
- First release of CadLib
- 19 Jan 2003
- Some bug fixes
- Added Dimension-Line support. It's a combination of other entity commands like "Line" and "Solid"
- Added BLOCKS section support
- Added
Arc
,Point
andInsertBlock
commands for ENTITIES section - Text command has been improved
- 11 May 2003
- Added
CDrawing
class to store drawing data in memory and change the data before saving it as a DXF file.
- Added
- 28 June 2003
- Added DXF read capability to
CDrawing
class - Some bug fixes of
CDrawing
class when writing data to a DXF file
- Added DXF read capability to
- 22 Nov 2003 (CadLib Version 2.00)
- Added Drawing View capability
- Added
PolyLine
command (by Tran duy Dung) - Improved DXF loading speed
- Some bug fixes of drawing memory management functions
- 24 Aug 2004 (CadLib Version 2.10)
- Added ZoomExtents Function
- Improved Viewing functions to show Dashed Lines
- Added "ChangeEntity" & "DeleteEntity" commands
- Added Dimension view capability
- Fixed a bug occures when viewing a rotated block
- Improved viewing of texts
License
This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)
- CDxfFileWrite类,用CabLib创建DXF(绘图交换格式)文件
- CDxfFileWrite类,用CabLib创建DXF(绘图交换格式)文件
- 数据交换文件DXF简单java解析
- 使用OGR创建dxf格式矢量数据
- 关于CAD文件 DXF格式的理解
- 关于CAD文件 DXF格式的理解
- AltiumDesigner导入AutoCAD文件DXF,DWG格式
- dwg文件怎么转为dxf格式
- dwg文件快速转为dxf格式
- cad文件怎么转为dxf格式?
- 用C读取DXF文件
- 用C读取DXF文件
- 用C读取DXF文件
- 用C读取DXF文件
- dwg文件转为dxf的格式怎么转
- DXFLIB,DXF格式 笔记
- GDAL/OGR创建DXF文件中多图层的方法
- GDAL/OGR创建DXF文件中多图层的方法 .
- 字符串匹配
- html Div层的展开与收缩的特效
- Android睡眠唤醒机制--Kernel态
- 说文解字 - 罗
- 小猫爬山 搜索 先放大的
- CDxfFileWrite类,用CabLib创建DXF(绘图交换格式)文件
- 二叉查找树BST_legend
- svn 操作异常总结
- 《UNIX环境高级编程》笔记--UNIX域套接字
- 存储过程实现报表数据源的利弊分析
- Android睡眠唤醒机制--HAL-->Kernel
- java 中对象的哈希码值是指的什么?
- 稳定排序和不稳定排序
- 字符串的一些基本操作