Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: prajdziswet от 05-06-2016, 06:22:29

Название: Interop в Autocad 2014
Отправлено: prajdziswet от 05-06-2016, 06:22:29
Хочу подключится к Autocad черех ком, но в 2014 ненахожу библиотеку Autodesk.AutoCAD.Interop.Common.dll(как впринципе и Autodesk.AutoCAD.Interop.dll).Думал в установочнике дело взял другой устроновочник,но тоже самое.
например
Код - C# [Выбрать]
  1. var Acad =new Autodesk.AutoCAD.Interop.AcadApplication();
  2. var t = Type.Missing;
  3. var Doc = Acad.Documents.Add(t);
  4. Acad.Visible = true;
  5. Double[] t1 = { 10.0, 10, 0 };
  6. Double[] t2 = { 100.0, 100, 0 };
  7. Doc.ModelSpace.AddLine(t1, t2);
  8. Doc.SaveAs(@"h:\Xt.dwg", t, t);
  9. Acad.Quit();
в автокад 2012 работало, как тут работать или какие библиотеки подключать?
п.с как можно вызвать лисп функцию автокада, допустим myfun (через ком)
Название: Re: Interop в Autocad 2014
Отправлено: Дима_ от 05-06-2016, 07:48:12
1. По моему с 2013 эти библиотеки не копируются в GAC, теперь они лежат в папке автокада.
2. Самый простой вариант - Documunt.SendStringToExecute...
Название: Re: Interop в Autocad 2014
Отправлено: prajdziswet от 05-06-2016, 08:22:17
1. Благодарю, вы полностью правы - они в папке автокада, а я их искал в GAC. (получилось запустить код)
2. Буду пробывать вроде в Doc есть метод SendCommand(или Documunt.SendStringToExecute...) - буду разбираться

Большое спасибо!
Название: Re: Interop в Autocad 2014
Отправлено: Александр Ривилис от 05-06-2016, 08:58:50
2. Буду пробывать вроде в Doc есть метод SendCommand(или Documunt.SendStringToExecute...) - буду разбираться
Это отдельное приложение (внешний exe-файл), или .NET-сборка, которая грузится в AutoCAD? Если внешнее приложение, то  Documunt.SendStringToExecute использовать нельзя - только COM.
Название: Re: Interop в Autocad 2014
Отправлено: prajdziswet от 05-06-2016, 09:44:27
это не внешнее приложение, а лисп-файл который стоит в автозагрузке и зарегестрированный в командной строке(например c:myfun -тоесть он дуступен из командной строки). И возможно Documunt.SendStringToExecute подойдет? (пояснение дальше...,если не подойдет подскажите как сделать из com)
Мое внешнее приложение должно запускать автокад (когда мне нужно из моего ехе) и давать команды на выполнение лиспа или несколько лиспов (а lisp-файл остальное сам сделает)
 :)

п.с насчет форматирование кода -учту. Спасибо
Название: Re: Interop в Autocad 2014
Отправлено: Андрей Бушман от 05-06-2016, 10:25:02
п.с насчет форматирование кода -учту. Спасибо
Было бы неплохо, если бы ты, перед тем как жать кнопку "Отправить", читал свой текст и исправлял кривую орфографию и пунктуацию. А то уж очень глаза режут...

Мое внешнее приложение должно запускать автокад (когда мне нужно из моего ехе) и давать команды на выполнение лиспа или несколько лиспов (а lisp-файл остальное сам сделает)
Если используешь AutoCAD 2013 или более новый, то можешь воспользоваться accoreconsole.exe, дабы не изобретать велосипед.
Название: Re: Interop в Autocad 2014
Отправлено: prajdziswet от 05-06-2016, 10:29:31
Cпасибо.
Наверное не пойдет: http://adn-cis.org/debug-and-run-lisp-at-console-autocad.html. У меня в коде много на lisp работы с ActiveX (получение объектов и другого,но это надо пробывать). До этого accoreconsole.exe не пользовался.

Все равно спасибо, буду пробывать.
Название: Re: Interop в Autocad 2014
Отправлено: Андрей Бушман от 05-06-2016, 11:01:26
У меня в коде много на lisp работы с ActiveX (получение объектов и другого,но это надо пробывать).
В консольной версии AutoCAD отсутствует COM API.
Название: Re: Interop в Autocad 2014
Отправлено: Дима_ от 05-06-2016, 13:21:52
то  Documunt.SendStringToExecute использовать нельзя - только COM.
Да перепутал - для COM это SendCommand и не забыть добавить в конец строки \n.
Название: Re: Interop в Autocad 2014
Отправлено: Александр Ривилис от 05-06-2016, 13:28:47
И возможно Documunt.SendStringToExecute подойдет? (пояснение дальше...,если не подойдет подскажите как сделать из com)
Не подойдёт именно потому, что:
Мое внешнее приложение должно запускать автокад (когда мне нужно из моего ехе) и давать команды на выполнение лиспа или несколько лиспов (а lisp-файл остальное сам сделает)
Из внешнего приложения ты не можешь использовать AutoCAD .NET API (Document - это из него), а можешь использовать только COM (Interop) - это AcadDocument и его метод SendCommand.
Есть еще вариант через VLAX (https://forums.autodesk.com/autodesk/attachments/autodesk/33/64103/1/VLAX.cls.txt), но я давно с ним не работал.
Название: Re: Interop в Autocad 2014
Отправлено: Дима_ от 05-06-2016, 14:45:25
Есть еще вариант посложнее подписаться из лиспа на "свободный" реактор и менять его программно через сом (я так достаточно успешно связывал .Net с лиспом - писал своего рода механизм обработки .Net событий на автолиспе).
Название: Re: Interop в Autocad 2014
Отправлено: Андрей Бушман от 05-06-2016, 15:14:25
Есть еще вариант посложнее
Есть ещё вариант: поместить в автозагрузку .net-расширение, хостящее WCF сервис и, запустив AutoCAD, из любого внешнего приложения можно будет взаимодействовать с этим сервисом (в т.ч. и из др. компьютера). В этом случае для работы в AutoCAD внешнему приложению будут доступны возможности не только те, которые реализованы в COM API и AutoLISP, то так же и те, которые имеются в AutoCAD .NET API.
Название: Re: Interop в Autocad 2014
Отправлено: prajdziswet от 06-06-2016, 07:02:48
Спасибо за советы. Сделал с помощью SendCommand
Код - C# [Выбрать]
  1. Doc.SendCommand("myfun\n");
- дошел до "\n" сам, но спасибо за советы (где myfun - лисп функция построение линии, для проверки приложения).

Но в приложении столкнулся с ошибкой
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs33.postimg.org%2Fhrkovaabv%2Fimage.jpg&hash=2802753ba50fcf7899e6dcc4bdf27656) (http://postimg.org/image/hrkovaabv/)
При установке системной переменной Startup в 2 (установка в автокаде), вываливается ошибка приложения(скорее всего что нет открытых чертежей и он с нуля не может его создать, хоть не логично)
при установке в 0, ошибка обычно при в втором запуске (скорее всего не до конца закрывает автокад, в памяти висит процесс). При удалении процесса автокада иногда отрабатывает, но в большинстве случаев ошибка.
В чем может быть дело?

п.с теоретически я могу вообще не связывается с Com и API, у меня реализовано автоматическая загрузка приложений через лисп (даже однократная). И можно просто задавать тестовым файлом через c#  и запуском (просто вызовом автокада). Но через ком - я больше контролирую, например - тоже отработку приложения ( SendCommand вызывается синхронно, то-есть отработало приложение пусть даже с ошибкой, оно закончилось - отработка следующей строки кода....)
Конечно можно поступить как предложил Андрей, но зачем придумывать что-то, если в принципе код (в данном случае несколько строчек, ну конечно добавится проверка при открытии файлов и т.д). Да и выдумывать что-то сверхъестественное для простой отработки лиспов в чертежах
Название: Re: Interop в Autocad 2014
Отправлено: Андрей Бушман от 06-06-2016, 08:45:41
скорее всего что нет открытых чертежей и он с нуля не может его создать, хоть не логично
Вообще, целесообразно всегда проверять текущий документ на равенство null, т.к. с некоторых пор это стало актуально.
Название: Re: Interop в Autocad 2014
Отправлено: Андрей Бушман от 06-06-2016, 09:08:22
SendCommand вызывается синхронно

Зависит от контекста:
Цитата: Autodesk Knowledge Network
SendCommand Method (ActiveX)
...
This method is generally synchronous. However, if the command sent with this method requires any user interaction (such as picking a point on the screen) then this method will continue as soon as the user input begins. The command will then continue to be processed asynchronously.

When this method is called from an event handler it is processed asynchronously.

У меня в коде много на lisp работы с ActiveX

Кроме того, есть нюанс по поводу использования через SendCommand методов ActiveX (даже косвенно):
Цитата: Autodesk Knowledge Network
SendCommand Method (ActiveX)
...
You should never use this method to issue a command for which there is an ActiveX method available.

Источник (https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2015/ENU/AutoCAD-ActiveX/files/GUID-E13A580D-04CA-46C1-B807-95BB461A0A57-htm.html).
Название: Re: Interop в Autocad 2014
Отправлено: Андрей Бушман от 06-06-2016, 09:11:08
У меня в коде много на lisp работы с ActiveX (получение объектов и другого,но это надо пробывать). До этого accoreconsole.exe не пользовался.
Попробовал?
Название: Re: Interop в Autocad 2014
Отправлено: prajdziswet от 06-06-2016, 11:05:13
1) К сожалению не пробовал (сам тоже читал, что не поддерживает, хоть загрузку команды vl-load-com поддерживает (я про accoreconsole.exe)).

