Тема: Использование wblock в AcDatabaseReactor::objectAppended()

Создал свой AcDatabaseReactor и пытаюсь сохранить только что созданный объект в файле при помощи wblock, но wblock возвращает ошибку eWasOpenedForWrite. Может кто что подскажет?
AcDbReactor::objectAppended(const AcDbDatabase* db,
    const AcDbObject* pObj)
{
AcDbDatabase *pTempDb;
   
AcDbObjectIdArray objIdList;
objIdList.append(pObj->objectId());
Acad::ErrorStatus es;
es=acdbHostApplicationServices()->workingDatabase()->wblock(pTempDb, objIdList, AcGePoint3d::kOrigin);
!!!! es == eWasOpenedForWrite !!!!   
ACHAR* pFile = _T("C:\\temp.dwg");
pTempDb->saveAs(pFile);
}

Re: Использование wblock в AcDatabaseReactor::objectAppended()

> Solmar
1) Это очень плохой стиль пытаться что-то такое делать в AcDatabaseReactor-производных реакторах. Намного правильнее это проделывать это в AcEditorReactor, накапливая в AcDbReactor::objectAppended() массив AcDbObjectId для wblock
2) Если уж очень хочется это сделать, то выполни pObj->downgradeOpen(), затем wblock, а затем pObj->upgradeOpen();
3) Ты не создал pTempDb, т.е вместо AcDbDatabase *pTempDb; должно быть

AcDbDatabase *pTempDb = AcDbDatabase(false,true);

Re: Использование wblock в AcDatabaseReactor::objectAppended()

Упс...

AcDbDatabase *pTempDb = new AcDbDatabase(false,true);

Re: Использование wblock в AcDatabaseReactor::objectAppended()

Спасибо, с AcEditorReactor все получилось! Повесил wblock в commandEnded().
Насчет pObj->downgradeUpdate() и pObj->upgradeUpdate() не получилось, предполагаю что из-за того, что pObj это все-таки константа.
А pTempDb создается самой wblock, как я выяснил из примеров ARX, туда надо только указатель передать, а вот delete pTempDb в конце не помешает.
Теперь вот думаю, а нельзя ли вместо AcEditorReactor использовать AcTransactionReactor и делать wblock по завершении транзакции или wblock будет ту же ошибку выдавать.

Re: Использование wblock в AcDatabaseReactor::objectAppended()

> Solmar
Проблема не в том, что pObj константа (можно привести указатель к неконстатному), а в том, что скорее всего в этот момент открыт на запись не pObj, а его "владелец". Кроме того имеет смысл клонировать не все, а только примитивы, т.е. те для которых AcDbEntity::cast(pObj) != NULL
С AcTransactionReactor я бы не стал заморачиваться.