Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 400242.doc
Скачиваний:
10
Добавлен:
30.04.2022
Размер:
14.24 Mб
Скачать

4.5. Предикаты, логические операторы и условные выражения

Условный переход. Способность исследовать состояние одного или больше назначений (или переменных ) и принимать решение основанное на том, выполняется или нет выражение в программе - фундаментальное и мощное средство в AutoLISP. Эта форма принятия решения может оцениваться как условный переход, то-есть переход в логике программы, говорящий, выполнять или не выполнять специфическое выражение программы, или выполнять одно выражение программы скорее чем другой, основанный на некотором существующем условии.

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

В обеих предыдущих примерах, слово "если" используется как условное выражение, то-есть функция которая выполняет тест чтобы определить существует ли специфическое состояние или условие. Функция AutoLISP IF имеет фактически то же самое значение что и слово "если", используемое в предыдущих, реальных примерах.

Условный оператор IF. Функция IF используется чтобы проверить состояние одиночного условия. Если условие сравнивается с не-нулевым значением, т. е. чему-нибудь НE нуль, тогда выражение программы немедленно после проверки будет выполняться.

( if <выражение проверки> <выражение> [<выражение>] )

Должно существовать одно выражение после выражения проверки. Может существовать также второе, необязательне выражение, которое будет оцениваться если выражение проверки возвращает нуль. Например определеим функцию, которая бы проверяла, большее ли 0 значение переменной X. Если так, тогда это вывести на дисплей "X greater than 0". Создайте файл с именем GREATER.LSP и определите эту функцию.

(defun GREATER ()

(if

(> x 0)

(prompt "\nX is greater than 0.")

)

(prin1)

)

Command: (setq x 1)

1

Command: (load "greater")

GREATER

Command: (greater)

X is greater than 0.

Command: (setq x -1)

-1

Command: (greater)

Имеются несколько вещей, которые Вы можете выполнить чтобы делать функцию GREATER более универсальной. Сначала, сделайте значение для выражения проверки аргументом функции, чтобы GREATER больше не зависила от значения специфической глобальной переменной X. Затем, добавьте второй оператор к выражению IF который бы выводил на экран сообщение, если значение требуемого параметра МЕНЬШЕ или РАВНО нулю. Отредактируйте файл GREATER.LSP и сделают эти два изменения в функции GREATER.

(defun GREATER (x)

(if

(> x 0)

(print "\nArgument is greater than 0.")

(print "\nArgument is less than or equal to 0.")

)

(prin1)

)

Command: (load "greater")

GREATER

Command: (greater 1)

Argument is greater than 0.

Command: (greater -1)

Argument is less than or equal to 0.

Command: (setq y 1)

1

Command: (greater y)

Argument is greater than 0.

Практическое использование оператора IF. Одна из недавних тем на CompuServe ADESK Форуме были же ание изменять команду END, что бы она запрашивала у пользователя, сохранять или нет текущее состояние рисунка перед выходом из AutoCAD, тем же самым способом как запрашивает пользователя команда QUIT. В следующем примере, Вы будете записывать функцию AutoLISP заменяющую родную команду END AutoCAD, и делающую неопределенной родную команду END, чтобы AutoCAD использовал функцию AutoLISP вместо нее. Новая функция будет поэтому определена так, что сможет вызываться непосредственно из командной строки AutoCAD без включения в круглые скобки, и будет самостоятельно вызывать местную команду END ( независимо от того была ли команда END сделана неопределенной ) указав перед именем команды точку ".". Создайте новый файл назвав его END.LSP и добавте туда эту функцию.

(defun C:END (/ usr)

; Запросить пользователя и получить ответ

(setq usr (getstring "\nReally want to END the drawing? "))

; Преобразовать его ответ в символы верхнего регистра

(setq usr (strcase usr))

; Проверяют был ли его ответ "y" или "Y"

(if

(equal "Y" usr)

Если это было, тогда завершить чертеж, иначе вывести сообщение

(command ".END")

(prompt "\nRemaining in drawing editor.")

)

; тихий выход из функции

(prin1)

)

Родная команда END может отключаться командой UNDEFINE и поэтому может заменяться функцией AutoLISP C:END .

Command: UNDEFINE

Command name: END

Command: (load "end")

C:END

Command: END

Really want to END the drawing? n

Remaining in drawing editor.

Command: END

Really want to END the drawing? y

Для эффективности и не выполнения ненужного связывания переменных, которое может быть относительно дорого в смысле компьютерного времени, функция C:END может также быть написана так:

(defun C:END ()

(if

(eq "Y"

(strcase

(getstring "\nReally want to END the drawing? ")

)

)

(command ".END")

(prompt "\nRemaining in drawing editor.")

)

(prin1)

)

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]