Тема: Почему Акад отказывается сохранять чертеж?

Автокад после активного использования _3DOrbit при попытке сохранить чертеж начинает выдавать такую надпись:
Command: _qsave
Document "G:\Drawing6.dwg" has a command in
progress.
Hit enter to cancel or [Retry]: *Cancel*
При этом acDocManager->curDocument()->isQuiescent() выдает true (т.е. нет активных команд, скриптов и lisp-а)...
Все модальные команды работают. Приметивы работают и добавляются. Т.е. все пашет кроме сохранения документа. При закрытии Акада - спрашивает а не хотите ли сохранить изменения - отвечаю что хочу - все без проблем сохраняет.
Кто-нибудь сталкивался с подобным? Почему документ может попадать в такое состояние что команды работают, isQuiescent - выдает true, а документ отказывается сохраняться( с меню акада ).

Re: Почему Акад отказывается сохранять чертеж?

Акад 2002 (в 2004 не проверял).

Re: Почему Акад отказывается сохранять чертеж?

Нашел причину.
Почему-то редко время от времени - документ после команды _3dorbit остается залоченным.
Т.е. причина в том, что AcAp::DocLockMode становится AcAp::kWrite и система реагирует на это вышеописанным способом.
Почему это происходит буду разбираться. Вроде везде юзаю AcAxDocLock - даже при эксепшенах состояние документа должно возвращаться в прежднее.

Re: Почему Акад отказывается сохранять чертеж?

:(
Это баг Акад 2002 при команде _3dOrbit. (Есть ли он для других Акадов не тестил)
Нарисовал в голом Акаде без всяких вгруженых arx-ов лабуду из стандартных приметивов что позволяет Акад. После этого поиздевался над _3dOrbit - (надо несколько десятков раз раскрутить модель с большой скоростью иногда чередуя с обычным _3dOrbit - без авт. вращения).
Получил то же самое... отказ сохранять чертеж и очень редко падения при закрытии Акада... такие вот пироги.
Вылечил следующим образом:
AcEdInputContextReactor::beginQuiescentState()
{
AcAp::DocLockMode lMode = acDocManager->curDocument()->lockMode();
if ( lMode != AcAp::kNormal )
acDocManager->lockDocument(curDoc, AcAp::kNormal);
}
Только вот думаю... А бывают такие ситуации когда при событии beginQuiescentState - текущий документ может находится в залоченном состоянии? Типа там транспарент команды и т.п.?

Re: Почему Акад отказывается сохранять чертеж?

Короче в 2002-м акаде баг с 3dOrbit. Они забывают разлочивать документ. lockDocument-s - копятся (видать есть ограничение на кол-во локов на документ). С некоторого момента как накапливается критическое число неразлоченных локов, документ попадает в перманентно залоченное состояние на запись... Даже внутри одной команды если менять направления вращения достаточно долго, то происходит ошибка и пытаться делать за акадом unlock - бесполезно.
Уже в 2004-м такого бага нет. Там все нормально.

Re: Почему Акад отказывается сохранять чертеж?

в 2006 такой баг есть !! )= как лечить ??

Re: Почему Акад отказывается сохранять чертеж?

