Темы сайта
Интегрированная система ruCAD - приложение к базовой системе AutoCAD.

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

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

Так помечены материалы, не опубликованные на сайте!

Новинки
Книга была выпущена в 2004 году. С тех пор многое изменилось - появились версии AutoCAD 2005, 2006, 2007, 2008.

Система ruCAD была выпущена в свет, появились замечания и предложения пользователей. Да и у нас появились новые представления по некоторым вопросам.

Поэтому в материалы книги, публикуемые на сайте, мы вносим дополнительные замечания, выделяемые так:
Так выделяются дополнительные замечания, комментарии, указания!

Проблемы с прерыванием LISP-программ


Часть претензий к ruCAD вызвана блокировкой прерывания работы клавишей ESC. Разберемся, зачем это было сделано, так как объяснять приходится часто, а мы предпочитаем, чтобы дотошные пользователи, при желании, могли бы понять, почему именно сделано так, а не иначе.

 

Объяснение будет длинным, а начинать его придется издалека.

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

Как правило, на клавишу ESC привязываются действия, ассоциирующиеся у человека с отменой чего-то. Если в диалоговом окне есть кнопка Отменить, то, весьма вероятно (но не обязательно) что нажатие ESC будет эквивалентно щелчку по Отменить, или по кнопке закрытия окна.

У нас используется много диалоговых окон с GUI-интерфейсом и там ESC обрабатывается таким образом.

Большое спасибо пользователю 5x8nug, который здорово потрудился и отыскал наши упущения в некоторых диалоговых окнах, где обработка ESC не была предусмотрена.

Это различные файловые диалоги и другие подобные им окна.

 

 

В LISP-программах исторически сложилась иная ситуация. Это древний язык 1952 года рождения, а в AutoCAD изначально был включен один из диалектов LISP, получивший после "привязки к местным условиям, имя AutoLISP. Одновременно с лучшими качествами были унаследованы и недостатки.

Клавиши ESC, к которой привыкли пользователи современных компьютеров - потомков IBM-PC, когда-то вообще не было, как и многих других клавиш. И клавиатур сначала не было! А языки программирования были. Потом клавиатуры появились, но разных конструкций (ветераны помнят эти времена). Программы часто управлялись с помощью ввода управляющих последовательностей символов. Сейчас их называют горячими клавишами.

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

Теперь разберем, где же она применяется.

Штатные, "стандартные" команды AutoCAD, как правило, имеют возможность досрочного прерывания или завершения клавишей ESC, хотя и имеются другие варианты штатного завершения. Обычно это действие по умолчанию (нажатие пробела или Enter). Прерывание будет выполнено и при выборе пункта меню до завершения работающей команды. Если это не пункт меню с прозрачной командой. Для этого в макросе меню и записаны символы ^C, эмулирующие нажатие ESC. При прерывании штатной команды AutoCAD ничего страшного не происходит - просто вылетает сообщение *Cancel*.

С программами написанными на LISP все сложнее. Такая программа не является приложением Windows, любое из которых управляется событиями. Обработку нажатий клавиш выполняет сам AutoCAD.

Если в Windows-приложении нажатие ESC может прервать выполнение какого-то участка кода, то AutoLISP изначально был сделан так, что при нажатии ESC прерывалась вся программа и вступала в работу специальная функция *error*. Эта функция и должна была сделать что-то необходимое при нештатной ситуации. Если программист не предусмотрел такой функции, то просто вылетает сообщение *Cancel*.

Но в LISP-программах, обычно вначале, выполняются различные настройки системных переменных. При завершении или прерывании хорошая программа должна восстановить системное окружение. Штатный выход, предусмотренный программистом, обычно предусматривает и восстановление окружения. А вот при нештатном выходе программа не дорабатывает до конца и окружение не восстанавливается.

Вот отсюда и многие беды, по поводу которых постоянно задаются вопросы на форумах. Люди используют некорректно написанные "довески", прерываю их работу, а потом жалуются, что пропало то одно, то другое, то третье. Во многом это вина программистов, не умеющих писать функцию обработки ошибок *error*. В книге САПР на базе AutoCAD - как это делается, в главе 10 мы подробно разбирали этот вопрос.

Обычному пользователю эти технические детали не интересны. Ему работать надо, а обеспечить правильную работу должен программист. Самым правильным решением по борьбе с ошибками является предотвращение ошибок в месте их возникновения. Идеальным решением было бы выламывание клавиши ESC у "автокадчиков. Шутка.

В версиях AutoCAD включая 14 нажатие ESC было "ломом, против которого нет приема". Его никак нельзя было перехватить и обработать, а функция *error*, даже правильно написанная, не может предотвратить всех неприятных последствий, особенно при работе "обезьяны с гранатой". Одним из таких последствий является несбалансированность меток отката. В результате при отмене команды может удалиться совсем не то, что ожидал пользователь, и не всегда он может это заметить. Да и срабатывает *error*
после фатального разрушения программы, когда уже "поздно пить боржоми".

Одним из способов борьбы с последствиями прерываний у нас было воспитание пользователей, привитие культуры работы. Само слово Escape означает бегство, спасение, то есть некий нештатный выход из ситуации. Наподобие выпрыгивания из окна с криком - Спасите! Да, такой способ покидания помещения возможен, например при пожаре. Но в обычной обстановке лучше выходить через дверь, особенно если выход явно обозначен.

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

После появления дополнительных функций VisualLISP ситуация изменилась. Стало возможным отлавливать ошибки не после, а во время возникновения.  Мы получили и возможность контроля над ESC, и вообще над вводом данных, то есть  позволять вводить только правильные данные.

А когда вообще может потребоваться нажимать ESC?

1. При зависании и зацикливании программы. Бывают, к сожалению, такие ситуации. Как правило, они вызваны алгоритмическими ошибками в программе, но иногда это не зависти и от программы.  Вот тут  нажатие  ESC может быть единственным средством спасения, причем даже не нажатие, а прижатие на некоторое время. Блокировка ESC в циклах не нужна и опасна - может потребоваться убиение всего AutoCAD.

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

Тут есть нюанс. Штатный выход всегда предусмотрен в самом начале программы, и при цикличном повторении ввода. Например, может быть такой диалог:

Точка начала элемента <Выход>:
Пользователь указывает точку любым способом, или, нажав Пробел или Enter, покидает программу.

Если указана точка,  может последовать приглашение:

Направление окончания элемента:

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

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

Однако воспитание у людей разное, и неприличное в одном месте, считается допустимы в другом. Вот некоторые и писали - Хочу ESC! Хочу! Я так привык!

И даже - "Было бы в ruCAD прерывание по ESC - цены бы этой программе не было!"

Ну что ж, не было бы счастья, да несчастье помогло. При разработке ruCAD-3D выяснилось, что многократную визуальную вставку блоков в трехмерном пространстве с помощью применяемых нами программных ухищрений выполнять невозможно - требуется прерывание цикла именно с помощью ESC. Так как "многократная визуальность" для нас стратегически важнее, пришлось сделать такую вставку с приглашением вместо:

Точка вставки <Выход>:

в виде

Точка вставки или ESC для выхода:

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

Многие наши дамы, получившие соответствующее воспитание, были этим недовольны. Они много лет завершали вставку блоков нажатием Enter, а тут вдруг потребовалось жать ESC. Боялись издавать звуки, однако. Пришлось объяснить, что к чему, что программы давно работают молча. И что вообще теперь про кофе можно говорить "оно" и ковыряться в носу за столом.

 

Изменение обработки клавиши ESC вошло в ruCAD RC05 Free.

 

 

    Содержание раздела «О клавише ESC»: