Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Книги_AutoCad_2 / Настройка AutoCAD_Sham_Tickoo-Customizing_2006г

.pdf
Скачиваний:
182
Добавлен:
09.04.2015
Размер:
9.06 Mб
Скачать

Использование AutoLISP

441

Пояснения

Строка 5

(defun dtr (a)

Функция defun, содержащаяся в этой строке, определяет функцию dtr (a), которая преобразует градусы в радианы.

Строка 6

(* a (/ pi 180.0))

Число π (pi) делится на 180, а затем полученный результат умножается на величину угла а (угол 180 градусов равен π радиан).

Строка 10

(defun c:belt(/ r1 r2 d a c1 x1 x2 c2 p1 p2 p3 p4)

Функция defun, содержащаяся в этой строке, определяет функцию belt, которая позволяет построить две окружности, соединенные касательными линиями.

Строка 18

(setq x1 (- r2 r1))

Функция setq, содержащаяся в этой строке, присваивает значение, полученное при вычислении выражения (- r2 r1), переменной x1.

Строка 19

(setq x2 (sqrt (- (* d d) (* (- r2 r1) (- r2 r1)))))

Вначале вычисляется разность значений r2 и r1 (выражение (- r2 r1)), после чего полученное число возводится в квадрат (выражение (* (- r2 r1) (- r2 r1)). Затем вычисляется квадратный корень от разницы квадрата гипотенузы и квадрата катета (выражение (sqrt (- (* d d) (* (- r2 r1) (- r2 r1)))). Функция setq присваивает полученное значение переменной x2.

Строка 20

(setq ang (atan (/ x1 x2)))

В этой строке функция (atan (/ x1 x2) вычисляет арктангенс числа, полученного в результате деления x1 и x2. Функция setq присваивает полученное значение переменной ang.

Строка 21

(setq c2 (polar c1 a d))

Функция polar, содержащаяся в этой строке, используется для определения относительного положения точки c2, удаленной от точки с1 на расстояние d и находящейся на линии, образующей угол а с положительной осью Х.

Строка 22

(setq p1 (polar c1 (+ ang a (dtr 90)) r1))

В этой строке функция (polar c1 (+ ang a (dtr 90)) r1)) используется для определения координат точки р1, удаленной от точки с1 на расстояние r1 и на-

442 Глава 12

ходящейся на линии, образующей с положительной осью Х угол (90 + а) (выражение

(+ ang a (dtr 90))).

Строка 28

(command "circle" c1 p3)

Функция command, содержащаяся в этой строке, используется для вызова команды CIRCLE, с помощью которой вы сможете начертить окружность с центром в точке с1 и радиусом, определяемым точкой р3.

Строка 30

(command "line" p1 p2 "")

Функция command, содержащаяся в этой строке, используется для вызова команды LINE, с помощью которой вы сможете начертить линию, соединяющую точки p1 и p2. Пара кавычек ("") в конце строки возвращает каретку в исходное положение, завершая тем самым выполнение команды LINE.

Шаг 3: загрузка программы AutoLISP

Сохраните текст в виде файла с расширением .lsp, а затем загрузите созданную программу, используя описание, приведенное в примере 1.

Упражнение 5

Напишите программу на языке AutoLISP, с помощью которой вы сможете провести касательные к окружностям, показанным на рис. 12.17. Программа должна вывести приглашение, которое позволит определить диаметры и расстояние между центрами окружностей.

Рис. 12.17. Касательные, проведенные к окружностям

Блок-схемы

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

Использование AutoLISP 443

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

Рис. 12.18. Стандартные обозначения, используемые в блок-схемах

Условные операторы

Реляционные операторы (или операторы отношения), с которыми вы познакомились в одной из предыдущих глав, определяют отношения между элементами программы. Например, выражение (< x y) описывает условие, проверяемое при выполнении операции. Для создания более сложных отношений используются условные функции.

444Глава 12

Вданном случае выражение (if (< x y) (setq z (– y x)) (setq z (–x y))) описывает операции, которые будут выполнены в том случае, если данное высказывание является истинным (T) или, наоборот, ложным (nil). Если поставленное условие выполняется, z = y – x. Если условие не выполняется, переменной z присваивается значение (x – y). Таким образом, условные функции играют важную роль во всех языках программирования, включая AutoLISP.

Функция if

Если заданное условие возвращает значение “истина”, функция if (рис. 12.19) вычисляет первое выражение (then); если же это условие возвращает значение “ложь” (“nil”), функция if вычисляет второе выражение (else). Эта функция имеет следующий формат:

(if условие then [else]),

где

условие — заданное условие;

then — выражение, которое вычисляется, когда заданное условие является истинным (T);

else — выражение, которое вычисляется, когда заданное условие является ложным (nil).

Рис. 12.19. Функция if

Примеры

(if (= 7 7) ("true"))

(if (= 5 7) ("true") ("false"))

(setq

ans "yes")

 

(if (=

 

ans

"yes") ("Yes") ("No"))

(setq

num1

8)

 

(setq

num2

10)

 

(if (>

x

num1

num2)

(setq

(-

num1

num2))

(setq

x

(-

num2

num1))

)

 

 

 

 

возвращает “true” возвращает “false”

возвращает “Yes”

возвращает 2

Использование AutoLISP 445

Пример 6

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

Шаг 1: разработка алгоритма и блок-схемы программы

Исходные данные

Число (num1)

Число (num2)

Выходные данные

x = num1 – num2 или

x = num2 – num1

Обработка данных

Если num1 > num2,

то x = num1 – num2 (If num1 > num2 then x = num1 – num2)

Если num1 < num2, то

x = num2 – num1 (If num1 < num2 then x = num2 – num1)

На рис. 12.20 показана блок-схема, описывающая процесс выполнения программы. Для этого используются стандартные условные обозначения.

Рис. 12.20. Блок-схема для примера 6

Шаг 2: написание программы AutoLISP

Для записи программы на языке AutoLISP может использоваться любой текстовый редактор. Ниже приведен листинг программы для примера 6. Номера строк не являются

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

446

Глава 12

 

;Эта программа вычитает большее число

1

;из меньшего.

2

;

 

3

(defun c:subnum()

4

 

(setvar "cmdecho" 0)

5

 

(setq num1 (getreal "\n Enter first number: "))

6

 

(setq num2 (getreal "\n Enter second number: "))

7

 

(if (> num1 num2)

8

 

(setq x (- num1 num2))

9

 

(setq x (- num2 num1))

10

 

)

11

 

(princ)

12

(setvar "cmdecho" 1)

13

(princ)

14

)

 

15

Пояснения

Строка 8

(if (> num1 num2)

Функция if, содержащаяся в этой строке, оценивает заданное условие (> num1 num2). Если это условие выполняется, функция возвращает значение “T” (“истина”); если условие не выполняется, функция возвращает значение “nil” (“ложь”).

Строка 9

(setq x (- num1 num2))

Эта операция выполняется, если проверочное выражение (if (> num1 num2) возвращает значение “Т”. Число num2 вычитается из числа num1 и полученное значение присваивается переменной х.

Строка 10

(setq x (- num1 num2))

Эта операция выполняется в том случае, если проверочное выражение (if (> num1 num2) возвращает значение “nil”. Число num1 вычитается из числа num2 и полученное значение присваивается переменной х.

Строка 11

)

Закрывающая скобка завершает определение функции if.

Шаг 3: загрузка программы AutoLISP

Сохраните текст в виде файла с расширением .lsp, а затем, используя команду APPLOAD, загрузите созданную программу, как описывается в примере 1.

Использование AutoLISP

447

Пример 7

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

Шаг 1: создание блок-схемы

На рис. 12.21 показан один из возможных вариантов вашей блок-схемы.

Рис.12.21. Блок-схема для примера 7

Шаг 2: написание программы AutoLISP

Ниже приведен листинг программы на языке AutoLISP для примера 7.

;Эта программа делит или умножает два заданных числа. (defun c:cmdnum()

(setvar "cmdecho" 0)

(setq num1 (getreal "\n Enter first number: ")) (setq num2 (getreal "\n Enter second number: "))

(prompt "Do you want to multiply or divide? Enter M or D: ") (setq ans (strcase (getstring)))

(if (= ans "M")

(setq x (* num1 num2))

)

(if (= ans "D")

(setq x (/ num1 num2))

)

(if (and (/ = ans "D")(/ = ans "M")) (prompt "Sorry! Wrong entry/ Try again") (princ x)

)

(setvar "cmdecho" 1) (princ)

)

448 Глава 12

Шаг 3: загрузка программы AutoLISP

Сохраните текст в виде файла с расширением .lsp, а затем загрузите созданную программу, используя команду APPLOAD. О том, как это сделать, рассказывается в примере 1.

Функция progn

Функция progn может использоваться вместе с функцией if для оценки сразу нескольких выражений. Функция progn имеет следующий формат:

(progn выражение1 выражение2 ...)

Функция if вычисляет только одно выражение (при условии, что заданное условие возвращает значение “истина”). В отличие от этого, функция progn, используемая вместе с функцией if, позволяет вычислить сразу несколько выражений. Ниже приведен пример, иллюстрирующий совместное использование этих функций.

Пример

(defun c:IFPRGN()

(setq p1(getint "Введите целое число")) (if (> = p1 5)

(progn (command "line" "2,2" "3,3" "") (command "rec" "3,3" "6,6"))

(progn (command "circle" "3,3" 1) (command "line" "3,3" "5,5" ""))

)

)

;Конец программы

Функция while

Функция while (рис. 12.22) проверяет выполнение заданного условия. Если условие выполняется (возвращаемое значение не равно nil), то операция, указанная после оператора while, выполняется до тех пор, пока проверочное выражение не возвратит значение nil. Функция while имеет следующий формат:

(while пров_выражение операции),

где

пров_выражение — выражение, проверяющее выполнение условия;

операции — операции, выполняемые до тех пор, пока проверочное выражение не возвратит значение nil.

Пример

(while (= ans "yes") (setq x (+ x 1))

(setq ans (getstring "Enter yes or no: "))

)

(while (< n 3) (setq x (+ x 10)) (setq n (1 + n))

)

Использование AutoLISP 449

Рис. 12.22. Функция while

Пример 8

Напишите программу на языке AutoLISP, с помощью которой вы сможете возвести заданное число в n-ю степень. Показатель степени n — любое целое число. Эта программа должна также вывести приглашение, которое позволит вам ввести число и показатель степени (рис. 12.23).

Рис. 12.23. Блок-схема программы для примера 8

Шаг 1: разработка алгоритма программы и создание блок-схемы

Исходные данные

Число х

Показатель степени n

Выходные данные

• Число х в степени n (xn)

450 Глава 12

Обработка данных

1.Установите значения: t = 1 и c =1.

2.Умножьте t на x и присвойте полученный результат переменной t.

3.Повторяйте эту операцию до тех пор, пока счетчик c будет меньше или равен показателю степени n.

Шаг 2: написание программы AutoLISP

Ниже представлен листинг программы AutoLISP для примера 8.

;Эта программа вычисляет n-ю ;степень заданного числа (defun c:npower()

(setvar "cmdecho" 0)

(setq x(getreal "\n Enter a number: "))

(setq n(getint "\n Enter Nth power-integer number: ")) (setq t 1) (setq c 1)

(while (<= c n) (setq t (* t x)) (setq c (1 + c))

)

(princ t) (setvar "cmdecho" 1) (princ)

)

Шаг 3: загрузка программы AutoLISP

Сохраните файл, а затем загрузите созданную программу, используя для этого команду APPLOAD.

Пример 9

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

Рис. 12.24. Шесть крепежных отверстий, расположенных по окружности

Соседние файлы в папке Книги_AutoCad_2