Autocad и плагин с использованием Winforms.

Автор Тема: Autocad и плагин с использованием Winforms.  (Прочитано 19156 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Здравствуйте.
Как написать плагин,подгружаемый через dll и работающим при помощи ввода команд (данных) я разобрался благодаря Вам.
Теперь возник вопрос,а как сделать плагин с заранее нарисованным и продуманным интерфейсом? То есть идея такая,что в Автокаде должно появиться окно,в котором производятся определенные действия.
Сам я пользуюсь Visual Studio Express 2012.
Подскажите пожалуйста,в каком направлении мне двигаться.

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Как и обычную ВинГуй программу - подключаешь windows.forms и по нужной команде (или событию) вызываешь окно модально или не модально (но тогда лучше с TopMost=true).

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Пока делал пример убедился, что WPF лучше) ИМХО

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Окно, а точнее UserForm можно зпихнуть в палитру, а начиная с 2015, его можно запихнуть в закладку
и WPF лучшее  ::)

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Окно, а точнее UserForm можно зпихнуть в палитру,
На палитрах AutoCAD можно размещать как элементы управления WinForm, так и элементы управления WPF.
Цитата: Denis
Подскажите пожалуйста,в каком направлении мне двигаться.
Два нюанса:
1. Открывать в AutoCAD окна Form (WinForms) следует при помощи статических методов:
Код - C# [Выбрать]
  1. Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog (Form)
  2. Autodesk.AutoCAD.ApplicationServices.Application.ShowModelessDialog (Form)
2. Открывать в AutoCAD окна Window (WPF) следует при помощи статических методов:
Код - C# [Выбрать]
  1. Autodesk.AutoCAD.ApplicationServices.Application.ShowModalWindow (Window)  
  2. Autodesk.AutoCAD.ApplicationServices.Application.ShowModelessWindow (Window)
Дополнительно в IDE смотри перегруженные версии всех указанных выше методов (в документации обозначены не все).

А в остальном всё делается практически так же, как и в любом WPF\WinForm приложении. Здесь обозначена литература по теме: п. 8-11.

Онлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 533
  • Карма: 117
WPF лучше) ИМХО

WPF лучшее  ::)

Пару оговорок:
WPF чуть менее универсальна по применению, т.к. появилась с NET 3.0.
WPF приложения кушают больше памяти.(вычитал в каком-то форуме)

И еще вопрос, кто пробовал применить WPF в палитре PaletteSet?
В 2009 когда-то пробовал добавить через Add(), но кроме Windows.Forms.Control он ничего не принимал.
С какой версии автокада добавили поддержку WPF в PaletteSet?


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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
WPF приложения кушают больше памяти.(вычитал в каком-то форуме)
На заборах тоже пишут... WPF выполняет прорисовку графики при помощи видеокарты, посредством DirectX. WinForms рисует за счёт ЦП. Т.о. прорисовка графики WPF выполняется шустрее, причём чем больше рисовать, тем разница заметней. Насчёт объёмов памяти - я не замерял, ибо не критично (не ест он столько памяти, чтобы компьютер на лопатки ложился, а ловить блох не вижу смысла).

И еще вопрос, кто пробовал применить WPF в палитре PaletteSet?
В 2009 когда-то пробовал добавить через Add(), но кроме Windows.Forms.Control он ничего не принимал.
С какой версии автокада добавили поддержку WPF в PaletteSet?
Плохо пробовал. Я в 2009-м акаде на палитрах размещаю преимущественно WPF контент. Контрол WPF следует размещать на палитре опосредованно, через контрол ElementHost, специально для этих целей существующий. Здесь можешь глянуть мой пример кода.

Онлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 533
  • Карма: 117
На заборах тоже пишут... WPF выполняет прорисовку графики при помощи видеокарты, посредством DirectX. WinForms рисует за счёт ЦП.
При помощи чего и так понятно. И что есть ускорение прорисовки тоже понятно.
На форуме обсуждалось WinForms&WPF и представитель фирмы по разработке ПО написал, что тестили WPF и приложения созданные с помощью этой технологии потребляют больше памяти, чем WinForms приложения.

Плохо пробовал. Я в 2009-м акаде на палитрах размещаю преимущественно WPF контент. Контрол WPF следует размещать на палитре опосредованно, через контрол ElementHost, специально для этих целей существующий. Здесь можешь глянуть мой пример кода.
А за ссылку спасибо!


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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Открывать в AutoCAD окна Form (WinForms) следует при помощи статических методов:
Я, например, это тоже знаю - но не знаю почему - кто нибудь мне может сказать что теоретически (или практически) может произойти если я буду использовать .Show и .ShowDialog.

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
то нибудь мне может сказать что теоретически (или практически) может произойти если я буду использовать .Show и .ShowDialog.
Я в таких случаях сталкивался с аварийным завершением работы AutoCAD 2009. Происходило это не стабильно, но достаточно часто. Замена вызова на альтернативу от Autodesk устранило проблему. Считаю, что лучше перестраховаться и дёргать "кукол" за обозначенные кукловодом "верёвочки", дабы "пьеса" не завершилась неожиданным финалом. :) Причём в официальной документации автодеск эти методы долгие годы отсутствовали (некоторые их перегруженные версии отсутствуют до сих пор).

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Autocad и плагин с использованием Winforms.
« Ответ #10 : 08-07-2015, 12:18:11 »
Есть "падающий" пример с WinForms - я "подергаю" - мне не лень. ИХМО данный функционал (сейчас говорю только касательно WinForms - WPF в автокаде практически не использую) похоже задел на будующее которое не настанет (хотели, но "ниосилили"). Я вставлял готовые WinForm модули (dll) в плагин автокада (часть функционала продублированная в другом месте, которую для удобства можно вызывать и из под акада) она активно работает с формами, естественно вызывая их обычными методами - работают с ними достаточно плотно и сейчас - пока чего-то не падало (хотя я и не исключаю, что может). В общем если есть конкретные примеры (а еще лучше причины) - то я крайне заинтересован.

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Autocad и плагин с использованием Winforms.
« Ответ #11 : 08-07-2015, 13:03:44 »
Есть "падающий" пример с WinForms - я "подергаю" - мне не лень. ИХМО данный функционал (сейчас говорю только касательно WinForms - WPF в автокаде практически не использую) похоже задел на будующее которое не настанет (хотели, но "ниосилили"). Я вставлял готовые WinForm модули (dll) в плагин автокада (часть функционала продублированная в другом месте, которую для удобства можно вызывать и из под акада) она активно работает с формами, естественно вызывая их обычными методами - работают с ними достаточно плотно и сейчас - пока чего-то не падало (хотя я и не исключаю, что может). В общем если есть конкретные примеры (а еще лучше причины) - то я крайне заинтересован.
Я сейчас не помню, какую именно решал задачу, в процессе которой открывал окошки, и какие именно дальнейшие манипуляции приводили к Fatal Error (это было давно, в 2009-м году). :( На старом сайте себе "зарубок" на эту тему не сделал видимо, т.к. найти сейчас не смог. Если я верно помню, то на наличие обозначенных не документированных методов мне указал А.Н. Ривилис. Помню, что после внесённых обозначенных изменений фатал прекратил появляться.

С тех пор, вместо Show и ShowDialog я стал использовать обозначенные методы автодеска, а так же перестал воспринимать содержимое документации ObjectARX как 100% точный источник информации, т.к. обозначенные методы (да и не только они, как выяснилось позднее) не были обозначены в ней.
Однако использование "родных" методов автодеска может дать неожиданный результат, если использовать не тот вариант перегрузки метода: реализация по умолчанию, к примеру, ShowModelessWindow(Window formToShow) такова, что размеры и позиция окна сохраняются:
Код - C# [Выбрать]
  1. public static void ShowModelessWindow(Window formToShow)
  2. {
  3.     ShowModelessWindow(IntPtr.Zero, formToShow, true); // По умолчанию последний аргумент - true
  4. }
  5.  
  6. public static unsafe void ShowModelessWindow(IntPtr owner, Window formToShow, [MarshalAs(UnmanagedType.U1)] bool persistSizeAndPosition){
  7. ...
  8. }
Т.е. чтобы избежать грабли, обозначенные в англоязычной заметке, в коде лучше открывать модальное окошко так:
Код - C# [Выбрать]
  1. ShowModelessWindow(IntPtr.Zero, formToShow, false);
Для немодальных окон и для Forms всё аналогично.
« Последнее редактирование: 08-07-2015, 15:07:41 от Андрей Бушман »

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Autocad и плагин с использованием Winforms.
« Ответ #12 : 08-07-2015, 14:45:04 »
Возможно то, что мне сейчас смутно помнится, как-то связано с проблемой, указанной мною здесь (см. строку кода 122 и комментарий к ней):
Код - C# [Выбрать]
  1. //Окно откроется, но есть проблема: временами, при попытке что-то сделать с
  2. // окном (помимо закрытия) может возникать Fatal error, а может и не возникать
  3. //(закономерности не выявил)...
  4. frm.Show();
Но там я экспериментировал с разными доменами... Домены могут работать в разных потоках (Thread), а для устойчивой работы GUI (WinForms\WPF) требуется [STAThread].

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Autocad и плагин с использованием Winforms.
« Ответ #13 : 08-07-2015, 15:06:42 »
Я добавил информацию в #11.

Онлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 533
  • Карма: 117
Re: Autocad и плагин с использованием Winforms.
« Ответ #14 : 08-07-2015, 15:11:21 »
Вопрос не по теме, но тоже про интерфейс в автокаде.

можно вывести сообщение в командную строку автокада:
editor.WriteMessage()
А есть ли в Api автокада аналог lisp команды
(alert message)

т.е. всплывающее окошко с сообщением.
Или для этих целей нужно WinForm использовать?