|
АвтоЛИСП - реализация языка программирования
Глава 1
Введение
АвтоЛИСП - реализация языка программирования ЛИСП, вложенного в пределах
системы АвтоКАД. АвтоЛИСП позволяет пользователям и разработчикам АвтоКАДА писать
макропрограммы и функции на очень высоком, находящем графическое применение, уровне
языка. ЛИСП очень гибок, легок в изучении и применении.
Замечание
Для более эффективного применения АвтоКАДА нет необходимости изучать АвтоЛИСП;
если у вас нет опыта компьютерного программирования, прочтите тольно установочные
требования в главе 2 - это позволит вам увидеть применяемые АвтоЛИСПом преимущества
многочисленных меню АвтоКАДА. Однако, если вам нравится программировать, прочтите это
руководство до конца, чтобы узнать как применять АвтоЛИСП для преобразования основного
назначения пакета изготовления чертежей АвтоКАДА в более мощный инструмент программиста.
Данная книга - справочник, а не учебник по программированию. Хотя в главе 3 мы и
приводим пример практического применения АвтоЛИСПа, мы все же рекомендуем достать
различные тексты на ЛИСПе для изучения этого языка программирования: Винстон и Хорн
"LISP" (второе издание), "Looking at LISP" Тони Хасемера (обе книги опубликованы Эддисоном
Веслей). ЛИСП - язык, содержащий много диалектов: МакЛИСП, ИнтерЛИСП, ЗетаЛИСП и
КоммонЛИСП. АвтоЛИСП по синтаксису и условным обозначениям наиболее близок к
КоммонЛИСПу, но он с меньшим подмножеством и имеет больше специфических для АвтоКАДа
дополнительных функций. Этот справочник содержит все функции автоЛИСПа и способы их
применения.
1.1 Типы данных в АвтоЛИСПе
АвтоЛИСП содержит несколько различных типов данных:
- lists - списки
- symbols - символы
- strings - строчки
- real numbers - действительные числа
- integers - целые числа
- file descriptors -дескрипторы файла
- AutoCAD entity "names" - "имена" объектов АвтоКАДа
- AutoCAD selection-sets - секции установок АвтоКАДа
- subrs (build-in functions) - (встроенные функции)
Целые числа - 16-битные числа со знаком с диапазоном от -32768 до +32767.
Действительные числа представлены как плавающая точка с двойной точностью. Строчки могут
быть любой длины, их память динамически распределяется.
АвтоЛИСП содержит несколько встроенных функций по обеспечению базиса для про-
граммирования чертежей в двух и трех измерениях. При работе с графическими координатами,
рассматриваются следующие условные обозначения:
2D points - выражены как перечни двух действительных чисел
(X Y):
(3.400000 7.520000 )
Первое значение - координата X, второе - Y.
3D points - выражены как перечни трех действительных чисел
(X Y Z ):
(3.400000 7.520000 1.000000)
Первое значение - координата X,второе -Y, третье -Z.
Всякий раз при требовании АвтоКАДа ввести определенный тип (например, точку или
масштабный коэффициент) может применяться выражение этого типа или функция АвтоЛИСПа,
вводящая в результате этот тип.
1.2 Вычислитель языка АвтоЛИСП
Вычислитель является основой интерпретатора каждого варианта ЛИСПа. Он берет
строчку входных данных пользователя, вычисляет ее и выдает результат. В процессе вычисления
АвтоЛИСПа участвуют:
- целые, действительные числа; строчки; дескрипторы файла; встроенные функции - вы-
числяются по отношению сами к себе;
- символы - вычисляются к значению их текущей компоновки;
- списки - вычисляются согласно их первого элемента, если они вычисляются в:
? список (или пустой список); список предполагает быть определением функции, а
функция вычисляется с применением значений остальных элементов списка в качестве
параметров.
? название внутренней функции (subrs); оставшиеся элементы списка проходят в subr
как формальные параметры и вычисляются с помощью subr.
Если в ответ на подсказку АвтоКАДа "Command:" вы вводите выражение на языке Авто-
ЛИСП, АвтоЛИСП вычислит выражение и напишет результат. Подсказка АвтоКАДа "Command:"
вновь появится на экране.
Если напечатано или прочитано из файла неправильное выражение, АвтоЛИСП выдаст
следующую подсказку:
n>
где n - целое число, обозначающее сколько уровней левых скобок осталось незакрытыми.
Если появилась эта подсказка, вы должны напечатать n правых скобок для того, чтобы выйти из
этого состояния. Общая ошибка - игнорирование заключенного в круглых скобках значка (") в
строке текста; в этом случае правые скобки будут интерпритированы как уже процитированные и
не будут учитываться при изменении n. Для того, чтобы исправить это положение, напечатайте
перед n правыми скобками кавычки.
1.3 Лексические условные обозначения
Процедура ввода АвтоЛИСПа имеет несколько форм. Ее можно проделать следующим
образом: находясь в АвтоКАДе напечатать вызов с клавиатуры; прочитать из ASCII файла или
из строчечной переменной. В любом случае необходимо следующее:
- имена символов могут состоять из любого сочетания печатных характеристик,кроме
следующих: ( ) . ' " ;
- имя символа или числовой константы будут завершаться следующими знаками:
( ) ' " ; (промежуток) (конец линии)
- выражения могут состоять из многочисленных линий;
- многочисленные промежутки между символами эквивалентны единичному промежутку.
Пока не требуется смещение, вы можете применять их для придания ясности структуре ваших
функций;
- символы и имена функций (subrs) не чувствительны к регистрам в АвтоЛИСПе. Имена
символов могут и не начинаться с цифры;
- константы целых чисел могут начинаться с необязательных знаков "+" или "-". Как упо-
миналось ранее, они находятся в диапазоне от -32768 до +32767;
- константы действительных чисел содержат один или более цифровых разрядов, сопро-
вождаемые точкой десятичной дроби, после которой следуют один или несколько цифровых зна-
ков, например ".4" не рассматривается как действительное число, правильно будет "0.4". Анало-
гично,"5." недействительно, правильно - "5.0". Действительные числа могут применяться в науч-
ных записях т.е. могут встретиться необязательное "е" или "Е", сопровождаемое цифровым
показателем;
- буквенные строчки - последовательность символов, заключенная в кавычки. Внутри
строки, взятой в кавычки, символ (\) означает возможность включения контрольных символов.
Рассмотрим следующие текущие коды:
\\ означает символ "\"
\e означает выход
\n означает новая строка
\r означает ввод
\t означает табуляцию
\nnn означает символ, чей восьмиричный код - nnn
Например, на новой линии появится следующая подсказка:
(prompt "\nEnter first point: ")
- единичный цитируемый символ может применяться как сокращение функции QUOTE.
Так, 'foo эквивалентно (quote foo)
- комментарии, взятые из дисковых файлов, могут быть включены в программы Авто-
ЛИСПа. Комментарии начинаются с двоеточия и продолжаются до конца строки. Например,
:This entire line is a comment
:Эта полная строка - комментарий
(setq area (* pi r r )) :Compute area of circle
:Рассчитайте площадь круга
1.4 Условные обозначения примечаний
Это справочное пособие применяет определенные условные обозначения для документи-
рования режима функций. Например,
(moo ...)
строка цифра
Имя функции показано таким, каким вы должны его ввести. Заключенные в кавычки эле-
менты данных, следующие за именем функции, определяют количество и тип параметров, предпо-
лагаемых функцией.
В этом промере функция "moo" имеет два необходимых параметра: строка и цифра. Эл-
липсис ("...") определяет, что к функции могут быть присоединены дополнительные цифровые
параметры. Не включайте в строку скобки или эллипсисы, если вы снабжаете функцию ссылка-
ми.
Вызов данного формата функции "moo" показан выше; для функции "moo" будут
действительными следующие ссылки:
(moo "Hello" 5)
(moo "Hi" 1 2 3 )
Следующие примеры не соответствуют требуемому формату и приведут к ошибкам:
(moo 1 2 3 ) (первый параметр должен быть строкой)
(moo "Hello") (должен быть хотя бы один цифровой параметр)
(moo "do" '(1 2)) (второй параметр должен быть строкой,а не перечнем)
Когда необязательный параметр может возникнуть один раз, без повторений, он заключа-
ется в квадратные скобки ("[]"):
(foo ])
Здесь функция "foo" предполагает один строчечный параметр и принимает один необяза-
тельный цифровой параметр. Например, для функции "foo" будут действительны следующие вызо-
вы:
(foo "catch")
(foo "catch" 22)
В этом примере показаны неправильные вызовы:
(foo 44 13) (первый параметр должен быть строчечным)
(foo "foe" 44 13) (слишком много параметров)
1.5 Изменения и расширения
Обработка ошибки
Если АвтоЛИСП сталкивается с ошибкой во время вычисления, он выдает сообщение сле-
дующей формы:
error:text
где text - описание ошибки. Если установлена функция "ERROR" (не ноль), Авто-
ЛИСП,вместо выдачи сообщения, выполняет эту функцию ("text"- ее единственный параметр).
Если"ERROR" не установлена, или граничит с нулем, вычисление АвтоЛИСПа останавливается,
а на экране появится обратный ход вызова функции и ее вызывающей программы до 100 уровней
вглубь.
Глава 2
Установка АвтоЛИСПа
2.1 Требования
Выпуск формата
АвтоЛИСП снабжается любой копией Автокада. Никаких специальных установок не
требуется. Файл "acadl.ovl" на рабочей дискете является оверлеем АвтоЛИСПа в АвтоКАДе.
Одна из рабочих дискет АвтоКАДа содержит файл "readme.doc". Просмотрите
этот файл; он содержит самые последние изменения и корректировки в документации АвтоКАДа
и АвтоЛИСПа.
2.2 Автоматические функции - файл "acad.lsp"
Начиная сеанс работы графического редактора АвтоКАДа, АвтоЛИСП загружает файл
"acad.lsp" (если такой существует). На этом файле вы можете задать определения наиболее часто
используемых функций и они будут автоматически высчитываться при редактировании чертежа.
См.определение функции DEFUN в главе 4 .
Глава 3
По садовой дорожке к АвтоЛИСПу
Большое количество мощности АвтоКАДа поступает за счет его способности заказывать
ее. Поближе познакомившись с АвтоКАДом, можно заметить, что вам бы хотелось, чтобы у него
была некоторая возможность, часто необходимая вам. Вы можете начать добавление последова-
тельности команд, которые вы часто применяете на экране, кнопок или планшетного меню. Вы
можете определить новые типы линий, образцы штриховки или текстовый шрифт. Этим вы ис-
пользуете преимущества открытой архитектуры АвтоКАДа - возможность расширить его и сфор-
мировать его в ваш персонально-спроектированный инструментарий, реагирующий на особенно-
сти вашего мышления и работы.
Язык АвтоЛИСП - наиболее мощное условие для расширения возможностей АвтоКАДа.
Эти, обеспеченныеАвтоКАДом благоприятные условия - реализация языка программирования
ЛИСП, в сочетании с АвтоКАДом. Составляя программу на АвтоЛИСПе, вы можете добавить
команды для АвтоКАДа и иметь больше мощности для модифицирования АвтоКАДа (что и
имеют наши разработчики программного обеспечения).
Вскоре мы добавим новую команду для АвтоКАДа. В процессе объяснения принципа ра-
боты АвтоЛИСПа, мы дадим вам возможность использования его мощности для работы на вас.
Команда, которую мы собираемся создать, сориентирована на архитектуру поверхности, но
принципы , которые вы изучите, - релевантные, не считающиеся с вашей областью применения.
3.1 Что вы должны знать перед началом работы
Мы предполагаем,что вы сносно владеете АвтоКАДом - т.е. вы знаете команды Авто-
КАДа и общие принципы их применения. Мы также предполагаем, что вы знакомы с текстовым
редактором, который может создавать ASCII файлы. Сейчас мы напишем программу, а вы приме-
няйте свой текстовый редактор для выполнения наших заданий.
В этом примере мы будем применять много функций АвтоЛИСПа. Последующие
главы этого руководства содержат полное объяснение всех этих функций.
3.2 Задача
Наша задача - создать новую программу для АвтоКАДа, которая рисует садовую
дорожку и заполняет ее круглыми плитами.
Наша новая команда будет иметь следующую последовательность команд:
COMMAND: PATH (ДОРОЖКА)
Start point of path: start point
(Начальная точка дорожки: начальная точка)
End point of path: end point
(Конечная точка дорожки: конечная точка)
Half point of path: number
(Половина ширины дорожки: число)
Radius of tiles: number
(Радиус плит: число)
Spacing between tiles: number
(Расстояние между плитами: число)
где начальная и конечная точки определяют центральную линию дорожки. Определяется поло-
вина ширины дорожки и вводится радиус круглых плит. Наконец, определяется расстояние между
плитами. Половину ширины дорожки мы определяем раньше, чем полную ее ширину потому, что
это позволяет более четко определить отрезок типа "резиновая нить" от начальной точки.
3.3 Начало
Мы до конца разовьем эту прикладную задачу (по восходящей). В этой задаче мы будем
применять жесткое задание углов.
АвтоЛИСП, как и многие другие языки программирования, определяет углы в радианах.
Радианы измеряют углы от 0 до 2'PL. Так как большинство измеряет углы в градусах, мы опреде-
лим функцию, которая преобразовывает градусы в радианы. Используя ваш редактор текста, соз-
дайте файл GP.LSP. Введите следующую программу:
: Convert angle in degree to radians
(defun dtr (a)
(*pi (/a 180.0))
)
Давайте рассмотрим, что это даст. Мы определили функцию, применив в АвтоЛИСПе
функцию DEFUN. Функция называется DТR (сокращение от "degrees to radians" ("градусы в ра-
дианы")).
Она содержит один параметр "а" - угол в градусах. В результате - выражение:
PI * (a / 180.0)
которое в примечаниях ЛИСПа расшифровывается как: "произведение от PI, умножен-
ное на коэффициент А, разделенное на 180 градусов". PI предопределяется ЛИСПом как 3.1459...;
строчка, начинающаяся с двоеточия,- комментарий - АвтоЛИСП игнорирует текст, расположен-
ный после двоеточия.
Сохраните файл на диске, затем перейдите на новый чертеж (имя не имеет значения, т.к.
мы не будем сохранять чертеж).
Когда появится подсказка АвтоКАДа "Command:", загрузите функцию, введя:
Command: (load "gp")
АвтоЛИСП загрузит вашу функцию, отражая ее имя в "DТR". Далее в этом руководстве,
когда мы говорим : "Введите АвтоКАД и загрузите программу", будет подразумеваться проде-
ланная только что последовательность.
Сейчас мы проверим функцию, выполняя различные действия. Из определения радианы,
0 градусов должно соответствовать нулевой радиане; введите в АвтоКАД строчку:
Command: (dtr 0)
Печатая строку, начинающуюся с левой круглой скобки, вы заставляете АвтоКАД пере-
водить эту строку в АвтоЛИСП для вычисления. В этом случае мы высчитываем функцию DIR,
только что определенную нами, передавая ей параметр - ноль. После высчитывания функции, Ав-
тоКАД выдаст результат; так наш ввод выдаст следующий ответ:
0.000000
Теперь давайте попробуем 180 градусов. Если вы введете
Command: (dtr 180)
вы получите ответ:
3.141593
Это показывает, что 180 градусов равно PI радианам. Если вы исследуете функцию, вы
убедитесь, что это именно так.
Для выхода из АвтоКАДа введите:
Command: QUIT
и на подсказку
Really want to discard all changes to drawing? Y
(Действительно хотите не учитывать все изменения в чертеже? Д)
ответьте
0
в основном меню для возврата к DOS подсказке. Далее в руководстве под "Выйти из АвтоКАДа"
будет подразумеваться эта процедура.
3.4 Ввод
Наша команда garden path (садовая дорожка) запросит у пользователя следующую ин-
формацию: где рисовать дорожку, какой ширины ее делать, размер конкретных плит и как близко
друг к другу их размещать. Мы определим функцию, которая будет спрашивать пользователя по
всем этим пунктам, а затем просчитает цифры, которые мы проставим в конце команды.
Используя редактор текста, добавьте следующие строчки в GP.LSP (мы будем приме-
нять вертикальную черту для выделения добавляемых строчек).
: Convert angle in degrees to radians
(defun dtr (a)
('pi (/ a 180.0))
)
| :Acquire information for garden path
| (defun gpuser ()
| (setq sp (getpoint "\nStart point of path:"))
| (setq ep (getpoint "\nEnd point of path:"))
| (setq hwidth (getdist "\nHalf width of path:"sp))
| (setq trad (getdist "\nRadius of tiles:"sp))
| (setq pangle (angle sp ep ))
| (setq plength (distance sp ep ))
| (setq width (' 2 hwidth))
| (setq angp90 (+pangle (dtr 90))) : Path angle +90 deg
| (setq angm90 (-pangle (dtr 90))) : Path angle -90 deg
Необязательно смещать выражения, содержащие ваши функции. Фактически вы можете
ввести всю программу в одну строку. Однако, смещение и прерывание строчки служит созданию
более понятной и четкой для чтения структуры программы. Также, расположение начальных и ко-
нечных круглых скобок основных выражений на одной оси, способствует уверенности, что ваши
скобки верно сбалансированы.
Итак, мы определили функцию GPUSER. Она не принимает параметров, а спрашивает
пользователя по всем пунктам. Функция SETQ приводит переменную АвтоЛИСПа к определен-
ному значению. Первая SETQ приводит переменную SP (начальная точка ) к результату
функции GETPOINT. Пользователь задает точки для функции GETPOINT. Для получения точки
будет применяться строка, определяющая подсказку АвтоКАДа. "\n" заставляет подсказку
появиться на новой линии. Мы применяем функцию GETPOINT для получения значения
середины ширины дорожки, радиуса плиты и расстояния между плитами. Второй параметр
функции GETPOINT , SP, определяет "базовую точку" расстояния. Расстояние можно
создать, определив в АвтоКАДе точку, соответствующую начальной точке дорожки, и
присоединив к ней линию резиновой нити.
После ввода высчитываются наиболее часто применяемые переменные. PANGLE обозна-
чает угол от начальной до конечной точки дорожки. Функция ANGLE вводит этот угол по задан-
ным двум точкам. PLENGTH вводит длину дорожки. Функция DISTANCE рассчитывает расстоя-
ние, заданное двумя точками. Задав половину ширины дорожки, мы рассчитываем общую шири-
ну, умножив на два заданную величину. И, наконец, мы рассчитываем и сохраняем угол дорожки
плюс-минус 90 градусов в переменных ANGP90 и ANGM90 соответственно (т.к. углы в Авто-
ЛИСПе рассчитываются в радианах, мы перед этими рассчетами применили функцию DTR для
перевода градусов в радианы).
Сохраните эту откорректированную программу на диске, запустите АвтоКАД и загрузите
программу. Сейчас мы проверим функцию ввода, чтобы убедиться, что она работает правильно.
Приведите в действие функцию, напечатав:
Command: (gpuser)
Ответьте на подсказки следующим образом:
Начальная точка дорожки: 2,2
Конечная точка дорожки: 9,8
Половина ширины дорожки: 2
Радиус плиты: .2
Расстояние между плитами: .1
GPUSER использует ваши ответы для подсчета необходимых ему дополнительных пе-
ременных и на экране появится результат последних подсчетов (в данном случае - 0,826169,
значение ANGM90 в радианах). Вы можете разгрузить все переменные, установленные функцией
GPUSER путем подстановки восклицательного знака (!) перед их именами. Это заставит Авто-
КАД вычислить переменные и выдать результат на экран. Если вы введете следующие команды,
вы получите следующие результаты:
Command: !sp
(2.000000 2.000000)
Command: !ep
(9.000000 8.000000)
Command: !hwidth
2.000000
Command: !width
4.000000
Command: !trad
0.200000
Command: !tspac
0.100000
Command: !pangle
0.708626
Command: !plength
9.219544
Command: !angp90
2.279423
Command: !angm90
-0.862169
Обратите внимание, что PANGLE, ANGP90 и ANGM90 представлены в радианах. После
проверки этих значений, выйдите из АвтоКАДа и вернитесь в свой текстовый редактор в GP.LSP.
3.5 Добавление команд в АвтоКАД
Наконец, мы готовы объединить все составные части в команду АвтоКАДа. Если мы
определим функцию с именем C:XXX на языке АвтоЛИСП, вводя ХХХ (предполагая,что ХХХ не
является командой АвтоКАДа) мы активизируем функцию. Для завершенности ввода в работу
нашей команды PATH, мы определяем функцию C:PATH, что дает возможность нам впоследствии
после загрузки GP.LSP напечатать только PATH и наша команда garden path будет вычисляться.
Используйте ваш текстовый редактор для добавления указанной строчки в GP.LSP, за-
тем запустите АвтоКАД и загрузите программу.
С добавлением функции C:PATH, мы добавили команду PATH в АвтоКАД. Вы можете
проверить команду, осуществив следующий ввод:
Команда: PATH
Начальная точка дорожки: 2,2
Конечная точка дорожки: 9,8
Половина ширины дорожки: 2
Радиус плиты: .2
Расстояние между плитами: .1
3.6 Замораживание
Так как наша команда PATH выполняется, все команды, которые она представляет в Авто-
КАД, будут передаваться в область команд/подсказок и все выбранные ею точки будут отмечаться
на экране маленькими черточками (метками). Раз командная функция налажена, для появления
вводных команд АвтоЛИСПа точно похожих на команды АвтоКАДа, этот ввод может быть отме-
нен.
Применение функции GETVAR необходимо, чтобы получить текущие значения режимов
АвтоКАДА BLIPMODE и CMDECHO. Они сохраняются через SETQ в SBLIP и SCMDE. Затем
мы применяем функцию SETVAR для того, чтобы установить обе эти переменные АвтоКАДа в
нулевое положение; этим делая недействительными метки и переданные команды. Обратите
внимание, что мы установили эти переменные в нулевое положение после получения ввода от
пользователя через GPUSER. Мы хотим, чтобы метки остались для подтверждения ввода пользо-
вателя.
После того, как мы закончили черчение дорожки, мы используем функцию SETVAR для
восстановления первоначального значения этих переменных.
Сохраните файл, запустите АвтоКАД и попробуйте сейчас команду PATH. Испробуйте ее
со всех сторон, определяя различные виды ввода как при помощи поинтера, так и клавиатуры.
3.7 Резюме
За короткий период времени вы ввели новую команду в АвтоКАД. Во многих системах
КАД вам понадобится следующее: доступ к исходному коду системы КАД, квалификация про-
граммиста и большой запас знаний для проделывания операций, подобно этой. Открытая архи-
тектура АвтоКАДа и АвтоЛИСПа предоставляет вам возможности, которые большинство про-
давцов систем КАД приберегают для себя.
Вы можете применять этот пример как исходную ступень к мастерству в АвтоЛИСПе.
Вы можете начать с модифицирования и расширения команды PATH, создание которой вы сейчас
завершили. Попробуйте начертить квадратные и шестиугольные плиты. Для более полной ориен-
тации, создайте новую команду, которая принимает центральную точку и площадь, и рисует
квадрат определенной площади, заполненный плитами. Вы можете просмотреть только что запи-
санные функции в тесной связи с оставшимися главами этого руководства. Здесь мы дали очень
краткое описание работы и возможностей функций. АвтоЛИСП содержит много возможностей,
опробовав которые и ближе познакомившись с ними, вы сможете полнее их использовать.
Поскольку вы запустили АвтоЛИСП в работу, вы перешли на новый уровень совершен-
ства в АвтоКАДе. По мере использования АвтоЛИСПа для автоматизации изготовления чертежей
и конструкторских задач, вы освободите себя от различных деталей и сможете полностью посвя-
тить себя проектированию. В "лице" АвтоЛИСПа вы приобрели неутомимого помощника, кото-
рый будет служить вам десятилетия.
Глава 4
Функции АвтоЛИСПа
АвтоЛИСП снабжен многочисленными предопределенными функциями. Каждая функция
вызывается путем задания ее имени (верхний или нижний регистр) как первого элемента списка, с
параметрами (если такие существуют) как последующими элементами списка.
В этой главе вы найдете алфавитный список основных базовых функций АвтоЛИСПа.
Для удобства пользования функции сгруппированы в предметном указателе в конце справочника.
Вы обнаружите, что многие функции стандартные, их можно обнаружить в каждой реализации
языка программирования ЛИСП. Другие же функции уникальны для интерактивных
графических программных средств, обеспечиваемых АвтоКАДом. В последующих главах
описываются некоторые функции с улучшенными свойствами.
4.1 (+ . Она может применяться с действительными и
целыми числами. Если - целые числа, результат будет выражен целыми числами; если же
одно из чисел - действительное, целые числа переходят в действительные и результат будет выра-
жен действительным числом.
Например:
(+1 2) вводит 3
(+1 2 3 4.5) вводит 10.500000
(+1 2 3 4.0) вводит 10.000000
4.2 (- из первого и вводит разницу. Если задано более
двух , из первого числа вычитается сумма от второго до последнего элемента и вводится
конечный результат. Если задано только одно , вводится результат вычитания его из
нуля. Эта функция может применяться с действительнвми и целыми числами, со стандартными
правилами перехода.
Например:
(-50 40) вводит 10
(-50 40.0 2) вводит 8.000000
(-50 40.0 2.5) вводит 7.500000
(-8) вводит -8
4.3 (* . Она может применяться с действитель-
ными и целыми числами со стандартными правилами перехода.
Например:
(* 2 3) вводит 6
(* 2 3 4.0) вводит 8.000000
(* 3 -4.5) вводит -13.500000
4.4 (/ , первое делится на произведение второго и всех последующих чисел и вводится
конечное частное.
Примеры:
(/100 2) вводит 50
(/100 2.0) вводит 50.000000
(/100 20 2.0) вводит 2.500000
(/100.0 20 2) вводит 2.500000
(/100 20 2) вводит 2
(/135 360) вводит 0
(/135 360.0) вводит 0.375000
4.5 (= равны в числовом отношении, во всех других случаях вводится ноль. Эта функция
также действительна для строчек.
Примеры:
(=4 4.0) вводит T
(=20 388) вводит nil
(=2.4 2.4 2.4) вводит T
(=499 499 500) вводит nil
(="me" "me") вводит T
(="me" "you") вводит nil
4.6 (/= , в противном случае вводится nil. Если задано более двух параметров, функция не
определяется. Например:
(/=10 20) вводит T
(/=5.43 5.43) вводит nil
(/=5.43 5.44) вводит T
4.7 ( меньше
второго, и nil если наоборот. Если задано более двух справа от него. Например:
(< 10 20) вводит T
(< 4 4) вводит nil
(< 357 33.2) вводит nil
( ...)
Это относительная функция "менее или равно". Она вводит T, если первое , T вводится в том
случае, если каждое число меньше или равно , стоящему справа от него. Например:
(<= 10 20) вводит T
(<= 4 4) вводит T
(<= 357 33.2) вводит nil
( ...)
Это относительная функция "больше, чем" . Она вводит T, если первое , T вводится при условии, что
каждое число больше стоящего справа. Например:
(> 120 17) вводит T
(> 57 57) вводит nil
(> 3.5 1792) вводит nil
(> 77 4 2) вводит T
(> 77 4 4) вводит nil
4.10 (>=
больше или равно второму, и nil в противном случае. Если задано больше двух = 120 17) вводит T
(>= 57 57) вводит T
(>= 3.5 1792) вводит nil
(>= 77 4 4) вводит T
(>= 77 4 9) вводит nil
4.11 (-
должно быть целым. Например:
(-3) вводит -4
(-100) вводит -101
(- -4) вводит 3
4.12 (1+ может
быть действительным или целым. Например:
(1+ 5) вводит 6
(1+ -17.5) вводит -16.500000
4.13 (1-
может быть действительным или целым. Например:
(1- 5) вводит 4
(1- -17.5) вводит -18.500000
4.14 (abs может быть действитель-
ным или целым. Например:
(abs 100) вводит 100
(abs -100) вводит 100
(abs -99.25) вводит 99.250000
4.15 (and ...)
Эта функция вводит логическое И (AND) списка выражений. Она вводит ноль, если лю-
бое из выражений вычисляется к нулю, в противном случае она вводит T. Например, заданы сле-
дующие назначения:
(setq a 103)
(setq b nil)
(setq c "string")
тогда:
(and 1.4 a c) вводит T
(and 1.4 a b c) вводит nil
4.16 (angle , когда 2D
точка - перечень двух действительных чисел. Например:
(angle '(1.0 1.0) '(1.0 4.0)) вводит 1.570796
(angle '(5.0 1.33) '(2.4 1.33)) вводит 3.141593
4.17 (angtos (действительный, в радианах) и вводит его отредактирован-
ным в виде строки. Параметр - целое число; следующим образом он диктует
тип выполняемого редактирования:
Режим ANGTOS Формат Редактирования
------------ ---------------------
0 Градусы
1 Градусы/минуты/секунды
2 Грады
3 Радианы
4 Топографические единицы
Параметр и соответствуют системе переменых
AUNITS и AUPREC АвтоКАДа. Если вы пропускаете параметры, будут применяться текущие ус-
тановки AUNITS и AUPREC.
Например,заданы следующие назначения:
(setq pt1 '(5.0 1.33))
(setq pt2 '(2.4 1.33))
(setq a (angle pt1 pt2))
тогда:
(angtos a 0 0) вводит "180"
(angtos a 0 4) вводит "180.0000"
(angtos a 1 4) вводит "180d0'0"
(angtos a 3 4) вводит "3.1416r"
(angtos a 4 2) вводит "W"
4.18 (append ) и соединяет их
вместе в один перечень. Например
(append '(a b) '(c d)) введет (A B C D)
(append '((a)(b)) '((c)(d)) введет ((A)(B)(C)(D))
APPEND требует,чтобы ее параметры были в виде списков.
4.19 (apply . Например:
(apply ' + '(1 2 3)) вводит 6
(apply 'stract' ("a" "b" "c")) вводит "abc"
APPLY работает как со встроенными (subrs), так и с определенными пользователем (эти
создаются как с помощью DEFUN, так и LAMBDA) функциями.
4.20 (ascii в ее знаковый код ASCII (целые
числа). Это то же, что и функция ASC в языке БЕЙСИК. Например:
(ascii "A") вводит 65
(ascii "a") вводит 97
(ascii "BIG") вводит 66
4.21 (assoc ) как ключевого эле-
мента и вводит содержимое , ASSOC вводит
ноль. Например, предположим, что список "al" определен как:
((name box) (width 3) (size 4.7263) (depth 5))
тогда:
(assoc 'size al) вводит (SIZE 4.7263)
(assoc 'weight al) вводит nil
Список ассоциаций часто используется для запоминания данных, которые могут выби-
раться как "ключ". Это похоже на матрицы и структуры в других языках программирования.
Функция SUBST, описанная далее в этой главе, обеспечивает удобные способы отмены значе-
ний, ассоциируемые с одним ключем в перечне ассоциаций.
4.22 (atan может
быть отрицательным, диапазон вводимых углов от -pt до +pt радиан. Например:
(atan 0.5) вводит 0.463647
(atan 1.0) вводит 0.785398
(atan -1.0) вводит -0.785398
(angtos (atan -1.0) 0 4) вводит "-45.0000"
Если заданы оба параметра ( - ноль, вводится угол в плюс или минус 1.570796 радиан (90 или -90
градусов) в зависимости от знака . Например:
(atan 2.0 3.0) вводит 0.588002
(angtos (atan 2.0 3.0) 0 4) вводит "33.6901"
(atan 2.0 -3.0) вводит 2.553590
(angtos (atan 2.0 -3.0) 0 4) вводит "146.3099"
(atan -2.0 3.0) вводит -0.588002
(atan -2.0 -3.0) вводит -2.553590
(atan 1.0 0.0) вводит 1.570796
(angtos (atan 1.0 0.0) 0 4) вводит "90.0000
(atan -0.5 0.0) вводит -1.570796
(angtos (atan -0.5 0.0) 0 2) вводит "-90.00"
4.23 (atof )
Эта функция вводит преобразование строчки в действительные числа. Например:
(atof "97.1") вводит 97.100000
(atof "3") вводит 3.000000
4.24 (atoi )
Эта функция вводит преобразование строки в целое число.
(atoi "97") вводит 97
(atoi "3") вводит 3
(atoi "3.9) вводит 3
4.25 (atom - список, в противном случае вводится T. Данные,
поступающие не в виде строчек, проходят как atom. Например, даны выражения:
(setq a '(x y z))
(setq b 'a)
тогда:
(atom 'a) вводит T
(atom a) вводит nil
(atom 'b) вводит T
(atom b) вводит T
(atom '(a b c)) вводит nil
Некоторые варианты ЛИСПа различаются в своих интерпретациях ATOMа, так что по-
упражняйтесь в применении кода преобразования.
4.26 (Boole - целое число от 0 до 15, представ-
ляющая одну из 16 возможных булевых функций на двух переменных. Последовательные пара-
метры в виде целых чисел подразрядно (логически) скомбинированы, основываясь на этих функ-
циях и истинностной таблице:
Int1 Int2 Func bit
---------------------
0 0 8
0 1 4
1 0 2
1 1 1
Каждый бит , выбирая один горизон-
тальный ряд истинностной таблицы. Бит результата или ноль, или 1, в зависимости от установки
бита , бит результата 1, в противном случае бит результата - 0.
Некоторые значения для эквивалентны стандартным булевым операциям AND,
OR, XOR и NOT. Они представлены ниже:
Функция Операция Бит результата 1,если...
-------------------------------------------------------
1 AND оба входных бита - 1
6 XOR только один из двух входных битов - 1
7 OR любой или оба из входных битов
8 NOT оба входных бита - 0 (чье-то дополнение)
Например:
(Boole 1 12 5)
определяет логическое AND для значений 12 и 5. Результат 4. Аналогично:
(Boole 6 6 5)
определяет логическое XOR для значений 6 и 5,в результате - 3.
Вы можете применять другие значения - 4 , биты результата
заданы, если заданы соответствующие биты в )
Эта функция вводит T, если (или если оно близко к нулю), вводится ноль.
Например, заданы назначения:
(setq a 2)
(setq b nil)
тогда:
(boundp 'a) вводит T
(doundp 'b) вводит nil
4.28 caar, cadr, cddr, cadar, etc.
АвтоЛИСП обеспечивает связь CAR и CDR до четырех уровней вглубь. Например, задано
назначение:
(setq x '((a b) c d))
тогда:
(caar x ) эквивалентно (car (car x)) вводит A
(cdar x) эквивалентно (cdr (car x)) вводит (B)
(cadar x) эквивалентно (car (cdr (car x))) вводит B
(cadr x) эквивалентно (car (cdr x)) вводит С
(cddr x) эквивалентно (сdr (сdr x)) вводит (D)
(caddr x) эквивалентно (car (cdr (cdr x))) вводит D
В АвтоЛИСПе CADR частично применяется для получения координаты Y для точек 2D и
3D ( второй элемент в списке из двух или трех действительных чисел). Аналогично, CADDR мо-
жет применяться для определения координаты Z для точки 3D. Например:
(setq pt2 '(5.2 1.0 (2D точка)
(setq pt3 '(5.2 1.0 3.0) (3D точка)
тогда:
(car pt2) вводит 5.200000
(cadr pt2) вводит 1.000000
(caddr pt2) вводит nil
(car pt3) вводит 5.200000
(cadr pt3) вводит 1.000000
(caddr pt3) вводит 3.000000
4.29 (car пустой, вводится
ноль. Например:
(car '(a b c)) вводит A
(car '((a b) c)) вводит (A B)
(car '()) вводит nil
4.30 (cdr пустой,
вводится ноль. Например:
(cdr '(a b c)) вводит (B C)
(cdr '((a b) c)) вводит (C)
(cdr '()) вводит nil
Когда параметры - разделенные точкой пары (см. ниже CONS), CDR вводит
второй элемент без включения его в список. Например:
(cdr '(a . b) вводит B
(cdr '(1 . "Text") вводит "Text"
4.31 (chr )
Эта функция вводит переход целых чисел, представленных в знаковом коде ASCII, в од-
нознаковую строку (аналогично функции CHRS в языке БЕЙСИК). Например:
(chr 65) вводит "A"
(chr 66) вводит "B"
(chr 97) вводит "a"
4.32 (close - дескриптор файла (оприсатель),
полученный из функции OPEN. После CLOSE дескриптор файла не изменяется, но становится
недействительным. Например, представьте, что Х - действительный открытый дескриптор файла,
(close x )
закроет предполагаемый файл и введет ноль.
4.33 (command ...)
Эта функция выполняет команду АвтоКАДа в пределах АвтоЛИСПа и всегда вводит
ноль. Параметры, представляющие команды АвтоКАДа, и их подкоманды, каждый параметр вы-
считывается в АвтоКАД в качестве ответа на последующие подсказки. Имена команд и опции за-
пускаются в виде строчек, точки 2D как списки из двух действительных чисел и 3D точки как
списки из трех действительных чисел. Имена команд узнаются АвтоКАДом только при выходе
подсказки "Command". Например:
(setq pt1 '(1.45 3.23))
(setq pt2 (getpoint "Enter a point: "))
(command "line" pt1 pt2)
(command "")
Предполагая, что подсказка АвтоКАДа "Command" не выполняется, указанная выше
последовательность выражений устанавливает значение для точки "pt1", выдает подсказку для
точки "pt2" и выполняет команду АвтоКАДа LINE с двумя точками как данными ввода.
Параметрами COMMAND могут быть строчки, действительные и целые числа или точки, как
предусматри-вается последовательностью подсказки для выполнения команды АвтоКАДа.
Нулевая строчка ("") эквивалентна печатанью пробела на клавиатуре. Вызов COMMAND без
параметров эквивалентен печатанию CTR C на клавиатуре; это отменит большинство команд
АвтоКАДа.
Команды, выполняемые из функции COMMAND, не отражаются на экране, если система
переменных АвтоКАДа CMDECHO (выбранная из SETVAR или GETVAR) установлена на нуле.
Функция COMMAND - основной метод выбора команд АвтоКАДа из АвтоЛИСПа.
Вводимые функции пользователя
"GETxxx" (GETANGLE, GETSTRING, GETINT, GETPOINT) не могут применяться внутри
функции. Попытка проделать это, приведет в результате к появлению сообщения:
"ошибка:забракованная АвтоКАДом функция" и выполнение функции прекращается. Если ввод
пользователя необходим, заранее задайте функции GETxxx, как указано выше, или поместите их
между удачными вызовами функции COMMAND.
Если команда АвтоКАДа выполняется и строка,состоящая из единичного мертвого хода
("/"), просчитывается как один из параметров функции COMMAND, эта функция приостановит
прямой ввод пользователя (или смещение). Это идентично механизму паузы мертвого хода, ко-
торым снабжены меню. Однако, поскольку мертвый ход является специальным контрольным зна-
ком в ЛИСПе, требуется два символа мертвого хода для того, чтобы получить один в текстовой
строке.
Если вы выдаете промежуточные команды в то время, когда функция COMMAND приос-
тановлена, она и остается приостановленной. Тем не менее, вы можете выполнять команду ZOOM
или PAN во время паузы функции COMMAND. Пауза сохраняется до тех пор, пока АвтоКАД
получает действительный ввод и в работе нет никаких промежуточных команд.
Например:
(command "circle" "5,5" "r" "\\" "line" "5,5" "7,5" "")
начинает команду CIRCLE, устанавливает центральную точку 5,5 и затем-пауза, позволяющая
смещать радиус окружности на экране. Когда вы укажете необходимые точки (или напечатаете
необходимый радиус), функция продолжает работу, рисуя линию от 5,5 до 7,5.
Меню ввода не отменяется паузой АвтоЛИСПа. Если элемент меню активен когда функ-
ция COMMAND находится в паузе для ввода, это требование ввода может быть удовлетворено
при помощи меню. Если вы хотите отменить и элементы меню, вы должны ввести мертвый
ход в элемент меню. Когда обнаружен действительный ввод, будут продолжаться как функция
COMMAND, так и элемент меню.
4.34 (cond ( ...)
Эта функция принимает в качестве параметров любое количество списков. Она вычисля-
ет первый элемент каждого списка (в установленной последовательности) пока один из этих эле-
ментов введет значение, отличное от нуля. Затем она вычисляет те выражения, которые следуют
за тестом, и вводит значение последнего выражения в подсписке. Если в подсписке только одно
выражение (например, пропущен . COND - исходная
условная функция в АвтоЛИСПе.
Например,в этом случае COND используется для выполнения расчетов абсолютного зна-
чения:
(cond (minusp a) (-a))
(t a)
)
Если для "а" было установлено значение -10, будет введено 10. Как показано, COND мо-
жет применяться как функция типа "case". Общепринято использовать T как последнее (по умол-
чанию) выражение. Далее, другой пример. Задана ответная строка пользователя в виде
символа "s", эта функция проверяет ответ и вводит 1, если он "Y" или "y" и 0, если он "N" или
"n", в остальных случаях -nil (нуль).
(cond (( = s "Y") 1)
(( = s "y") 1)
(( = s "N") 0)
(( = s "n") 0)
( t nil)
)
4.35 (cons ) и
список ( ), и вводит дополнение этого элемента в начало списка. Например:
(cons 'a '(b c d)) вводит (A B C D)
(cons '(a) '(b c d)) вводит ((A) B C D)
Обратите внимание, что первый элемент может быть атомом в списке. CONS также до-
пускает атом на место параметра в , создающего структуру, известную как dotted pair
(точечная пара). Когда на экран выдается точечная пара, АвтоЛИСП печатает период или точку
между первым и вторым элементом пары. Точечные пары занимают меньше места в памяти, чем
обычные списки; функция CDR может применяться для ввода второго атома. Таким образом:
(cons 'a 'b) вводит ( A . B)
(car (cons 'a 'b)) вводит A
(cdr (cons 'a 'b)) вводит B
4.36 (cons выражен в радианах. Например:
(cos 0.0 ) вводит 1.000000
(cos pi ) вводит -1.000000
4.37 (defun (обратите внимание, что имя функции
автоматически взято в угловые скобки, так что она не должна заключаться пользователем в скоб-
ки). За именем функции следует список параметров (возможно пустой), за ним косая черта не обя-
зательна, и имена одного или более локальных символов для функции. Последний параметр (если
таковой имеется) и первый локальный символ должны быть отделены косой чертой или хотя бы
одним пробелом.
Если не объявляются ни параметры, ни локальные символы, после имени функции
должны быть пустые круглые скобки. Например:
(defun myfunc (x y)...) (функция принимает 2 параметра)
(defun myfunc (/a b)...) (функция имеет 2 локальных символа)
(defun myfunc (x/temp)...) (один параметр и один локальный символ)
(defun myfunc ()...) (нет параметров и локальных символов)
Следующие за списком параметров и локальных символов одно или несколько выражений
вычисляются при выполнении функции.
Сама функция DEFUN вводит имя определенной функции. Если вызвана определенная
таким образом функция, ее параметры будут вычислены и ограничены (подогнаны) параметрами
символов. Локальные символы могут применяться в функции без изменения их связи на внеш-
них уровнях. После вычисления результата последнего выражения, функция будет введена. Все
предыдущие выражения в функции имеют побочный эффект. Сама функция DEFUN вводит имя
определенной функции. Например:
(defun add (x y)
(+ x y)
)
(add 10 5) вводит 15
(add -7 . 4) вводит 2,60000
и
(defun dots ( x y/temp)
(setq temp (strcat x "..."))
(strcat temp y)
)
(dots "a" "b" ) вводит "а...b"
(dots "from" "to") вводит "from...to"
Никогда не применяйте имя встроенной функции или символа в качестве , посколь-
ку это сделает встроенную функцию недоступной.
4.37.1. Функции библиотек и автоматическая загрузка
Определения функций могут храниться в файле и загружаться при помощи функции
LOAD АвтоЛИСПа (эта функция описана дальше в этой главе). Если существует файл "acad.lsp",
АвтоЛИСП будет загружать его автоматически каждый раз при введении графического редакто-
ра АвтоКАДа; вы можете применять эту функцию для создания библиотеки полезных функций и
для создания гарантии присутствия этой библиотеки.
4.37.2. Функции С:ххх - дополнение команд АвтоКАДа
Вы можете ввести дополнительные команды в АвтоКАД, применяя функцию DEFUN для
определения функций, вводящих в работу эти команды. Для того, чтобы применяться как
команды АвтоКАДа, эти функции должны придерживаться следующих правил:
1. Функция должна иметь имя следующей формы: "С:ХХХ", где все буквы - верхнего
регистра. Часть имени "С" должна присутствовать всегда, часть "ХХХ" может быть именем
команды по вашему выбору, при условии, что она не дублирует никаких команд АвтоКАДа,
встроенных или внешних.
2. Функция должна быть определена с нулевым списком параметров (но локальные сим-
волы могут присутствовать).
Например, функция: нарисовать квадрат при помощи Полилиний определяет следующее:
(defun C:PSQUARE ('pt1 pt2 pt3 pt4 len)
(setq pt1 (getpoint "Lower left corner:"))
(setq len (getdist pt1 "Length of one side:"))
(setq pt2 (polar pt1 0.0 len))
(setq pt3 (polar pt2 ('PI 2.0) len))
(setq pt4 (polar pt3 PI len))
(Command "PLINE" pt1 pt2 pt3 pt4 "C")
)
Функции, определенные таким образом, могут быть вызваны просто введением части
"ХХХ" имени функции, при появлении подсказки АвтоКАДа "Command:". Если "ХХХ" - неиз-
вестная команда, АвтоКАД попытается вызвать функцию АвтоЛИСПа "С:ХХХ" без параметров.
Например, при функции C:PSQUARE диалог будет следующим:
Сommand: PSQUARE
Lower left corner: (enter a point)
Нижний левый угол: (введите точку)
Length of one side: (enter a distance)
Длина стороны: (введите размер)
Затем функция вызовет команду АвтоКАДа PLINE и введет в ее подсказки: нарисовать
желаемый квадрат. Добавление таким образом команды в АвтоКАД - очень мощное свойство
АвтоЛИСПа. Однажды определенная, новая команда может использовать все свойства, предос-
тавляемые АвтоЛИСПом. Фактическое применение новой команды не требует окружения имени
команды параметрами, так что эта введенная АвтоЛИСПом команда, применяется также, как и
любая другая команда АвтоКАДа.
4.38.(distance , где 2D точка - список
из двух действительных чисел.
Например:
(distance '(1.0 2.5) '(7.7 2.5)) вводит 6.700000
(distance '(1.0 2.5) '(3.0 4.0)) вводит 2.828427
4.39. (eq , то есть, они фактически гра-
ничат с одним и тем же объектом (например,SETQ). EQ вводит T, если два выражения идентичны,
в противном случае вводится ноль. Обычно она применяется для определения фактической иден-
тичности двух списков. Например, даны следующие назначения:
(setq f1 '(a b c))
(setq f2 '(a b c))
(setq f3 f2)
тогда:
(eq f1 f2) вводит ноль (f1 и f2 - не один и тот же список!)
(eq f3 f2) вводит T (f3 и f2 - абсолютно одинаковые списки!)
См. также функцию EQUAL.
4.40 (equal , т.е. вычисляются ли они к одному
предмету. Например, заданы следующие назначения:
(setq f1 '(a b c))
(setq f2 '(a b c))
(setq f3 f2)
тогда:
(equal f1 f2) вводит T (f1 и f2 вычисляются к одному и тому же)
(equal f3 f2) вводит Т (f2 и f3 абсолютно одинаковые списки)
Обратите внимание, что в то время, как два списка равны, они могут быть неидентичны,
атомы, когда они равны, они всегда идентичны. И, наконец, если любые два списка или атомы
идентичны, они всегда равны.
4.41.(eval - любое выражение ЛИС-
Па. Например, заданы назначения:
(setq a 123)
(setq b 'a)
тогда:
(eval 4.0) вводит 4.000000
(eval (abs - 10 )) вводит 10
(eval a) вводит 123
(eval b) вводит 123
4.42.(exp (обычный антилогарифм
(antilog)). Она вводит действительные числа. Например,
(exp 1.0) вводит 2.718282
(exp 2.2) вводит 9.025013
(exp -0.4) вводит 0.670320
4.43. (expt . Если оба пара-
метра целые числа, результат будет целым числом. В противном случае, результат будет действи-
тельным числом. Примеры:
(expt 2 4) вводит 16
(expt 3.0 2.0) вводит 9.000000
4.44. (fix может
быть как целым, так и действительным. Если оно действительное, оно усекается до ближайшего
целого числа путем отбрасывания десятичной части. Например:
(fix 3) вводит 3
(fix 3.7) вводит 3.000000
4.45.(float может
быть как целым, так и действительным. Например:
(float 3) вводит 3.000000
(float 3.7) вводит 3.700000
4.46.(foreach каждому элементу и вычис-
ляет каждое
может быть определено. FOREACH вводит результат вычисления последнего .
Например:
(foreach n'(a b c)(print n))
эквивалентно
(print a)
(print b)
(print c)
кроме того FOREACH вводит результат только последнего вычисленного выражения.
4.47.(gcd должны быть целыми. Например:
(gcd 81 57) вводит 3
(gcd 12 20) вводит 4
4.48.(getangle [ - произвольная
строка, которая появляется на экране в качестве подсказки, а - произвольная базовая точка
2D. Вы можете определить угол, напечатав цифру в текущем формате единиц угла АвтоКАДа.
Отметьте, что хотя текущий формат единиц угла может быть выражен в градусах, градах и т.д.,
эта функция всегда вводит угол в радианах.
Вы можете также "показать" АвтоЛИСПу угол, отмечая точками два 2D расположения на
экране графики. АвтоКАД рисует линию резиновой нити от первой точки до позиции текущего
перекрестия, что поможет вам при визуализировании угла.
Необязательный параметр функции GETANGLE (если он определен) предполагается
быть первой из этих двух точек, позволяя вам "показать" АвтоЛИСПу" угол, отмечая еще одну
точку. Вызов GETANGLE демонстрирует следующее:
(setq ang (getangle))
(setq ang (getangle '(1.0 3.5))
(setq ang (getangle "Which way?")
(setq ang (getangle '(1.0 3.5)"Which way?")
Вы не можете ввести другое выражение ЛИСПа в качестве ответа на требование
GETANGLE. Попытка сделать это приведет к сообщению "Can't reenter Autolisp" (Не могу
повторно ввести АвтоЛИСП"). См. также GETORIENT и INITGET.
4.49. (getcorner точки и чертит прямоугольник из точки по мере переме-
щения пользователем пересечения на экране. Для детального ознакомления см. GETPOINT и
INITGET. В качестве ответа на требование GETCORNER, вы не можете ввести другое выражение
ЛИСПа.
4.50.(getdist [ - произ-
вольная строка, которая появляется на экране в качестве подсказки, а - произвольная базовая
точка. Вы можете определить расстояние, напечатав цифру в текущем формате единиц расстояния
АвтоКАДа. Отметьте, что хотя текущий формат единиц расстояния может быть выражен в футах,
дюймах (архитектурный), эта функция всегда вводит расстояние в действительных числах.
Вы можете "показать" АвтоЛИСПу расстояние, отметив точками два расположения на
графическом экране. АвтоКАД рисует линию резиновой нити от первой точки до позиции
текущего перекрестия, что поможет вам при визуализировании расстояния. Необязательный
параметр функции GETDIST (если он определен) предполагается быть первой из этих двух
точек, позволяя вам "показать" АвтоЛИСПу расстояние, отмечая еще одну точку.
Следующие примеры иллюстрируют применение GETDIST.
(setq dist (getdist))
(setq dist (getdist '(1.0 3.5))
(setq dist (getdist "How far?")
(setq dist (getdist '(1.0 3.5)"How far?")
Вы не можете ввести другое выражение ЛИСПа в качестве ответа на требование
GETDIST. См. также INITGET.
4.51.(getint[ - произвольная строка, которая появляется на экране в качестве
подсказки.
Например:
(setq num (getint))
(setq num (getint "Enter a number:")) (Введите число)
Вы не можете ввести другое выражение ЛИСПа в качестве ответа на требование GETINT.
См. также INITGET.
4.52.(getkword [ ])
Функция GETKWORD требует от пользователя ключевого слова. Перед вызовом
GETKWORD, устанавливается список действительных ключевых слов, применяя функцию
INITGET (описанную ниже). GETWORD вводит ключевое слово, выравнивая в строку ввод
пользователя. АвтоКАД повторит попытку, если ввод не соответствует одному из этих ключевых
слов. Пустой (нулевой) ввод введет нуль (если это допустимо). Нуль также вводится, если создана
строка ключевых слов. Например:
(initgent 1 "Yes Nо")
(setq x (getkword "Are you sure? (Yes or No)"))
подскажет пользователю и установит символ Х как для "Yes", так и для "No", в зависимости от
ответа пользователя. Если подсказка не соответствует ни одному из ключевых слов, или если
пользователь отвечает нулем, АвтоКАД попросит пользователя повторить процедуру.
Вы не можете ввести другое выражение ЛИСПа в качестве ответа на требование
GETKWORD. См. также INITGET.
4.53.(getorient [ ])
В АвтоЛИСПе углы всегда представлены в радианах, с направлением в ноль-радиан
вправо ( восток) и углом, увеличивающимся в направлении против часовой стрелки. Таким обра-
зом, будут иметь место некоторые преобразования, если пользователь выберет различные нуль-
градусные базы или различные направления для увеличения угла посредством команды INITS
или систем переменных ANGBASE и ANGDIR.
GETORIENT похож на функцию GETANGLE, но находится под влиянием нуль-
градусной базы и направления для увеличения угла совсем по-другому, чем GETANGLE.
GETANGLE должна применяться в том случае, когда вам необходима величина вращения
(относительный угол), тогда как GETORIENT должна применяться для получения ориентации
(абсолютный угол).
Представьте, что команда АвтоКАДа INITS применялась для выбора нуль-градусной ба-
зы 90 градусов (север) и направления для увеличения угла - по часовой стрелке. В таблице пока-
зано, что введут функции GETANGLE и GETORIENT (в радианах) для репрезентивного ввода пе-
ременных пользователем (в градусах).
Input (degrees)
GETANGLE
GETORIENT
0
0.000000
1.570796
90
1.570796
3.141593
180
3.141593
4.712389
90 (-90 270?)
4.712389
0.000000
Как показано в таблице, GETANGLE принимает на обработку направление увеличения
угла, но игнорирует ноль-градусную базу. Таким образом, вы можете применять GETANGLE для
получения величины вращения при вводе/вставке блока, так как ввод нуль-градуса всегда вве-
дет ноль радиан. С другой стороны, GETORIENT принимает на обработку как ноль-градусную
базу, так и направление увеличения угла. Таким образом, вы должны применять GETORIENT для
получения таких углов, как угол базовой линии для Элемента Текста. Например, для заданных вы-
ше установок UNITS, ориентация базовой линии для нормальной горизонтальной линии текста
будет 90 градусов.
Вы не можете ввести другое выражение ЛИСПа в качестве ответа на требование
GETORIENT. См. также GETANGLE и INITGET.
4.54. (getpoint [ - необязательная базо-
вая точка, а - произвольная строка, которая появляется на экране в качестве подсказки.
Вы можете определить точку поинтером или напечатав координату в текущем формате единиц.
Если присутствует параметр необязательной базовой точки , АвтоКАД чертит линию резино-
вой нити от этой точки до позиции текущего перекрестия. Например:
(setq p (getpoint))
(setq p (getpoint "Where?")) "Где?"
(setq p (getpoint '(1.5 2.0) "Second point:")
Обычно GETPOINT вводит точку 2D (список из двух действительных чисел). Применяя
функцию INITGET для установки контрольной отметки "точка.3D", вы можете заставить
GETPOINT ввести точку 3D (список из трех действительных чисел).
Вы не можете ввести другое выражение ЛИСПа в качестве ответа на требование
GETPOINT. См. также GETCORNER и INITGET.
4.55.(getreal [ ])
Для пользователя эта функция приостанавливает ввод действительного числа и возвра-
щает это действительное число. - произвольная строка, которая появляется на экране
в качестве подсказки. Например:
(setq val (getreal)
(setq val (getreal "фактор шкалы:")
Вы не можете ввести другое выражение ЛИСПа в качестве ответа на требование
GETREAL. См. также INITGET.
4.56.(getstring [ задан и он не равен нулю, вводимая строка может содержать пробелы (и должна поэтому
быть завершена нажатием RETURN). В других случаях ввод строки завершается пробелом или
RETURN. - произвольная строка, появляющаяся на экране в качестве подсказки.
Например:
(setq s (getstring))
(setq s (getstring "What's your first name?"))
(setq s (getstring T "What's your full name?"))
Если ввод пользователя должен быть одной из нескольких опций (ключевых слов), вме-
сто GETSTRING может применяться описанная ранее функция GETKWORD.
Вы не можете ввести другое выражение ЛИСПа в качестве ответа на требование
GETSTRING.
4.57.(getvar )
Эта функция отыскивает значения системных переменных АвтоКАДа. Имя переменной
дожно быть заключено в двойные кавычки "". Например, предположим, что самый последний из
определенных нами радиус округления был 0.25 единиц:
(getvar "FILLETRAD") введет 0.250000
Список текущих системных переменных АвтоКАДа можно найти в приложениях А
книги пользователя АвтоКАДа. См. также функцию SETVAR.
4.58.(graphscr)
Функция GRAPHSCR переключается с текстового экрана на графический в одно-
экранных системах (типа функциональной клавиши "Flip screen" в АвтоКАДе). GRAPHSCR
всегда вводит ноль. См. также функцию TEXTSCR.
4.59.(if не ноль, тогда она вычисля-
ет ) -
необязательное. IF вводит значение выбранного выражения; если равно нулю, IF вводит ноль. Например:
(if (=1 3)"Yes!!" "No") вводит "No"
(if (=2 (+1 1)) "Yes!!") вводит "Yes!!"
(if (=2 (+3 4)) "Yes!!") вводит nil
4.60.(initget [ ])
Эта функция создает различные опции для дальнейшего использования их функцией
GETxxx (кроме GETSTRING и GETVAR). INTGET всегда вводит ноль. Необязательный параметр
- целое число со следующими значениями:
INITGET Bits
Значение
1
не допускает нулевой ввод
2
не допускает нулевые значения
4
не допускает отрицательных значений
8
не проверяет границы,даже если действует limcheck
16
вводит точки 3D раньше,чем точки 2D
Биты могут складываться вместе в любой комбинации для создания значений от 0 до
31. Если пользователь при вводе определенных режимов ошибается (например, вводит нулевое
значение, когда оно не допускается), АвтоКАД выдаст на экран сообщение и попросит пользова-
теля повторить попытку. Например:
(initget (+ 1 2 4))
(setq age (getint "How old are you?") : возраст "Сколько вам лет?"
получит возраст пользователя, автоматически повторив попытку, если пользователь введет ноль,
отрицательное число или нулевое значение. Если параметр не задан, предполагается ноль
(нет режимов). Специальные контрольные значения принимаются на обработку только теми функ-
циями GETxxx, для которых они имеют смысл (как показано в таблице):
Функция
INITGET control bits honored (принимаемые на обработку контрольные
байты функции INITGET)
No null
No zerro
No neg.
No limits
3D hoints
GETINT
?
?
?
GETREAL
?
?
?
GETDIST
?
?
?
GETANGLE
?
?
?
GETORIENT
?
?
?
GETPOINT
?
?
?
GETCORNER
?
?
?
GETKWORD
?
GETSTRING
GETVAR
Необязательный параметр функции INITGET определяет список ключевых слов
опции, которые будут проверены следующими требованиями GETxxx, если пользователь не ввел
ожидаемый тип данных ввода (например, точку для GETPOINT). Если ввод пользователя соответ-
ствует одному из ключевых слов этого списка, это ключевое слово вводится с помощью функ-
ции GETxxx как результат функции STRING. Программа пользователя может контролировать
ключевые слова и выполнять желаемые действия для каждого из них. Если ввод пользователя не
ожидаемого типа и не соответствует ни одному из ключевых слов, АвтоКАД попросит повторить
попытку. Список ключевых слов должен быть следующей формы: "KEY1 KEY2 KEY3
ABBREV3". Отдельные ключевые слова определены пробелами. Сокращения (аббривиатура)
необязательны, есть два метода их определения.
Необходимая часть может быть написана заглавными буквами, а остальная - с применени-
ем нижнего регистра; или необходимая часть может быть повторена, отделенная от ключевого
слова запятой. Второй способ предназначен для облегчения применения иностранных языков,
где переключение регистров может быть затруднено или вообще невозможно. В каждом методе
длина необходимой части - минимальная длина, которая должна точно соответствовать. (Для
метода разделителя-запятой предполагается, что строка аббревиатуры - правильное подмножество
начала ключевого слова).
Например: "LTYPE,LT" и "LType" - эквивалентные спецификации. Каждая означает, что
вводы пользователя типа "LTYPE", "LTYP", "LTY" или "LT" применяемы, но "L"- недостаточно, а
"LTSCALE" и "LTYPEX" не соответствуют.
Рассмотрим следующие, определенные пользователем функции
(defun getnum (ix)
(initget 1 "Pi Two-pi")
(setq x (getreal "Pi/Two-pi/ :"))
(cond((eqx "Pi") pi)
((eq x "Two-pi")(*2.0 pi))
(T x)
)
)
Этот INITGET запрещает нулевой ввод и создает список из двух ключевых слов "Pi" и
"TWO-Pi". Затем применяется GETREAL для получения целых чисел, издавая подсказку
"Pi/Two-pi/ :", результат перемещения в локальном символе Х.
Если пользователь вводит число, это число возвращается функцией GETNUM. Однако,
если пользователь вводит ключевое слово "Pi" ( или просто "P"), функция GETPOINT возвращает
ключевое слово "Pi". Функция COND обнаруживает это и, в данном случае, вводит значение Pi.
Ключевое слово "Two-pi" обрабатывается аналогично. Созданные с помощью INITGET контроль-
ные пометки и ключевые слова применяются только со следующим GETxxx вызовом, а затем
автоматически отбрасываются. Это позволяет очистить специальный режим при необходимости
вызова другой функции.
4.61.(inters ])
Функция INTERS исследует две линии и вводит точку их пересечения, или ноль, если они
не пересекаются. - конечные точки
второй линии. Если присутствует необязательный параметр и он равен нулю, линии
считаются бесконечными по длине, INTERS вводит точку пересечения даже если она находится
вне конца одной или обеих линий. Если параметр опущен или он - ноль, точка пересече-
ния должна находиться на обеих линиях или INTERS введет ноль. Например, задано:
(setq a'(1.0 1.0) b'(9.0 9.0))
(setq c'(4.0 1.0) d'(4.0 2.0))
тогда:
(inters a b c d) введет nil
(inters a b c d T) введет nil
(inters a b c d nil)введет (4.000000 4.000000)
4.62.(itoa )
Эта функция вводит переход целых чисел в строку. Например:
(itoa 33) вводит "33"
(itoa -17) вводит "-17"
4.63 (lambda ...)
LAMBDA определяет "анонимную" функцию. Обычно она применяется когда заголовок
при определении новой функции не выравнен. Она также помещает функцию на то место, где она
должна применяться. LAMBDA вводит значение последнего и часто применяется
вместе с APPLY и/или MAPCAR для выполнения функции в списке. Например:
(apply '(lambda (x y z)
(* x (-y z)
)
'(5 20 14)
) вводит 30
или:
(mapcar '(lambda (x)
(setq counter (1 + counter))
(* x 5)
)
'(24 -6 10.2)
) вводит (10 20 -30 51.000000)
4.64.(last должен быть не нулевым.
Например:
(last '(a b c d e)) вводит E
(last '(a b c (d e))) вводит (DE)
Как показано, LAST может вводить как атом, так и список. На первый взгляд может по-
казаться,что LAST- отличный способ получения координаты Y точки. Пока это истинно для 2D
точки (список из двух действительных чисел), LAST введет координату Z для 3D точки. Для то-
го,чтобы ваша функция работала как следует, задавая точки 2D и 3D, мы советуем вам
применять CADR для получения координаты Y и CADDR для получения координаты Z.
4.65.(length . Например:
(length '(a b c d) вводит 4
(length '(a b (c d)) вводит 3
(length '()) вводит 0
4.66.(list ) и соединяет их вместе, вводя
список. Например:
(list 'a 'b 'c) вводит (A B C)
(list 'a '(d c) 'd) вводит (A (B C) D)
(list 3.9 6.7) вводит (3.90000 6.70000)
В АвтоЛИСПе эта функция часто применяется для определения переменных точек 2D и
3D (список из двух или трех действительных чисел).
4.67. (listp - список, и nil в противном случае. Например:
(listp '(a b c)) вводит T
(listp 'a) вводит nil
(listp 4.343) вводит nil
4.68.(load - строка, которая представляет имя файла без расширения (расширение ".lsp"
допускается). может включать префикс с каталогом, как в "/function/test1"
("функция/тест 1"). В системах MS-DOS/PC-DOS также допускается имя накопителя (например, a:
c:) и вы можете использовать мертвый ход вместо предшествующей косой черты (но помните,
что вы должны применять "\\" для получения одной косой черты в строке).
Если операция удачна, LOAD вводит имя последней определенной в файле функции.
Если операция дает сбой, LOAD введет имя файла в виде строки.
Например, предположим, что файл "/fred/test1.lsp" содержит DEFUN функции MY-FUNС,
а файл "test2.lsp" не существует:
(load "/fred/test1") вводит MY-FUNC
(load "test2" вводит "test"
Функция LOAD не может быть вызвана внутри другой функции ЛИСПа. Она должна
быть введена непосредственно с клавиатуры (или из меню, или файла сценария /script file/), по-
ка не активна никакая другая функция ЛИСПа.
Каждый раз, когда начинается сеанс работы графического редактора АвтоКАДа, Авто-
ЛИСП загружает файл "acad.lsp", если он существует. Вы можете записать на этот файл определе-
ние или наиболее часто употребляемые команды, они будут вычисляться автоматически каждый
раз, когда вы начнете редактировать чертеж.
4.69.(log . Например:
(log 4.5) вводит 1.504077
(log 1.22) вводит 0.198850
4.70.(logand должны быть целыми, результат также будет целым числом. Например:
(logand 7 15 3) вводит 3
(logand 2 3 15) вводит 2
(logand 8 3 4) вводит 0
4.71.(logior должны быть целыми, результат будет также целым числом. Например:
(logior 1 2 3) вводит 7
(logior 9 3) вводит 11
4.72.(lsh и положительное число, смещается влево, если отрицательное -
вправо. В обоих случаях "нулевые" биты смещаются внутрь, а биты, сдвигаемые наружу без со-
хранения выдвигаемых разрядов, не учитываются (shift in/shift out). Если "один" бит смещен
внутрь или наружу (into/out) от вершины (16-ого ) бита целого числа, его знак меняется. Например:
(lsh 2 1) вводит 4
(lsh 2 -1) вводит 1
(lsh 40 2) вводит 160
(lsh 16384 1) вводит -32768
4.73.(mapcar через
должно соответствовать количеству параметров, требуемых . Например:
(mapcar '1+'(10 20 30) вводит (11 21 31)
Это эквивалентно
(1 + 10)
(1 + 20)
(1 + 30)
Кроме этого MAPCAR вводит список результатов. Аналогично:
(mapcar '+'(10 20 30)'(4 3 2) вводит (14 23 32)
эквивалентно:
(+10 4)
(+20 3)
(+30 2)
Функция LAMBDA может определить "анонимную" функцию, которую выполнит
MAPCAR. Это полезно, когда некоторые параметры функции - константы или подаются некото-
рыми другими путями. Например:
(mapcar '(lambda (x)(+ x 3))'(10 20 30) вводит (13 23 33)
и
(mapcar '(lambda (x y z)
(* x (-y z)
)
'(5 6)'(20 30)'(145.0)
) вводит (30 150.000000)
4.47.(max может быть
действительным или целым. Например:
(max 4.07 -144) вводит 4.070000
(max -88 19 5 2) вводит 19
4.75.(member , начиная с первого, имеющегося в наличии , MEMBER вводит ноль. Например:
(member 'c '(a b c d e) вводит (C D E)
(member 'q '(a b c d e) вводит nil
4.76.(menucmd )
Функция MENUCMD снабжает средствами программы для переключения между подстра-
ницами в меню АвтоКАДа. Таким образом, программа ЛИСПа может работать во взаимодействии
с объединенным файлом меню, каждый раз при необходимости ввода пользователя, выводя на эк-
ран соответствующие подменю варианты/альтернативы. Параметр функции MENUCMD
имеет следующую форму:
section - submenu (секция - подменю)
где
section определяет секцию/раздел меню. Действительны следующие имена:
S - для меню экрана (SCREEN)
B - для клавишного меню (BUTTONS)
T1-T4 - для меню планшета (TABLET) от 1 до 4
A1 - для AUXI меню.
submenu определяет какое из подменю активно. Имя должно быть или одним из зна-
ков/обозначений меню (без "**") в текущем загруженном файле меню, или именем секции основ-
ного меню. Для дальнейшей информации см. Главу 5. Обратите внимание, что начальная "S",
применяемая для ссылки на подменю в файле меню, здесь не применяется. Например:
(menucmd "S = OSNAP")
вызовет на экран подменю "OSNAP" (предполагая, что такое подменю существует в текущем фай-
ле меню). Аналогично:
(menucmd "B" = "MY-BUTTONS")
определит "MY-BUTTONS" для кнопочного меню. MENUCMD всегда вводит nil.
4.77.(min должно
быть действительным или целым. Например:
(min 683 -10.0) вводит -10.000000
(min 73 2 48 5) вводит 2
4.78.(minusp - действительное или целое число и вычисляется к
отрицательному значению, иначе она вводит nil. Для других типов функция не определяет-
ся. Например:
(minusp -1) вводит T
(minusp -4.293) вводит T
(minusp 830.2) вводит nil
4.79.(not )
Эта функция вводит T, если выражение - нулевое и ноль в противном случае. Как пра-
вило, функция NULL применяется для списков, а NOT применяется для других типов данных в
сочетании с некоторыми типами контроля функций. Например, заданы следующие назначения:
(setq a 123)
(setq b "string")
(setq c nil)
тогда:
(not a) вводит nil
(not b) вводит nil
(not c) вводит T
(not '()) вводит T
4.80.(nth - номер вводимого элемента
(нулевой - первый элемент). Если , вводится nil. Например:
(nth 3 '(a b c d e)) вводит D
(nth 0 '(a b c d e)) вводит A
(nth 5 '(a b c d e) вводит nil
4.81.(null близок к нулю, иначе она введет nil. Например, зада-
ны следующие назначения:
(setq a 123)
(setq b "string")
(setq c nil)
тогда:
(nul a) вводит nil
(nul b) вводит nil
(nul c) вводит T
(nul '()) вводит T
4.82.(numberp - целое или действительное число, иначе она вводит
ноль. Например, заданы назначения:
(setq a 123)
(setq b 'a)
тогда:
(numberp 4 ) вводит T
(numberp 3.8348) вводит T
(numberp "Howdy") вводит nil
(numberp 'a) вводит nil
(numberp a) вводит T
(numberp b) вводит nil
(numberp (eval b)) вводит T
4.83.(open )
Эта функция открывает файл для обращения к нему I/O функции АвтоЛИСПа. Она вводит
дескриптор файла, который будет применяться другими I/O функциями, поэтому он должен начи-
наться с setq. Например:
(setq a(open "file.ext" "r"))
- по-
метка для чтения/написания. Он должен быть в виде строки, состоящей их единичных букв ниж-
него регистра. Действительные для mode буквы описаны в следующей таблице:
ОPEN mode
Описание
"r"
Открыт для чтения. Если не существует, создается и от-
крывается новый файл. Если не существует, создается и
открывается новый файл. Если уже существует, он откры-
вается и дополняется позиция в конце существующих данных, так лю-
бые новые данные, записанные в файл, будут добавлены к сущест-
вующим данным.
В системах DOS, некоторые программы и текстовые редакторы записывают файлы текста
с маркером конец-файла (CTRL Z, десятичный ASCII код 26) в конце текста. При прочтении тек-
стового файла DOS вводит статус конец-файла, если имеется маркер CTRL Z , даже если после не-
го имеются еще данные. Если вы намерены применять "a" режим функции OPEN для дополнения
данных в файл созданный другой программой, проверьте, чтобы другая программа не использова-
ла маркер CTRL Z в конце своих текстовых файлов.
Представьте, что в данных примерах имен файлов не существует:
(setq f(open "new.tst" "w")) вводит
(setq f(open "nouch.fil" "r")) вводит nil
(setq f(open "logfile" "a")) вводит может содержать прямой префикс, как в "test/func3" В системах MS-DOS
также допускается управляющая буква; вы можете использовать обратную косую черту вместо
прямой черты (но помните, что вы должны применять "\\" для получения в строке одной косой
черты). Например:
(setq f(open "/x/new.tst" "w") вводит ..)
Эта функция вводит логическое OR/ИЛИ для списка выражений. Если все выражения
вычисляются к нулю ИЛИ вводит ноль, в противном случае вводит Т. Например:
(or nil 'a '()) вводит T
(or nil '()) вводит nil
4.85.(osnap )
Эта функция вводит точку, которая является результатом применения режимов
фиксации (snap) объекта, описанного - строка,
состоящая из одного или более действительных зафиксированных объектов, определенные как
"midpoint", "center" и т.д., отделенные запятыми. Например:
(setq pt2 (osnap pt1 "midp"))
(setq pt2 (osnap pt1 "midp,endp,center")
Если параметр точка 3D (список из трех действительных чисел), вводится точка 3D. Если в
оснапе не находится точки, определенной , вводится
ноль.
4.86. pi
Это не функция, а константа pi. Она вычисляется приблизительно 3,1415926.
4.87.(polar .
Точка - список из двух действительных чисел, угол выражен в радианах. Например:
(polar '(1.0 1.0) 0.785398 1.414214)
вводит (2.000000 2.000000)
4.88. (prin1 могут быть
любые выражения, но они не должны быть строкой. Если присутствует в файле точно так, как оно должно
появиться на экране. Печатаются только заданные , новые линии или пробелы не
включаются. Например, заданы следующие назначения:
(setq a 123)
(setq b '(a))
тогда
(prin1 'a) печатает A и вводит A
(prin1 a) печатает 123 и вводит 123
(prin1 b) печатает (A) и вводит (A)
(prin1 "Hello") печатает "Hello" и вводит "Hello"
Каждый из примеров печатается на экране, как только определяется . Пред-
ставьте, что F - действительный дескриптор файла, открытого для написания:
(prin1 "Hello" f)
напишет "Hello" в заданный файл и введет "Hello".
Если - строка, содержащая контрольные символы, PRIN1 отредактирует эти сим-
волы кавычками " ".
\e для escape переход
\n для newline новая линия
\r для return возврат,ввод
\t для tab табуляция
\nnn для символов,чей восьмиричный код nnn
Таким образом:
(prin1 (chr 2)) печатает "\002" и вводит "\002"
(prin1 (chr 10)) печатает "\n" и вводит "\n"
4.89.(princ печа-
таются без расширения. В общем, PRIN1 разработан для написания выражений в таком виде,
чтобы они были совместимы с функцией LOAD , в то время как PRINC будет печатать их в при-
годном для чтения функцией READ-LINE виде.
4.90. (print , а в промежутке печатается следующее выражение.
4.91. (progn и вводит значение по-
следнего выражения. Вы можете применять PROGN для вычисления нескольких выражений,
где предусматривается только одно выражение. Например:
(if (=a b) (progn
(setq a (+a 10)
(setq b (-b 10)
)
Функция IF нормально вычисляет одно выражение "then", если тестовое выражение вы-
числяется к чему-либо отличному от нуля. В этом примере мы применяли PROGN для вычисления
двух выражений вместо первоначального.
4.92.(prompt - строка. В двухэкранной конфигурации АвтоКАДа, функция PROMPT высвечивает
на обоих экранах и поэтому предпочтительна для PRINC. Например:
(prompt "New value:")
на экранах появится "New value:" и вводится ноль.
4.93.(quote . Она также может быть записана следующим обра-
зом:
'expr
Например:
(quote a) вводит A
(quote cat) вводит CAT
(quote (a b)) вводит (A B)
'a вводит A
'cat вводит CAT
'(a b) вводит (A B)
4.94. (read не
должна содержать пробелов. Например:
(read "hello") вводит HELLO
(read "hi") вводит HI
(read "(a)") вводит (A)
4.95.(read-char [ ])
Эта функция читает единичный символ из буфера ввода клавиатуры или из открытого
файла, описанного в не определен, а в буфере ввода клавиатуры нет символов, READ-CHAR
ждет, пока вы что-либо напечатаете с клавиатуры (сопроводжая запись клавишей RETURN !). На-
пример, предположим, что буфер ввода клавиатуры пуст:
(read-char)
будет ждать, чтобы что-то было введено. Если вы напечатаете "A B C", а затем нажмете RETURN,
READ-CHAR введет 65 (код ASCII для буквы "A"). На следующие вызовы READ-CHAR введет
66, 67 и 10 (новая линия) соответственно. Если затем будут произведены следующие вызовы
READ-CHAR, она опять будет ждать ввод.
4.96. (read-line [ . Если конец файла не вычисляется, READ-LINE вводит ноль, в противном случае она вво-
дит строку, которая была прочитана. Предположим, что F - действительный поинтер открытого
файла:
(read-line f)
введет следующую входную линию из файла, или ноль, если был достигнут конец файла.
4.97 (redraw [ ]])
Эффект функции зависит от количества заданных параметров. Если вызов без параметров,
(redraw)
он перерисует весь чертеж, как команда АвтоКАДа REDRAW. Если вызов с параметром имени
объекта,
(redraw )
перечерчен будет выбранный объект. Это полезно при определении объекта на экране после при-
менения GRCLEAR для очистки экрана.
Завершение контроля над перечерчиванием объекта осуществляется вызовом REDRAW с
двумя параметрами:
( - целое число с одним из сле-
дующих значений:
Redraw Mode
Action/действие
1
Перечертить объект на экране
2
Уничтожить объект (внести пробелы)
3
Высвечивание объекта (если позволяет дисплей)
4
Отмена высвечивания объекта (если позволяет дисплей)
Если - заголовок или комплексный объект (Полилиния или Блок с дополнения-
ми), главный объект и все его подобъекты будут отрабатываться, если параметр отрицательный, управляемый функцией REDRAW будет
только один заголовок. Если ошибок нет, REDRAW всегда вводит ноль.
4.98.(rem mod mod - модуль операция вычисления остатка.
REM может применяться с действительными и целыми числами со стандартными прави-
лами перевода. Например:
(rem 42 12) вводит 6
(rem 12.0 16) вводит 12.000000
(rem 60 3) вводит 0
4.99.(repeat представляет любое из положительных целых чисел. Функция
вычисляет каждое количество раз и вводит значение последнего выражения. На-
пример, заданы назначения:
(setq a 10)
(setq b 100)
тогда:
(repeat 4
(setq a(+ a 10)))
(setq b(+ b 10)))
) вводит 140
4.100.(reverse с зарезервированными элементами. Например:
(reverse '((a)b c)) вводит (C B (A))
4.101. (rtos (действительного)
согласно с установками - целые числа, которые выбирают линейные элемен-
ты режима и точности. Ниже перечислены обеспеченные значения :
RTOS Режим
Редактируемый формат
1
Научный
2
Десятичный
3
Прикладной (футы и десятичные дюймы)
4
Архитектурный (футы и дробные дюймы)
5
Производные дробные элементы
Параметры соответствуют системе переменных LUNITS и LUPREC
АвтоКАДа. Если вы пропускаете параметры, будут применяться текущие установки LUPREC и
LUNITS. Примеры RTOS:
(rtos 17.5 1 4) вводит "1.7500E+01"
(rtos 17.5 2 2) вводит "17.50"
(rtos 17.5 3 2) вводит "1'-5.50""
(rtos 17.5 4 2) вводит "1'-5 1/2""
(rtos 17.5 5 2) вводит "17 1/2"
Глава 5. Разработка интерфейсов пользователя
5.1. Меню пользователя
Меню пользователя служит для расширения и дополнения существующего и разработки
собственного меню. Меню пользователя задается в файле меню.Файлы меню представляют собой
текстовые файлы.
Исходные файлы меню имеют расширение .mnu. Компилированные файлы имеют расши-
рение .mnx. LISP-файлы меню имеют расширение .mnl. Эти файлы автоматически загружаются в
память при загрузке файла меню с таким же именем и содержат LISP-выражения, которые могут
использоваться файлом меню. Файлы определения меню имеют расширение .mnd. Они являются
специальными исходными файлами, содержащими макросы. Файлы этого типа компилируются с
помощью программы mc, которая размещена в каталоге SAMPLE.
Файл .mnu компилируется, и создается файл с расширением .mnx, который имеет ком-
пактный внутренний формат, позволяет значительно быстрее осуществлять загрузку меню. При
создании нового рисунка файл меню с именем, указанным в рисунке-прототипе, загружается авто-
матически. АвтоКАД предоставляет возможность заменить это меню на новое. Для компиляции и
загрузки меню используется команда menu (меню). При этом АвтоКАД записывает в файл
рисунка имя последнего использовавшегося с ним меню; при последующем редактировании этого
рисунка меню загружается автоматически. Команда menu загружает файл меню с диска:
Command: MENU
Для задания имени файла на экран выводится стандартное диалоговое окно файлов с заго-
ловком «Выбор файла меню». АвтоКАД ищет файл с расширением .mnu, если он найден, то ищет
файл с расширением .mnx, и если MNX-файл имеет те же дату и время создания, что и MNU-
файл, он загружается АвтоКАДом. Иначе компилируется MNU-файл и загружается MNX-файл.
Если MNU-файл не найден, АвтоКАД ищет MNX-файл. Если MNX-файл найден, АвтоКАД его
загружает, иначе высвечивается сообщение об ошибке и запрос на ввод другого файла меню.
Если отключена системная переменная FILEDIA, можно воспользоваться командной
строкой для загрузки меню:
Command: MENU : (Команда: МЕНЮ)
Menu file name or . for none :
Имя файла задается без расширения.
Иногда имеет смысл полностью убрать меню, например, для очистки зоны экранного ме-
ню. Для этого необходимо ввести «.» в ответ на запрос команды MENU.
5.2. Структура файла меню
Файл меню можно логически разбить на разделы, каждый из которых относится к некото-
рому устройству, поддерживающему работу с меню, и содержит командные строки, предназначен-
ные для этого устройства. Разделы идентифицируются с помощью меток разделов:
***SCREEN - экранное меню;
***BUTTONSn - кнопочное меню устройства указания, где n - число от 1 до 4;
***AUXn - дополнительное кнопочное меню, где n - число от 1 до 4;
***POPn - падающие и курсорные меню, где n - число от 1 до 16;
***ICON - графическое меню;
***TABLETn - область меню планшета, где n - число от 1 до 4.
Метки определяют, что соответствующие пункты меню до метки следующего раздела или
до конца файла относятся к конкретному работающему с меню устройству. Например:
***SCREEN
[Help]help
[Bye]end
***BUTTONS
erase
oops
Пункты меню «Help» и «Bye» относятся к меню экрана, а пункты «erase» и «oops» - к кно-
почному меню. Если в файле нет метки «***SCREEN», то система АвтоКАД действует так, как
будто «***SCREEN» является первой меткой в файле.
5.3. Подменю
Пользователю предоставляется возможность определять подменю, которые представляют
собой группы из пунктов меню, активизировать их и сделать доступными для выбора пользовате-
ля. Например, выбор пункта «ARC» из подменю «DRAW» может активизировать подменю,
которое содержит варианты исполнения команды ARC. Пункты дополнительного меню временно
заменяют все или часть текущего меню. Обычно по окончании использования подменю
происходит возвращение к предыдущему меню. Подменю могут быть вложенными.
Начало подменю задается меткой подменю. Она имеет следующий формат:
** .
Имя меню представляет собой последовательность из не более чем 31 символа, содержа-
щую буквы, цифры, а также специальные символы «$», «-» (дефис), «_» (подчеркивающая черта).
Метка подменю должна находиться в отдельной строке файла меню и не должна содержать пробе-
лов. Каждое имя подменю в пределах файла должно быть уникальным, например:
**MOVE 3
[MOVE:]^C^CMOVE
Window
Last
Previous
Crossing
Remove
Add
Undo
где имя «**MOVE» введено для подменю команды MOVE. Заголовок [MOVE:] oeacuaaao,
что это команда и ее выбор вызовет выполнение команды MOVE.
Подменю может содержать любое количество пунктов, но с учетом возможностей устрой-
ства, с которого задается меню. Например, в меню экрана необходимо учитывать, что на экране
одновременно можно отобразить только 20 пунктов.
При активизации подменю его пункты обычно замещают пункты предыдущего меню. На-
пример, для экрана пункты подменю заменяют пункты предыдущего меню, начиная с верхнего
блока, при этом они могут заменять только часть предыдущего меню. Номер задает номер началь-
ной строки подменю. Например, **MOVE 3 позволяет сохранять в экранном меню доступ к кор-
невому меню АвтоКАДа и объектной динамической привязке «* * * *», а далее разместить подме-
ню для команды «MOVE:».
Чтобы активизировать или деактивизировать некоторое подменю, в пункте меню исполь-
зуется следующая конструкция:
$ - метка меню. Допустимы следующие сокращения:
S - для меню SCREEN;
P1 - P16 - для меню POP от 1 до 16;
I - для меню ICON;
B1 - B4 - для меню BUTTONS;
T1 - T4 - для меню TABLET1 - TABLET4;
A1 - A4 - для меню AUX1.
- указывает метку подменю без символов «**» или имя раздела меню, которое
должно активизироваться.
Например, в подменю EDIT для активизации подменю с именем MOVE используется кон-
струкция $S=MOVE:
**EDIT 3
...
[MOVE:]^C^C$S=MOVE
...
Прежде чем активизируется подменю, пункты меню, активизированные в текущий момент
времени, в разделе переписываются в стек. Для того, чтобы восстановить пункты предыдущего эк-
рана, в пункте меню должно выдаваться «$S=». Например, чтобы предусмотреть в текущем меню
пункт LAST для возврата в предыдущее меню, должен быть создан следующий пункт:
[_LAST_]^C^C$S=
Именно так в меню, поставляемом с системой АвтоКАД, осуществляется возврат в преды-
дущее меню. Сохраняются до восьми вложенных подменю. Если количество вложенных меню
больше восьми, первые меню пропадают.
Активизацию механизма подменю можно осуществлять в ходе выполнения некоторой ко-
манды без ее прерывания, т.е. допускаются такие последовательности команд, как «COLOR
$=X $S=LACOLOR»:
[COLOR:]^C^CCOLOR $S=X $S=LACOLOR
...
**X 3
...
[_LAST]$S= $S=
[DRAW]^C^C$S=X $S=DR
[EDIT]^C^C$S=X $S=ED
...
**LACOLOR 3
[COLOR]
red
yellow
green
cyan
blue
magenta
white
...
При этом начинается выполнение команды COLOR, затем последовательно включаются
дополнительные меню экрана X и LACOLOR и система ожидает ввода параметров команды
COLOR.
5.4. Пункт меню
Каждый пункт меню может состоять из команды, параметра или последовательности ко-
манд и параметров. Обычно каждый пункт меню занимает одну строку файла.
В экранном меню могут появиться только первые восемь символов пункта меню. Напри-
мер, команда «SNAP 0.01» отобразится на дисплее в виде «SNAP 0.0». В этом случае для пункта
меню можно определить заголовок пункта, заключив его в квадратные скобки «[ ]». Заголовок
пункта должен содержать не более восьми символов и начинаться с первой позиции. Заголовок
отображается на дисплее в соответствующем месте экранного меню. Часть пункта, следующая по-
сле заголовка, выдается в диалоговом поле при выборе этого пункта меню:
[MYSNAP]SNAP 0.01
Примечание. Пробелы в заголовках пунктов меню не требуются. Они могут быть включе-
ны для того, чтобы сделать файл удобочитаемым.
Все метки меню, управляющие операторы и параметры могут вводиться на
верхнем, нижнем регистрах или же в произвольном их сочетании. При счи-
тывании из файла они преобразуются в символы верхнего регистра.
Если некоторый пункт в файле меню не помещается в одну строку, то для
его продолжения используется символ «+». Знак «+» размещается в качестве
последнего символа строки, которую вы хотите продолжить.
Иногда требуется ввод информации с клавиатуры или при помощи устройства указания в
середине пункта меню. Символ «\» определяет ввод информации. Например,
[CIRCLE-3]circle \3
[ERASE 1]erase \;
Здесь «CIRCLE-3» запрашивает точку центра, а затем считывает из меню радиус, равный
3. «ERASE 1» позволяет указанием выбрать один объект, символ «;» соответствует нажатию
.
Выбранный пункт меню не возобновляется:
? до завершения выбора в режиме объектной привязки, если ожидается ввод точки;
? до завершения ввода всех координат точки, если используются координатные фильтры;
? до формирования всего набора в команде SELECT (ВЫБРАТЬ);
? при вводе прозрачной команды до ее выполнения и завершения ввода;
? если в качестве ответа указывается другой пункт меню (для выбора ключа или выполне-
ния прозрачной команды), до выполнения этого пункта (в свою очередь, новый выбран-
ный пункт может иметь свои символы обратной косой черты).
При разработке меню, которые используют в версиях АвтоКАДа на разных иностранных
языках, стандартные команды и ключевые слова АвтоКАДа на английском языке будут автомати-
чески переводиться в команды и ключевые слова АвтоКАДа национальной версии (например,
русский), если перед каждой командой или ключевым словом стоит символ подчеркивания (_):
[Центр, Начало, Длина]^C^C_arc;_c;\\_l
Для отмены действия предыдущей команды можно использовать в пункте меню строку
^C^C. Ее действие аналогично двойному вводу . Хотя выполнение большинства команд
отменяется одним ^C, ^C^C требуется для возврата к подсказке Command: из вложенной команды
(например, DIM); поэтому для надежности рекомендуется использовать ^C^C.
Обычно символы, считанные из пункта меню, отображаются в зоне подсказок экрана, как
при вводе с клавиатуры, а запросы высвечиваются даже в том случае, когда пункт меню включает
ответы. Этот вывод можно подавить с помощью системной переменной MENUECHO. Если эхо-
вывод отключен, управляющая последовательность ^P в пункте включает его.
При выборе пункта меню АвтоКАД автоматически ставит после него пробел. Иногда это
нежелетельно. Поэтому существует два соглашения: если в пункте меню появляется символ «;»,
то система АвтоКАД заменяет его на «ENTER». Если строка заканчивается каким-либо управляю-
щим символом «\», «;» или «+», то АвтоКАД не добавляет после него символа пробела.
Можно использовать управляющие символы кода ASCII в строке команд в пункте меню
путем ввода символа «^» перед любым другим символом. Например, ^С будет преобразован в код,
соответствующий .
В системе предусмотрена возможность автоматического повтора часто используемых ко-
манд до выбора какой-либо другой команды. Если пункт меню начинается строкой *^C^C
(следующей сразу за заголовком пункта), то он запоминается и будет автоматически вводиться в
ответ на подсказку Command: до тех пор, пока не будет прерван нажатием или
выбором другого пункта меню. ^C нельзя использовать внутри пунктов меню, начинающихся со
строки *^C^C, т.к. при этом прерывается повтор пункта меню.
В файлах меню используются следующие управляющие последовательности символов:
*** - указывает заголовок раздела;
** - указывает метку раздела подменю;
[] - ограничивает заголовки для экранного, падающих, курсорного меню, пунктов меню,
графических меню, имен слайдов или текста;
; - выдает нажатие клавиши ;
\ - выдает паузу для ввода пользователем;
_ - переводит следующую за ним команду и ключевое слово АвтоКАД;
+ - продолжает макрос на следующей строке, если является последним символом в строке
=* - выводит текущую пиктограмму, падающее или курсорное меню на экран;
*^C^C - префикс для повтора пункта;
$ - специальный код, используемый для указания АвтоКАДу загрузить раздел меню;
^B - переключает режим ШАГ;
^C - отменяет выполнение команды;
^D - переключает режим отображения координат;
^E - устанавливает следующую плоскость изометрии;
^G - переключает режим СЕТКА;
^H - выдает нажатие клавиши ;
^O - переключает режим ОРТО;
^P - переключает переменную MENUECHO;
^Q - переключает вывод эхо всех запросов, сообщений и вводов на принтер;
^T - переключает режим ПЛАНШЕТ;
^V - изменяет текущий видовой экран.
Для создания пунктов меню, предназначенных для решения сложных задач, можно ис-
пользовать возможности символов и S-выражений языка АвтоЛИСП. Например, S-выражение,
обеспечивающее вычерчивание прямоугольной ломаной с указанием точек в качестве ее углов:
[BOX](setq a (getpoint «Enter first corner:»));\+
(setq b (getpoint «Enter second corner:»));\+
pline !a (list (car a) (cadr b)) !b (list (car b) (cadr a)) c;
В АвтоКАДе допускается использование до 255 символов в ЛИСП-коде в файлах меню. В
случае более длинных кодов их следует разбивать с помощью точки с запятой (;), чтобы АвтоКАД
мог считывать и использовать их отдельными блоками.
Для более удобного и эффективного использования АвтоЛИСПа в меню можно
разместить ЛИСП-процедуры в отдельных файлах и использовать файл автоматической
загрузки с расширением .mnl. Основным содержанием данных файлов являются функции load.
АвтоКАД автоматически загружает файл .mnl после загрузки файла меню с таким же именем.
| |