admin管理员组文章数量:1627469
autocad形源代码
许多开发人员和地理信息系统(GIS)专业人员无法使用图形交换格式(DXF)或“图形”(DWG)文件。 这些AutoCAD格式通常要求您具有Windows®和AutoCAD副本才能打开它们。 使用一些方便的开源库,您可以使您的应用程序能够免费读取任何操作系统上的DXF和DWG文件。 在本文中,您将构建一个转换器,将这些文件格式转换为更开放的ESRI shapefile或锁Kong标记语言(KML)格式。 商业和开源软件使用ESRI Shapefile,而Google Earth和Google Maps主要使用KML。
AutoCAD DWG和LibreDWG
最常见的AutoCAD格式是“绘图”格式,文件扩展名以.dwg结尾。 很少有软件应用程序可以读取此格式,这是在AutoCAD中保存文件时的默认格式。 但是,您可以使用开源库LibreDWG(参见相关主题 )来读取这些文件。 文件格式由一个控制块组成,该控制块包含表示文件中形状的其他块,以及用于模型空间和图纸空间的块,这些模型空间和图纸空间表示文档中坐标的偏移量。
您可以通过打开文档并读取文件来使用库,然后遍历主控制块中的每个块,如清单1所示。
清单1.打开一个DWG文件并遍历主控制块
Dwg_Data dwg = new Dwg_Data();
int errno = dwg_read_file((char *)inputFilename, dwg);
if (errno) {
fprintf(stderr, "Could not open DWG. Returned error code: $d\n", errno);
delete dwg;
}
Dwg_Object_BLOCK_CONTROL * ctrl = dwg->object[0].tio.object->tio.BLOCK_CONTROL;
dumpBlock(ctrl->model_space);
dumpBlock(ctrl->paper_space);
for (int i = 0; i < ctrl->num_entries; i++) {
dumpBlock(ctrl->block_headers[i]);
}
dwg_free(dwg);
每个块可以代表几种几何类型中的任何一种:直线,圆,弧,锚定到某个位置的文本或插入(将偏移量应用于以后的块)。 您可以通过访问get_first_owned_object
和get_next_owned_object
返回的块对象的属性依次处理每个对象,如清单2所示 。
清单2.使用get_first_owned_object和get_next_owned_object读取对象
void InputFormatDWG::dumpBlock(Dwg_Object_Ref * block) {
if (!block) return;
if (!block->obj) return;
if (!block->obj->tio.object) return;
Dwg_Object_BLOCK_HEADER * header = block->obj->tio.object->tio.BLOCK_HEADER;
Dwg_Object * obj = get_first_owned_object(block->obj, header);
while (obj) {
if (obj->type == DWG_TYPE_LINE) {
Dwg_Entity_LINE * line = obj->tio.entity->tio.LINE;
printf("Line starting at (%f, %f, %f) ending at (%f, %f, %f)\n", line->start.x,
line->start.y, 0, line->end.x, line->end.y, 0);
// Don't delete "line" - dwg_free will do this
}
obj = get_next_owned_object(block->obj, obj, header);
}
}
这样,从头到尾使用LibreDWG读取DWG文件是一个顺序流程。 在C++
实现LibreDWG时,将dwg.h
包含在extern "C"
块中非常重要,以避免以后遇到链接器错误。 这是一个例子:
extern "C" {
#include <dwg.h>
}
该库的先决条件是autoconf
, swig
, texinfo
和python-dev
软件包以及编译器软件包(如果使用Debian或Ubuntu,则为build-essential
)。 您可以通过在命令行中输入以下内容来下载来构建库:
git clone git://git.sv.gnu/libredwg.git
。 。 。 其次是:
./autogen.sh && ./configure && make && sudo make install
AutoCAD DXF和dxflib
DXF格式是AutoCAD内部的导出选项。 这样,支持DWG的应用程序比支持DWG的应用程序更多,并且文件格式规范已发布( 有关完整DXF规范的链接,请参阅参考资料)。 但是,您可以使用开源dxflib
库读取这些文件。 与LibreDWG不同,读取DXF文件的驱动程序由您自己的顺序编码驱动。 实际上,使用dxflib
就像编写事件驱动的代码。
您可以通过调用DL_Dxf
对象的in
函数并将指针传递给从DL_CreationAdapter
抽象类继承的类来打开文件。 当in
函数运行时,它将在传递给它的类中调用几个函数。 有几十个这样的功能(见DXFLib程序员指南链接相关信息 ),但你只关心在大多数情况下,通常,少数addPoint
, addLine
, addCircle
和addVertex
。 您只需要实现您关心的功能即可; 其余的您可以忽略。 清单3显示了一个简单的示例,该示例加载DXF文件并仅读取其中的行。
清单3.加载DXF文件并只读行
LineReader.h:
#ifndef LINEREADER_H
#define LINEREADER_H
#include "dxflib/src/dl_dxf.h"
#include "dxflib/src/dl_creationadapter.h"
#include <stdio.h>
class LineReader: public DL_CreationAdapter {
public:
// Our functions:
void readLines(const char * filename);
// Overloading from parent DL_CreationAdapter:
void addLine(const DL_LineData& data);
};
#endif
LineReader.cpp:
void LineReader::readLines(const char * filename) {
DL_Dxf * getData = new DL_Dxf();
if (!getData->in(filename, this)) {
fprintf(stderr, "Could not retrieve data from input file.\n");
delete getData;
exit(1);
}
版权声明:本文标题:autocad形源代码_在开放源代码库中使用AutoCAD文件格式 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1728983981a1181836.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论