Тема: Как реализовать вызов функции AutoCAD из внешнего приложения ?

Я только начал разбираться с OARX, но кое-что мне сразу непонятно, разъясните пожалуйста!
Есть отдельное, независимое приложение X и ARX, загруженный в процесс автокада, назовем его Y. Если в автокаде произойдет любое событие (команда, меню, эвент и т.д.), то его можно перехватить путем вызова самим автокадом заранее определенной функцией-обработчика в Y. Здесь все ясно.
Но мне нужно  из приложения X заставить автокад вызвать функцию в приложении Y. Вот тут-то я и не догоняю, как мне заставить автокад выполнять код в в ARX, если у него нет такого желания? Ну, к примеру, послать ему Windows Message, COM-вызов или еще как? (Например, в автокаде открыт документ, автокад свернут и спит себе, а я хочу чтобы он отдал мне имя активного документа, не разворачиваясь, и, вообще, не подавая признаков своего присутствия). Что-то вроде зарегистрировать пользовательскую функцию с аргументами? Так опять же, непонятно, как он её выполнит...
Посоветуйте что-нибудь.

Re: Как реализовать вызов функции AutoCAD из внешнего приложения ?

> Геннадий
Попробуй ActiveX модель AutoCAD. Для того, чтобы обратиться непосредственно из X к Y, Y должно быть не просто arx-приложением, но COM-сервером. Для того, чтобы AutoCAD отдал имя активного документа вообще Y не нужно. Достаточно обратиться к его ActiveX модели.

Re: Как реализовать вызов функции AutoCAD из внешнего приложения ?

Да мне кроме имени активного документа много чего еще надо будет, к тому же требования к быстродействию, поэтому нужен in-proc. ActiveX медленен будет.
Вопрос не в том даже, как вызвать методы, имеющиеся в arx из приложения X, а в том, как сделать так, чтобы автокад вызвал метод, например, acrxEntryPoint, когда мне это нужно.
К тому же, сомневаюсь, что когда я сделаю из Win32 arx-a COM-сервер, автокад его сожрет как arx, к тому же мне кажется, что зарегистрировать COM-сервер с расширением arx винда тоже не будет довольна, хотя и можно её заставить это сделать. Но это не решит проблему.
Я готов использовать COM или ActiveX автокада, но только для того, чтобы заставить его вызвать нужную мне функцию, или какую-либо определенную, т.е. передать управление в arx, а там уж я разберусь...

Re: Как реализовать вызов функции AutoCAD из внешнего приложения ?

ActiveX медленен будет.
Будет медленно, если много раз обращаться к функции, которая быстро выполняется. Тогда действительно время запуска будет соизмеримо или даже больше, чем время работы самой функции.
Вопрос не в том даже, как вызвать методы, имеющиеся в arx из приложения X, а в том, как сделать так, чтобы автокад вызвал метод, например, acrxEntryPoint, когда мне это нужно.
Эту функцию AutoCAD вызовет только при загрузке/выгрузке arx-приложения, открытии/закрытии чертежа и т.п. Думаю, это не то, что тебе нужно. Для твоей задачи скорее подходит определение команды, которая будет вызвана, если ты пошлешь через AcadApplication.SendCommand(...). Тогда будет вызвана соответствующая этой команде функция из твоего arx-файла. Правда с возвратом значений может возникнуть проблема.
К тому же, сомневаюсь, что когда я сделаю из Win32 arx-a COM-сервер, автокад его сожрет как arx, к тому же мне кажется, что зарегистрировать COM-сервер с расширением arx винда тоже не будет довольна, хотя и можно её заставить это сделать. Но это не решит проблему.
Это без проблем будет работать. Запусти ObjectARX Wizard и при создании проекта можешь указать ему, что это arx-приложение будет COM-сервером.

Re: Как реализовать вызов функции AutoCAD из внешнего приложения ?

Можно вынести COM в отдельную DLL. Тогда к ней, через COM можно обращаться из любых приложений. А можно и не через COM, смотря что за приложение.
ARX - только для связки с AutoCAD. Реализация - в той же DLL, и тоже не обязательно через COM.
Про медленность ActiveX - больше суеверий. Конечно, медленнее, но насколько? Накладные затраты есть на первоначальную загрузку, но Windows выгружает сервера, к которым больше нет обращений только через 10 минут. Если работа с ними идет достаточно интенсивно, то и тормозов нет.

Re: Как реализовать вызов функции AutoCAD из внешнего приложения ?

Про медленность ActiveX — больше суеверий. Конечно, медленнее, но насколько? Накладные затраты есть на первоначальную загрузку, но Windows выгружает сервера, к которым больше нет обращений только через 10 минут. Если работа с ними идет достаточно интенсивно, то и тормозов нет.
ActiveX - обход чертежа (все элементы чертежа и их свойства) единицы минут, in-process arx - единицы, ну десятки секунд. Никаких споров и суеверий, это проверенный факт. in-process взаимодействие всегда намного быстрее out-of-process.

Re: Как реализовать вызов функции AutoCAD из внешнего приложения ?

2 Александр Ривилис
Это без проблем будет работать. Запусти ObjectARX Wizard и при создании проекта можешь указать ему, что это arx-приложение будет COM-сервером.
Спасибо, нашел Wizard, сделал COM-сервер, все катит!
Для твоей задачи скорее подходит определение команды, которая будет вызвана, если ты пошлешь через AcadApplication.SendCommand(...). Тогда будет вызвана соответствующая этой команде функция из твоего arx-файла. Правда с возвратом значений может возникнуть проблема.
Как раз AcadApplication.SendCommand(...) - кривовато, как из-за того, что при достаточно приличном количестве вызовов будет дамп команд в окне, так и с возвращением значений. Я не стал использовать свои функции в acrxEntryPoint, а написал реализацию непосредственно в реализации интерфейсных функций. Работает на ура.
Конечно для пущей уверенности по быстродействию, протестирую объемные вычисления как в acrxEntryPoint, так и в интерфейсных функциях. Хотя и тот и другой вариант реализует in-proc технологию, должно быть одинаково. Скоро отпишусь.

Re: Как реализовать вызов функции AutoCAD из внешнего приложения ?

> Геннадий
Есть один нюанс, о котором я не упомянул ранее. Возможно ты это уже и сам обнаружил. Необходимо в своей функции (которая в arx-файле) выполнять блокировку чертежа, с которым будешь работать:

AcAxDocLock lockDb(pDb); // Для текущего чертежа: AcAxDocLock lockDb(acdbCurDwg());

Да и проверять статус блокировки (lockDb.lockStatus()) тоже не повредит. Иначе есть шанс развалить AutoCAD.

Re: Как реализовать вызов функции AutoCAD из внешнего приложения ?

Да, я обратил внимание на данную команду, но пока не придал ей особого значения. Странно, это действительно приводит к падению AutoCAD-а? SolidWorks, например, прекрасно работает параллельно с пользователем, другое дело, насколько это ему (пользователю) удобно, но падений не происходит.
Спасибо, я это учту.

Re: Как реализовать вызов функции AutoCAD из внешнего приложения ?

> Геннадий
Странно, это действительно приводит к падению AutoCAD-а?
Да. В лучшем случае при попытке обращения к примитиву в чертеже ты получишь eLockViolation. Если ты запускаешь команду (зарегистрированную, как выполняющуюся в контексте документа) из самого AutoCAD, то блокировка/разблокировка выполняется автоматически. Во всех других случаях необходимо выполнить блокировку.