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

4.3. Вычисления в AutoLisp

AutoCAD не имеет вычислителя, похожего на всплывающий калькулятор, чтобы выполнить арифметические операции и возвращать соответствующее значение в командную строку AutoCAD, но он имеет язык программирования чтобы вычислять и сохранять значения и передавать их AutoCAD. Комментарий " AutoCAD не имеет встроенный калькулятор " - истина, поскольку это бессмысленно, потому что он имеет взамен весь встроенный язык программирования!

AutoLISP может использоваться в любое время в редакторе рисунка. Он может использоваться в командной строке при запросе размерности, и при любом запросе сгенерированном любой командой AutoCAD.

Синтаксис не такой простой, чтобы овладеть им сразу как у простого калькулятора с 10 клавишами; однако, это еще более мощно. И синтаксис, если он изучен, является простым и непротиворечивым.

Возврат значения в командную строку. Значение выражения AutoLISP передается от AutoLISP к AutoCAD как ответ в командную строку AutoCAD.

Если командная строка активна, значение выражения просто печатается в командной строке. Любой побочный эффект который происходит во время выполнения выражения, типа нового связывания символов, является несоответствующим для приглашения ко вводу команды (пока команда AutoCAD не вызывается в выражении). Например, эта форма (форма являясь любое сложное выражение которое обрабатывается как код программы а не как данные) связывает символ X и результ сложения 4 и 6 а затем передает значение 10 в AutoCAD, который просто печатает результат в командной строке.

Command: ( setq x ( + 4 6 ))

10

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

Например, эта форма возвращает значение деления квадратного корня 50 на вещественное число 9.

Command: ( / ( sqrt 50.0 ) 9.0 )

0.785674

Эта форма возвращает значение умножения результата сложения 2.5 и 6.3 на 24.0.

Command: ( * ( + 2.5 6.3 ) 24.0 )

211.2

Возврат значения команде AutoCAD

Если команда AutoCAD активна, тогда оценка формы AutoLISP возвращает значение в AutoCAD. Значение становится ответом к текущей подсказке команды AutoCAD.

В этом примере, команда ARRAY получает как число элементов массива результат формы AutoLISP которая делит 6.0 на 0.35; другими словами, мы не знаем вначале сколько приходится величин 0.35 на величину 6.0, так что мы просим AutoLISP вычислить это значение для нас и возвратить ответ в AutoCAD. Так как подсказка из ARRAY принимает только целочисленные значения, мы будем использовать AutoLISP функцию ( fix <real> ) чтобы округлить полученное значение к самому близкому целому числу.

Command: ( / 6.0 0.35 )

17.1429

Command: ( fix 17.1429 )

17

Command: ( fix ( / 6.0 0.35 ))

17

Command: LINE

From point: 1,1

to point: 5,5

to point: <return>

Command: ARRAY

Select objects: L

Select objects: <return>

Rectangular or Polar array (R/P): R

Number of rows (---) <1>: 1

Number of columns (|||) <1>: (fix (/ 6.0 0.35))

Distance between columns: 0.35

В этом случае, AutoCAD создает 17 элементов в массиве.

Важным есть указание на то, что форма AutoLISP использовалась в интерактивном режиме, в середине команды AutoCAD, для вычисления значение ( в этом случае, целого числа ) которое впоследствии автоматически предалось команде в этом же месте в качестве ответа на запрос.

В этом примере AutoLISP вычисляет размер радиуса для команды fillet.

Command: FILLET

Polyline/Radius/<Select two lines>: R

Enter fillet radius <1.0>: (/ 28.0 8.0)

Так как оба параметра для (/) - вещественные числа, результат вещественен, и размер радиуса для команды fillet устанавливается в 3.5.

Интерактивное вычисление. Другой метод передавать значения команде AutoCAD состoит в том, чтобы использовать форму AutoLISP которая непосредственно запрашивает пользователя набрать необходимые значения, а затем выполняет некоторые операции над этими значениями, в конечном счете возвращая ответ в AutoCAD. Это вероятно более легко для использования чем для объяснения.

Прежде, чем мы выполним некоторое сложное вычисление с запрошенными у пользователя значениями, мы будем представлять две новых функции AutoLISP: (getdist) и (getpoint).

(getdist) останавливает выполнение формы и позволяет пользователю определять расстояние набрать на клавиатуре значение, или выбрать с помощю мыши две точки; точно такой же механизм используется каждой подсказкой AutoCAD которая запрашивает пользователя указать расстояние.

(getpoint) останавливает форму и позволяет пользователю выбрать точку, используя любой из стандартных методов выбора точки: указать на экране; ввести значение в абсолютных, относительных, или относительных полярных координатах; используя обьектную привязку, координатные фильтры, или спецификацию lastpoint.

GETDIST. Этот пример использует подсказку в функции (getdist), которая запрашивает у пользователя расстояние. Пробуйте использовать эту форму в командной строке и ответить на нее один раз набирая значение, а другой - выбирая две точки на дисплее.

Управляющие символы \n, или наклонная черта влево и нижний регистр n, означают переход на новую строку. Они необходимы для того, что бы подсказка появилась на новой строке в области приглашения ко вводу команды.

