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

ADN Club => AutoCAD .NET API => Тема начата: Андрей Бушман от 16-08-2016, 13:54:44

Название: Как отличить переменные окружения AutoCAD, от системных переменных AutoCAD?
Отправлено: Андрей Бушман от 16-08-2016, 13:54:44
Как отличить переменные окружения AutoCAD, от системных переменных AutoCAD?

Насколько я понимаю, первые всегда хранятся в ветке FixedProfile/General:
Цитата: ObjectARX 2017 SDK
acedGetEnv retrieves the value of an environment variable. Looks first in the AutoCAD-specific FixedProfile/General section of the registry

а вторые - либо в конкретном  профиле AutoCAD, либо в конкретном DWG-файле:
Цитата: ObjectARX 2017 SDK
acedGetVar retrieves the current value of the specified AutoCAD system variable.

Я правильно понимаю?
Название: Re: Как отличить переменные окружения AutoCAD, от системных переменных AutoCAD?
Отправлено: Александр Ривилис от 16-08-2016, 13:58:30
В чем смысл "различения"? Может есть более простой способ...
Название: Re: Как отличить переменные окружения AutoCAD, от системных переменных AutoCAD?
Отправлено: Андрей Бушман от 16-08-2016, 14:00:17
смысл в том, что моя DLL может вызываться как из кода расширений AutoCAD, так и из кода сторонних приложений. В первом случае должна вызываться соответствующая функция AutoCAD чтения\правки переменной, а во втором - прямая правка (или чтение) значения в реестре. Поскольку в автокаде присутствует свой набор функция для каждого вида переменных, то возникает необходимость понимать (определять программно), в каком случае какую из них вызывать.
Название: Re: Как отличить переменные окружения AutoCAD, от системных переменных AutoCAD?
Отправлено: Александр Ривилис от 16-08-2016, 14:19:35
Переменные окружения (если это не переменные Windows) действительно хранятся в FixedProfile\General и (!!!) в FixedProfile\Editor Configuration (для проверки можешь попробовать (getenv "AutoSnapPolarAng") и поискать где строка "AutoSnapPolarAng" находится) и (!!!) в FixedProfile\General Configuration  - проверка (getenv "DYNMODE")
Возможно и еще где-то - однозначно никто не скажет.
Название: Re: Как отличить переменные окружения AutoCAD, от системных переменных AutoCAD?
Отправлено: Андрей Бушман от 16-08-2016, 14:21:54
а по поводу системных переменных автокада?
Название: Re: Как отличить переменные окружения AutoCAD, от системных переменных AutoCAD?
Отправлено: Андрей Бушман от 16-08-2016, 14:32:35
Переменные окружения (если это не переменные Windows) действительно хранятся в FixedProfile\General и (!!!) в FixedProfile\Editor Configuration (для проверки можешь попробовать (getenv "AutoSnapPolarAng") и поискать где строка "AutoSnapPolarAng" находится) и (!!!) в FixedProfile\General Configuration  - проверка (getenv "DYNMODE")
Возможно и еще где-то - однозначно никто не скажет.
И я так понимаю, что от версии к версии состав подветок реестра и размещение переменных хаотично скачет, т.к. в более ранних версиях последней из них не было.
Название: Re: Как отличить переменные окружения AutoCAD, от системных переменных AutoCAD?
Отправлено: Александр Ривилис от 16-08-2016, 14:33:59
Во-первых, если ты помнишь имя системной переменной AutoCAD не всегда совпадает с именем переменной в реестре, что уже делает твой поиск совсем не простым. Во-вторых, в разных версиях AutoCAD это тоже не всё одинаково...
Название: Re: Как отличить переменные окружения AutoCAD, от системных переменных AutoCAD?
Отправлено: Александр Ривилис от 16-08-2016, 14:35:47
И я так понимаю, что от версии к версии состав подветок реестра и размещение переменных хаотично скачет, т.к. в более ранних версиях последней из них не было.
Я перечислил переменные из древнего AutoCAD 2008. Вероятно эта переменная (как и многие другие) появляется в списке только если её значение отлично от значения по-умолчанию.
Название: Re: Как отличить переменные окружения AutoCAD, от системных переменных AutoCAD?
Отправлено: Александр Ривилис от 16-08-2016, 14:41:37
Еще интересный факт:

