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

ADN Club => AutoCAD .NET API => Тема начата: antonksp от 20-10-2019, 14:52:44

Название: Доступ к AutoCad из внешнего Windows-приложения
Отправлено: antonksp от 20-10-2019, 14:52:44
Здравствуйте Александр!

В продолжении одноименной темы на форуме CadUser.ru  хотел бы конкретизировать решаемую мной задачу.

В качестве предисловия:

Я имею (на любительском уровне) опыт программирования на AutoLisp для AutoCad.  Периодически пишу небольшие приложения для автоматизации своих задач на работе.  Так же имею ( на том же уровне ) опыт программирования на C#.  Этот язык я осваивал во время учебы в аспирантуре для выполнения различных вычислений.  С тех пор у меня осталось много полезных библиотек для вычислений: матричная, решение систем уравнений по МНК, триангуляция Делоне и т.д.  Хотелось бы использовать  эти библиотеки  для программирования в AutoCad. В интернете нашел информацию как писать плагины на C# и подгружать их с помощью функции Netload. Но мне бы хотелось иметь доступ к объектам AutoCad  из  внешних приложений типа WindowsFormApplication, чтобы использовать все элементы управления ( кнопки, списки и т.д. ), которые я мог бы использовать, если бы просто писал программу на C# в VisualStudio

Задача:


Для начала, в качестве тестовой поставил себе следующую задачу: Из внешнего приложения WindowsFormApplication открыть AutoCad и нарисовать, скажем, круг с центром 0,0 и радиусом 1. Вы мне посоветовали использовать технологию ActiveX.  Если  я правильно понимаю, базовым классом там является Application, и если получить на него ссылку, можно добраться до текущего документа, далее до пространства Модели и наконец, до любого примитива.

Поэтому основной вопрос: как получить ссылку на объект Application ?

Для этого, как я понимаю, надо сделать 2 действия:
1.   Подгрузить ссылку на нужную библиотеку
2.   В файле главной формы ( напр. Form1.cs ) сделать ссылку на нужное пространство имен при помощи using…….., в котором находится этот класс Application

Если я все правильно изложил, мой вопрос можно конкретизировать: на какую библиотеку сделать ссылку и где она находится ?  Как называется пространство имен с классом Applicaton?

