Тема: растр не добавляется

Здравствуйте.

Пытаюсь добавить растр (путь типа \\server\sharefolder\raster.ext, там нормальный jpg).
Нашел исходники старого приложения, где это работало.
Вставил себе, и получаю странную ошибку 409 - eNoClassId при добавлении в словарь.
Не понимаю, какой класс нужен словарю.

    AcDbBlockTableRecord *pModel = NULL;
    AcDbDictionary* pDictionary = NULL;
    AcDbRasterImage *pAcDbRasterImage = NULL;
    AcDbRasterImageDef* pAcDbRasterImageDef = NULL;    
    AcDbObjectId parObjectId;

    // это пробовал добавить после поисков на форуме - не помогает 
    // AcAxDocLock docLock(acdbHostApplicationServices()->workingDatabase(),AcAxDocLock::kNormal); 
        
    // обеспечиваем словарь для растров
    pModel = prims.openModelspace(AcDb::kForWrite);    
    AcDbDatabase *pBase = acdbHostApplicationServices()->workingDatabase();            
    AcDbObjectId DictionaryId = AcDbRasterImageDef::imageDictionary(pBase);

    if (DictionaryId.isNull()) 
        if (Acad::eOk != AcDbRasterImageDef::createImageDictionary(pBase, DictionaryId)) 
            throw "не удалось создать словарь для растров.";
            
    if (Acad::eOk != acdbOpenObject((AcDbObject*&)pDictionary, DictionaryId, AcDb::kForWrite))
        throw "не удалось открыть словарь для растров.";

    m_imageDefName = "raster_" + id;
    if (pDictionary->has(m_imageDefName)) 
        pDictionary->getAt(m_imageDefName, parObjectId);    // уже грузилось
    else
        {        // первая загрузка
        pAcDbRasterImageDef = new AcDbRasterImageDef();            
        if ( Acad::eOk != pAcDbRasterImageDef->setSourceFileName( cs2ws(path)) )
            throw string("Ошибка имени файла растра [") + path + "]";
        if ( Acad::eOk != pAcDbRasterImageDef->load() )
            throw string("Ошибка загрузки описания растра из файла [") + path + "]";            
        int res = pDictionary->setAt(m_imageDefName, pAcDbRasterImageDef, parObjectId);
        
        // здесь res==409 - eNoClassId 
        
        if ( Acad::eOk != res )
            throw string("Ошибка занесения в словарь описания растра из файла [") + path + "], код: " + AS(res) + ".";
        pAcDbRasterImageDef->close();
        pAcDbRasterImageDef = NULL;
        }                
        
    pDictionary->close();
    pDictionary = NULL;

Вразумите, пожалуйста, куда копать?
Какой класс надо дать словарю?
Acad 2010, objArx2010, VS 2008, winXP.

Re: растр не добавляется

Интересно, а в этот момент acismobj18.dbx загружен?
Добавь перед всем этим кодом:

acrxLoadModule(L"acismobj18.dbx"); // Для AutoCAD 2010...2012

Re: растр не добавляется

Спасибо, Александр, загружаться изображения начали.

Вот только теперь они побитые - полосы по ним идут.

JPEG не распознается корректно.

А тем же вьюером тотал командера по-прежнему видится ок.

Так что помощь пока нужна :)

С уважением,
Wing

Re: растр не добавляется

Wing пишет:

JPEG не распознается корректно.

А если вставляешь командой AutoCAD?

Re: растр не добавляется

Через изобвставить - да, тоже портятся.

Причем, не все. ч/б изображения в основном нормально вставляются.
Цветные - как повезет.

Одно было - через изобвставить нормально, а через arx - портится.
Второе - портится при обоих способах вставки.
Третье - не портилось и через arx.

Еще деталь: выгрузка изображений через arx - все отрабатывает.
Нажатие Del на изображение, вставленное через изобвставить дает краш,
причем, не важно, нормально изображение отображалось или запорчено.

Как будто надо еще что-то инициализировать, но вот что?

Спасибо.

Re: растр не добавляется

Wing пишет:

Как будто надо еще что-то инициализировать, но вот что?

Скорее уж нужно не инициализировать, а закрывать. Проверь все ли ты объекты закрываешь, а лучше пользуйся интеллектуальными указателями (типа AcDbObjectPointer).
Но вообще это всё странно...

Re: растр не добавляется

Спасибо за помощь, Александр.


Насчет проверять закрытие и перейти на смарт-пойнтеры это конечно здраво, только код не мой и его много. Поэтому не так оно просто. Да и необходимости особой нет.

Выяснилось еще кое-что. Во-первых, в arx даже одно и то же изображение может отображаться и корректно, и некорректно, это зависит от того, какие изображения грузились перед ним, причем, эта ситуация стабильна, когда после одних портится постоянно, после других - нормально отображается. Во-вторых, коллеги, работающие с автокадом 2010 сказали, что они работают командами без arx и у них тоже периодически портятся изображения. Раз нормально загрузилось, два нормально, потом - испортилось. Портится так же, горизонтальными полосами с узнаванием изображения в целом. Помогает обычно перезапуск автокада. В-третьих, я отключил все действия после загрузки изображения. И теперь не вызываются никакие команды arx'a после загрузки изображения, т.е. это точно не то, что они портят память. И уже нет оснований подозревать какую-то команду arx'a.

В итоге, работа по отладке этого глюка прекращена, поскольку портятся не все изображения, и установлены пути, которыми их можно получить неповрежденными, и не arx тому причиной, насколько мы можем судить.

Еще немного сведений, для полноты картины.
Если это изображение вставлять в arx и выгружать в arx - оно выгружается без проблем. Если при загруженном arx его вставить командой Изобвставить - оно вставляется и отображается корректно, но при удалении клавишей Del - Fatal Error. Если же вставлять командой Изобвставить без arx, на чистом автокаде - вставляется и удаляется корректно. Выглядит целостно. Но, при вставке изображения можно указать масштаб мышкой. Изображение вставляется масштабом гораздо большим, чем указывается мышкой, верх уходит за пределы видимости и вообще не может быть увиден, даже со скроллом. А другое изображение при вставке в чистом автокаде нормально вставляется, удаляется, и с масштабом никаких проблем - тот самый, который указан мышкой.

С уважением,
Wing

Re: растр не добавляется

Еще отпишусь по состоянию проблемы.

Ситуацию удалось довести до почти нормальной.

По масштабу: введен второй алгоритм получения масштаба, он используется, если по первому получаются запредельные значения. Таким образом удалось заставить отображаться в верном масштабе все проверенные изображения.
По порче самого изображения: эффект продолжается, но портящихся изображений осталось только одно, и для него установлено то изображение, после загрузки которого оно отображается нормально. Дополнительные действия сведены к приемлемому минимуму.

Еще раз благодарю за помощь.