4

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 は強力なコピーレフトです。つまり、たとえ変更を加えなくても、別のオリジナル コードにリンクする場合でも、そのコードGPL の下でライセンスを取得する必要があります。

4

2 に答える 2

2

なぜ車輪を再発明するのですか?利用可能な DWG ライブラリはたくさんあります。LibDWGを試してください。GNU GPL (つまり、オープン ソース)の下でライセンスされています。LibDWGに基づくLibreDWGもありますが、GNU プロジェクトの Web サイトから直接入手できます。DWG ファイルを開き、それを SVG に変換するgithub で LibreDWG を使用する例があります。

ファイルの読み取りは非常に簡単です。

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);
于 2014-03-23T21:14:00.370 に答える
2

CAD (DWG/DXF) ファイルを操作するために、新しいオープンソース ライブラリ (MIT ライセンスに基づいているため、libredwg/lidwg/ODA Teigha とは異なり、完全に無料で使用できます) を開発しています。今では 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.
        }
    }
}
于 2016-06-24T20:15:54.700 に答える