Тема: Получение информации о растровых изображениях

Собственно нужно определить пути ко всем растровым изображениям, прикрепленных к чертежу или как можно получить данные из Image Manager.

Re: Получение информации о растровых изображениях

> metod

static void GetImgPathes(void)
{
  Acad::ErrorStatus es;
  AcDbDatabase *pDb = acdbCurDwg();
  AcDbDictionaryPointer pRoot(pDb->namedObjectsDictionaryId(),AcDb::kForRead);
  if ((es = pRoot.openStatus()) != Acad::eOk) {
    acutPrintf(_T("\npRoot.openStatus()=%s"),acadErrorStatusText(es));
    return;
  }
  AcDbObjectId eIdImgDict;
  if ((es = pRoot->getAt(_T("ACAD_IMAGE_DICT"),eIdImgDict)) != Acad::eOk) {
    acutPrintf(_T("\npRoot->getAt(...)=%s"),acadErrorStatusText(es));
    return;
  }
  AcDbDictionaryPointer pImgDict(eIdImgDict,AcDb::kForRead);
  if ((es = pImgDict.openStatus()) != Acad::eOk) {
    acutPrintf(_T("\npImgDict.openStatus()=%s"),acadErrorStatusText(es));
    return;
  }
  AcDbDictionaryIterator *pImgDictIter = pImgDict->newIterator();
  if (pImgDictIter) {
    for (;!pImgDictIter->done();pImgDictIter->next()) {
      AcDbObjectPointer<AcDbRasterImageDef> pImgDef(pImgDictIter->objectId(),AcDb::kForRead);
      if ((es = pImgDef.openStatus()) != Acad::eOk) {
        acutPrintf(_T("\npImgDef.openStatus()=%s"),acadErrorStatusText(es));
        continue;
      }
      // Печатаем путь к растровому файлу
      acutPrintf(_T("\npImgDef->activeFileName()=\"%s\""),pImgDef->activeFileName());
      acutPrintf(_T("\npImgDef->sourceFileName()=\"%s\""),pImgDef->sourceFileName());
    }
  }
  delete pImgDictIter;
}

Re: Получение информации о растровых изображениях

Спасибо, все работает!

Re: Получение информации о растровых изображениях

а еще,а где можно узнать про стринговые константы типа ACAD_IMAGE_DICT

Re: Получение информации о растровых изображениях

Попробуй при помощи ARXDBG (есть такой пример в ObjectARX SDK). С его помощью можно много чего полезного узнать.

Re: Получение информации о растровых изображениях

> Александр Ривилис
Пытаясь работать с набором вставленных картинок в AutoCAD 2002 (SKD 2000) столкнулся со следующей проблемой:
AcDbDictionaryPointer не может найти словарь для работы с картинками по ключу "ACAD_IMAGE_DICT":

pRoot->getAt(_T("ACAD_IMAGE_DICT"), eIdImgDict);// acadErrorStatusText="eKeyNotFound"

С SDK 2004 и 2007 такой проблемы нет.

Re: Получение информации о растровых изображениях

> equilibrium
В классе AcDbRasterImageDef есть две такие статические функции:

    static Acad::ErrorStatus     createImageDictionary(AcDbDatabase* pDb, AcDbObjectId& dictId);
    static AcDbObjectId          imageDictionary(AcDbDatabase* pDb);

Вот ими и пользуйся для создания/получения словаря.

Re: Получение информации о растровых изображениях

> Александр Ривилис
При работе с SDK 2000 проблема осталась:

AcDbRasterImageDef* rasterImageDef = new AcDbRasterImageDef();
AcDbObjectId eIdImgDict = rasterImageDef->imageDictionary(acdbCurDwg()); // eIdImgDict{mId=0}
delete rasterImageDef;
    
AcDbDictionaryPointer pImgDict(eIdImgDict , AcDb::kForRead); //pImgDict{m_ptr=0x0000000;m_status=eNullObjectId}
Acad::ErrorStatus es = pImgDict.openStatus();//eNullObjectId        

Re: Получение информации о растровых изображениях

Не то делаешь.

AcDbObjectId dictID = AcDbRasterImageDef::imageDictionary(acdbCurDwg());
AcDbRasterImageDef::createImageDictionary(acdbCurDwg(), dictID);
AcDbDictionaryPointer pImgDict(dictID, AcDb::kForRead);
// И т.д.

Re: Получение информации о растровых изображениях

> Александр Ривилис
К сожалению, при такой реализации похоже заменяется словарь и все растровые изображения "исчезают" (SDK 2000, 2004, 2007).

Re: Получение информации о растровых изображениях

К сожалению проверить в AutoCAD 2000 не могу. Наверное, более точным должно быть так:

AcDbObjectId dictID = AcDbRasterImageDef::imageDictionary(acdbCurDwg());
if (AcDbObjectId::isNull(dictID)) AcDbRasterImageDef::createImageDictionary(acdbCurDwg(), dictID);

Re: Получение информации о растровых изображениях

> Александр Ривилис
Да, именно так работает корректно в SDK 2000, 2004, 2007. Разве что AcDbObjectId проверяется на NULL немного иначе - метод вызывается у объекта AcDbObjectId:

...
if (dictID.isNull())
...

В очередной раз
Спасибо за помощь, Александр!

Re: Получение информации о растровых изображениях

> equilibrium
Да. С isNull() я лопухнулся, так как в VS код не проверял. Все на глазок... smile

Re: Получение информации о растровых изображениях

> Александр Ривилис
Так и понял (: