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