Смекни!
smekni.com

АвтоЛИСП - реализация языка программирования (стр. 7 из 10)

INITGET Bits

Значение

1

не допускает нулевой ввод

2

не допускает нулевые значения

4

не допускает отрицательных значений

8

не проверяет границы,даже если действует limcheck

16

вводит точки 3D раньше,чем точки 2D

Биты могут складываться вместе в любой комбинации для создания значений от 0 до 31. Если пользователь при вводе определенных режимов ошибается (например, вводит нулевое значение, когда оно не допускается), АвтоКАД выдаст на экран сообщение и попросит пользователя повторить попытку. Например:

(initget (+ 1 2 4))

(setq age (getint "How old are you?") : возраст "Сколько вам лет?"

получит возраст пользователя, автоматически повторив попытку, если пользователь введет ноль, отрицательное число или нулевое значение. Если параметр <int> не задан, предполагается ноль (нет режимов). Специальные контрольные значения принимаются на обработку только теми функциями 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

Необязательный параметр <string> функции 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/<number>:"))

(cond((eqx "Pi") pi)

((eq x "Two-pi")(*2.0 pi))

(T x)

)

)

Этот INITGET запрещает нулевой ввод и создает список из двух ключевых слов "Pi" и "TWO-Pi". Затем применяется GETREAL для получения целых чисел, издавая подсказку "Pi/Two-pi/<number>:", результат перемещения в локальном символе Х.

Если пользователь вводит число, это число возвращается функцией GETNUM. Однако, если пользователь вводит ключевое слово "Pi" ( или просто "P"), функция GETPOINT возвращает ключевое слово "Pi". Функция COND обнаруживает это и, в данном случае, вводит значение Pi. Ключевое слово "Two-pi" обрабатывается аналогично. Созданные с помощью INITGET контрольные пометки и ключевые слова применяются только со следующим GETxxx вызовом, а затем автоматически отбрасываются. Это позволяет очистить специальный режим при необходимости вызова другой функции.

4.61.(inters <pt1><pt2><pt3><pt4>[<onseq>])

Функция INTERS исследует две линии и вводит точку их пересечения, или ноль, если они не пересекаются. <pt1> и <pt2> - конечные точки первой линии, а <pt3> и <pt4> - конечные точки второй линии. Если присутствует необязательный параметр <onseq> и он равен нулю, линии считаются бесконечными по длине, INTERS вводит точку пересечения даже если она находится вне конца одной или обеих линий. Если параметр <onseq> опущен или он - ноль, точка пересечения должна находиться на обеих линиях или 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 <int>)

Эта функция вводит переход целых чисел в строку. Например:

(itoa 33) вводит "33"

(itoa -17) вводит "-17"

4.63 (lambda <arguments><expr>...)

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<list>)

Эта функция вводит последний элемент <списка>. <Список> должен быть не нулевым. Например:

(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 <list>)

Эта функция вводит целое число, обозначающее номер элемента в <списке>. Например:

(length '(a b c d) вводит 4

(length '(a b (c d)) вводит 3

(length '()) вводит 0

4.66.(list <expr>...)

Эта функция берет любое количество выражений (<expr>) и соединяет их вместе, вводя список. Например:

(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 <item>)

Эта функция вводит T, если <item> - список, и nil в противном случае. Например:

(listp '(a b c)) вводит T

(listp 'a) вводит nil

(listp 4.343) вводит nil

4.68.(load <filename>)

Эта функция загружает файл выражений АвтоЛИСПа и вычисляет эти выражения. <filename> - строка, которая представляет имя файла без расширения (расширение ".lsp" допускается). <filename> может включать префикс с каталогом, как в "/function/test1" ("функция/тест 1"). В системах MS-DOS/PC-DOS также допускается имя накопителя (например, a: c:) и вы можете использовать мертвый ход вместо предшествующей косой черты (но помните, что вы должны применять "&bsol;" для получения одной косой черты в строке).

Если операция удачна, 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 <number>)

Эта функция вводит в виде действительного числа естественный log <числа>. Например:

(log 4.5) вводит 1.504077

(log 1.22) вводит 0.198850

4.70.(logand <number><number>...)

Эта функция вводит результат логического подразрядного AND/И списка <чисел>. <Числа> должны быть целыми, результат также будет целым числом. Например:

(logand 7 15 3) вводит 3