Генерация миниатюры dwg-файла при помощи функции acdbMakeDrawingPreview
Вопрос:
Как сгенерировать миниатюру dwg-файла, который создан при помощи AcDbDatabase::wblock/saveas API?
Ответ:
arx-файл acblock.arx экспортирует функцию, которая позволяет сгенерировать миниатюру dwg-файла. Заметим, что эта функция недокументированная и неподдерживаемая. Заметим также, что её сигнатура может измениться или функция вообще не будет доступна в будущем.
Например, в AutoCAD 2013 эта функция перенесена в файл acblock.crx.
- typedef Acad::ErrorStatus (*MakePreviewFuncType)(AcDbDatabase* pDb, bool bUseCurrentViewInfo);
- Acad::ErrorStatus acdbMakeDrawingPreview(AcDbDatabase* pDb, bool bUseCurrentViewInfo);
Эта функция создает миниатюру чертежа в данной базе используя запись таблицы блоков для пространства Модели в качестве источника изображения и фоновый цвет пространства Можели в качестве фонового цвета.
Флаг bUseCurrentViewInfo определяет следует ли генерировать изображение используя установленный текущий видовой порт (указывается системной переменной CVPORT). Как правило, имеет смысл устанавливать этот флаг в True, особенно когда выполняется wblock некоторых выбранных в редакторе AutoCAD примитивов.
В этой функции неявно используется AcGs API для генерации миниатюры.
Следующий код демонстрирует возможный сценарий для использования:
- // 2010 - 2012:
- // typedef Acad::ErrorStatus (*MakePreviewFuncType)(
- // AcDbDatabase* pDb,
- // BOOL bUseCurrentViewInfo);
- // 2013:
- typedef Acad::ErrorStatus (*MakePreviewFuncType)(
- AcDbDatabase* pDb,
- bool bUseCurrentViewInfo);
- void asdkcmdtest()
- {
- ads_name ss;
- // Выберем несколько примитивов для wblock
- if (acedSSGet(NULL,NULL,NULL,NULL,ss)!=RTNORM)
- return;
- AcDbDatabase* pDb =
- acdbHostApplicationServices()->
- workingDatabase();
- long l;
- if (acedSSLength(ss,&l)!=RTNORM)
- return;
- AcDbObjectIdArray idArray;
- ads_name ename;
- AcDbObjectId id;
- for (long i=0;i<l;i++)
- {
- if (acedSSName(ss,i,ename)!=RTNORM)
- return;
- if (acdbGetObjectId(id,ename)!=Acad::eOk)
- return;
- idArray.append(id);
- }
- // Выполняем wblock
- AcDbDatabase* pOut;
- if (pDb->wblock(pOut,idArray,AcGePoint3d(0,0,0))!=Acad::eOk)
- return;
- // Загружаем модуль
- // 2010- 2012
- // if (acrxLoadModule(_T("acblock.arx"), FALSE))
- // 2013
- if (acrxLoadModule(_T("acblock.crx"), FALSE))
- {
- HINSTANCE hInst;
- // Загружаем модуль
- // 2010- 2012
- // if (acrxLoadModule(_T("acblock.arx"), FALSE))
- // 2013
- if ((hInst = LoadLibrary(_T("acblock.crx")))
- !=NULL)
- {
- MakePreviewFuncType makePreviewFunc;
- if ((makePreviewFunc =
- (MakePreviewFuncType)
- GetProcAddress
- (hInst,"acdbMakeDrawingPreview"))
- !=NULL)
- {
- if (makePreviewFunc(pOut,true)
- ==Acad::eOk)
- {
- if(pOut->saveAs(
- _T("d:\\test.dwg"))
- ==Acad::eOk)
- acutPrintf(
- _T("База данных сохранена.\n"));
- }
- }
- FreeLibrary(hInst);
- }
- // Выгружаем модуль
- // 2010- 2012
- // acrxUnloadModule(_T("acblock.arx"));
- // 2013
- acrxUnloadModule(_T("acblock.crx"));
- }
- delete pOut;
- }
Примечание переводчика: код не работает в 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