Interop в Autocad 2014

Автор Тема: Interop в Autocad 2014  (Прочитано 7267 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн prajdziswetАвтор темы

  • ADN OPEN
  • Сообщений: 32
  • Карма: 0
Interop в Autocad 2014
« : 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 (через ком)
« Последнее редактирование: 05-06-2016, 08:59:40 от Александр Ривилис »

Отмечено как Решение prajdziswet 05-06-2016, 08:13:07

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 467
  • Карма: 62
Re: Interop в Autocad 2014
« Ответ #1 : 05-06-2016, 07:48:12 »
1. По моему с 2013 эти библиотеки не копируются в GAC, теперь они лежат в папке автокада.
2. Самый простой вариант - Documunt.SendStringToExecute...

Оффлайн prajdziswetАвтор темы

  • ADN OPEN
  • Сообщений: 32
  • Карма: 0
Re: Interop в Autocad 2014
« Ответ #2 : 05-06-2016, 08:22:17 »
1. Благодарю, вы полностью правы - они в папке автокада, а я их искал в GAC. (получилось запустить код)
2. Буду пробывать вроде в Doc есть метод SendCommand(или Documunt.SendStringToExecute...) - буду разбираться

Большое спасибо!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 10033
  • Карма: 1281
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Interop в Autocad 2014
« Ответ #3 : 05-06-2016, 08:58:50 »
2. Буду пробывать вроде в Doc есть метод SendCommand(или Documunt.SendStringToExecute...) - буду разбираться
Это отдельное приложение (внешний exe-файл), или .NET-сборка, которая грузится в AutoCAD? Если внешнее приложение, то  Documunt.SendStringToExecute использовать нельзя - только COM.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн prajdziswetАвтор темы

  • ADN OPEN
  • Сообщений: 32
  • Карма: 0
Re: Interop в Autocad 2014
« Ответ #4 : 05-06-2016, 09:44:27 »
это не внешнее приложение, а лисп-файл который стоит в автозагрузке и зарегестрированный в командной строке(например c:myfun -тоесть он дуступен из командной строки). И возможно Documunt.SendStringToExecute подойдет? (пояснение дальше...,если не подойдет подскажите как сделать из com)
Мое внешнее приложение должно запускать автокад (когда мне нужно из моего ехе) и давать команды на выполнение лиспа или несколько лиспов (а lisp-файл остальное сам сделает)
 :)

п.с насчет форматирование кода -учту. Спасибо

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 162
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Interop в Autocad 2014
« Ответ #5 : 05-06-2016, 10:25:02 »
п.с насчет форматирование кода -учту. Спасибо
Было бы неплохо, если бы ты, перед тем как жать кнопку "Отправить", читал свой текст и исправлял кривую орфографию и пунктуацию. А то уж очень глаза режут...

Мое внешнее приложение должно запускать автокад (когда мне нужно из моего ехе) и давать команды на выполнение лиспа или несколько лиспов (а lisp-файл остальное сам сделает)
Если используешь AutoCAD 2013 или более новый, то можешь воспользоваться accoreconsole.exe, дабы не изобретать велосипед.

Оффлайн prajdziswetАвтор темы

  • ADN OPEN
  • Сообщений: 32
  • Карма: 0
Re: Interop в Autocad 2014
« Ответ #6 : 05-06-2016, 10:29:31 »
Cпасибо.
Наверное не пойдет: http://adn-cis.org/debug-and-run-lisp-at-console-autocad.html. У меня в коде много на lisp работы с ActiveX (получение объектов и другого,но это надо пробывать). До этого accoreconsole.exe не пользовался.

Все равно спасибо, буду пробывать.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 162
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Interop в Autocad 2014
« Ответ #7 : 05-06-2016, 11:01:26 »
У меня в коде много на lisp работы с ActiveX (получение объектов и другого,но это надо пробывать).
В консольной версии AutoCAD отсутствует COM API.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 467
  • Карма: 62
Re: Interop в Autocad 2014
« Ответ #8 : 05-06-2016, 13:21:52 »
то  Documunt.SendStringToExecute использовать нельзя - только COM.
Да перепутал - для COM это SendCommand и не забыть добавить в конец строки \n.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 10033
  • Карма: 1281
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Interop в Autocad 2014
« Ответ #9 : 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), но я давно с ним не работал.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 467
  • Карма: 62
Re: Interop в Autocad 2014
« Ответ #10 : 05-06-2016, 14:45:25 »
Есть еще вариант посложнее подписаться из лиспа на "свободный" реактор и менять его программно через сом (я так достаточно успешно связывал .Net с лиспом - писал своего рода механизм обработки .Net событий на автолиспе).

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 162
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Interop в Autocad 2014
« Ответ #11 : 05-06-2016, 15:14:25 »
Есть еще вариант посложнее
Есть ещё вариант: поместить в автозагрузку .net-расширение, хостящее WCF сервис и, запустив AutoCAD, из любого внешнего приложения можно будет взаимодействовать с этим сервисом (в т.ч. и из др. компьютера). В этом случае для работы в AutoCAD внешнему приложению будут доступны возможности не только те, которые реализованы в COM API и AutoLISP, то так же и те, которые имеются в AutoCAD .NET API.

