autocad形源代码_在开放源代码库中使用AutoCAD文件格式

许多开发人员和地理信息系统(GIS)专业人员无法使用图形交换格式(DXF)或“图形”(DWG)文件。 这些AutoCAD格式通常要求您具有Windows®和AutoCAD副本才能打开它们。 使用一些方便的开源库,您可以使您的应用程序能够免费读取任何操作系统上的DXF和DWG文件。 在本文中,您将构建一个转换器,将这些文件格式转换为更开放的ESRI shapefile或锁Kong标记语言(KML...
摘要由CSDN通过智能技术生成

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_objectget_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>
}

该库的先决条件是autoconfswigtexinfopython-dev软件包以及编译器软件包(如果使用Debian或Ubuntu,则为build-essential )。 您可以通过在命令行中输入以下内容来下载来构建库:

git clone git://git.sv.gnu.org/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程序员指南链接相关信息 ),但你只关心在大多数情况下,通常,少数addPointaddLineaddCircleaddVertex 。 您只需要实现您关心的功能即可; 其余的您可以忽略。 清单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);
  } 
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值