Я работаю над проектом, в котором мне нужно будет импортировать данные строки из файла .dwg в C ++, и я пытаюсь понять, с чего начать. Я посмотрел на это 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.
Зачем изобретать велосипед? Существует множество доступных библиотек DWG. Пытаться LibDWG. Он лицензирован под GNU GPL (то есть с открытым исходным кодом). Существует также LibreDWG которая основана на LibDWG, но доступна непосредственно с веб-сайта проекта GNU. Есть пример использования LibreDWG на github, который открывает файл DWG и преобразует его в 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);
Я занимаюсь разработкой новой библиотеки с открытым исходным кодом (под лицензией 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.
}
}
}