Код - INI [Выбрать]
  1. Command: (getenv "Attdia") "0"
  2. Command: (getvar "Attdia") 0
  3.  
  4. Command: (getenv "Coords") "1"
  5. Command: (getvar "Coords") 1
  6.  
  7. и т.д.
Это всё из конкретного профиля\General
При этом (getenv) - регистрозависимая, а (getvar) - нет.
Название: Re: Как отличить переменные окружения AutoCAD, от системных переменных AutoCAD?
Отправлено: Александр Ривилис от 16-08-2016, 14:45:47
Продолжение юмора:

Код - INI [Выбрать]
  1. Command: (getvar "Osmode") 33
  2. Command: (getenv "Osmode") "33"
  3. Command: (setenv "Osmode" "34") "34"
  4. Command: (getenv "Osmode") "34"
  5. Command: (getvar "Osmode") 34

Это я всё в 2008-ом проверял.
Название: Re: Как отличить переменные окружения AutoCAD, от системных переменных AutoCAD?
Отправлено: Андрей Бушман от 16-08-2016, 14:52:50
Согласно документации, OSMODE - системная переменная (как и ATTDIA, COORDS). Т.е. для работы с ней нужно пользоваться acedGetVar(), поскольку функция acedGetEnv() не должна с ней работать  в принципе...

Т.е. показанныее выше примеры, на мой взгляд, несколько противоречит официальной документации:
Цитата: ObjectARX SDK 2017
acedGetEnv()
This function will not work for AutoCAD sysvars. For AutoCAD sysvars, use acedGetVar().
В этом случае как-то не до шуток юмора...
Название: Re: Как отличить переменные окружения AutoCAD, от системных переменных AutoCAD?
Отправлено: Александр Ривилис от 16-08-2016, 15:02:14
В этом случае как-то не до шуток юмора...
Тем не менее. Можешь сам попробовать.
Название: Re: Как отличить переменные окружения AutoCAD, от системных переменных AutoCAD?
Отправлено: Андрей Бушман от 16-08-2016, 15:06:01
Так что из этого неправильно? Документация кривая, ибо не соответствует реализации, или же реализация кривая, ибо не соответствет документации? Что из этого может в дальнейшем измениться, дабы реализация соответствовала документации? На что ориентироваться - на документацию или же на текущую реализацию?
Название: Re: Как отличить переменные окружения AutoCAD, от системных переменных AutoCAD?
Отправлено: Александр Ривилис от 16-08-2016, 15:12:37
На что ориентироваться - на документацию или же на текущую реализацию?
Ну если ты будешь ориентироваться на документацию, то погрязнешь в ошибках. Так что:
Цитировать
О сколько нам открытий чудных
Готовят просвещенья дух
И Опыт, [сын] ошибок трудных,
И Гений, [парадоксов] друг...
Название: Re: Как отличить переменные окружения AutoCAD, от системных переменных AutoCAD?
Отправлено: Андрей Бушман от 16-08-2016, 15:19:07
Ну если ты будешь ориентироваться на документацию, то погрязнешь в ошибках
Тогда получается, что это будет использование "недокументированных возможностей", которые могут "исправить" в любой момент без каких-либо предупреждений...
О сколько нам открытий чудных
Готовят просвещенья дух
И Опыт, [сын] ошибок трудных,
И Гений, [парадоксов] друг...
Да, это однозначно про автокад.... Всегда с ним так было, есть и будет (к сожалению).
Название: Re: Как отличить переменные окружения AutoCAD, от системных переменных AutoCAD?
Отправлено: Александр Ривилис от 16-08-2016, 15:40:08
Да, это однозначно про автокад....
Ага. Александр Сергеевич - оракул! За несколько столетий предвидел появление AutoCAD! :)
Название: Re: Как отличить переменные окружения AutoCAD, от системных переменных AutoCAD?
Отправлено: Андрей Бушман от 16-08-2016, 15:41:56
Да, это однозначно про автокад....
Ага. Александр Сергеевич - оракул! За несколько столетий предвидел появление AutoCAD! :)
Предвидеть не предвидел, но фраза весьма актуальна для текущего контекста.