Все больше прихожу к мысли, что проще реализовать через свой загрузочник-lisp (он у меня работает со всеми типами lsp,vlx,arx,dll можно сказать что-то "аля" accoreconsole.exe с помещением в автозагрузку или на один раз, с выгрузкой и удалением файлов если надо) => то есть поместить строку выполнения лиспа в текстовый файл не проблема.
+ не зависит от версии автокад
- теряю контроль, в плане загрузка, выполнение, закрытие осуществляется самим автокадом. и программа получается тупо ждет ответа.

2) Полностью согласен с проверкой на null (ту же не совершенный код, да и работаю с com autocad первый раз). Да и Acad.Documents.Add(t) теоретически автокад сам должен был бы, если в Acad.Documents. метода New не вижу. Вопрос сам как бы напрашивается : если добавляете как его добавить, если пустой или другой чертеж не открыт? (открылся сам автокад).

п.с Да и библиотека честно говоря отвратительная - в плане если взять работу с вордом через ком, там при введении метода - подсказки. Тут чисто из-за названия ориентироваться, я понимаю если я её писал. Ато вы же для людей пишете(разработчики автокад), то добавить подсказки на c# или  c++ это не так сложно
п.с2 Андрею лучше не читать, ато снова к грамматическим ошибкам придерется )). - прошу прощения
Название: Re: Interop в Autocad 2014
Отправлено: Александр Ривилис от 06-06-2016, 11:33:33
Но в приложении столкнулся с ошибкой
По поводу этой ошибки смотри:
http://adn-cis.org/kak-ispolzuya-visual-c-zapustit-autocad-i-zastavit-ego-vyipolnyat-nekotoryie-dejstviya.html
http://through-the-interface.typepad.com/through_the_interface/2010/02/handling-com-calls-rejected-by-autocad-from-an-external-net-application.html
https://msdn.microsoft.com/en-us/library/ms228772.aspx
Название: Re: Interop в Autocad 2014
Отправлено: Андрей Бушман от 06-06-2016, 11:41:51
1) К сожалению не пробовал (сам тоже читал, что не поддерживает, хоть загрузку команды vl-load-com поддерживает (я про accoreconsole.exe)).
Что мешает попробовать? Запустить accoreconsole.exe и указать ему в качестве параметра твой лисп файл - это занимает несколько секунд времени.
Все больше прихожу к мысли, что проще реализовать через свой загрузочник-lisp (он у меня работает со всеми типами lsp,vlx,arx,dll можно сказать что-то "аля" accoreconsole.exe с помещением в автозагрузку или на один раз, с выгрузкой и удалением файлов если надо) => то есть поместить строку выполнения лиспа в текстовый файл не проблема.
На мой взгляд, имеет смысл изобретать велосипед, если вариант с accoreconsole.exe у тебя точно не будет работать. Но, как я уже выше писал, нет смысла гадать "годится/не годится" не попробовав то, что было предложено.

Не стоит так же сбрасывать со счетов тот факт, что accoreconsole.exe, в отличие от acad.exe, запускается и завершает работу (после выполнения твоего лиспа) почти мгновенно. Т.е. не приходится ждать 15-45 секунд пока оно "прокашляется" и будет готово к работе (как это обычно имеет место с acad.exe).
п.с2 Андрею лучше не читать, ато снова к грамматическим ошибкам придерется )). - прошу прощения
Это надо было писать в начале сообщения, а не в конце. :)
Название: Re: Interop в Autocad 2014
Отправлено: prajdziswet от 06-06-2016, 12:33:07
Вечером(после работы) если не буду занят проверю. Просто на мой основной лисп подвешен еще диалог и это все скомпилировано одним файлом vlx -  и мне надо убрать диалог, чтобы он без него сразу запускался(для проверки accoreconsole.exe ).
п.с как проверю отпишусь
Название: Re: Interop в Autocad 2014
Отправлено: prajdziswet от 06-06-2016, 16:29:41
Проверил, в принципе что и требовалось доказать:
1) скрин - простым подсовыванием не получилось, сразу дать accoreconsole.exe свой лисп  (это неважно смотрите второй скрин)
2) скрин - как видно vla-object возвращает nil

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs33.postimg.org%2Fe41cjy363%2Fconsole0.jpg&hash=29e38d48abe5c0425ed17d9a38062aae) (http://postimg.org/image/e41cjy363/)

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs33.postimg.org%2F5dcp8nde3%2Fconsole.jpg&hash=0876b35589988c5ccd35d2a996acb254) (http://postimg.org/image/5dcp8nde3/)

п.с спасибо Александру Ривилису за ссылки на ошибки
Название: Re: Interop в Autocad 2014
Отправлено: Алексей Кулик от 21-06-2016, 23:12:13
Прошу прощения, был лишен сети...
Старое, но, похоже, не потерявшее актуальности: http://autolisp.ru/2014/03/04/accoreconsole-lisp-debug/
Название: Re: Interop в Autocad 2014
Отправлено: prajdziswet от 23-06-2016, 07:01:26
Большое спасибо и вправду не потерявшее актуальности ссылка.
Думал редактор vlide в консоли не работает....

Большое спасибо. :)