【问题标题】:How to handle DWG files in C++如何在 C++ 中处理 DWG 文件
【发布时间】:2014-05-01 02:01:14
【问题描述】:

我正在做一个项目,我需要从 C++ 中的 .dwg 文件导入行数据,并且正在努力知道从哪里开始。我看过这个http://opendesign.com/files/guestdownloads/OpenDesign_Specification_for_.dwg_files.pdf,我认为这对我来说可能太硬核了,除非有人知道用代码简单地描述解码策略的方法吗?例如,大概每个操作都必须按位计算?

除此之外,我可能不得不依赖一些第三方库,但问题是:是否有任何此类(开源)库获得许可许可?我不能在这个项目中使用复制左代码。

为了澄清对 cme​​ts 的回应,我正在寻找 permissive 许可库(请参阅 http://en.m.wikipedia.org/wiki/Permissive_free_software_licence)。这包括例如 MIT 和 BSD 许可证,但不包括 GPL(LGPL 可能会起作用,但前提是静态链接存在例外情况)。当然,公共领域也可以。 GPL 是强烈的左版版权,这意味着即使您不更改它,而是使用单独的原始代码链接到它,该代码必须也获得 GPL 许可。

【问题讨论】:

  • 请更清楚您不能使用哪些类型的 copyleft。大多数 Copyleft 许可证都是开源的。我怀疑你的意思是“公共领域”。
  • DXF 格式是否符合您的需求?因为有些库可以处理这种更简单的格式。
  • Dwg 是理想的,但是是的,我认为 dxf 可能有用。快速搜索发现 dxflib,但它也是 GPL...
  • 作为记录,我查看了 libdwg 并且缺乏文档是可悲的,make 命令也失败了,没有报告任何缺少的依赖项等。我正在测试 libredwg 的转换为 svg 测试程序(在成功构建之后尽管有一些可疑的“无事可做”报告和失败的“sudo make check”)并且它声称它不支持特定文件(他们注意到[libreplanet.org/wiki/LibreDWG])可能会发生(他们希望报告错误)。我不相信它们是被忽略的解决方案许可证偏好...

标签: c++ dwg


【解决方案1】:

为什么要重新发明轮子?有很多可用的 DWG 库。试试LibDWG。它在GNU GPL(即开源)下获得许可。还有基于 LibDWG 的 LibreDWG,但可直接从 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);

【讨论】:

  • 他说不能使用复制的左授权库。
  • 他说开源是经过许可的。 GPL 是经许可开源的。
【解决方案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.
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2021-03-01
    • 2016-08-22
    相关资源
    最近更新 更多