Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: AndrewKuznets от 07-01-2020, 20:11:57

Название: DxfOut с выборкой примитивов для сохранения
Отправлено: AndrewKuznets от 07-01-2020, 20:11:57
Всем привет!
Не получается в objectARX сохранить чертёж в DXF-формате с выборкой примитивов, как это делается в команде DXFOut (опция Select objects).
Просьба дать ссылку на код.
Название: Re: DxfOut с выборкой примитивов для сохранения
Отправлено: Александр Ривилис от 07-01-2020, 21:51:36
Всем привет!
Не получается в 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-файл с выбранными примитивами.
Название: Re: DxfOut с выборкой примитивов для сохранения
Отправлено: Александр Ривилис от 07-01-2020, 23:23:59
Тут вариант решения этой проблемы при помощи AutoCAD .NET API: https://adn-cis.org/forum/index.php?topic=7323.msg22319#msg22319
В ObjectARX всё точно так же.
Название: Re: DxfOut с выборкой примитивов для сохранения
Отправлено: AndrewKuznets от 08-01-2020, 10:38:42
Спасибо, Александр!
Название: Re: DxfOut с выборкой примитивов для сохранения
Отправлено: AndrewKuznets от 13-01-2020, 16:36:01
Добрый вечер, Александр.
Выборочный экспорт в 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.  
Название: Re: DxfOut с выборкой примитивов для сохранения
Отправлено: Александр Ривилис от 13-01-2020, 17:40:16
А у меня работает. Сравни коды. Особенно то, что выделено комментарием:
Код - 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. }
Название: Re: DxfOut с выборкой примитивов для сохранения
Отправлено: AndrewKuznets от 15-01-2020, 11:08:59
Спасибо, всё вроде заработало...
Название: Re: DxfOut с выборкой примитивов для сохранения
Отправлено: Александр Ривилис от 15-01-2020, 12:11:16
Спасибо, всё вроде заработало...
Вроде или точно? :-)
Название: Re: DxfOut с выборкой примитивов для сохранения
Отправлено: AndrewKuznets от 15-01-2020, 21:14:48
Время покажет. :)
Название: Re: DxfOut с выборкой примитивов для сохранения
Отправлено: Александр Ривилис от 15-01-2020, 23:29:10
Время покажет.
Проблема была в форме конструктора AcDbDatabase ?
Название: Re: DxfOut с выборкой примитивов для сохранения
Отправлено: AndrewKuznets от 16-01-2020, 12:11:21
Александр, проблема была из-за того, что создавал в исходной базе новый слой и перемещал на него некоторые объекты.
Слой создавался, а перемещение (setLayer) почему-то не проходило.
Когда тоже самое я стал делать в целевой базе, это удалось...
Название: Re: DxfOut с выборкой примитивов для сохранения
Отправлено: Александр Ривилис от 16-01-2020, 12:13:20
AndrewKuznets,
Не понял взаимосвязи...