Тема: Свободен ли Автокад???

Пытаюсь строить объекты в Автокаде с внешнего приложения, НО ...  возникает задачка, если Автокад занят (открыта какая либо форма или он в режиме ожидания ввода данных) выводит
System.Runtime.InteropServices.COMException was unhandled
  ErrorCode=-2147418111
  Message="Вызов был отклонен. (Exception from HRESULT: 0x80010001 (RPC_E_CALL_REJECTED))"
  Source="Autodesk.AutoCAD.Interop"
если Автокад свободен - то построение объектов проходит нормально.
Вопрос: Существуют ли какие-либо методы узнать занат ли АКАД или нет.
Зараннее спасибо с Уважением Michigan.

Re: Свободен ли Автокад???

У AutoCAD есть объект AcadState
нужно прочитать его свойство IsQuiescent. Если оно True, можно работать.

Re: Свободен ли Автокад???

Все гениальное - гениально просто !!!
Все работает, огромное спасибо!
Да, и вот еще вопросик есть ли в автокаде событие реагирующее на выбор чертежа если открыто много документов?
Michigan

Re: Свободен ли Автокад???

Activate

Re: Свободен ли Автокад???

Проблема в том, что событие Acivate работает токо для класса AcadDocument, и срабатывает только при активации определенного документа, а что касается класса AcadDocuments у него нет событий вообще (в том числе и Acivate). Поскольку задача стоит отлавливать события при выборе любых документов открытых в текущем сеансе автокада. Как быть?
Я создал объект
Public WithEvents Документы_Автокада As Autodesk.AutoCAD.Interop.AcadDocuments
и пытался его использовать его события, но ничего не вышло ... ???
Michail

Re: Свободен ли Автокад???

Нужно каждому открытому документу присвоить обработчик события Activate. Да еще неплохо бы обрабатывать EndOpen и BeginDocClose, т.к. пользователь может открывать/закрывать документы.

Re: Свободен ли Автокад???

С этим понятно. Спасибо.
У меня крутится еще такая идея:
Делаю таймер постоянно тикающий с интервалом 500мс (к примеру), и при каждом тике он проверяет метку (или объект) текущего активного документа с раннее записанной в глобальную переменную (например Active_Acad_Document) если метки не совпадают, таймер перезаписывает глобальную переменную для дальнейшей работы с активным документом.
Вопрос: есть ли в этой идее (использование таймера и постоянного обращении к автокаду) что-то плохое???

Re: Свободен ли Автокад???

Нужно экспериментировать. В принципе ничего страшного в этом я не вижу. Разве что сам пользовотель завершит работу AutoCAD. И нужно при этом проверять еще статус AutoCAD (IsQuiescent).

Re: Свободен ли Автокад???

Спасибо за поддержку!
Буду эксперементировать!!!

Re: Свободен ли Автокад???

Сделал конструкцию на таймере работает всё четко! Необычайная гибкость, практически конструктор событий. Пиши что хочеш во внешнем приложении .NET, оно же будет управлять автокадом. При работе таймера вхолостую - проц работает нормально (без нагрузки).
Единственное что следует сделать: при старте события Tick следует отключать счетчик, поскольку выполнение операций внутри счетчика может привысить время самого счетчика и его 'накроет'. По окончании выполнения операции(й) счетчик следует включить. Ну и конечно не забывать анализировать IsQuiescent.
    Private Sub Timer_Запуска_Форм_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer_Запуска_Форм.Tick
            ''приостановить таймер перехвата
            Timer_Запуска_Форм.Enabled = False
        {
        код для выполнения
        }
            ''запустить таймер перехвата
            Timer_Запуска_Форм.Enabled = True
    End Sub

Re: Свободен ли Автокад???

Добрый день!
Столкнулся с подобным.
Ранее, на win7 работал в Автокад с программами на Delphi через com связку. Все программы и модули работали штатно, без глюков. Теперь везде стоит win10, и тут все то, что раньше работало штатно стало работать не штатно. Например в процессе работы какого-нибудь модуля, в котором выполняется ряд действий пользователем в среде автокад по запросу программы (например указание кликами мыши группы точек на чертеже) на какой-то из кликов программа вылетает с сообщением "Вызов был отклонен." Видимо что-то перехватывает автокад и рвет com-связку с моим внешним модулем.
Что можно сделать? Как бороться с "влезанием" чего-то в процесс?