Оффлайн prajdziswetАвтор темы

  • ADN OPEN
  • Сообщений: 32
  • Карма: 0
Re: Interop в Autocad 2014
« Ответ #12 : 06-06-2016, 07:02:48 »
Спасибо за советы. Сделал с помощью SendCommand
Код - C# [Выбрать]
  1. Doc.SendCommand("myfun\n");
- дошел до "\n" сам, но спасибо за советы (где myfun - лисп функция построение линии, для проверки приложения).

Но в приложении столкнулся с ошибкой

При установке системной переменной Startup в 2 (установка в автокаде), вываливается ошибка приложения(скорее всего что нет открытых чертежей и он с нуля не может его создать, хоть не логично)
при установке в 0, ошибка обычно при в втором запуске (скорее всего не до конца закрывает автокад, в памяти висит процесс). При удалении процесса автокада иногда отрабатывает, но в большинстве случаев ошибка.
В чем может быть дело?

п.с теоретически я могу вообще не связывается с Com и API, у меня реализовано автоматическая загрузка приложений через лисп (даже однократная). И можно просто задавать тестовым файлом через c#  и запуском (просто вызовом автокада). Но через ком - я больше контролирую, например - тоже отработку приложения ( SendCommand вызывается синхронно, то-есть отработало приложение пусть даже с ошибкой, оно закончилось - отработка следующей строки кода....)
Конечно можно поступить как предложил Андрей, но зачем придумывать что-то, если в принципе код (в данном случае несколько строчек, ну конечно добавится проверка при открытии файлов и т.д). Да и выдумывать что-то сверхъестественное для простой отработки лиспов в чертежах

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 162
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Interop в Autocad 2014
« Ответ #13 : 06-06-2016, 08:45:41 »
скорее всего что нет открытых чертежей и он с нуля не может его создать, хоть не логично
Вообще, целесообразно всегда проверять текущий документ на равенство null, т.к. с некоторых пор это стало актуально.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 162
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Interop в Autocad 2014
« Ответ #14 : 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.

Источник.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 162
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Interop в Autocad 2014
« Ответ #15 : 06-06-2016, 09:11:08 »
У меня в коде много на lisp работы с ActiveX (получение объектов и другого,но это надо пробывать). До этого accoreconsole.exe не пользовался.
Попробовал?

Оффлайн prajdziswetАвтор темы

  • ADN OPEN
  • Сообщений: 32
  • Карма: 0
Re: Interop в Autocad 2014
« Ответ #16 : 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 Андрею лучше не читать, ато снова к грамматическим ошибкам придерется )). - прошу прощения

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 10033
  • Карма: 1281
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 162
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Interop в Autocad 2014
« Ответ #18 : 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 Андрею лучше не читать, ато снова к грамматическим ошибкам придерется )). - прошу прощения
Это надо было писать в начале сообщения, а не в конце. :)

Оффлайн prajdziswetАвтор темы

  • ADN OPEN
  • Сообщений: 32
  • Карма: 0
Re: Interop в Autocad 2014
« Ответ #19 : 06-06-2016, 12:33:07 »
Вечером(после работы) если не буду занят проверю. Просто на мой основной лисп подвешен еще диалог и это все скомпилировано одним файлом vlx -  и мне надо убрать диалог, чтобы он без него сразу запускался(для проверки accoreconsole.exe ).
п.с как проверю отпишусь

Оффлайн prajdziswetАвтор темы

  • ADN OPEN
  • Сообщений: 32
  • Карма: 0
Re: Interop в Autocad 2014
« Ответ #20 : 06-06-2016, 16:29:41 »
Проверил, в принципе что и требовалось доказать:
1) скрин - простым подсовыванием не получилось, сразу дать accoreconsole.exe свой лисп  (это неважно смотрите второй скрин)
2) скрин - как видно vla-object возвращает nil





п.с спасибо Александру Ривилису за ссылки на ошибки
« Последнее редактирование: 07-06-2016, 12:21:52 от prajdziswet »

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 818
  • Карма: 134
Re: Interop в Autocad 2014
« Ответ #21 : 21-06-2016, 23:12:13 »
Прошу прощения, был лишен сети...
Старое, но, похоже, не потерявшее актуальности: http://autolisp.ru/2014/03/04/accoreconsole-lisp-debug/
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн prajdziswetАвтор темы

  • ADN OPEN
  • Сообщений: 32
  • Карма: 0
Re: Interop в Autocad 2014
« Ответ #22 : 23-06-2016, 07:01:26 »
Большое спасибо и вправду не потерявшее актуальности ссылка.
Думал редактор vlide в консоли не работает....

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