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

ADN Club => AutoCAD .NET API => Тема начата: strayker1206 от 30-01-2017, 18:42:53

Название: Передача параметров плагинам AutoCAD
Отправлено: strayker1206 от 30-01-2017, 18:42:53
Здравствуйте!
Имеется плагин (dll), который автоматически запускается при открытии документа. Так же имеется необходимость передачи некоторого строкового параметра этому плагину. Как подобное можно реализовать? Может, существуют плагины для автокад, которые принимают некие параметры, аргументы.
Автокад запускаю через командную строку (cmd) следующим образом:
acad.exe D:\1.dwg /b D:\1.scr
Где:
/b D:\1.scr - путь к скрипту следующего содержания:

netload
"D:/Мой_плагин.dll"


Сделал это исходя из соображений, что создавать запись в реестре для автозагрузки dll - не очень хорошая идея, поскольку плагин необходимо запускать, в том числе, на ПК без права на внесение изменений в реестр.

Итак, основной вопрос - каким образом можно передать строковый параметр своему плагину? Возможно, с помощью того же скрипта?

Спасибо за внимание.
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: Дмитрий Загорулькин от 30-01-2017, 20:40:27
Как самый простой вариант, который в голову пришел.
Задаем переменной USERS1 нужное значение в файле сценария перед запуском плагина. Типа такого, наверное:
Код - C# [Выбрать]
  1. _.setvar
  2. users1
  3. "parameter"
  4. _.netload
  5. "D:/Мой_плагин.dll"
А в плагине считывать эту переменную.
Не проверял, просто как идея.
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: Дима_ от 30-01-2017, 21:17:27
Можно создать автолисп функцию - аттрибут LispFunction - достаточно широко тему раскрывали здесь (http://adn-cis.org/forum/index.php?topic=3274.0), ну а в принципе вызывающий метод может предварительно "положить" необходимые данные куда угодно - например в БД.
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: Александр Ривилис от 30-01-2017, 21:28:56
Сделал это исходя из соображений, что создавать запись в реестре для автозагрузки dll - не очень хорошая идея, поскольку плагин необходимо запускать, в том числе, на ПК без права на внесение изменений в реестр.
Так как автозагрузку можно реализовать через HKEY_CURRENT_USER, то это должно быть доступно всегда (иначе сам AutoCAD работать не будет).
Итак, основной вопрос - каким образом можно передать строковый параметр своему плагину? Возможно, с помощью того же скрипта?
Пользуйся поиском. Пример: http://adn-cis.org/forum/index.php?topic=1036.msg4843#msg4843
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: strayker1206 от 01-02-2017, 11:05:58
Спасибо всем большое за помощь!
Сделал следующим образом:
Скрипт:
._setvar
USERS1
"параметр"
netload
"D:\мой_плагин.dll"

А в плагине пишу:
Код - C# [Выбрать]
  1. string parametr = Application.GetSystemVariable("USERS1").ToString();
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: Алексей Кулик от 03-02-2017, 10:32:37
Сугубо ИМХО. Я бы не стал полагаться на безошибочность такого решения: в AutoCAD может быть загружено другое приложение, которое обращается к USERS*. Может быть, проще будет использовать нечто типа
(setenv "MyCoolPluginParameter1" "Параметр")
_.netload
"d:\MYCoolPlugin.dll"
А в плагине
string param = Application.GetEnvironmentVariable("MyCoolPluginParameter1").ToString();
Или что-то наподобие. На .NET не пишу, со всеми вытекающими.
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: strayker1206 от 03-02-2017, 14:24:09
Алексей Кулик, полагаю, Ваше решение более безопасное, однако я не нашёл возможность считать созданную переменную. Метода Application.GetEnvironmentVariable нет..
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: Дмитрий Загорулькин от 03-02-2017, 14:28:51
Метода Application.GetEnvironmentVariable нет..
System.Environment.GetEnvironmentVariable
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: Алексей Кулик от 03-02-2017, 14:34:25
https://www.theswamp.org/index.php?topic=20237.30 + https://www.google.ru/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#newwindow=1&q=autocad+.net+getenv
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: Алексей Кулик от 03-02-2017, 14:35:39
Дмитрий Загорулькин, по-моему, твое решение больше касается системных переменных окружения. Я говорил о переменных окружения для AutoCAD
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: Дмитрий Загорулькин от 03-02-2017, 15:06:49
А... Семен-Семеныч... Ну да. Тогда так:
Код - C# [Выбрать]
  1. HostApplicationServices.Current.GetEnvironmentVariable("MyCoolPluginParameter1");
Кстати, Алексей, то ли изначально тут не совсем точная информация: http://autolisp.ru/2013/12/11/environtment-variables/, то ли в уже новых версиях все поменялось.
В том плане, что вместо этого:
Цитировать
Их перечень можно посмотреть в реестре, в ветке HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\RXX.X\ACAD-YYYY:YYY\Profiles\ИмяПрофиля\General
У меня так:
HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\RXX.X\ACAD-YYYY:YYY\FixedProfile\General
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: Александр Ривилис от 03-02-2017, 15:12:55
Кстати, Алексей, то ли изначально тут не совсем точная информация: http://autolisp.ru/2013/12/11/environtment-variables/, то ли в уже новых версиях все поменялось.
В том плане, что вместо этого:
Цитировать

    Их перечень можно посмотреть в реестре, в ветке HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\RXX.X\ACAD-YYYY:YYY\Profiles\ИмяПрофиля\General

У меня так:
Код: [Выделить]

HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\RXX.X\ACAD-YYYY:YYY\FixedProfile\General

Они в действительности разбросаны по разным веткам реестра. Стандартные обычно в ...Profiles\ИмяПрофиля\General, собственные в ...FixedProfile\General
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: Алексей Кулик от 03-02-2017, 15:37:59
Как только немного времени появится, дополню информацию, спасибо :)
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: Дмитрий Загорулькин от 03-02-2017, 15:47:33
Я сильно не тестировал, но, вроде как, ситуация такая:
(setenv "параметр" "значение") пишет пользовательские параметры в FixedProfile
(getenv "параметр") читает пользовательские параметры из FixedProfile и стандартные значения вроде из Profiles\ИмяПрофиля. По крайней мере, (getenv "ACAD") значение выдает, но в FixedProfile его нет.
Но если вручную создать в реестре параметр в Profiles\ИмяПрофиля\General, то его не читает ни getenv, ни HostApplicationServices.Current.GetEnvironmentVariable
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: strayker1206 от 03-02-2017, 16:01:03
Алексей Кулик, Дмитрий Загорулькин, спасибо за предложенный вариант, всё заработало =)
Один вопрос:
После завершения сессии (после закрытия автокада), наша переменная остаётся в реестре. Неплохо бы, наверно, подчистить за собой?
Пробежался по форумам, но везде сказано, как записать и считать переменную, но нигде не сказано, что она остаётся в реестре и как с этим бороться. Может, это не так важно, не знаю..
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: Александр Ривилис от 03-02-2017, 16:02:48
Но если вручную создать в реестре параметр в Profiles\ИмяПрофиля\General, то его не читает ни getenv, ни HostApplicationServices.Current.GetEnvironmentVariable
Это если у параметра нестандартное имя. Если имя стандартное, но в силу того что у него было значение по-умолчанию в реестре его не было, и создать его вручную в правильном формате, то (getenv ...) его читает.
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: Александр Ривилис от 03-02-2017, 16:18:20
После завершения сессии (после закрытия автокада), наша переменная остаётся в реестре. Неплохо бы, наверно, подчистить за собой?
Пробежался по форумам, но везде сказано, как записать и считать переменную, но нигде не сказано, что она остаётся в реестре и как с этим бороться. Может, это не так важно, не знаю..
В AutoCAD API нет средств для стирания, так что (если будешь "подчищать") придётся удалять непосредственно в реестре. Я бы не стал с этим заморачиваться. Просто придумай уникальные имена для своих переменных, чтобы не было пересечения со стандартными и чужими.
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: strayker1206 от 03-02-2017, 16:19:07
Просто придумай уникальные имена для своих переменных, чтобы не было пересечения со стандартными и чужими.
Хорошо, так и поступлю, спасибо
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: Алексей Кулик от 05-02-2017, 11:39:29
Да, остается. В принципе, можно чистить, а можно и оставить - особенно если подобных переменных не будет сто миллионов :)
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: exilerus от 30-06-2017, 16:46:11
Здравствуйте.
Подскажите, пожалуйста, setenv и getenv это команды LISP?
Как записать в реестр значение для своего плагина?
При этом:
Код - C# [Выбрать]
  1. Application.SetSystemVariable("USERR1", Value);
значение остается только до перезагрузки Автокада.

Заранее спасибо
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: Александр Ривилис от 30-06-2017, 16:59:26
Подскажите, пожалуйста, setenv и getenv это команды LISP?
Это не команды, а функции lisp, но в ObjectARX есть их аналог и соответственно при помощи P/Invoke можно их вызывать и в AutoCAD .NET
Почитай:
http://adn-cis.org/prostaya-alternativa-ispolzovaniyu-com-obekta-preferences-v-autocad.html
http://adn-cis.org/izmenenie-ustanovok-profilya-autocad-pri-pomoshhi-net.html
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: exilerus от 30-06-2017, 17:03:18
Спасибо большое!
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: Дмитрий Загорулькин от 30-06-2017, 17:52:36
Если не принципиально хранить значение именно в ветке реестра AutoCAD, то можно воспользоваться общими методами работы с реестром: https://metanit.com/sharp/tutorial/20.3.php
Название: Re: Передача параметров плагинам AutoCAD
Отправлено: Александр Ривилис от 30-06-2017, 18:18:27
Дмитрий Загорулькин
Во второй моей ссылке ка раз и используется обычна работа с реестром.