Тема: Добавление графического примитива в базу не текущего рисунка

Открыт чертеж "а" и "б".
Текущий чертеж "а".
Получаю базу AcDbDatabase рисунка "б", используя AcApDocManager, добавляю в нее какой-нибудь графический примитив. После завершения команды открываю чертеж "б" - графический примитив не отображается на рисунке.
Если сохранить чертеж "б" и закрыть, а потом снова открыть - графический примитив отображаеться.
Как сделать так, чтобы графичиский примитив отображался сразу на рисунке после добавления в базу.

Re: Добавление графического примитива в базу не текущего рисунка

по моему там вся проблема с регенерацией. Попробуй регенерировать рисунок Б сразу после добавления в его БД примитива.

Re: Добавление графического примитива в базу не текущего рисунка

Пробывал,
не помогает

Re: Добавление графического примитива в базу не текущего рисунка

посмотри тему https://www.caduser.ru/forum/topic18003.html вдруг поможет

Re: Добавление графического примитива в базу не текущего рисунка

Не помогает

Re: Добавление графического примитива в базу не текущего рисунка

тогда нужен код, других мыслей пока нет

Re: Добавление графического примитива в базу не текущего рисунка

После завершения команды открываю чертеж "б" — графический примитив не отображается на рисунке.

А как ты его открываешь? Просто переключаешься между чертежами или открываешь его повторно с диска? Во втором случае он может быть открыт в режиме read-only и добавленый в него примитив не появится на экране.
Если же это первый случай, то попробуй выполнить команду _REGENALL - появится ли примитив на экране? Выполни проверку чертежа при помощи команды _AUDIT.
Кроме того уточни версию AutoCAD и ObjectARX.

Re: Добавление графического примитива в базу не текущего рисунка

А как ты его открываешь? Просто переключаешься между чертежами или открываешь его повторно с диска? Во втором случае он может быть открыт в режиме read-only и добавленый в него примитив не появится на экране.

Переключаюсь между чертежами и рисунок открыт для записи.
Команды _REGENALL и _AUDIT не дают результата.
AutoCAD 2006
ObjectARX 2006
Даю код, который использую.
Входной метод addLine() принимает путь к файлу.

Re: Добавление графического примитива в базу не текущего рисунка

//Возвращает указатель на документ sDocName если он открыт, или 0 - если документа нет
AcApDocument* GetDocument( const CString &sDocName )
{   
    AcApDocumentIterator* iter = acDocManager->newAcApDocumentIterator();
    AcApDocument* pTmpDoc = 0;
    for( ; !iter->done(); iter->step() ) {
        if( !_stricmp( sDocName, iter->document()->fileName() ) ) {
            pTmpDoc = iter->document();
            break;
        }
    }
    delete iter;
    return pTmpDoc;
}//GetDocument
Acad::ErrorStatus addToModelSpace(AcDbEntity* ent, AcDbObjectId& objectId, AcDbDatabase *pDb)
{   
    SmartAcDb<AcDbBlockTable> blockTable;
    if(!pDb) pDb = acdbHostApplicationServices()->workingDatabase();
    Acad::ErrorStatus es = pDb->getSymbolTable(blockTable, AcDb::kForRead);
    if(es!=Acad::eOk)    return es;
   
    SmartAcDb<AcDbBlockTableRecord> blockTableRecord;
    es=blockTable->getAt(ACDB_MODEL_SPACE, blockTableRecord, AcDb::kForWrite);
    if(es!=Acad::eOk)    return es;
   
    es=blockTableRecord->appendAcDbEntity(objectId, ent);
    if(es!=Acad::eOk)    return es;
   
    ent->close();
    ent = 0;
    return es;
}//addToModelSpace
Acad::ErrorStatus addLine( const CString& sFileName )    // sFileName  - путь к файлу
{
    AcApDocument* pDoc = GetDocument( sFileName );
    if( pDoc == NULL )    return Acad::eOk;
    acDocManager->lockDocument(pDoc, AcAp::kWrite);
   
    acdbHostApplicationServices()->setWorkingDatabase( pDoc->database() );
               
    AcDbPolyline* pLine;
    pLine = new AcDbPolyline;
    pLine->addVertexAt( pLine->numVerts(), AcGePoint2d( 50, 50 ) );
    pLine->addVertexAt( pLine->numVerts(), AcGePoint2d( 100, 50 ) );
    AcDbObjectId objId;
    Acad::ErrorStatus es = cmnAcadDB::addToModelSpace( pLine, objId );
    acDocManager->unlockDocument(pDoc);
    return es;
}//addLine

Re: Добавление графического примитива в базу не текущего рисунка

> ihor
1) Я не заметил, чтобы ты переключал обратно WorkingDatabase, а это не правильно! Да и вообще не очень понятно в данном случае зачем ты переключаешь WorkingDatabase - этого здесь можно и не делать.
2) Попробуй после добавления примитива открыть его на запись, выполнить для него метод recordGraphicsModified(), а затем его закрыть.

Re: Добавление графического примитива в базу не текущего рисунка

Попробуй после добавления примитива открыть его на запись, выполнить для него метод recordGraphicsModified(), а затем его закрыть.

Делал (примитив успешно открывается),
не помогает.

Re: Добавление графического примитива в базу не текущего рисунка

У тебя в коде:

Acad::ErrorStatus es = cmnAcadDB::addToModelSpace( pLine, objId );

Попробуй явно указать

Acad::ErrorStatus es = cmnAcadDB::addToModelSpace( pLine, objId, [b]pDoc->database() [/b] );

Re: Добавление графического примитива в базу не текущего рисунка

Делал,
тот же самый результат

Re: Добавление графического примитива в базу не текущего рисунка

> ihor
Перед acDocManager->lockDocument(pDoc, AcAp::kWrite);

        AcApDocument *pDocPrev = acDocManager->curDocument();
        acDocManager->setCurDocument(pDoc);

После acDocManager->unlockDocument(pDoc);

acDocManager->setCurDocument(pDocPrev);

И все будет нормально! :)

Re: Добавление графического примитива в базу не текущего рисунка

Все работает.
Спасибо!!!

Re: Добавление графического примитива в базу не текущего рисунка

:) Отлично!