DxfOut с выборкой примитивов для сохранения

Автор Тема: DxfOut с выборкой примитивов для сохранения  (Прочитано 3650 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AndrewKuznetsАвтор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Всем привет!
Не получается в objectARX сохранить чертёж в DXF-формате с выборкой примитивов, как это делается в команде DXFOut (опция Select objects).
Просьба дать ссылку на код.

Отмечено как Решение AndrewKuznets 08-01-2020, 10:57:13

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Всем привет!
Не получается в objectARX сохранить чертёж в DXF-формате с выборкой примитивов, как это делается в команде DXFOut (опция Select objects).
Просьба дать ссылку на код.
Как вариант:
1. При помощи метода:
Код - C++ [Выбрать]
  1. AcDbDatabase::wblock(AcDbDatabase*& pOutputDb,
  2.     const AcDbObjectIdArray& outObjIds,
  3.     const AcGePoint3d& basePoint);
  4.  
создаём новую базу только с выбранными примитивами.
2. При помощи метода:
Код - C++ [Выбрать]
  1. Acad::ErrorStatus dxfOut(
  2.     const ACHAR* fileName,
  3.     int precision = 16,
  4.     AcDb::AcDbDwgVersion dwgVer = AcDb::kDHL_CURRENT,
  5.     bool saveThumbnailImage = false
  6. );
  7.  

создаём DXF-файл с выбранными примитивами.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Тут вариант решения этой проблемы при помощи AutoCAD .NET API: https://adn-cis.org/forum/index.php?topic=7323.msg22319#msg22319
В ObjectARX всё точно так же.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AndrewKuznetsАвтор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Спасибо, Александр!

Оффлайн AndrewKuznetsАвтор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Добрый вечер, Александр.
Выборочный экспорт в DXF не получается. Вот мой код.
Что-то здесь не так. Файлы создаются, но пустые.

Код - C++ [Выбрать]
  1. AcDbDatabase *pDbIDX = new AcDbDatabase(Adesk::kTrue);
  2.      
  3.       swprintf(buffer, L"%hs", File_IDX.c_str());
  4.       if (IDXObjIds.isEmpty())
  5.       {
  6.          MessageBox(NULL, buffer, L"Пусто!", MB_OK);
  7.       }
  8.       pDb->wblock(pDbIDX, IDXObjIds, basePoint);
  9.    
  10.      
  11.       pDbIDX->dxfOut(buffer, -1); // Сохраним файл как Binary в каталоге /IDX
  12.      
  13.      
  14.       delete pDb, pDbIDX;
  15.  

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А у меня работает. Сравни коды. Особенно то, что выделено комментарием:
Код - C++ [Выбрать]
  1. static void RivilisDxfOutSelected() {
  2.   ads_name ss;
  3.   if (acedSSGet(NULL, NULL, NULL, NULL, ss) == RTNORM)
  4.   {
  5.     Adesk::Int32 len = 0; acedSSLength(ss, &len);
  6.     if (len > 0)
  7.     {
  8.       AcDbObjectIdArray ids; ids.setPhysicalLength(len);
  9.       for (Adesk::Int32 i = 0; i < len; i++)
  10.       {
  11.         ads_name en; AcDbObjectId id;
  12.         acedSSName(ss, i, en);
  13.         acdbGetObjectId(id, en);
  14.         ids.append(id);
  15.       }
  16.       //////////////////////////////////////////////////////////////////////////
  17.       // Создавать нужно базу совершенно пустую (без начальной структуры)
  18.       //////////////////////////////////////////////////////////////////////////
  19.       AcDbDatabase *tempDb = new AcDbDatabase(Adesk::kFalse);
  20.       Acad::ErrorStatus es;
  21.       if ((es = acdbCurDwg()->wblock(tempDb, ids, AcGePoint3d::kOrigin)) == Acad::eOk)
  22.       {
  23.         if ((es = tempDb->dxfOut(L"C:\\test.dxf", -1)) != Acad::eOk)
  24.           acutPrintf(L"\ntempDb->dxfOut(...) = %s", acadErrorStatusText(es));
  25.       }
  26.       else
  27.       {
  28.         acutPrintf(L"\nacdbCurDwg()->wblock(...) = %s", acadErrorStatusText(es));
  29.       }
  30.       delete tempDb;
  31.     }
  32.   }
  33. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AndrewKuznetsАвтор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Спасибо, всё вроде заработало...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Спасибо, всё вроде заработало...
Вроде или точно? :-)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AndrewKuznetsАвтор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Время покажет. :)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Время покажет.
Проблема была в форме конструктора AcDbDatabase ?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AndrewKuznetsАвтор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Александр, проблема была из-за того, что создавал в исходной базе новый слой и перемещал на него некоторые объекты.
Слой создавался, а перемещение (setLayer) почему-то не проходило.
Когда тоже самое я стал делать в целевой базе, это удалось...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
AndrewKuznets,
Не понял взаимосвязи...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение