| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
01.08.2006, 23:26 | #1 | |
Запрет на действия пользователя -- создать реактор или.....?
Программист широкого профиля.
Челябинск
Регистрация: 08.09.2005
Сообщений: 722
|
||
Просмотров: 4589
|
|
||||
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 - как это делается". |
|||
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
ShaggyDoc,
Предложенный вами способ, в той теме, работает очень хорошо если его дополнить вырубаниями Nomutt но это для обычной командной строки. Сейчас речь идет о динамической строке которая появилась только в 2006м акаде. Это тоже обычная строка но она висит на курсоре и перемещается вместе с ним. Также у этой строки есть и другие висячие и мельтешащие вещи с очень полезной информацией(например она может показать на какое расстояние и угол оттянут курсор от точки вставки), но речь не о них их в принципе можно оставить. Беда в том что на эту динамическую строку не действуют переменные CMDECHO NOMUTT, она при любом раскладе выдает стандартные сообщения. Но она сама управляется переменной DYNMODE, значения от 0 до 3. Ее можно выключить из лисп функции, но я спокойно могу включить ее во время PAUSE, так как кнопка включения находится рядом с кнопками привязок, отслеживаний, сетки, веса, итп и вродебы имеет свою функциональную клавишу на клавиатуре. Именно поэтому нужно уделить ей внимание. И как говорил Николай Николаевич в "САПР на базе AutoCAD - как это делается" , пользователь не должен знать что в данный момент выполняется и не должен пугаться необычных сообщений, даже если этот пользователь сам себе программист. Когда писалась книга, то автор наверняка и не задумывался ни о какой динамической строке и как с ней бороться. А реактор получился хороший Вот его тестовая версия Код:
Вот только чтобы сделать этот реактор пришлось два раза автокад переустанавливать -- после некоторых ошибочных действий работать в реДакторе VL было просто невозможно, при открытом реДакторе окно рисунка становилось неактивным даже если никакие собственные приложения не загружались вовсе. -- реакторы ошибок не прощают. Cпасибо за предоставленную информацию. |
|||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
Цитата:
Цитата:
PS. А вот с NOMUTT вообще баловаться не стоит. При сбоях грозит полной временной слепотой. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844
|
ИМХО: реактор не надо делать постоянным - при условии отсутствия функции-обработчика можно получить по полной программе.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Цитата:
Несколько дней назад меня пригласили в нашу базовую организацию, в которой стоит около сотни пакетов МАЭСТРО. У одной барышни ("теткой" я ее назвать не буду из этических соображений) поменяли третий PC - у нее периодически переставал работать МАЭСТРО. У остальных - все в порядке, никаких проблем. Наблюдаю такую картину - она загружает МАЭСТРО, выбирает чертеж и сразу давит на ESC - разумеется инициализация программы не происходит и соответственно ничего (или почти ничего) не работает. Т.е. если она не успела клацнуть на ESC - все нормально, если успела... Тут я и призадумался. Толи писать в инструкции - "Не нажимайте клавишу ESC при загрузке чертежа", толи попытаться поставить хук (в ObjectARX-приложении) на ESC (в AutoCAD 2006 и выше - в VisualLisp клавиша ESC не перехватывается). Так до сих пор и не решил как поступить. |
||||
|
||||
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. |
|||
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
|
|||
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
Кстати, как мне удалось выяснить -- не обязательно вырубать динамический ввод полностью достатолчно вырубить только динамические подсказки (DYNPROMPT)
Но как ни странно если при моем реакторе ее выключить, то реактор не влетает в цикл(а точнее мой окончательный тестовый реактор и вовсе не работает), наверно это потому, что переменная изменяется в диалоговом окне. Вобщем разработчики и авторы книг в своих будущих произведениях наверно учтут эту ситуацию и без меня |
|||