Interop в Autocad 2014

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

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

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

  • ADN OPEN
  • Сообщений: 13
  • Карма: 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
  • ****
  • Сообщений: 447
  • Карма: 55
Re: Interop в Autocad 2014
« Ответ #1 : 05-06-2016, 07:48:12 »
1. По моему с 2013 эти библиотеки не копируются в GAC, теперь они лежат в папке автокада.
2. Самый простой вариант - Documunt.SendStringToExecute...

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

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

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

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

  • Administrator
  • *****
  • Сообщений: 6250
  • Карма: 664
  • Рыцарь 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
  • Сообщений: 13
  • Карма: 0
Re: Interop в Autocad 2014
« Ответ #4 : 05-06-2016, 09:44:27 »
это не внешнее приложение, а лисп-файл который стоит в автозагрузке и зарегестрированный в командной строке(например c:myfun -тоесть он дуступен из командной строки). И возможно Documunt.SendStringToExecute подойдет? (пояснение дальше...,если не подойдет подскажите как сделать из com)
Мое внешнее приложение должно запускать автокад (когда мне нужно из моего ехе) и давать команды на выполнение лиспа или несколько лиспов (а lisp-файл остальное сам сделает)
 :)

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

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

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

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

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

  • ADN OPEN
  • Сообщений: 13
  • Карма: 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
  • *****
  • Сообщений: 1990
  • Карма: 157
  • Программист. Администратор CAD.
    • Блог
  • Skype: Compositum78
Re: Interop в Autocad 2014
« Ответ #7 : 05-06-2016, 11:01:26 »
У меня в коде много на lisp работы с ActiveX (получение объектов и другого,но это надо пробывать).
В консольной версии AutoCAD отсутствует COM API.

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

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

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

  • Administrator
  • *****
  • Сообщений: 6250
  • Карма: 664
  • Рыцарь 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
  • ****
  • Сообщений: 447
  • Карма: 55
Re: Interop в Autocad 2014
« Ответ #10 : 05-06-2016, 14:45:25 »
Есть еще вариант посложнее подписаться из лиспа на "свободный" реактор и менять его программно через сом (я так достаточно успешно связывал .Net с лиспом - писал своего рода механизм обработки .Net событий на автолиспе).

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

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

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

  • ADN Club
  • *****
  • Сообщений: 1990
  • Карма: 157
  • Программист. Администратор CAD.
    • Блог
  • 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.

Источник.