如何在C ++中处理DWG文件

时间:2014-03-23 21:10:32

标签: c++ dwg

我正在开发一个项目,我需要在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下获得许可。

2 个答案:

答案 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),所以你可以尝试使用它。目前还没有稳定版本,但任何测试都会对项目产生很大帮助。

链接:libopencad github

在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.
        }
    }
}