我正在开发一个项目,我需要在C ++中从.dwg文件导入行数据,并且很难知道从哪里开始。我已经看过这个http://opendesign.com/files/guestdownloads/OpenDesign_Specification_for_.dwg_files.pdf,我认为这对我来说可能太硬了,除非有人知道一种描述方式,简单地说,在代码中解码它的策略?例如,大概每一次操作都必须有点明智吗?
除此之外,我可能不得不依赖一些第三方库,但问题是:是否有任何此类(开源)库获得许可许可?我不能在这个项目中使用复制左代码。
为了澄清对评论的回应,我正在寻找许可的许可库(参见http://en.m.wikipedia.org/wiki/Permissive_free_software_licence)。这包括例如MIT和BSD许可证,但不包括GPL(LGPL可能会起作用,但前提是静态链接有例外)。当然,公共领域也会起作用。 GPL是强烈的copyleft,意思是即使你不改变它,但是使用单独的原始代码链接到它,代码 也可以在GPL下获得许可。
答案 0 :(得分:2)
为什么重新发明轮子?有很多DWG库可供使用。试试LibDWG。它是根据GNU GPL许可的(即开源)。还有LibreDWG基于LibDWG,但可直接从GNU项目网站获得。有一个在github上使用LibreDWG opens a DWG file, and converts it to an SVG的例子。
阅读文件似乎非常简单:
int error;
Dwg_Data dwg;
error = dwg_read_file(filename, &dwg);
if (!error)
{
model_xmin = dwg_model_x_min(&dwg);
model_ymin = dwg_model_y_min(&dwg);
double dx = (dwg_model_x_max(&dwg) - dwg_model_x_min(&dwg));
double dy = (dwg_model_y_max(&dwg) - dwg_model_y_min(&dwg));
double scale_x = dx / (dwg_page_x_max(&dwg) - dwg_page_x_min(&dwg));
double scale_y = dy / (dwg_page_y_max(&dwg) - dwg_page_y_min(&dwg));
//...
}
dwg_free(&dwg);
答案 1 :(得分:2)
我正在开发一个新的开源库(在MIT许可下,所以你可以完全免费使用它,不像libredwg / lidwg / ODA Teigha)来处理CAD(DWG / DXF)文件。现在它很好地处理DWG R15(2000),所以你可以尝试使用它。目前还没有稳定版本,但任何测试都会对项目产生很大帮助。
在README.md中描述了安装 用法非常简单:
#include <iostream>
# include "lib/opencad_api.h"
// returns nullptr on fail. GetLastErrorCode() returns an error code.
CADFile *pCADFile = OpenCADFile( pszCADFilePath,
CADFile::OpenOptions::READ_ALL );
const CADHeader& header = pCADFile->getHeader ();
header.print (); // prints CAD Header variables.
cout << endl;
const CADClasses& classes = pCADFile->getClasses ();
classes.print (); // prints custom CAD classes
cout << endl;
for ( size_t i = 0; i < pCADFile->getLayersCount (); ++i )
{
CADLayer &layer = pCADFile->getLayer (i);
cout << "Layer #" << i << " contains "
<< layer.getGeometryCount () << " geometries" << endl;
for ( size_t j = 0; j < layer.getGeometryCount (); ++j )
{
unique_ptr<CADGeometry> geom(layer.getGeometry (j));
if ( geom == nullptr )
continue;
switch ( geom->getType() ) // returns GeometryType enum.
{
case CADGeometry::CIRCLE:
CADCircle * poCADCircle = ( CADCircle* ) geom.get();
std::cout << poCADCircle->getPosition().getX() << std::endl;
std::cout << poCADCircle->getPosition().getY() << std::endl;
std::cout << poCADCircle->getPosition().getZ() << std::endl;
break;
// any other geometry type you need.
}
}
}