Тема: Определение активного чертежа в ACAD.

Здрасте!
Задача такая: определить название активного чертежа в акаде.
Написал такую ф-ию:

function GetActiveDWG : String;
var
AcadAppl, AcadDoc : Variant;
begin
  try AcadAppl:=GetActiveOLEObject('AutoCAD.Application')
    except Result:=''; Exit end;
  try AcadDoc:=AcadAppl.ActiveDocument; Result:=AcadDoc.Name
    except Result:=''; Exit end;
end;

Все, вроде, работает, функция возвращает название открытого чертежа или пустую строку, если акад закрыт или в нем не открыт ни один чертеж. Проблема в том, что если при работе с чертежом открыть какое-нибудь диалоговое окно в акаде, например, "Text Style" то функция вдруг начинает возвращать пустую строку (как-будто нет открытых чертежей). Как только закрываю диалоговое окно, функция опять начинает отрабатывать правильно sad
Что можно сделать в такой ситуации?
Заранее благодарен!

Re: Определение активного чертежа в ACAD.

все правильно, просто в то время как у акада открыто МОДАЛЬНОЕ диалоговое окно он ни на что не может реагировать пока это окно не будет закрыто.
зы. скорее всего при этом срабатывают try...except.
в отладчике смотрел ?

Re: Определение активного чертежа в ACAD.

Ну да, срабатывает исключение на: Result:=AcadDoc.Name
Хотя, AcadDoc:=AcadAppl.ActiveDocument отрабатывает нормально. Т.е. можно получить инфу о том, что активный документ существует, но вот как он называется - нет, что не хорошо.
Вопрос в том, как определить название активного чертежа, когда открыто модальное окно в акаде?

Re: Определение активного чертежа в ACAD.

с модальным окном никак(!!!)
по идее и сам процесс получения активного дока не должен отрабатывать...
а может он и не отрабатывает ? т.е. не возвращает объект ?
зы. интересно взглянуть на сообщение ошибки при:
Result:=AcadDoc.Name

Re: Определение активного чертежа в ACAD.

Ошибка такая:
Exception class: EOleSysError
Message: 'Call was rejected by callee'
AcadDoc:=AcadAppl.ActiveDocument отрабатывает без генерации исключения.
И как быть?

Re: Определение активного чертежа в ACAD.

Вот пример схожей задачи, думаю разберешься...

...
private
   Lastdoc : String;
...
procedure TForm1.FormCreate(Sender: TObject);
var
  v : OleVariant;
begin
  Try
// пытаемся присоединиться к уже запущенной копии AutoCad
    v := GetActiveOleObject('AutoCAD.Application');
    AcadDocument1.ConnectTo((IDispatch(v) as IAcadApplication).ActiveDocument);
  Except
// если не получилось присоединиться, то запускаем новую копию AutoCad
    AcadDocument1.Connect
  end;
// сразу заполняем вспомогательную переменную для последующей проверки
  LastDoc:= AcadDocument1.Path+'\'+AcadDocument1.Name;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
  v : OleVariant;
begin
  try
    if LastDoc <> AcadDocument1.Application.ActiveDocument.Name then
    try
      AcadDocument1.Disconnect;
      v := GetActiveOleObject('AutoCAD.Application');
      AcadDocument1.ConnectTo((IDispatch(v) as IAcadApplication).ActiveDocument);
// при этом обновляем дополнительную переменную
      LastDoc:= AcadDocument1.Path+'\'+AcadDocument1.Name;
    except
    end;
  except
  end;
  Caption:= LastDoc;
end;
...

Re: Определение активного чертежа в ACAD.

Ну, я примерно так и решил.

Re: Определение активного чертежа в ACAD.

> Asail
:) ты пойми с "висящим" в акаде модальным окном у тебя НИЧЕГО не получится.

Re: Определение активного чертежа в ACAD.

чуть-чуть припоздал...  :)))

Re: Определение активного чертежа в ACAD.

В, общем, у меня получилось так:
Функция приобрела следующий вид:

function GetActiveDWG : String;
var
  AcadAppl, AcadDoc : Variant;
begin
  try AcadAppl:=GetActiveOLEObject('AutoCAD.Application') except Result:=''; Exit end;
  try AcadDoc:=AcadAppl.ActiveDocument except Result:=''; Exit end;
  try Result:=AcadDoc.Name except Result:='-'; Exit end;
end;

Вызывается по таймеру, если возвращает '-', о значит название чертежа не изменилось по сравнению с предыдущим запуском, а если пустую строку - значит нет открытого чертежа вообще.
Вообщем, меня устраивает... Только выглядит все это как-то не красиво sad

Re: Определение активного чертежа в ACAD.

> Asail
а с какой периодичностью "тикает" таймер ?
зы. просто интересно...

Re: Определение активного чертежа в ACAD.

> callisto
>а с какой периодичностью "тикает" таймер ?
Настраиваемый пользователем параметр.
По умолчанию: 3 сек