ВВЕДЕНИЕ
_________________________________________________________________
-списки
-символы
-строки
-вещественные числа
-целые числа
-дескрипторы файлов
-"имена" примитивов системы AutoCAD
-совокупности отбора системы AutoCAD
-встроенные в функции (subr)
n>
() . ' " ;
'foo
эквивалентно:
(quote foo)
(moo "Hello" 5)
(moo "Hi" 1 2 3
(foo "catch")
(foo "catch" 22)
error: text
2.2.1 Настройка
2.3.1 Настройка
Commmand: PATH
Start point of path: начальная точка
End point of path: конечная точка
Half width of path: число
Radius of tiles: число
Spacing between tiles: число
/Команда ...
Начальная точка дорожки ...
Конечная точка дорожки ...
Половина ширина дорожки ...
Расстояние между плитами ... /
PI * (a / 180 . 0)
Command: (dtr 0)
0.000000
3.141593
Command: QUIT
Really want to discard all changes to drawing? Y
/Команда ...
Действительно хотите отменить все изменения чертежа? /
и ответьте вводом :
Command: (gpuser)
Command: !sp
(2.000000)
Command: !ep
(9.000000 8.000000)
Command: !hwidth
2.000000
Command: !width
4.000000
Command: !trad
0.200000
Command: !tspac
0.100000
Command: !pangle
0.708626
Command: !plength
9.219544
Command: !angp90
2.279423
Command: !angm90
-0.862169
(defun gpuser ()
(setq sp (getpoint "\ nStart point of path: "))
(setq ep (getpoint "\nEnd point of path: "))
(setq hwidth (getdist "\nHalf width of path: "sp)
(setq trad (getdist "\nRadius of tiles: "sp))
(setq tspac (getdist "\nSpacing between tiles: " sp))
│ )
│
│ )
Command: (gpuser)
Command: (drawout)
Command: (qpuser)
Command: (DRAWOUT)
Command: (DRAWTILES)
(defun gpuser ()
(setq sp (getpoint "\nStart point of path: "))
(setq ep (getpoint "\nEnd point of path: "))
(setq hwidth (getdist "\nHalf width of path: "sp))
(setq trad (getdist "\nRadius of tiles: "sp))
(setq tspac (getdist "\nSpacing between tiles: "sp))
(defun drawout ()
(command "pline"
(setq p (polar sp angm90 hwidth))
(setq p (polar p pangle plength))
(setq p (polar p angp90 width))
(polar p (+ pangle (dtr 180)) plength)
"close"
)
)
(defun drawtiles ()
(setq pdist (+ trad tspac))
(setq off 0.0)
(while (<= pdist (- plength trad))
(drow pdist off)
(defun gpuser ()
(setq sp (getpoint "\nStart point of path: "))
(setq ep (getpoint "\nEnd point: "))
(setq hwidth (getdist "n\Half width of path: "sp))
(setq trad (getdist "\nRadius of tiles: "sp))
(setq tspac (getdist "\n Spacing between tiles: "sp)
(defun drawtiles ()
(setq pdist (+ trad tspac))
(setq off 0.0)
(while (<= pdist (- plegth trad))
(drow pdist off)
(setq pdist (+ pdist (* (+ tspac trad trad) (sin
(dtr 60 )))))
(if (= off 0.0)
(setq off (* (+tspac trad trad) (cos (dtr 60))))
(setq off 0.0)
)
)
)
(defun C:PATH ()
(gpuser)
| (setq sblip (getvar "blipmode"))
| (setq scmde (getvar "cmdecho"))
| (setvar "blipmode" 0)
| (setvar "cmdecho" 0)
(drawout)
(drawtiles)
3.9. Выводы
(+ 1 2) возвращает 3
(+1 2 3 4.5) возвращает 10.500000
(+1 2 3 4.0) возвращает 10.000000
(- 50 40) возвращает 10
(- 50 40.0 2) возвращает 8.000000
(- 50 40.0 2.5) возвращает 7.500000
(- 8) возвращает - 8
(* 2 3) возвращает 6
(* 2 3 4 .0) возвращает 24.000000
(* 3 -4.5) возвращает -13.500000
4.5. (/ <number> <number>. . .)
Эта функция делит первое число на второе и возвращает частное.
Если задается более чем два числа, первое число делится на
произведение остальных чисел и возвращается частное. Эта функция может
использоваться с вещественными и целыми числами, подчиняясь
стандартным правилам преобразования. Например:
(/ 100 2) возвращает 50
(/ 100 2.0) возвращает 50.000000
(/ 100 20 2.0) возвращает 2.500000
(/ 100 20.0 2) возвращает 2.500000
(/ 100.0 20 2) возвращает 2.500000
(/ 100 20 2) возвращает 2
(/ 135 360) возвращает 0
(/ 135 360.0) возвращает 0.375000
(= 4 4.0) возвращает T
(= 20 388) возвращает nil
(= 2.4 2.4 2.4) возвращает T
(= 499 499 500) возвращает nil
(= "me" "me") возвращает T
(= "me" "you") возвращает nil
(/= 10 20 ) возвращает T
(/= "you" "you") возвращает nil
(/= 5.43 5.44) возвращает T
4.12. (~ <number>)
(1+ 5) возвращает 6
(1+ -17.5) возвращает -16.500000
(1- 5) возвращает 4
(1- -17.5) возвращает -18.500000
(setq a 103)
(setq b nil)
(setq c "string")
получим:
получим
тогда:
тогда
_________________________________________________________________
<func> | Операция | Получаемый бит равен единице, если...
_________|__________|____________________________________________
1 | AND | Оба бита на входе установлены на 1
_________|__________|____________________________________________
6 | XOR | Только один из двух битов на входе равен 1
_________|__________|____________________________________________
7 | OR | Один или оба бита на входе установлены на 1
_________|__________|____________________________________________
8 | NOT | Оба бита на входе установлены на 0 (допол-
| | нение единицы)
_________|__________|____________________________________________
Например:
(Boole 1 12 5)
(Boole 6 6 5)
(Boole 4 3 14)
возвратит 12.
(setq a 2)
(setq b nil)
получим:
тоа:
то:
(close x)
Замечания:
Обратите внимание на то, что первый элемент может быть атомом или
списком.
далее:
1. Функция должна иметь имя имя C:XXX, где все буквы даны в верхнем
регистре. Часть имени "C:" всегда должна присутствовать; частью
"XXX" может быть имя команды по вашему выбору, при условии, если
оно не дублирует никакую другую команду AutoCADа, встроенную или
внешнюю.
Command: PSQUARE
Lower left corner: (ввести точку)
Length of one side: (ввести расстояние)
Пример:
Пусть необходимо переопределить стандартные команды Автокада QUIT и
END.Это можно проделать с помощью автоматичеки загружаемого файла
:acad.lsp",содержащего следующие записи:
(defun C:QUIT ()
....определение....
)
(defun C:END ()
....определение....
)
(defun S::STARTUP()
(command "UNDEFINE" "QUIT")
(command "UNDEFINE" "QUIT")
)
тогда:
затем:
Пример:
пусть
(setq a 1.123456)
(setq b 1.123457)
тогда
(equal a b) возвращает nil
(equal a b 0.000001) возвращает T
(setq a 123)
(setq b 'a)
затем:
(expt 2 4) возвращает 16
(expt 3.0 2.0) возвращает 9.000000
Пример:
пусть
- текущий каталог - "/acad" в нем хранится файл "abc.lsp";
- редактируется рисунок из каталога "/acad/drawings";
- в переменную среды ACAD установлено значение "/acad/support";
- файл "xyz.txt" хранится только в каталоге "/acad/support";
-файла "nosuch" нет ни в одном из каталогов.
Тогда
(fix 3) возвращает 3
(fix 3.7) возвращает 3.000000
4.47. (float <number>)
эквивалентно выражениям:
(print a)
(print b)
(print c)
Пример:
Если переменная среды ACAD имеет значение "/acad/support",а
переменная NOSUCH не определена,тогда
----------------------------------------------------------------
Ввод | GETANGLE | GETORIENT |
(в градусах) | | |
---------------------------------------------------------------|
0 | 0.000000 | 1.570796 |
---------------------------------------------------------------|
-90 | 1.570796 | 3.141593 |
---------------------------------------------------------------|
180 | 3.141593 | 4.712389 |
---------------------------------------------------------------|
90 | 4.712389 | 0.000000 |
----------------------------------------------------------------
(setq p (getpoint))
(setq p (getpoint "Where? "))
(setq p (getpoint '(1.5 2.0) "Second point: "))
(setq s (getstring))
(setq s (getstring "What's your first name? "))
(setq s (getstring) T "What's your full name? "))
4.61. (graphscr)
____________________________________________________________
| INITGET Bits | Значение |
| /Биты функции/ | |
|__________________|_________________________________________|
| 1 | Запретить пустой ввод. |
|__________________|_________________________________________|
| 2 | Запретить ввод нуля . |
|__________________|_________________________________________|
| 4 | Запретить отрицательные значения. |
|__________________|_________________________________________|
| 8 | Не проверять соблюдение пределов, даже |
| | если LIMCHECK в активном состоянии. |
|__________________|_________________________________________|
| 16 | Возвратить трехмерные точки, а не дву- |
| | мерные. |
|__________________|_________________________________________|
| 32 | Использовать пунктирные линии для ре- |
| | зиновых нити и прямоугольника |
|__________________|_________________________________________|
Эти биты могут складываться в любой комбинации для задания
значения между 0 и 63.(Последующие версии Автолиспа могут включать
дополнительные управляющие биты,так что следует избегать
незадокументированных битов.) Если значение системной переменной
FLATLAND равно нулю ,то считается что установлен бит "трехмерная
точка".Если ввод пользователя не отвечает одному или более из заданных
условий (например, ввод нулевого значения, когда нулевые значения не
разрешаются), то AutoCAD высветит сообщение и запросит пользователя
повторить ввод снова. Например, на запрос:
(initget (+ 1 2 4))
(setq age (getint "How old are you? "))
_______________________________________________________________________
| Учитываемые биты управления INITGET
|
Функция
|______________________________________________________|
| Нет | Нет | Нет | Нет | Точки
|Пунктир|
| пусто- | нуля | отриц. | соблю- | 3D |
|
| го | | ввода | дения | |
|
| ввода | | | пределов| |
|
________________|________|______|__________|__________|________|_______|
GETINT | . | . | . | | |
|
________________|________|______|__________|__________|________|_______|
GETREAL | . | . | . | | |
|
________________|________|______|__________|__________|________|_______|
GETDIST | . | . | . | | . | .
|
________________|________|______|__________|__________|________|_______|
GETANGLE | . | . | | | | .
|
________________|________|______|__________|__________|________|_______|
GETORIENT | . | . | | | | .
|
________________|________|______|__________|__________|________|_______|
GETPOINT | . | | | . | . | .
|
________________|________|______|__________|__________|________|_______|
GETCORNER | . | | | . | . | .
|
________________|________|______|__________|__________|________|_______|
GETKWORD | . | | | | |
|
________________|________|______|__________|__________|________|_______|
GETSTRING | | | | | |
|
________________|________|______|__________|__________|________|_______|
GETVAR | | | | | |
|
________________|________|______|__________|__________|________|_______|
"LTYPE, LT" и
"LType"
(defun getnum (/ x)
(initget 1 "Pi Two-pi")
(setq x (getreal "Pi/Two-pi/<number>: "))
(cond ((eq x "Pi") pi)
((eq x "Two-pi") (* 2.0 pi))
(T x)
)
)
то:
(logand 7 15 3) возвращает 3
(logand 2 3 15) возвращает 2
(logand 8 3 4) возвращает 0
(logior 1 2 4) возвращает 7
(logior 9 3) возвращает 11
Например:
(lsh 2 1) возвращает 4
(lsh 2 -1) возвращает 1
(lsh 40 2) возвращает 160
(lsh 16384 1) возвращает -32768 для 16-разрядных машин
(lsh 16384 1) возвращает 32768 для 32-разрядных машин
4.76. (mapcar <function> <list1>...<listn>)
Это эквивалентно:
(1+ 10)
(1+ 20)
(1+ 30)
(mapcar '+ ' (10 20 30) '(4 3 2)) возвращает (14 23 32)
это эквивалентно
(+ 10 4)
(+ 20 3)
(+ 30 2)
Например:
(mapcar '(lambda (x) (+ x 3)) '(10 20 30)) возвращает (13 23 33)
и:
(mapcar '(lambda (x y z)
(* x (- y z))
)
'(5 6) '(20 30) '(14 5.0)
) возвращает (30 150.0)
section=submenu
раздел=подменю
где:
(menucmd "S=OSNAP")
(menucmd "B=MY-BUTTONS")
(menucmd "P1=NUMERIC")
(menucmd "P1=*")
(setq a 123)
(setq b "string")
(setq c nil)
то:
(setq a 123)
(setq b "string")
(setq c nil)
тогда:
(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
__________________________________________________________________
режим | ОПИСАНИЕ |
OPEN | |
__________|______________________________________________________|
"r" | Окрыт для чтения. Если <filename> не существует, |
| то возвращается nil. |
__________|______________________________________________________|
"w" | Открыт для записи. Если <filename> не существует, то|
| создается и открывается новый файл. Если <filename> |
| существует, то его данные перезаписываются. |
__________|______________________________________________________|
"a" | Окрыт для добавления. Если <filename> не существует,|
| то создается и открывается новый файл. Если <имя|
| файла> уже существует, то он открывается и новые |
| данные, которые вы записываете в файл, будут |
| добавляться вслед за существующими. |
| |
| В системах DOS некоторые программы и редакторы |
| текстов записывают текстовые файлы с меткой конца|
| файла (CTRL Z, десятичный ASCII код 26) после |
| текста. При считывании текстового файла, когда|
Например:
4.89. pi
Например:
Предположим ,что значение переменной FLATLAND равно 0
(polar '(1.0 1.0 3.5) 0.785398 1.414214) возвращает (2.0 2.0 3.5)
(setq a 123)
(setq b '(a))
то:
(print1 "Hello" f)
запишет "Hello" в заданный файл и возвратит "Hello".
\e для ESC
\n для новой строки
\r для возврата
\t для табуляции
\nnn для символа, восьмеричным кодом которого является nnn
Таким образом:
Пример:
пусть
(defun C:SETUP ()
(setvar "LUNITS" 4)
(setvar "BLIPMODE" 0)
(print1)
Тогда
Command:SETUP
исполнит определенную пользователем команду ,отвечая на запросы
функции SETVAR,и вернется к подсказке Автокада "Command" нне выводя на
экран никаких лишних сообщений.
(if (= a b) (progn
(setq a (+ a 10))
(setq b (- b 10))
)
)
'expr
Например:
(qoute a) возвращает A
(qoute cat) возвращает CAT
(quote (a b)) возвращает (A B)
'a возвращает A
'cat возвращает CAT
'(a b) возвращает (A B)
(read-char)
(read-line f)
(redraw)
(redraw <ename>)
-----------------------------------------------------------------
REDRAW режим | Действие |
| |
----------------|-----------------------------------------------|
1 | Перечертить примитив на экране. |
----------------|-----------------------------------------------|
2 | Отменить перечерчивание примитива(стирает) |
----------------|-----------------------------------------------|
3 | Высветить примитив более ярким светом (если|
| это позволяет дисплей) |
----------------|-----------------------------------------------|
4 | Отменить высвечивание примитива (если |
| позволяет дисплей) |
-----------------------------------------------------------------
(setq a 10)
(setq b 100)
то:
(repeat 4
(setq a (+a 10))
(setq b (+b 10))
) возвращает: 140
----------------------------------------------------------------
RTOS Mode | Формат редактирования |
/Режим/ | |
--------------|------------------------------------------------|
1 | Научный |
--------------|------------------------------------------------|
2 | Десятичный |
--------------|------------------------------------------------|
3 | Технический (футы и десятичные доли дюймов) |
--------------|------------------------------------------------|
4 | Архитектурный (футы и дробные дюймы) |
--------------|------------------------------------------------|
5 | Произвольные дробные единицы |
----------------------------------------------------------------
Пусть DIMZIN=0
__________________________________________________________
| Функции SET и SETQ могут присваивать новые значения |
| встроенным символам AutoLISPа и именам функций, игнорируя|
| первоначальные значения или делая их недоступными. |
| Некоторые пользователи пытались ошибочно сделать |
| следующее: |
| |
| (setq angle (...)) ;Неправильно! |
| (setq length (...)) ;Неправильно! |
| (setq max (...)) ;Неправильно! |
| (setq t (...)) ;Неправильно! |
| (setq pi 3.0) ;Неправильно!!! |
| |
| Чтобы избежать ошибок подобного рода, будьте осторожны |
| при выборе имен для ваших собственных символов. НИКОГДА |
| НЕ ИСПОЛЬЗУЙТЕ ВСТРОЕННЫЙ СИМВОЛ ИЛИ ИМЯ ФУНКЦИИ ДЛЯ |
| ВАШЕГО СОБСТВЕННОГО СИМВОЛА! (Перед загрузкой любой |
| функции AutoLISP введите "!ATOMLIST" в ответ на запрос |
| системы AutoCAD "Command:", чтобы узнать, какие символы |
| не следует использовать. |
|__________________________________________________________|
Тогда:
тогда:
(setq old
(assoc 'first who)
) возвращает (FIRST JOHN)
(setq new '(first j)) возвращает (FIRST J)
(subst new old who) возвращает (FIRST J) (MID Q) (LAST PUBLIC)
4.115. (terpri)
4.116. (textscr)
-----------------------------------------------------------
| Код | Система координат |
-----------------------------------------------------------
| 0 | Мировая (WCS) |
-----------------------------------------------------------
| 1 | Пользовательская (текущая UCS) |
-----------------------------------------------------------
| 2 | Экранная (DCS текущего видового экрана) |
-----------------------------------------------------------
--------------------------------------------------------------
| Из | Точка | Перемещение |
--------------------------------------------------------------
| WCS | 0.0 | 0.0 |
--------------------------------------------------------------
| UCS | Текущий уровень | 0.0 |
--------------------------------------------------------------
| OCS | 0.0 | 0.0 |
--------------------------------------------------------------
| DCS | Проецируется на текущую| 0.0 |
| | плоскость построений | |
| |(плоскость XY UCS + | |
| | текущий уровень ) | |
--------------------------------------------------------------
Например, пусть:
тогда:
4.122 (vports)
Пример:
Пусть имеется конфигурация с одним видовым экраном,тогда функция
VPORTS может возвратить
((1 (0.0 0.0) (1.0 1.0)))
а если имеется конфигурация с четырьмя видовыми экранами
одинакового размера,то функция VPORTS может возвратить
(setq a 1)
то:
(write-char 67 f) возвращает 67
(write-char 10 f) возвращает 10
ГЛАВА 5.
_________________________________________________________________
ДОСТУП К ПРИМИТИВАМ И УСТРОЙСТВАМ АВТОКАДА
_____________________________________________________
| Имена примитивов и совокупности отбора дос- |
| тупны только в сеансе редактора чертежей, |
| во время которого обеспечивается доступ к ним из |
| AutoCADа. |
|_____________________________________________________|
Кроме того, функции, связанные с примитивами могут манипулировать с
метками примитивов, являющимися постоянными идентификаторами,
присвоенными Автокадом примитивам.Автолисп воспринимает эти метки как
строки, состоящие из шестнадцатиричных чисел.
Код Значение
0 Тип примитива
6 Тип линии
8 Имя слоя
Примеры:
(setq el (entnext)) ;присваивает в E1 имя примитива в
рисунке
(setq ss (ssadd)) ;устанавливает нулевой набор SS
(ssadd el ss) ; возвращает набор SS, в котором добавлен
примитив по имени E1
(setq e2 (entnext el)) ;получает примитив,следующий за E1
(ssadd e2 ss) ;возвращает набор SS,в который добавлен
примитив E2
Пример:
(setq el (entnext)) ;
присваивает Е1 имя первого примитива в
рисунке
(setq e2 (entnext el)) ; присваивает Е2 имя примитива,следующего
за Е1
5.2.8. (entlast)
Command: LINE
From point: 1,1
To point: 6,6
To point: RETURN
Пример:
(handent "5A2") вернет <Имя примитива: 60004722>
Пример:
(setq el (entnext)) ;присваивает Е1имя первого примитива в рисунке
(entdel el) ;удаляет примитив Е1
(entdel el) ;восстанавливает удаленный примитив Е1
Command: LINE
From point: 1,2
To point: 6,6
To point: RETURN
Теперь можно получить данные о нарисованном отрезке после ввода
Command: ELEV
New current elevation <0.0000>: 3.5
New current thickness <0.0000>: 0
Command: LINTYPE
?/Create/Load/Set: SET
New entity linetype <BYLAYER>: DASHED
Command: COLOR
New entity color <BYLAYER>: BLUE
Command: LAYER
?/Make/Set/New/On/Off/Color/Ltype/Freeze/Thaw: MAKE
New current layer <0>: ANNOTATION
?/Make/Set/New/On/Off/Color/Ltype/Freeze/Thaw: RETURN
Command: TEXT
Start point or Align/Center/Fit/Middle/Right/Style: 2,2
Height <0.2000>: .3
Rotation angle <0>: 30
Text: So long and thanks for all the fish!
Command: (setq e (entget (entlast)))
5.3.5. Ограничения
может вернуть:
может вернуть:
((0 . "STYLE") (тип символа)
(2 . "STANDARD") (имя символа)
(70 . 0) (флаги)
(40 . 0.0) (фиксированная высота)
(grtext)
(redraw)
- 73 -
ГЛАВА 6.
___________________________________________________________________
УПРАВЛЕНИЕ ПАМЯТЬЮ
C>SET LISPHEAP=30000
C>SET LISPSTACK=10000
(vmon)
(alloc <namber>)
ALLOC устанавливает размер сегмента, равный <числу> нодов, и
возвращает предыдущую установку.
Используя функцию EXPAND, можно вручную распределить пространство
нодов,задавая число сегментов.
(expand <namber>)
****
6.4.6 Постраничная организация виртуальной памяти
После выполнения функции VMON, все DEFUN помещает новый узел,
называемый страничной таблицей/page table/ в начале каждого списка
определения функций. Этот узел добавляется перед списком формальных
аргументов. Узлы страничной таблицы служат только для использования
средств разбивки на страницы и никоим образом не должны обрабатываться
пользовательскими программами. Функция TYPE возвращает PAGETB для этих
узлов.