Тема: Закрытие документа в процессе его открытия

Проблема следующая.
Есть чертежи, которые не должны открываться пользователем в автокаде (чтоб чего-то не угробил нужного :) )
Если открыт хоть какой-то чертеж (есть окно консольных комманд), то реактор справляется замечательно.
В реакторе две перегруженны функции:

virtual void dwgFileOpened(AcDbDatabase * pDb, ACHAR *fileName);
virtual void commandEnded(const ACHAR* cmdStr);

Первая ищет признак выше упомянутого файла, и если находит, то вторая функция откслеживает окончание команды OPEN и закрывает чертеж.
А вот если в автокаде вообще нет чертежей, то первая функция работает безупречно, вот только команды OPEN в данном случае почему-то нет.
Если кто сталкивался, скажите как с этим бороться?

Re: Закрытие документа в процессе его открытия

> Николай
В "бездокументном" режиме AutoCAD вообще работает хитро...

Re: Закрытие документа в процессе его открытия

> Александр Ривилис
это я понял. так значит никак?
может реактор свой наследовать не от AcEditorReactor?

Re: Закрытие документа в процессе его открытия

commandEnded - вообще не надо.
Добавьте в dwgFileOpened сточки:
[code]
CString StrToExec;
    StrToExec.Append(_T("CLOSE\n"));
    acDocManager->sendStringToExecute(acDocManager->curDocument(),StrToExec.GetBuffer(),false,true);
    StrToExec.ReleaseBuffer();[code] [/code]
Этот самый sendStringToExecute очень хитро работает - подозреваю, что он вызывается только после установки невозмущенного состояния программы. Иными словами, ваш файл откроется, все реакторы завершат работу, после этого файл сразу же закроется командой CLOSE

Re: Закрытие документа в процессе его открытия

> Зигмус
идея хорошая, но не работает.
ни acedCommand, ни sendStringToExecute в dwgFileOpened не срабатывают, так как документ находится еще на стадии формирования.

Re: Закрытие документа в процессе его открытия

> Николай
Еще есть варианты с acedPostCommand, ads_queueexpr и таймером (запуск sendStringToExecute или acedPostCommand или ads_queueexpr из callback-функции таймера).

Re: Закрытие документа в процессе его открытия

> Николай
У меня работает. Файл открывается командой OPEN, потом автоматически закрывается, как в многодокументном режиме, так и в бездокументном. Когда вызывается SendStringToExecute, файл уже сформирован и является acDocManager->curDocument()'ом. (ACAD 2008).
Может, вы его не открываете, а создаете командой NEW?
Он у вас просто формируется, что ли?

Re: Закрытие документа в процессе его открытия

> Зигмус
где именно вызывается SendStringToExecute?

> Александр Ривилис
я делал еще круче :) создавал отдельный поток с таймером. Вот только есть проблемка с задержкой таймера. Во-первых бывают компьютеры слабенькие, на них документ открывается дольше, а во-вторых, сам документ может быть большим. а ставить таймер на минуту - это круто :), хотя работает.

Re: Закрытие документа в процессе его открытия

> Николай
Нет возможности сейчас проверить, но в AcApDocManagerReactor::documentCreated() вроде SendStringToExecute уже должна работать и таймер не нужен...

Re: Закрытие документа в процессе его открытия

Сейчас смотрю - где-то ошибся, не то загрузил ((( не работат...сорри

Re: Закрытие документа в процессе его открытия

> Александр Ривилис
Проверил. В AcApDocManagerReactor::documentCreated() не работает.

Re: Закрытие документа в процессе его открытия

> Николай
А остальные функции отправки команды в командную строку AutoCAD тоже не работают?

Re: Закрытие документа в процессе его открытия

вот моя функция закрытия документа с именем fileName

void CloseDocument(ACHAR * fileName)
{
    if(acDocManager->documentCount() == 1)
    {
        acDocManager->curDocument()->database()->disableUndoRecording( Adesk::kTrue );
        Acad::ErrorStatus err = acDocManager->closeDocument(acDocManager->curDocument()); // закрыть документ
        
        if(err != eOk)
            acutPrintf(_T("\nНе могу закрыть документ"));
    }
    else
    {
        AcApDocumentIterator *pIter = acDocManager->newAcApDocumentIterator();
        if(pIter)
        {
            for(;!pIter->done();pIter->step())
            {
                AcApDocument *pAcApDoc = pIter->document();
                if(NULL != pAcApDoc)
                {
                    const ACHAR *pFileName = pAcApDoc->fileName();
                    CString usTempName = pFileName;
                    if(usTempName.CompareNoCase(fileName) == 0)
                    {
                        pAcApDoc->database()->disableUndoRecording( Adesk::kTrue );
                        Acad::ErrorStatus err = acDocManager->closeDocument(pAcApDoc);
                        if(err != eOk)
                            acutPrintf(_T("\nНе могу закрыть документ"));
                        break;
                    }    
                }
            }
            delete pIter;
        }
    }
}

из dwgFileOpened она не работает, так как документ еще не сформирован.
так же в dwgFileOpened не работает ни acedCommand ни sendStringToExecute
в реакторе commandEnded (от AcEditorReactor) по команде OPEN происходит CloseDocument.
Если есть другие документы в акаде, то все работает
Если других документов нет, то сюда нет захода.
Сделал еще другой реактор documentCreated (от AcApDocManagerReactor).
И тут без разницы есть документы или нет, в функцию заходим, но перед dwgFileOpened и не работают ни CloseDocument, ни acedCommand ни sendStringToExecute. (commandEnded я отключал для проверки)

Re: Закрытие документа в процессе его открытия

> Николай
Можешь попробовать вариант еще с таким реактором: AcEdInputContextReactor::beginQuiescentState - по логике в нем уже можно закрывать документ и таймер не нужен. Подключаешь этот реактор к созданому документу и из него через sendStringToExecute или acedPostCommand (acedCommand скорее всего работать не будет - эта функция только в контексте документа) закрываешь документ.

Re: Закрытие документа в процессе его открытия

все получилось.
правда не знаю на сколько правильно я делаю.
в On_kInitAppMsg  я создаю экземпляр if (!pDocReact)pDocReact = new CDocReact();
в On_kUnloadAppMsg -  if (pDocReact) delete pDocReact;
а в функции AcEditorReactor::dwgFileOpened(..)

if (HaveToCloseDoc)
{
  ...
  acDocManager->curDocument()->inputPointManager()->addInputContextReactor(pDocReact);
  ...
}

так что спасибо всем откликнувшимся.

Re: Закрытие документа в процессе его открытия

> Николай
Ну если AutoCAD не разваливается, то делаешь все правильно! :)