Command: ( getdist " \nEnter distance: " )

Enter a distance: <enter a number>

Command: (getdist "\nEnter a distance: ")

Enter a distance: <pick two points>

В обоих случаях, (getdist) возвращает расстояние введенное пользователем как вещественное число.

GETPOINT. Этот пример использует подсказку для функции (getpoint), которая запрашивает у пользователя точку. Пробуйте использовать эту форму введя значение в абсолютных координатах, указав на экране, и используя объектную привязку.

Command: ( getpoint " \nPoint: " )

Point: 1,1

(1.0 1.0 0.0)

AutoLISP возвращает точку как список трех вещественных чисел. 3-D точки возвращаются как список трех вещественных чисел; 2-D точки как список двух вещественных чисел. По умолчанию, все точки выбранные в Версии 10 полностью 3-D, с X, Y, и Z значениями. Первый элемент в списке точки - значение X, второй - значение Y, и третий - значение Z.

Это выражение ( 1.0 1.0 0.0 ) не форма, потому что оно не может оцениваться. Оно не содержит никакой функции в первом элементе списка. Это - пример использование списка в AutoLISP чтобы сохранить данные предпочтительнее чем код программы.

Command: ( getpoint " \nPoint: " )

Point: <pick point>

Command: LINE

From point: 1,1

To point: 5,5

To point: <return>

Command: (getpoint "\nPoint: ")

Point: MID

of <pick line>

(3.0 3.0 0.0)

Необязательные подсказки. Нет никаких жестких правил которые бы сообщали, что Вы должны включать необязательный строковый аргумент в (getdist) или (getpoint) как подсказку для пользователя. Однако, это - хорошая практика если вы делать так. Можете предположить почему?

Пробуйте использовать (getdist) и (getpoint) без необязательного строкового аргумента.

Command: (getdist)

?

Command: (getpoint)

?

Еще больше вычислений. Так как компьютер - по существу калькулятор с памятью, то вычисления требуют чтобы AutoLISP помнил расстояния и точки.

В этом примере, переменная X связывается со списком трех вещес твенных чисел которые формируют координаты 1,1,0.

Command: ( setq x ( getpoint " \nPoint: " ))

Point: 1,1

(1.0 1.0 0.0)

Имеются другой способ связать X и список трех вещественных чисел без того, чтобы использовать функцию (getpoint). Можете Вы не забыли что это? Это функция которая сообщает чтобы AutoLISP брал следующий аргумент в его значении (как данные), скорее чем пробовал оценивать это (как форма )...

В этом примере, выберите произвольную точку где-нибудь на экране с помощью курсора.

Command: ( setq x (getpoint) )

<pick a point>

Затем, начертите линию, начинающуюся в 0,0 и заканчивающий в точке сохраненной в переменной X. Как можно запросить AutoLISP использовать текущее значение переменной?

Command: LINE

From point: 0,0

To point: !x

To point: <return>

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

Command: CIRCLE

3P/2P/TTR/<Center point>: !x

Diameter/<Radius>: 1.0

Command: (setq origin (quote (0.0 0.0 0.0)))

(0.0 0.0 0.0)

Command: MOVE

Select objects: Last

Select objects: <return>

Base point or displacement: !x

Second point of displacement: !origin

Предыдущий пример должен переместить окружность и расположить ее центральную точку в 0,0. Можете ли Вы определить почему?

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

Сначала мы будем формировать некоторую произвольную геометрическую конструкцию.

Command: LINE

From point: 1.1143,5

To point: 8.9178,5

To point: <return>

Command: CIRCLE

3P/2P/TTR/<Center point>: 1.1143,5

Diameter/<Radius>: 0.5

Теперь, мы будем использовать (getdist) чтобы помочь обеспечить средства для ARRAY. В начале для ARRAY необходимо: в интерактивном режиме вычислить число элементов которые должны появляться в массиве основанном только на расстоянии между каждым элементом и общими расстоянием в массиве! В этом примере, мы будем выделять каждому элемету 0.5 едениц в отдельности.

Command: ARRAY

Select objects: Last

Select objects: <return>

Rectangular or Polar array (R/P): R

Number of rows: 1

Number of columns: (fix (/ (getdist "\nDistance: ") 0.5))

Distance: END

of <pick start point of line>

Second point: END

of <pick end point of line>

Distance between columns: 0.5

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

Command: UNDO

Auto/Back/Control/End/Group/Mark/<number>: 1

Command: ARRAY

Select objects: Last

Select objects: <return>

Rectangular or Polar array (R/P): R

Number of rows: 1

Number of columns: 10

Distance between columns: (/ (getdist) 10)

END

of <pick start point of line>

Second point: END

of <pick end point of line>

Следующие занятие: Запись новых команд AutoCAD

Для этого урока нет никакх вопросов. Пожалуйста экспериментируйте самостоятельно, использование выражения AutoLISP в приглашении ко вводу команды и внутри команд AutoCAD чтобы вычислять и сохранять ответы для AutoCAD.

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