Заранее Спасибо!
Название: Re: Доступ к AutoCad из внешнего Windows-приложения
Отправлено: Александр Пекшев aka Modis от 20-10-2019, 14:58:44
Так много слов в посте, но ответа на главный вопрос не вижу - а зачем подключаться к автокаду из внешнего приложения? В чем необходимость такого усложнения?
Название: Re: Доступ к AutoCad из внешнего Windows-приложения
Отправлено: Дмитрий Загорулькин от 20-10-2019, 15:46:36
Вы мне посоветовали использовать технологию ActiveX.
Да, это, по сути, практически единственный способ напрямую взаимодействовать с AutoCAD из внешнего приложения.
Если  я правильно понимаю, базовым классом там является Application, и если получить на него ссылку, можно добраться до текущего документа, далее до пространства Модели и наконец, до любого примитива.
Это в .NET. В ActiveX (он же COM) эквивалентный объект - AcadApplication (http://help.autodesk.com/view/OARX/2018/ENU/?guid=GUID-0225808C-8C91-407B-990C-15AB966FFFA8#GUID-0225808C-8C91-407B-990C-15AB966FFFA8). Сложность в том, что по COM нет справки для C# или VB.NET, только для VBA. И если планируете через COM взаимодействовать с AutoCAD, то изучайте AutoCAD VBA Reference (http://help.autodesk.com/view/OARX/2018/ENU/?guid=GUID-5D302758-ED3F-4062-A254-FB57BAB01C44).
Но Вы действительно пытаетесь залезть в очень сложную и недружелюбную среду. Гораздо проще всё то же самое делать "изнутри" AutoCAD. Можно внутри AutoCAD вызвать ту же самую форму Windows Forms или WPF и взаимодействовать с AutoCAD при помощи более дружелюбного .NET API.
Название: Re: Доступ к AutoCad из внешнего Windows-приложения
Отправлено: Александр Ривилис от 20-10-2019, 17:59:20

antonksp,
Приветствую у нас на форуме!
AutoCad. В интернете нашел информацию как писать плагины на C# и подгружать их с помощью функции Netload. Но мне бы хотелось иметь доступ к объектам AutoCad  из  внешних приложений типа WindowsFormApplication, чтобы использовать все элементы управления ( кнопки, списки и т.д. ), которые я мог бы использовать, если бы просто писал программу на C# в VisualStudio
Их все можно использовать и в плагинах, загружаемых внутрь AutoCAD. Кроме того, возможности работы с AutoCAD значительно расширятся по сравнению с управлением AutoCAD через COM/ActiveX из внешнего приложения и Вы избавитесь от массы проблем, связанных с COM/ActiveX. Фактически единственный случай, когда необходимо использовать COM/ActiveX в работе с AutoCAD - это если у Вас уже есть готовое достаточно серьезное внешнее приложение, к которому следует подключить AutoCAD. Хотя и здесь есть альтернативные варианты.
Название: Re: Доступ к AutoCad из внешнего Windows-приложения
Отправлено: Александр Ривилис от 20-10-2019, 18:06:28
Если я все правильно изложил, мой вопрос можно конкретизировать: на какую библиотеку сделать ссылку и где она находится ?  Как называется пространство имен с классом Applicaton?
Если всё-таки остановитесь на COM/ActiveX, то нужно подключить Autodesk.AutoCAD.Interop.dll и Autodesk.AutoCAD.Interop.Common.dll
Только класс, как уже было сказано выше, в COM/ActiveX не Application, а AcadApplication (полное имя Autodesk.AutoCAD.Interop.AcadApplication)
Немного устаревший пример: https://through-the-interface.typepad.com/through_the_interface/2007/12/launching-autoc.html
Название: Re: Доступ к AutoCad из внешнего Windows-приложения
Отправлено: antonksp от 20-10-2019, 22:38:51
Спасибо за ответы!

Конечно, если из плагинов можно открывать WindowsForm и все элементы управления со всеми свойствами и
возможностью обрабатывать все стандартные события, то необходимость получать доступ к AutoCad через COM
из внешнего приложения отпадает.

Теперь возникает вопрос как это сделать. Порылся в интернете.
На этом форуме нашел ответ: при помощи статического метода
Код - C# [Выбрать]
  1. Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog (Form)

В качестве аргумента передается класс Form. Я так понимаю, что это класс из библиотеки dll, подгружаемой в AutoCad
командой netload.

Вопрос:

Как добавить класс формы в dll?  Из своего опыта ( не очень большого ), в VisualStudio при создании проекта на выбор, среди прочих, предлагаются следующие варианты:

- библиотека классов, в результате создается файл .dll

- приложение WindowsFormApplication. В этом варианте создается файл .exe и для каждой формы файлы типа Form.cs,
  каждый из которых содержит класс соответствующей формы. Но как все эти классы сохранить в одном .dll файле, я не знаю.

подскажите пожалуйста, как это сделать или дайте какую-нибудь полезную ссылку.

Заранее Спасибо!
 
Название: Re: Доступ к AutoCad из внешнего Windows-приложения
Отправлено: Александр Ривилис от 20-10-2019, 22:45:20
Как добавить класс формы в dll?
После того, как уже создан проект (или при помощи AutoCAD .NET Wizard или Class Library) в меню Project->Add Windows Form

(https://live.staticflickr.com/65535/48931521531_02c9110f93_o.png)


Название: Re: Доступ к AutoCad из внешнего Windows-приложения
Отправлено: Дмитрий Загорулькин от 20-10-2019, 22:45:46
У меня в подписи третья сверху ссылка на плейлист на моём ютуб-канале. В этом плейлисте есть подробное видео по созданию диалогов. Посмотрите - там есть ответы на многие вопросы.
Название: Re: Доступ к AutoCad из внешнего Windows-приложения
Отправлено: Александр Ривилис от 20-10-2019, 22:50:36
Теперь возникает вопрос как это сделать.
А вот для этого уже нужно создавать новую тему на форуме, так как действует правило "один вопрос - одна тема".
Название: Re: Доступ к AutoCad из внешнего Windows-приложения
Отправлено: antonksp от 21-10-2019, 08:55:20
Спасибо большое за ответы!

Направление понятно.  Буду разбираться