АвтоЛИСП - реализация языка программирования
использования их функцией 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 )
Эта функция вводит T, если - список, и 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
. Например:
(log 4.5) вводит 1.504077
(log 1.22) вводит 0.198850
4.70.(logand ...)
Эта функция вводит результат логического подразрядного AND/И
списка . должны быть целыми, результат также будет целым
числом. Например:
(logand 7 15 3) вводит 3
(logand 2 3 15) вводит 2
(logand 8 3 4) вводит 0
4.71.(logior )
Эта функция вводит результат логического подразрядного включающего
OR/ИЛИ списка . должны быть целыми, результат будет также
целым числом. Например:
(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 вводит результат выполненной с индивидуальными
элементами через , подаваемые как параметры .
Количество должно соответствовать количеству параметров,
требуемых . Например:
(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 )
Эта функция вводит T, если - действительное или целое число
и вычисляется к отрицательному значению, иначе она вводит 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 )
Эта функция вводит "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 )
Эта функция вводит T, если - целое или действительное
число, иначе она вводит ноль. Например, заданы назначения:
(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" |Открыт для чтения. Если не существует, вводится |
| |ноль |
|"w" |Открыт для написания. Если не существует, создается|
| |и открывается новый файл. Если существует, его |
| |существующие данные перепишутся. |
|"a" |Открыт для дополнений. Если не существует, |
| |создается и открывается новый файл. Если уже |
| |существует, он открывается и дополняется позиция в конце |
| |существующих данных, так любые новые данные, записанные в |
| |файл, будут добавлены к существующим данным. |
В системах 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") вводит
(setq f(open nosuch.fil" "r") вводит nil
4.84.(or ..)
Эта функция вводит логическое 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")
Если параметр -точка 2D (список из двух действительных чисел),
вводится точка 2D. Если параметр точка 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, кроме того, что контрольные
символы в печатаются без расширения. В общем, PRIN1 разработан для
написания выражений в таком виде, чтобы они были совместимы с функцией
LOAD , в то время как PRINC будет печатать их в пригодном для чтения
функцией READ-LINE виде.
4.90. (print [])
Эта функция такая же, как PRIN1, кроме того, что новые линии
печатаются перед , а в промежутке печатается следующее выражение.
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 [])
Эта функция читает единичный символ из буфера ввода клавиатуры или
из открытого файла, описанного в . Она вводит (целое число)
ASCII код, представляющий возможность прочесть символ.
Если не определен, а в буфере ввода клавиатуры нет
символов, 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 [])
Эта функция вводит строку, которая является представлением
(действительного) согласно с установками / режим и
/точность и переменной, задающей размеры АвтоКАДа DIMZIN.
и - целые числа, которые выбирают линейные элементы
режима и точности. Ниже перечислены обеспеченные значения :
|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:]
указывает, что это команда и ее выбор вызовет выполнение команды 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.
4. Пункт меню
Каждый пункт меню может состоять из команды, параметра или
последовательности команд и параметров. Обычно каждый пункт меню занимает
одну строку файла.
В экранном меню могут появиться только первые восемь символов пункта
меню. Например, команда «SNAP 0.01» отобразится на дисплее в виде «SNAP
0.0». В этом случае для пункта меню можно определить заголовок пункта,
заключив его в квадратные скобки «[ ]». Заголовок пункта должен содержать
не более восьми символов и начинаться с первой позиции. Заголовок
отображается на дисплее в соответствующем месте экранного меню. Часть
пункта, следующая после заголовка, выдается в диалоговом поле при выборе
этого пункта меню:
[MYSNAP]SNAP 0.01
Примечание. Пробелы в заголовках пунктов меню не требуются. Они могут
быть включены для того, чтобы сделать файл удобочитаемым.
Все метки меню, управляющие операторы и параметры могут
вводиться на верхнем, нижнем регистрах или же в произвольном их
сочетании. При считывании из файла они преобразуются в символы
верхнего регистра.
Если некоторый пункт в файле меню не помещается в одну строку,
то для его продолжения используется символ «+». Знак «+»
размещается в качестве последнего символа строки, которую вы
хотите продолжить.
Иногда требуется ввод информации с клавиатуры или при помощи
устройства указания в середине пункта меню. Символ «\» определяет ввод
информации. Например,
[CIRCLE-3]circle \3
[erase 1]erase \;
Здесь «CIRCLE-3» запрашивает точку центра, а затем считывает из меню
радиус, равный 3. «ERASE 1» позволяет указанием выбрать один объект, символ
«;» соответствует нажатию .
Выбранный пункт меню не возобновляется:
3 до завершения выбора в режиме объектной привязки, если ожидается ввод
точки;
3 до завершения ввода всех координат точки, если используются
координатные фильтры;
3 до формирования всего набора в команде SELECT (выбрать);
3 при вводе прозрачной команды до ее выполнения и завершения ввода;
3 если в качестве ответа указывается другой пункт меню (для выбора
ключа или выполнения прозрачной команды), до выполнения этого пункта
(в свою очередь, новый выбранный пункт может иметь свои символы
обратной косой черты).
При разработке меню, которые используют в версиях АвтоКАДа на разных
иностранных языках, стандартные команды и ключевые слова АвтоКАДа на
английском языке будут автоматически переводиться в команды и ключевые
слова АвтоКАДа национальной версии (например, русский), если перед каждой
командой или ключевым словом стоит символ подчеркивания (_):
[Центр, Начало, Длина]^C^C_arc;_c;\\_l
Для отмены действия предыдущей команды можно использовать в пункте
меню строку ^C^C. Ее действие аналогично двойному вводу . Хотя
выполнение большинства команд отменяется одним ^C, ^C^C требуется для
возврата к подсказке Command: из вложенной команды (например, DIM); поэтому
для надежности рекомендуется использовать ^C^C.
Обычно символы, считанные из пункта меню, отображаются в зоне
подсказок экрана, как при вводе с клавиатуры, а запросы высвечиваются даже
в том случае, когда пункт меню включает ответы. Этот вывод можно подавить с
помощью системной переменной MENUECHO. Если эхо-вывод отключен, управляющая
последовательность ^P в пункте включает его.
При выборе пункта меню АвтоКАД автоматически ставит после него
пробел. Иногда это нежелетельно. Поэтому существует два соглашения: если в
пункте меню появляется символ «;», то система АвтоКАД заменяет его на
«ENTER». Если строка заканчивается каким-либо управляющим символом «\», «;»
или «+», то АвтоКАД не добавляет после него символа пробела.
Можно использовать управляющие символы кода ASCII в строке команд в
пункте меню путем ввода символа «^» перед любым другим символом. Например,
^С будет преобразован в код, соответствующий /.
В системе предусмотрена возможность автоматического повтора часто
используемых команд до выбора какой-либо другой команды. Если пункт меню
начинается строкой *^C^C (следующей сразу за заголовком пункта), то он
запоминается и будет автоматически вводиться в ответ на подсказку Command:
до тех пор, пока не будет прерван нажатием или выбором другого
пункта меню. ^C нельзя использовать внутри пунктов меню, начинающихся со
строки *^C^C, т.к. при этом прерывается повтор пункта меню.
В файлах меню используются следующие управляющие последовательности
символов:
*** - указывает заголовок раздела;
** - указывает метку раздела подменю;
[] - ограничивает заголовки для экранного, падающих, курсорного меню,
пунктов меню, графических меню, имен слайдов или текста;
; - выдает нажатие клавиши ;
^M - выдает нажатие клавиши ;
^I - выдает нажатие клавиши ;
\ - выдает паузу для ввода пользователем;
_ - переводит следующую за ним команду и ключевое слово АвтоКАД;
+ - продолжает макрос на следующей строке, если является последним
символом в строке
=* - выводит текущую пиктограмму, падающее или курсорное меню на
экран;
*^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
после загрузки файла меню с таким же именем.
Страницы: 1, 2, 3
|