Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Запрет на действия пользователя -- создать реактор или.....?

Запрет на действия пользователя -- создать реактор или.....?

Ответ
Поиск в этой теме
Непрочитано 01.08.2006, 23:26 #1
Запрет на действия пользователя -- создать реактор или.....?
mmax
 
Программист широкого профиля.
 
Челябинск
Регистрация: 08.09.2005
Сообщений: 722

Проблема началась здесь http://dwg.ru/forum/viewtopic.php?t=8788, но уже появилась проблема на другую тему.

В 2006м Автокаде есть такая динамическая командная строка. На которую не действуют переменные NOMUTT & CMDECHO. И при выполнении примерно такой программы
Код:
[Выделить все]
(setvar "cmdecho" 0)
(initget 1)
(setq blkpoint (getpoint "\n Укжите точку вставки : "))
(vl-cmdf "_-insert" blkname)
(command blkpoint)
(princ "\n Укажите радиус описанной окружности <1> : ")
  (setvar "nomutt" 1)  
(vl-cmdf pause)
  (setvar "nomutt" 0)
(princ "\n Угол поворота <0> : ")
  (setvar "nomutt" 1)  
(vl-cmdf pause)

;Данный код создает всеголишь визуализацию
;(например если вставляемый блок – правильный многоугольник  с радиусом = 1, 
;то получится программа подобная команде POLYGON)
;и в ней не должно быть автокадовских сообщений.
В динамической строке все сообщения Автокада видны, и если я вместо чисел введу текст, то получается примерно так
Код:
[Выделить все]
Укажите радиус описанной окружности <1> : неукажу
Требуется численное значение или указать точку
Укажите масштаб <1> : почему_масштаб_а_не_радиус_оборзел_штоли?
Требуется численное значение или указать точку
Укажите масштаб <1> : что_не_есть_good
И при всем этом (vl-cmdf pause) не заканчивает свою работу, если бы она возвратила NIL, то можно былобы сделать выход или еще чего нибудь.

Можно убить динамическую строку на время выполнения программы(setvar "dynmode" 0) , но я обязательно включу ее снова, ничто не помешает мне нажать на кнопку и даже вызвать настройки этой строки, лисп-функция даже не прервется.

Надо както запретить включение этой строки, для чего лучше всего подойдет реактор
Вот сырой реактор, который по идее должен нормально работать, но всеравно вызывает зацикливание.

Код:
[Выделить все]
(defun dunn (a b)
  (princ "\nreactor")
(vlr-remove rea) ;сначала выключим реактор
  
(setvar "dynmode" 0) ;выключим строку
(princ  "\nДинамическую строку во время выполнения этой программы включать нельзя. Оборзел штоли. ")
  
(vlr-add rea) ;и снова включим реактор
  (princ)
  )

(setq rea (vlr-sysvar-reactor nil '((:vlr-sysvarchanged . dunn))))
;бесконечно выполняется (princ "\nreactor")

Создается ощущение, что по неизвестным причинам (vlr-remove rea) не выполняется, скорее всего реактор не любит действий функции действия в отношении себя самого.
Какими еще способами можно наложить запрет на включение динстроки или как обвести реактор?
Просмотров: 4589
 
Непрочитано 02.08.2006, 07:23
#2
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Зачем идти самым сложным путем и забивать память всякими реакторами, "реактирующими" на любое шевеление вокруг компьютера?

Надо:

1. Написать библиотечные функции, позволяющие делать пользователю сделать только правильный ввод (допустимый тип данных в допустимых диапазонах) или, "позвольте вам выйти вон" через штатный выход.

2. Если необходима визуализация, то написать функцию, включающую требуемую vl-cmdf с требуемыми pause. Функцию наполнить необходимыми установками и восстановлениями системных переменных. Вся потенциально-ошибочная часть должна быть обернута ловушкой ошибок (тоже функцией) использующей внутри себя стандартные функции vl-catch-all-apply, vl-catch-all-error-p, vl-catch-all-error-message в хитроумных комбинациях.

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

Как это делается написано в книге "САПР на базе AutoCAD - как это делается".
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 02.08.2006, 23:40
#3
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


ShaggyDoc,
Предложенный вами способ, в той теме, работает очень хорошо если его дополнить вырубаниями Nomutt но это для обычной командной строки.

Сейчас речь идет о динамической строке которая появилась только в 2006м акаде. Это тоже обычная строка но она висит на курсоре и перемещается вместе с ним. Также у этой строки есть и другие висячие и мельтешащие вещи с очень полезной информацией(например она может показать на какое расстояние и угол оттянут курсор от точки вставки), но речь не о них их в принципе можно оставить.

Беда в том что на эту динамическую строку не действуют переменные CMDECHO NOMUTT, она при любом раскладе выдает стандартные сообщения.
Но она сама управляется переменной DYNMODE, значения от 0 до 3.

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

И как говорил Николай Николаевич в "САПР на базе AutoCAD - как это делается" , пользователь не должен знать что в данный момент выполняется и не должен пугаться необычных сообщений, даже если этот пользователь сам себе программист.
Когда писалась книга, то автор наверняка и не задумывался ни о какой динамической строке и как с ней бороться.

А реактор получился хороший
Вот его тестовая версия

Код:
[Выделить все]
(setq i 0);эту переменную надо определить снаружи 
(defun dynoff (dynnamereactor parametr / *error*)

    (defun *error* (msg)
    (princ)
    )
(setq dmn parametr)
  (if (= (nth 0 dmn) "DYNMODE") (princ "\n\nИзменяетсяDYNMODE")(progn
			       (princ "\n\nИзменяется не та переменная")
			       (exit)
			       ))
  (setq i (1+ i))
  (if (> i 1) (progn (princ "\n\nЗащита от цикла") (princ "\n") (setq i 0)
		(exit))(princ "\n\nФункция будет выполнена тест"))
  ;(princ "\nreactor")
  (vlr-remove dynoff_reactor)
  (princ "\n\nРеактор временно выключен")
  ;(While (vlr-added-p dynoff_reactor) (vlr-remove dynoff_reactor) (princ "\nРеактор не выключился"))

  (setvar "dynmode" 0)
  
  (princ "\n\nПеременная выключена")
  (vlr-add dynoff_reactor)
  (princ "\n\nРеактор включен")
    (princ)
  )


  
(while (vlr-remove-all :vlr-sysvar-reactor) (vlr-remove-all :vlr-sysvar-reactor))

(setq dynoff_reactor
       (vlr-sysvar-reactor nil
	 '((:vlr-sysvarchanged . dynoff))));реактор на запрет включения динамической строки

(vlr-set-notification dynoff_reactor 'active-document-only)
(vlr-pers-release dynoff_reactor)
если у вас автокад ниже 2006 то попробуйте заменить dynmode напрмер на osnap.

Вот только чтобы сделать этот реактор пришлось два раза автокад переустанавливать -- после некоторых ошибочных действий работать в реДакторе VL было просто невозможно, при открытом реДакторе окно рисунка становилось неактивным даже если никакие собственные приложения не загружались вовсе. -- реакторы ошибок не прощают.

Cпасибо за предоставленную информацию.
mmax вне форума  
 
Непрочитано 03.08.2006, 06:45
#4
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
И как говорил Николай Николаевич в "САПР на базе AutoCAD - как это делается" , пользователь не должен знать что в данный момент выполняется и не должен пугаться необычных сообщений, даже если этот пользователь сам себе программист.
Это как раз я и писал. Да, "необычные" сообщения надо прятать. Но если пользователь, штатными средствами, сознательно в момент ввода переключил какой-то режим (отключенный или переустановленный программно), то ему надо дать возможность "как следует помучиться". Он сам этого захотел. "Тетка" этого делать не будет, но найдется много желающих высказать претензии автору за "шибко умную" программу. Из тех, кто "я всегда прерываю программу по ESC", "я всегда выключаю Windows рубильником".

Цитата:
Когда писалась книга, то автор наверняка и не задумывался ни о какой динамической строке и как с ней бороться.
Да, это так. Но бороться со штатными кнопками и не надо. Какие бы они не появились в будущем.

PS. А вот с NOMUTT вообще баловаться не стоит. При сбоях грозит полной временной слепотой.
ShaggyDoc вне форума  
 
Непрочитано 03.08.2006, 09:40
#5
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844


ИМХО: реактор не надо делать постоянным - при условии отсутствия функции-обработчика можно получить по полной программе.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.08.2006, 21:54
#6
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от ShaggyDoc
...Из тех, кто "я всегда прерываю программу по ESC", "я всегда выключаю Windows рубильником"...
Небольшой off-topic и достаточно поучительная история. Тем более, что тема связана с дизайном программ.
Несколько дней назад меня пригласили в нашу базовую организацию, в которой стоит около сотни пакетов МАЭСТРО. У одной барышни ("теткой" я ее назвать не буду из этических соображений) поменяли третий PC - у нее периодически переставал работать МАЭСТРО. У остальных - все в порядке, никаких проблем. Наблюдаю такую картину - она загружает МАЭСТРО, выбирает чертеж и сразу давит на ESC - разумеется инициализация программы не происходит и соответственно ничего (или почти ничего) не работает. Т.е. если она не успела клацнуть на ESC - все нормально, если успела... Тут я и призадумался. Толи писать в инструкции - "Не нажимайте клавишу ESC при загрузке чертежа", толи попытаться поставить хук (в ObjectARX-приложении) на ESC (в AutoCAD 2006 и выше - в VisualLisp клавиша ESC не перехватывается). Так до сих пор и не решил как поступить.
Александр Ривилис вне форума  
 
Непрочитано 04.08.2006, 06:40
#7
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Еще в off-topic про ESC - раз уж коснулись дизайна программ.

В ранних AutoCAD ESC на LISP перехватить было практически невозможно. Оставлось только пытаться минимизировать убытки в обработчике ошибок. Но встречались некоторые программы (даже "системы"), в которых все было построено на бесконечных циклах, а выход - только по ESC. Тем самым пользователям просто навязывался неверный стиль работы и к нему привыкали. Настолько, что у нас один архитектор переопределял в меню кнопки мыши и на правую привязывал ^C^C.

Пришлось вести и разъяснительную работу. Объяснял примерно так:

- Из любой нормальной программы есть штатный выход, как есть он из здания. ESCape означает - "Спасите!". Использовать ESC при наличии штатного выхода - все равно, что каждый раз выпрыгивать из окна здания с криком "Спасите!".

В InCAD у нас была и сигнализация (музыкальная) о срабатывании обработчика ошибок. На биппере. При нажатии ESC звучала соответствующая мелодия, все это слышали и радостно комментировали - "опять Рая из окна выпала" или "опять тетю Аню снасильничали". В результате неосознанные движения шаловливых ручек постепенно сошли на нет.

В ruCAD заложены ловушки - ESC во время любого ввода уже не принимается, но зато всегда явно и однозначно указан выход. Обычно это пустой ввод, иногда - опция. И тоже появились претензии - "а я всегда жму ESC". Но тут уж я назад не двину.

К слову, в штатных командах AutoCAD есть некоторая грязь в оформлении. В командной строке не всегда есть опция выхода. Не каждый начинающий может догадаться о штатном выходе при пустом вводе. Вот и приучаются жать ESC.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 04.08.2006, 21:32
#8
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


http://dwg.ru/forum/viewtopic.php?t=8788,
mmax вне форума  
 
Автор темы   Непрочитано 05.08.2006, 14:22
#9
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Кстати, как мне удалось выяснить -- не обязательно вырубать динамический ввод полностью достатолчно вырубить только динамические подсказки (DYNPROMPT)

Но как ни странно если при моем реакторе ее выключить, то реактор не влетает в цикл(а точнее мой окончательный тестовый реактор и вовсе не работает), наверно это потому, что переменная изменяется в диалоговом окне.

Вобщем разработчики и авторы книг в своих будущих произведениях наверно учтут эту ситуацию и без меня
mmax вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Запрет на действия пользователя -- создать реактор или.....?

Размещение рекламы