Тема: О совместном использовании сист. переменных типа USER

Еще раз возвращаясь к теме..
VK (2004-05-05 20:55:08)
...поменять их значения может любая программа или даже макрос из меню. И сделает это непременно втихаря, не предупреждая и не спрашивая
   Все таки, примнение этих переменных очень удобно.
Возможно, существует некое соглашение типа Конвенции сыновей лейтенанта Шмидта о совместном использовании?
Или стоит ее разработать?

Re: О совместном использовании сист. переменных типа USER

Какие у Вас виды на Балагонова?   wink
т.е. Вы, за вынос Тела?
т.е. как реагировать на нарушителей конвенции:
программно или физически?

Re: О совместном использовании сист. переменных типа USER

Я лично у себя в ПАРКС использую USERi1 для хранения масштаба, также поступают в МАЭСТРО и АРКО. Ну и хватит! Чем меньше хранишь в таких переменных, тем лучше. Можно использовать расширенные данные и т.п.

Re: О совместном использовании сист. переменных типа USER

> [Re:] Jura
Лучше всего - расстрел с последующим исключением из профсоюза...Но, возможно, уважаемое содружество найдет реальные рычаги воздействия? В сфере программирования, а не администрирования, конечно.

> [Re:] Alan
Можно использовать расширенные данные и т.п.
Можно, конечно, спору нет.Вопрос, как вернуть преимущества
предложенные фирмой Autodesk и утраченные вследствие некоей нашей коллективной безответсвенности.

Re: О совместном использовании сист. переменных типа USER

Привет!
На мой взгляд, применение этих _фиксированных_
имен переменных - просто один из изощренных
способов прогулки по граблям. Ведь даже определяя
глобальную переменную, есть ненулевой шанс
нарваться на использоване этого же имени другим
разработчиком софта для своих целей... Ну, вы
меня поняли.
Вывод: в серьезных/коммерческих целях использовать
их нельзя и никакая "конвенция" тут не поможет smile
Как альтернатива - "уговорить" smile)) Аутодеск разрешать
пользователям определять свои системные переменные
любого типа и имени. А может, это уже сделано и я
слегка отстал от жизни?
Альтернативные спобы хранения своих данных я
в этом посте не рассматриваю.
Успехов!

Re: О совместном использовании сист. переменных типа USER

Leonid (2004-06-24 21:05:27) ...утраченные вследствие некоей нашей коллективной безответсвенности...
IMHO это глобальный филосовский вопрос...  "Ребята давайте жить дружно..." этот призыв актуален и поныне, и forever...
т.е. Ваш вопрос, о том как вернуть "коллективную ответственность"? Но это вопрос для пенетенциарного форума...
(во загнул! smile)) )
...В сфере программирования, а не администрирования, конечно.... хоть намекните, как можно, программно принудить использовать переменные  "по назначению" ?  wink

Re: О совместном использовании сист. переменных типа USER

Jura пишет:

"Ребята давайте жить дружно..."

Если говорить о моей позиции, то тут есть тонкость - не давайте жить дружно, а давайте не будем мешать друг другу жить.В сущности, вопрос стоит о закреплении сложившегося положения, когда опытные программисты НЕ ИСПОЛЬЗУЮТ переменные типа USER для хранения своих данных, чтоб кто-нибудь не испортил их втихаря.Я предлагаю портить их не втихаря, а открыто, и не от случая к случаю а систематически и беспощадно.Если каждый участник форума возьмет на себя обязательства в начало каждой своей программы вставлять кусок кода по обнулению указанных переменных, то очень скоро все научатся использовать их только по назначению, т.е.
для межпрограммных связей.Например, для передачи параметров от LISP k VBA с обязательным последующим обнулением.А конвенции, декларации и т.п. мероприятия нужны чтобы сделать акцию гласной.В конце концов, если мы все участники процесса, то должны, наверное, соблюдать правила движения?! А для начала их надо сформулировать и объявить.Кто за?

Re: О совместном использовании сист. переменных типа USER

Ничего у вас с "конвенцией" не получится. Сколько народу обитает в этом форуме? А сколько пишет программы, не заглядывая сюда? Большинство AutoCAD-программистов просто даже не будут подозревать о существовании данной "конвенции". И будут писать так, как посчитают нужным. И будут правы. Тут вступает правило "спасение утопающих - дело рук самих утопающих". "Храните деньги в сберегательной кассе" (с), сиречь "храните переменные в местах, недоступных посторонним кулибиным". Я храню в словарях. А Вы?
______________
Удачи.

Re: О совместном использовании сист. переменных типа USER

Вопрос о том, хорошо или плохо использовать системные переменные Автокада для хранения данных можно обсуждать долго и будут сторнники и того и другого подхода.
А вместо того, чтобы в начале каждой функции - сбрасывать все системные переменные, чтоб другим неповадно было, так уж лучше, наоборот уважать других и делать корректное сохранение всех используемых переменных в начале своей программы и восстановленивать - в конце.
И будет всем счастье.

Re: О совместном использовании сист. переменных типа USER

> Alan
также поступают в МАЭСТРО и АРКО
если это правда, то МАЭСТРО и АРКО упали в моих глазах ниже плинтуса ... Неужели правда ?

Re: О совместном использовании сист. переменных типа USER

> kos (2004-06-25 16:34:57)
       

"Я храню в словарях. А Вы?"

Уже более 10 лет за километр обхожу этих самых "USER.."
При необходимости использую текстовые файлы (=словари???).

Re: О совместном использовании сист. переменных типа USER

> [Re:] Олег
так уж лучше, наоборот уважать других и делать корректное сохранение всех используемых переменных в начале своей программы и восстановленивать - в конце.
И будет всем счастье.

Я тоже за счастье людей и миру мир...Но, обратите внимание, вы ведь тоже предлагаета общее соглашение.Но более трудновыполнимое и оттого менее реальное.

Re: О совместном использовании сист. переменных типа USER

Вы создаете блок, даете ему имя, а это имя оказывается уже существует. Что скажет AutoCAD?
Do you want re-define it?. То есть он предупреждает, молодец. А теперь вы создаете новый текстовой стиль командой  -Style. И случайно даете ему имя существующего стиля.  Вы думаете, что автокад ругнется? Нет, он проглотит эти и молча изменит стиль. Наверное, можно найти еще что-нибудь, когда при совпадении имен что-то молча изменится. Однако же вряд-ли вы храните все-все-все в словарях. Есть вещи, где несанкционированное изменение переменной сразу-же бросается в глаза. Применение User в качестве масштабного коэффициента как раз такой случай. Увидев, что что-то сбилось, юзер нажмет опять кнопочку с нужным масштабом. Он все равно ее часто нажимает для перехода на другой масштаб. Возможно, упомянутые Аланом МАЭСТРО и АРКО  используют User для похожих случаев. Можно его для контроля заложить в статусную строку, хотя кто туда смотрит. Все-же интересно, имеет ли кто-нибудь в своей коллекци прогу, измяняющую User?

Re: О совместном использовании сист. переменных типа USER

Да забудьте вы все про существование этих переменных! Они - позор Автокада, пользоваться ими недостойно и неприлично, это унижает вас, как Программиста.
Для хранения данных в чертеже (именно в чертеже) созданы User Dictionaries, самый подходящий вариант.
Можно использовать расширенные данные примитивов, но тогда придётся сначала получить имя примитива.
Можно хранить параметры вашего приложения в файле acad.cfg с помощью функций (getcfg ...) и (setcfg ...).
Можно хранить даже в переменных окружения, функции (getenv ...) и (setenv ...).
В крайнем случае, можно хранить в реестре (vl-registry-...) или в текстовом файле.
Нельзя только одно: использовать переменные USER..., потому что никто не гарантирует сохранность ваших данных.

> Олег
делать корректное сохранение всех используемых переменных в начале своей программы и восстановленивать - в конце - все зрелые программисты так и делают. Но ведь речь о том, что кто-то другой всегда запросто может испортить ваши данные, по незнанию или по дикости своей. А если хранить теми способами, что перечислены выше, то пусть вандал догадается, какой именно файл или словарь или ветку в реестре я использую! (если, конечно, он не будет вредить целенаправленно).

Re: О совместном использовании сист. переменных типа USER

> Vova
Увидев, что что-то сбилось, юзер нажмет опять кнопочку с нужным масштабом. Он все равно ее часто нажимает для перехода на другой масштаб.
Вот так аквапарки и рушатся: Vova хранит данные в общедоступном месте, юзер "забивает" на изменение масштаба, когда оно происходит уже три тысячи первый раз за смену, прораб на стройке читает "бредовые" спецификации, и потеряв терпение, тоже "забивает" и делает "на авось". Программисты, обратите внимание, что эта порочная цепочка сложена по схеме "И", то есть - достаточно Vove прекратить пользоваться дурными приёмами, чтобы её разрушить.

Re: О совместном использовании сист. переменных типа USER

Вот что ещё.

