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

28/08/2013

Генерация миниатюры dwg-файла при помощи функции acdbMakeDrawingPreview

Вопрос:
Как сгенерировать миниатюру dwg-файла, который создан при помощи AcDbDatabase::wblock/saveas API?

Ответ:
arx-файл acblock.arx  экспортирует функцию, которая позволяет сгенерировать миниатюру dwg-файла. Заметим, что эта функция недокументированная и неподдерживаемая. Заметим также, что её сигнатура может измениться или функция вообще не будет доступна в будущем.

Например, в AutoCAD 2013 эта функция перенесена в файл acblock.crx.

Код - C++: [Выделить]
  1. typedef Acad::ErrorStatus (*MakePreviewFuncType)(AcDbDatabase* pDb, bool bUseCurrentViewInfo);
  2. Acad::ErrorStatus acdbMakeDrawingPreview(AcDbDatabase* pDb,  bool bUseCurrentViewInfo);

Эта функция создает миниатюру чертежа в данной базе используя запись таблицы блоков для пространства Модели в качестве источника изображения и фоновый цвет пространства Можели в качестве фонового цвета.

Флаг bUseCurrentViewInfo определяет следует ли  генерировать изображение используя установленный текущий видовой порт (указывается системной переменной CVPORT). Как правило, имеет смысл устанавливать этот флаг в True, особенно когда выполняется wblock некоторых выбранных в редакторе AutoCAD примитивов.

В этой функции неявно используется AcGs API для генерации миниатюры.

Следующий код демонстрирует возможный сценарий для использования:

Код - C++: [Выделить]
  1. // 2010 - 2012:
  2. //  typedef Acad::ErrorStatus (*MakePreviewFuncType)(
  3. //                           AcDbDatabase* pDb,
  4. //                         BOOL bUseCurrentViewInfo);
  5. // 2013:
  6. typedef Acad::ErrorStatus (*MakePreviewFuncType)(
  7.                             AcDbDatabase* pDb,
  8.                             bool bUseCurrentViewInfo);
  9.  
  10. void asdkcmdtest()
  11. {
  12.     ads_name ss;
  13.     // Выберем несколько примитивов для wblock
  14.     if (acedSSGet(NULL,NULL,NULL,NULL,ss)!=RTNORM)
  15.         return;
  16.     AcDbDatabase* pDb =
  17.       acdbHostApplicationServices()->
  18.                       workingDatabase();
  19.     long l;
  20.     if (acedSSLength(ss,&l)!=RTNORM)
  21.         return;
  22.     AcDbObjectIdArray idArray;
  23.     ads_name ename;
  24.     AcDbObjectId id;
  25.     for (long i=0;i<l;i++)
  26.     {
  27.         if (acedSSName(ss,i,ename)!=RTNORM)
  28.             return;
  29.         if (acdbGetObjectId(id,ename)!=Acad::eOk)
  30.             return;
  31.         idArray.append(id);
  32.     }
  33.     // Выполняем wblock
  34.     AcDbDatabase* pOut;
  35.     if (pDb->wblock(pOut,idArray,AcGePoint3d(0,0,0))!=Acad::eOk)
  36.         return;
  37.    // Загружаем модуль
  38.     // 2010- 2012
  39.     // if (acrxLoadModule(_T("acblock.arx"), FALSE))
  40.     // 2013
  41.     if (acrxLoadModule(_T("acblock.crx"), FALSE))
  42.     {
  43.         HINSTANCE hInst;
  44.         // Загружаем модуль
  45.         // 2010- 2012
  46.        // if (acrxLoadModule(_T("acblock.arx"), FALSE))
  47.         // 2013        
  48.         if ((hInst = LoadLibrary(_T("acblock.crx")))
  49.                     !=NULL)
  50.         {
  51.             MakePreviewFuncType makePreviewFunc;
  52.             if ((makePreviewFunc =
  53.                     (MakePreviewFuncType)
  54.                     GetProcAddress
  55.                  (hInst,"acdbMakeDrawingPreview"))
  56.                         !=NULL)
  57.             {
  58.                if (makePreviewFunc(pOut,true)
  59.                                     ==Acad::eOk)
  60.                 {
  61.                   if(pOut->saveAs(
  62.                       _T("d:\\test.dwg"))
  63.                          ==Acad::eOk)
  64.                    acutPrintf(
  65.                       _T("База данных сохранена.\n"));
  66.                 }
  67.             }
  68.             FreeLibrary(hInst);
  69.         } 
  70.         // Выгружаем модуль
  71.         // 2010- 2012
  72.         // acrxUnloadModule(_T("acblock.arx"));
  73.         // 2013
  74.         acrxUnloadModule(_T("acblock.crx"));
  75.     }
  76.     delete pOut;
  77. }

 

Примечание переводчика: код не работает в AutoCAD 2013

 

Источник: http://adndevblog.typepad.com/autocad/2013/02/generate-a-preview-by-acdbmakedrawingpreview.html

 

Обсуждение: http://adn-cis.org/forum/index.php?topic=189

Опубликовано 28.08.2013