Точно, есть. Мне приходилось сталкиваться, но я думал, что каким-то образом я сам ненароком в refedit вывалился... приодилось селект олл-копи- пэйст в новый делать :(  Как избавиться?

Re: Почему Акад отказывается сохранять чертеж?

> dream

> ASHAS
AutoCAD 2006 с SP1? Никогда не сталкивался. Сторонние программы (arx/dbx/dll-файлы, Object Enabler'ы и т.д.) не используются? А избавится, если это действительно есть, нельзя. Если это глюк стороннего приложения - просто его не использовать.

Re: Почему Акад отказывается сохранять чертеж?

Я использую из сторонних программ только  пару лиспов и все, это действительно скорее всегт связано с использованием 3D Orbit, мой автокад без SP1.

Re: Почему Акад отказывается сохранять чертеж?

> Александр Ривилис
Такое поведение есть на голом акаде без всего... Но мне казалось что этот баг есть только в 2002-ом... Поэтому я на это забил... В 2004 у меня все прекрасно работало... и повторить баг я не смог... в >2004 не тестил...
Документ после работы с 3dOrbit не сохраняется и остается только Copy->Paste в другой чертеж...

Re: Почему Акад отказывается сохранять чертеж?

Добрый день, уважаемые знатоки арха!
Позвольте продолжить старую тему, когда Акад выдает <<Hit enter to cancel or [Retry]>>.
Когда хочешь сохранить чертеж, то обойти проблему легко, набрав в командной строке "save".
Хуже, когда его не отправить на печать из текущей сесии.
Проблема возникает часто, но не всегда.

acDocManager->curDocument()->isQuiescent(); - выдает true
acDocManager->unlockDocument(curDoc ); - тоже не имеет положительного эффекта.

В чем тут загвоздка?

Re: Почему Акад отказывается сохранять чертеж?

Максим Маланичев пишет:

В чем тут загвоздка?

Вариантов 2:
1. Баг AutoCAD - такое было в старых версиях
2. Баг arx-приложения (твоего или чужого).
Первый вариант лечится установкой SP или не лечится
Второй вариант - если приложение твое - ищи ошибки.

Re: Почему Акад отказывается сохранять чертеж?

Спасибо Александр, я уже двое суток ищу ошибку в своем арх-приложении. Надеюсь, ошибка в нем, т.к. приложение запускал в 2007 и 2009 акадах, результат одинаков. Я просек, что акад дурит после моего черчения полилинии. Вот код:

    AcGePoint2d ptt;        // объекты cur, vert - мои собственные
    int i = 0;
    AcDbPolyline* pPoly =
         new AcDbPolyline( unsigned(cur.Size()) );
    double bulge = 0.0;

    while ( i < cur.Size() ){
        vert = cur.GetVertex(i);
        ptt.x = vert.GetX() ; ptt.y = vert.GetY();bulge = vert.Bulge;
        pPoly->addVertexAt( i, ptt, bulge );
        i++;
    }
    pPoly->setNormal ( Z_vec );
    pPoly->setElevation (  Elev );
    pPoly->setColorIndex( color );
    pPoly->setLayer( LayName);
    // Добавление к рисунку полилинии
    AcDbObjectId pOutputId;
    addToModelSpace( pOutputId, pPoly );
    pPoly->close();
    
а в базу вставляется так:
bool addToModelSpace(AcDbObjectId &objId, AcDbEntity* pEntity)
{            acDocManager->lockDocument(curDoc );   
   
     if ((es =
         acdbHostApplicationServices()->workingDatabase()
         ->getSymbolTable(this->pBlockTbl, AcDb::kForRead)) != Acad::eOk ){   
         Autodesk::AutoCAD::ApplicationServices::Application::ShowAlertDialog( _T("\nНе открыть таблицу блоков!"));
         acDocManager->unlockDocument(curDoc );    return false; }
     
     this->pBlockTbl->getAt(ACDB_MODEL_SPACE, this->pMS, AcDb::kForWrite);
     if (this->pMS == NULL){
         Autodesk::AutoCAD::ApplicationServices::Application::ShowAlertDialog( _T("\nНет доступа к блоку *Model_Space. "));
         pBlockTbl->close();
         acDocManager->unlockDocument(curDoc );    return false; }

     if (this->pMS->isWriteEnabled()){
         if ((es = pMS->appendAcDbEntity(objId, pEntity)) != Acad::eOk){
         Autodesk::AutoCAD::ApplicationServices::Application::ShowAlertDialog( _T("\nОшибка при добавлении объекта в базу... "));
         }
     }
      pMS->close(); pBlockTbl->close();
          acDocManager->unlockDocument(curDoc );     
      return true;
}

Не взглянете свежим взглядом, где тут баг закрался?
Заранее спасибо.

(изменено: Александр Ривилис, 20 января 2011г. 13:58:59)

Re: Почему Акад отказывается сохранять чертеж?

Помести свой код в тэги [code] ... сам код ... [/code] - в таком виде (как сейчас) читать очень сложно.
И еще. Вместо вызовов lockDocument() и unlockDocument() лучше использовать AcAxDocLock (как показано здесь: https://www.caduser.ru/forum/post85628.html#p85628) - это обезопасит от того, что забыл вызвать unlockDocument().
И почему curDoc, а не curDoc() ?

Re: Почему Акад отказывается сохранять чертеж?

простите. Еще раз:
Создаю полилинию:

AcGePoint2d ptt; // объекты cur, vert - мои собственные
int i = 0;
AcDbPolyline* pPoly =
new AcDbPolyline( unsigned(cur.Size()) );
double bulge = 0.0;

while ( i < cur.Size() ){
vert = cur.GetVertex(i);
ptt.x = vert.GetX() ; ptt.y = vert.GetY();bulge = vert.Bulge;
pPoly->addVertexAt( i, ptt, bulge );
i++;
}
pPoly->setNormal ( Z_vec );
pPoly->setElevation ( Elev );
pPoly->setColorIndex( color );
pPoly->setLayer( LayName);
// Добавление к рисунку полилинии
AcDbObjectId pOutputId;
addToModelSpace( pOutputId, pPoly );
pPoly->close(); 

добавляю в базу:

bool addToModelSpace(AcDbObjectId &objId, AcDbEntity* pEntity)
{ acDocManager->lockDocument(curDoc );

if ((es =
acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(this->pBlockTbl, AcDb::kForRead)) != Acad::eOk ){
Autodesk::AutoCAD::ApplicationServices::Application::ShowAlertDialog( _T("\nНе открыть таблицу блоков!"));
acDocManager->unlockDocument(curDoc ); return false; }

this->pBlockTbl->getAt(ACDB_MODEL_SPACE, this->pMS, AcDb::kForWrite);
if (this->pMS == NULL){
Autodesk::AutoCAD::ApplicationServices::Application::ShowAlertDialog( _T("\nНет доступа к блоку *Model_Space. "));
pBlockTbl->close();
acDocManager->unlockDocument(curDoc ); return false; }

if (this->pMS->isWriteEnabled()){
if ((es = pMS->appendAcDbEntity(objId, pEntity)) != Acad::eOk){
Autodesk::AutoCAD::ApplicationServices::Application::ShowAlertDialog( _T("\nОшибка при добавлении объекта в базу... "));
}
}
pMS->close(); pBlockTbl->close();
acDocManager->unlockDocument(curDoc );
return true;
}

(изменено: Александр Ривилис, 20 января 2011г. 14:28:24)

Re: Почему Акад отказывается сохранять чертеж?

Для начала замени curDoc на curDoc(). А еще лучше используй AcAxDocLock, как я написал выше.
P.S.: Только сейчас обратил внимание, что ты используешь Mixed Mode. Не люблю я это...
P.S.S.: И почему ты не пользуешься интеллектуальными указателями?

Re: Почему Акад отказывается сохранять чертеж?

СПАСИБО АЛЕКСАНДР!

try{
AcAxDocLock docLock(acdbHostApplicationServices()->workingDatabase(),AcAxDocLock::kNormal);
}  catch (const Acad::ErrorStatus){}

Сработало!! Конец мечениям!!!)))

Re: Почему Акад отказывается сохранять чертеж?

Ну и отлично!