> Олег
делать корректное сохранение всех используемых переменных в начале своей программы и восстановленивать - в конце
Только не "своей программы", а "своей КОМАНДЫ". Потому что программа грузится, как правило, из файла acaddoc.lsp или ему подобных (список этих файлов можно просмотреть командой _appload),  при открытии каждого чертежа.
Но после того, как программа загрузится, и до того, как юзер вызовет первую вашу КОМАНДУ, чужая "вандальская" программа (или её команда, вызванная юзером) может испортить "ваши" системные переменные.
А вот команда, насколько я знаю, исполняется монопольно (прозрачные команды типа 'PAN не опасны), то есть как транзакция, в терминах теории СУБД.
А что, если капризный юзер прервёт вашу команду клавишей Esc ? Тогда надо предусмотреть восстановление системных переменных из функции-обработчика ошибок, и кстати, восстановить саму функцию *error*.
Вот пример простейшего, но "правильного" обработчика ошибок:

(defun myErrorHandler (msg / )
  (if oldError (setq *error* oldError))
  (if oldOsmode (setvar "osmode" oldOsmode))
  ...
  (princ msg) ;-- где-то я читал, что обработчик ошибок обязан включать в себя функцию вывода сообщения. Может, я и неправ...
  (princ) ;-- "тихий" выход в консоль.
)
...
(defun myCommand ( / locvar1 locvar2 locvar3)
  (setq oldError *error*)
  (setq *error* myErrorHandler)
  (setq oldOsmode (getvar "osmode"))
  (setvar "osmode" 0) ;-- например, ноль
  ...
  (if oldOsmode (setvar "osmode" oldOsmode))
  (if oldError (setq *error* oldError))
)

Здесь oldError и oldOsmode - обязательно глобальные переменные, а не локальные.

Re: О совместном использовании сист. переменных типа USER

> Maxim T
...можно еще использовать переменные Лисп и переменные внедокументного именного пространства.... Но нельзя утверждать на 100% что все будет пучком. Всегда есть 1Е-99 вероятность что имя переменной или ветки реестра совпадет....
Просто имен USERxx очень мало и они общеизвестны. Потому и вероятность подмены значения выше. ИМХО

Re: О совместном использовании сист. переменных типа USER

> VK
"переменные Лисп и переменные внедокументного именного пространства" не сохраняются при закрытии акада, а переменные USER... - всегда сохраняются в чертеже, за что их некоторые так любят :) и хранят там свои данные.
А чтобы "имя переменной или ветки реестра" не совпадало с чужими именами, надо использовать свою систему именования глобальных переменных и символов и всегда придерживаться этой системы. И использовать префиксы/суффиксы, а не именовать переменные как i, _b и даже oldError, как в моём примере.

Re: О совместном использовании сист. переменных типа USER

Мдя... Аутодеск рекомендует делать суффикс/префикс из 4-х символов, кажется так.
Что касается хранения в реестре или отдельном файле - ну это тоже не хранится с чертехом....
Так что все зависит от исходных требований - нужно ли хранить настройки только в одном сеансе АКАД или на одном компе или требуется чтоб все сохранялось/восстанавливалось всегда.
Только вот все же, чем привлекательны USERxx - это возможность простого и легкого их использования. Есть доступ из командной строки и макросов DIESEL без применения дополнительных программных средств (как минимум, Лисп или VBA). Это скорее всего единственное простое (без "высоких" технологий) решение для LT-версий.
PS:

где-то я читал, что обработчик ошибок обязан включать в себя функцию вывода сообщения. Может, я и неправ...

Точнее, обязан принять один аргумент, который представляет собой сообщение об ошибке. А что с этим сообщением делать.... Можно посмотреть что это за сообщение и вывести свое... А можно просто благополучно забыть о том что было в этом сообщении...

Re: О совместном использовании сист. переменных типа USER

СОВМЕСТНОЕ использование UserXX, конечно невозможно. Это один из рудиментов ранних версий AutoCAD, когда не было ни словарей, ни расширенных данных.
Сохранить собственную переменную между сеансами можно.
Исходники см.
http://www.kurganobl.ru/cad/book.jsp?id … mp;tn=main
- серия функций, комеентарии в книге. Сохраняются любые типы, включая наборы.
А зачем использовать UserXX вообще? Единственная настоящая уважительная причина - то, что только системные переменные понимает язык DIESEL, а его очень удобно использовать в меню.
Но Аутодеск на самом деле заинтересована не в том, чтобы прикладные программисты разрабатывали хорошие и надежные программы, а в том, чтобы им казалось, что они это могут делать.
Иначе давно бы предусмотрели возможность создания собственных глобальных переменных.  Тогда и был бы смысл в префиксах и прочих соглашениях.  "Конвенция сыновей лейтенанта Шмидта" нарушалась из-за ограниченного количества злачных мест. При 15 переменных она бессмыссленна.
Но свою информацию, при ловкости рук, можно спрятать и в других системных переменных...

Re: О совместном использовании сист. переменных типа USER

Возможно меня тут затопчут сапогами, но UserXX это необходимая вещь. Это по моему единственный способ связать программы на Лиспе с программами на VBA. просто не надо в лоб назначать этим переменным значения и потом ими пользоваться.
Допустим после работы Лисп функции у меня есть ряд переменных которые надо передать  в VBA.
тогда из VBA присваиваю допустим переменной users1 ИмяLispПерем :
ThisDrawing.SendCommand ("(command ""setvar"" ""users1"" " & ИмяLispПерем & ")" & vbCr)
а затем получаю значение переменной
GetLispPar = ThisDrawing.GetVariable("users1")

Re: О совместном использовании сист. переменных типа USER

> Эйдельман Аркадий
https://www.caduser.ru/forum/topic7916.html