Функции в Autolisp



страница2/3
Дата25.07.2016
Размер0.71 Mb.
#4971
1   2   3

1.34 (cond (<тест 1> <резултат 1> ...) ...)

Тази функция приема произволно много списъци като аргументи. Тя оце­нява първия елемент във всеки списък (в дадения ред), докато един от тези елементи покаже стойност, различна от Nil. След това се оце­ня­ват следващите от успешния тест изрази и като резултат се дава стой­но­ст­та на последния израз от подсписъка. Ако подсписъка съдържа само един израз (когато напр. Липсва <резултат>), като резултат се дава стой­ността на израза <тест>. COND е най-важната условна функция на AutoLISP.

Пример 1:

В следващия пример COND се използва за изчисление на абсолютна стойност.

(cond ((minusp a) (- a))

(t a)


)

Ако "a" има стойност -10, резултатът ще е 10. Обикновено Т се използва като предварително зададен <тест>-израз.

Пример 2:

В символа "s" е даден отговор на потребителя във формата на символен низ. Тази функция проверява отговора и дава 1, ако той е "Y" или 0, ако е "N", в противен случай - Nil.

(cond ((=s "Y") 1)

((=s "y") 1)

((=s "N") 0)

((=s "n") 0)

(t Nil)

)
1.35 (cons <нов първи елемент> <списък>)



Това е основната функция за конструиране на списъци. Тя взема един елемент (<нов първи елемент>) и един <списък> и прибавя този еле­мент в началото на <списък>.

Пример 1:

(cons ‘a ‘(b c d)) резултат (A B C D)

(cons ‘(a) ‘(b c d)) резултат ((A) B C D)

*** Първи елемент може да е АТОМ или СПИСЪК.

CONS приема също вместо аргумент <списък> 1 атом и конструира струк­тура, която се нарича точкова двойка (dotted pair). При изо­бра­зя­ва­нето на точкова двойка, AutoLISP поставя точка межди първия и втория еле­менти. Точковите двойки се нуждаят от по-малко памет в сравнение с обик­новените списъци и втория атом може да се изведе с функцията CDR.

Пример 2:

(cons ‘a ‘b) резултат (A B)

(car (cons ‘a ‘b)) резултат A

(cdr (cons ‘a ‘b)) резултат B


1.36 (cos <ъгъл>)

Тази функция дава като резултат косинуса на <ъгъл> в радиани.

Пример:

(cos 0.0) резултат 1.000000



(cos Pi) резултат -1.000000
1.37 (defun <име на функция> <списък на аргументи> <изрази> ...)

DEFUN дефинира функция с име <име на функция> (появява се авто­ма­тич­но в кавички). След името на функцията следва <списък на аргументи> (евен­туално празен), следван от факултативна наклонена черта и името на 1 или няколко локални символи за функцията. Наклонената черта тряб­ва да е отделена от първия локален символ и от последния аргумент (ако има такъв) най-малко с един интервал. Ако липсват локални символи или ар­гументи, след името на функцията трябва да има един чифт скоби.

Пример 1:

(defun myfunc (x y) ...) има 2 аргумента

(defun myfunc (/ a b) ...) има 2 локални символа

(defun myfunc (x / temp) ...) има 1 арг. и 1 лок.символ

(defun myfunc () ...) няма аргументи и локални символи

След списъка от аргументи и локални символи следват 1 или няколко из­раза, които се оценяват при изпълнение на функцията.

DEFUN сама дава името на дефинираната функция. При извикване на та­ка дефинираната функция нейните аргументи се оценяват и се при­сво­я­ват на символи. Локалните символи могат да се използват вътре във фун­к­цията, без да се променят при това техните връзки на външни нива. Фун­кцията дава резултата на последния оценен израз. Всички пред­ше­ст­ва­щи изрази имат само вторично действие.

Пример 2:

(defun add10 (x)

(+ 10 x)


) резултат ADD10

(add10 5) резултат 15

(add10 -7.4) резултат 2.600000

Пример 3:

(defun points (x y / temp)

(setq temp (strcat x "..."))

(strcat temp y)

) резултат points

(points "a" "b") резултат "a...b"

ЗАБЕЛЕЖКА: За <име на функция> никога не използвайте името на си­с­темна функция или системен символ, защото така ще се лишите от достъп до тази функция или символ.


*** 1. Библиотеки с функции и автоматично зареждане.

Дефинициите на функции могат да се запишат във файлове с AutoLISP-функцията LOAD, която е описана по-долу(1.63). Ако файлът "acad.lsp" вече съществува, той ще се зарежда автоматично всеки път при извикване на чертожния редактор. Благодарение на това могат да се съз­дават библиотеки с често използвани функции. Така Вие ще сте си­гу­рен, че те са налице при необходимост.

Освен DEFUN, всеки файл от типа ".lsp" може да съдържа изрази. Тъй като зареждането на файл предизвиква оценяване на съдържащите се в не­го изрази, може да бъде включено извикването на функции, които ав­то­ма­тично ще бъдат изпълнявани при всяко зареждане на този файл. Файлът "acad.lsp" обаче се зарежда преди да бъде напълно инициализиран гра­фи­ч­ния редактор на AutoCAD. Затова не трябва да използвате функцията COMMAND вътре във файла "acad.lsp".

*** 2. Функции C:XXX - вмъкване на команди в AutoCAD.

С DEFUN могат да се дефинират функции, които внедряват нови ко­ман­ди в AutoCAD. За да могат такива функции да се използват като ко­ман­ди на AutoCAD, трябва да се спазват следните ПРАВИЛА:

¹ 1. Името на функцията трябва да има формат "C:XXX", при ко­ето всички букви са главни. "C:" е задължително; "XXX" може да е име на команда по Ваш избор, при условие че то не се среща като вътрешна или външна команда на AutoCAD.

¹ 2. Функцията трябва да се дефинира със списък на Nil-ар­гу­мен­ти (разрешени са локални променливи). По-долу дефинираната функция чер­тае квадрат с полилиния.

Пример 4:

(defun C:PQUADRAT ()

(setq pt1 (detpoint "Долен ляв ъгъл: "))

(setq l (detdist "Дължина на едната страна: "))

(setq pt2 (polar pt1 0.0))

(setq pt3 (polar pt2 (/ Pi 2.0) l)

(setq pt4 (polar pt3 Pi l))

(command "PLINE" pt1 pt2 pt3 pt4 "S")

)

По този начин създадените функции могат да се извикват с въ­ве­ж­да­не на компонентата "XXX" от името на функцията, когато се появи за­пит­ва­нето на AutoCAD "Command:". Ако "XXX" е непозната команда, AutoCAD опит­ва да извика AutoLISP-функция "XXX" без параметри. За примера по-го­ре диалогът би изглеждал така:



Command: PQUADRAT

Долен ляв ъгъл: (въвеждане на точка)

Дължина на едната страна: (въвеждане на разстояние)

Функцията извиква командата на AutoCAD PLINE и отговаря на ней­ни­те въпроси така, че да начертае желания квадрат.

Вмъкването на команди по този начин е важна функция на AutoLISP. Вед­нъж дефинирана, новата команда може да използва всички свойства на AutoLISP. Новата команда не трябва да се въвежда в скоби, поради което та­зи, реализирана с AutoLISP команда, може да се използва като всяка дру­га команда на AutoCAD.
1.38 (distance <точка1> <точка2>)

Тази функция дава разстоянието между две 2D-точки <точка1> и <точка2>, при което една 2D-точка е списък от 2 реални числа.

Пример:

(distance ‘(1.0 2.5) ‘(7.7 2.5)) резултат 6.700000



(distance ‘(1.0 2.0) ‘(3.0 4.0)) резултат 2.828427
1.39 (eq <израз1> <израз2>)

Тази функция проверява дали <израз1> е идентичен с <израз2>, т.е. да­ли са присвоени на един и същи обект (напр.със SETQ). EQ дава като ре­зултат Т, ако двата израза са идентични, в противен случай - Nil. Та­зи функция е въведена преди всичко за да установи, дали при 2 спи­съ­ка се касае за идентични списъци.

Пример:

(setq f1 ‘(a b c))



(setq f2 ‘(a b c))

(setq f3 f2)

От това следва:

(eq f1 f3) резултат Nil (f1 и f3 не са идентични)

(eq f3 f2) резултат Т (f3 и f2 са един и същ списък)
1.40 (equal <израз1> <израз2>)

Тази функция проверява дали <израз1> е еднакъв с <израз2>, т.е. да­ли резултатите от оценяването са еднакви.

Пример:

(setq f1 ‘(a b c))



(setq f2 ‘(a b c))

(setq f3 f2)

От това следва:

(equal f1 f3) резултат Т (стойн.на f1 и f3 са еднакви)

(equal f3 f2) резултат Т (f3 и f2 са един и същ списък)
1.41 (eval <израз>)

Тази функция дава резултата от оценяването на <израз>, при което <израз> може да е някакъв AutoLISP-израз.

Пример:

(setq a 123)



(setq b ‘a)

От това следва:

(eval 4.0) резултат 4.000000

(eval (abs -10)) резултат 10

(eval a) резултат 123

(eval b) резултат 123


1.42 (exp <число>)

Тази функция дава "е" с експонента <число> (естествен ло­га­ри­тъм). Резултатът е реално число.

Пример:

(exp 1.0) резултат 2.718282



(exp 2.2) резултат 9.025013

(exp -0.4) резултат 0.670320


1.43 (expt <база> <експонента>)

Тази функция дава <база> със специфицираната <експонента>. Ако два­та аргумента са цели числа, резултатът е цяло число, иначе - ре­ал­но.

Пример:

(expt 2 4) резултат 16



(expt 3.0 2.0) резултат 9.000000
1.44 (fix <число>)

Тази функция дава като резултат преобразуваното в цяло число <число>. <ЧИсло> може да е реално или цяло. Реалните числа се за­кръг­ля­ват, като позициите след десетичната точка се игнорират.

Пример:

(fix 3) резултат 3



(fix 3.7) резултат 3.000000
1.45 (float <число>)

Тази функция дава като резултат преобразуваното в реално число <число>. <Число> може да е реално или цяло.

Пример:

(float 3) резултат 3.000000



(float 3.7) резултат 3.700000
1.46 (foreach <име> <списък> <израз> ...)

Тази функция проверява <списък>, дава на всеки елемент <име> и оце­нява всеки <израз> за всеки елемент от списъка. Могат да се спе­ци­фи­цират произволно много изрази. FOREACH дава резултата от последния оце­нен израз.

Пример:

(foreach n ‘(a b c) (print n))



съответства на:

(print a)

(print b)

(print c)


1.47 (gcd <число1> <число2>)

Тази функция дава като резултат най-големия общ делител на <число1> и <число2>. Двете числа трябва да са цели.

Пример:

(gcd 81 57) резултат 3



(gcd 12 20) резултат 4
1.48 (getangle [<точка>] [<въпрос>])

Тази функция очаква въвеждането на ъгъл от потребителя. <Въпрос> е текст, който се указва по желание, а <точка> е 2D-основна точка, ко­я­то също се избира по желание. Ъгълът може да се специфицира чрез въ­веж­дане на един от форматите за ъглови мерни единици на AutoCAD. Тази фун­кция винаги дава ъгъла в радиани, независимо от това, че актуалният фор­мат за изобразяване на ъгъл в AutoCAD е в градуси, гради или ге­о­де­зи­чески единици.

Ъгълът може да се покаже на графичния екран с две 2D-точки. След то­ва ъгълът се визуализира динамично на екрана. Избираемият аргумент <точка> се приема като първата от тези 2 точки, чрез което можете да спе­цифицирате ъгъла с "показване" на другата точка.

На въпроса на GETANGLE не може да се въведе AutoLISP-израз. В про­тивен случай се появява съобщение "Нямам достъп до AutoLISP".(Виж съ­що GETORIENT и INITGET.)

Пример:

(setq win (getangle))



(setq win (getangle ‘(1.0 3.5)))

(setq win (getangle "В каква посока? "))

(setq win (getangle ‘(1.0 3.5) "В каква посока? "))
1.49 (getcorner <точка> [<въпрос>])

Тази функция дава като резултат точка, както GETPOINT. Обаче GETCORNER има нужда от базова точка като аргумент и чертае пра­во­ъ­гъл­ник с базовата точка като изходна и следва указаното движение на по­требителя на екрана. Като отговор на GETCORNER не може да се въведе друг AutoLISP-израз. (Виж също GETPOINT и INITGET.)



1.50 (getdist [<точка>] [<въпрос>])

Тази функция очаква въвеждането на разстояние от потребителя. <Въпрос> е произволен текст, който се указва по желание, а <точка> е ба­зова точка, която също се избира по желание. Разстоянието може да се за­даде чрез въвеждане на един от действащите формати на AutoCAD за раз­стояние. Тази функция винаги дава разстоянието като реално число, не­зависимо от вида на въведените данни.

Разстоянието може да се покаже на графичния екран с две точки. Ви­зуализира се динамично на екрана. Избираемият аргумент <точка> се при­ема като първата от тези 2 точки, чрез което можете да спе­ци­фи­ци­ра­те втората точка с "показване".

На въпроса на GETDIST не може да се отговори с друг AutoLISP-из­раз. (Виж също INITGET.)


Пример:

(setq abst (getdist))

(setq abst (getdist ‘(1.0 3.5)))

(setq abst (getdist "В каква посока? "))

(setq abst (getdist ‘(1.0 3.5) "В каква посока? "))
1.51 (getint [<въпрос>])

Тази функция очаква въвеждане на цяло число. След това дава цяло чис­ло. <Въпрос> е текст по желание. На въпроса на GETINT не може да се от­говори с друг AutoLISP-израз. (Виж също INITGET.)

Пример:

(setq ZZ (getint))



(setq ZZ (getint "Задайте число: "))
1.52 (getkword [<въпрос>])

Функцията GETKWORD пита потребителя за ключова дума. Списъкът на дей­стващите ключови думи се определя преди извикването на GETKWORD с но­вата функция INITGET (описана по-долу). GETKWORD връща ключова дума, ко­ято съответства на данните от потребителя, като символен низ. AutoCAD стартира нов опит, ако данните не съответстват на нито една от клю­човите думи. Отговор с интервали връща Nil (ако е позволен такъв). Ре­зултатът е Nil и когато не е дефинирана ключова дума като символен низ.

Пример:

(initget 1 "Y N")



(setq x (detkword "Сигурен ли сте? (Y или N)"))

Тази последователност пита потребителя и поставя X или на "Y", или на "N", според отговора на потребителя. В случай, че отговорът не съв­пада с никоя от ключовите думи, AutoCAD изисква от потребителя друг опит. На въпроса на GETKWORD не може да се отговори с друг AutoLISP-из­раз. (Виж също INITGET.)


1.53 (getorient [<точка>] [<въпрос>])

В AutoLISP ъглите се представят винаги в радиани, при което по­со­ка­та на ъгъл 0 е винаги надясно и нарастването е срещу часовниковата стрел­ка. Може да се направи преобразуване, ако потребителя е избрал дру­га посока на ъгъла 0 или друга посока на нарастване. Това става с ко­мандата UNITS или със системните променливи ANGBASE и ANGDIR.

GETORIENT е подобна на GETANGLE, обаче се отнася по различен на­чин по посоката на ъгъла 0 и посоката на нарастване. GETANGLE трябваше да се използва, когато е необходима величина на завъртане (относителен ъгъл). Противно на това, GETORIENT Ви дава ориентиране (абсолютен ъгъл).

Да приемем, че с командата UNITS посоката на ъгъла 0 е поставена на 90 градуса (север) и посоката на нарастване е по часовниковата стрел­ка. Таблицата по-долу Ви показва какво връщат GETANGLE и GETORIENT (в радиани) за въведените от потребителя данни (в градуси).

Данни(градуси) GETANGLE GETORIENT

0 0.000000 1.570796

-90 1.570796 3.141593

180 3.141593 4.712389

90 4.712389 0.000000

Както се вижда от таблицата, GETANGLE взема под внимание посоката на нарастване на ъгъла, обаче игнорира посоката на ъгъла 0. Можете да из­ползвате GETANGLE, за да получите стойността на завъртане при вмък­ва­не на блок, тъй като въвеждането на 0 градуса връща винаги 0 в ра­ди­а­ни. От друга страна GETORIENT взема под внимание посоката на ъгъла 0, как­то и посоката на нарастване на ъгъла. Бихте могли да използвате GETORIENT например за получаване на ъгъла на основната линия на текст. На въпроса на GETORIENT не може да се отговори с друг AutoLISP-израз. (Виж също INITGET и GETANGLE.)


1.54 (getpoint [<точка>] [<въпрос>])

Тази функция очаква въвеждане на точка. <Точка> е избираема ба­зо­ва точка и <въпрос> е текст, който се указва по желание, и може да се изо­брази като въпрос. Точката може да се специфицира чрез показване или чрез задаване на координати в актуални мерни единици. Ако е налице из­бираемата базова точка <точка> (като аргумент), се появява динамична ли­ния от тази точка към визирния кръст. GETPOINT дава като резултат точ­ка, която е списък от 2 реални числа.

Пример:

(setq p (getpoint))



(setq p (getpoint "Къде? "))

(setq p (getpoint ‘(1.5 2.0) "Втора точка: "))

С GETPOINT може да се зададе 3D-точка, ако функцията INITGET се из­ползва за поставяне на "3D-точков" управляващ флаг. На въпроса на GETPOINT не може да се отговори с друг AutoLISP-израз. (Виж също INITGET и GETCORNER.)
1.55 (getreal [<въпрос>])

Тази функция очаква въвеждане на реално число. След това дава ре­ал­но число. <Въпрос> е текст по желание. На въпроса на GETREAL не може да се отговори с друг AutoLISP-израз. (Виж също INITGET.)


Пример:

(setq ZZ (getreal))

(setq ZZ (getreal "Мащабен фактор: "))
1.56 (getstring [] [<въпрос>])

Тази функция очаква въвеждане на символен низ и връща като ре­зул­тат символен низ. Ако е налице и не е равно на Nil, зададеният сим­волен низ може да съдържа интервали (и трябва в такъв случай да бъ­де завършен с RETURN). В противен случай символният низ може да бъде за­вършен с интервал или с RETURN. <Въпрос> е текст, който се указва по же­лание и може да се изобрази като въпрос.

Ако заданието от потребителя трябва да е една от няколко опции (клю­чови думи), може вместо горепосочената функция да се използва GETKWORD. На въпроса на GETSTRING не може да се отговори с друг AutoLISP-израз. (Виж също INITGET.)

Пример:


(setq s (getstring))

(setq s (getstring "Как е Вашето име? "))


1.57 (getvar <име променлива>)

Тази функция търси стойността на системна променлива от AutoCAD. Име­то на променливата трябва да е записано в кавички. Ако търсите стой­ността на системна променлива, която не е позната на AutoCAD, ре­зул­татът е Nil. (Виж също функцията SETVAR.)

Пример:

Ако последният специфициран радиус е бил 0.25 единици:



(getvar "FILLETRAD") резултат 0.250000
1.58 (graphscr)

GRAPHSCR превключва на конфигурация от единичен екран, от текстов в графичен екран (както функционалния клавиш "FLIP SCREEN" на AutoCAD. GRAPHSCR винаги дава Nil. (Виж също функцията SETVAR.)


1.59 (if <тестов израз> <израз - ако ДА> [<израз - ако НE>])

Тази функция оценява изрази обусловено. Ако <тестов израз> не е ра­вен на Nil, оценява се <израз - ако ДА>, иначе - <израз - ако НЕ>. По­следния израз може да се указва по желание. IF дава като резултат стой­ността на избрания израз. Ако <израз - ако НЕ> липсва и <тестов израз> е Nil, IF дава като резултат Nil.

Пример:

(if (= 1 3) "Yes!!""N") резултат "N"



(if (= 2 (+ 1 1)) "Yes!!") резултат "Yes!!"

(if (= 2 (+ 3 4)) "Yes!!") резултат Nil


1.60 (initget [<битове>] [<символен низ>])

Тази функция дефинира опции за следващата GETxxx-функция (из­клю­че­ния: GETSTRING и GETVAR). INITGET винаги връща Nil. Избираемият ар­гу­мент <битове> е цяло число със следните стойности:



INITGET-Bits значение

1 интервали не са позволени

2 нулеви стойности не са позволени

4 отрицателни стойности не са позволени

8 границите се проверяват само ако е включен LIMCHECK

16 дава като резултат 3D-точки вместо 2D-точки

32 за Box или за динамична линия използва пунктирна линия

64 игнорира координатата Z на въведената точка


Битовете могат да се събират в произволна комбинация и да дават стой­ности от 1 до 127. Ако данните от потребителя не изпълняват едно или няколко специфицирани условия (напр.въвеждане на 0, ако не са поз­во­лени нулеви стойности), AutoCAD показва съобщение и изисква от по­тре­бителя нов опит.

Пример 1:

(initget (+ 1 2 4))

(setq A (getint "На колко години сте? "))

Тази поредица пита за възрастта. При отговори с 0, интервали или от­рицателни стойности, въпросите биха се повторили. Ако <битове> не е да­ден, се приема 0 (няма условие). Специалните управляващи стойности се вземат предвид само от GETxxx-функциите, за които те са разумни. То­ва ще видите от долустоящата таблица.

Стойността на управляващия бит 32 се взема под внимание от фун­к­ци­ите GETPOINT, GETCORNER, GETDIST, GETANGLE и GETORIENT, ако е дадена ба­зова точка. Тогава тази функция използва пунктирни линии (или като по­вдигнати) за динамичната линия или за прозореца на курсора от ука­за­на­та базова точка. Ако системната променлива POPUPS е 0 (екранът не под­държа новия потребителски интерфейс), AutoCAD игнорира този INITGET-бит.

Функция Управляващи битове

име "1" "2" "4" "8" "16" "32" "64"

GETINIT Y Y Y - - - -

GETREAL Y Y Y - - - -

GETDIST Y Y Y - - Y Y

GETANGLE Y Y - - - Y -

GETORIENT Y Y - - - Y -

GETPOINT Y - - Y Y Y -

GETCORNER Y - - Y Y Y -

GETKWORD Y - - - - - -

GETSTRING - - - - - - -

GETVAR - - - - - - -

Избираемият аргумент <символен низ> на функцията INITGET дефинира спи­сък от ключови думи, които трябва да се проверят от следващия въ­прос на GETxxx, в случай, че потребителят не въведе очакваните данни (напр. Ако за GETPOINT не е въведена точка). Ако данните от по­тре­би­те­ля съвпадат с една от ключовите думи в списъка, тази ключова дума е ре­зултат от функцията GETxxx като символен низ. Потребителската про­гра­ма проверява ключовите думи и изпълнява за всяка желаното действие. Ако данните от потребителя не са от очаквания тип и не съответстват на ни­коя от ключовите думи, AutoCAD изисква от потребителя да направи нов опит.

Списъкът от ключови думи трябва да притежава следната форма "КД1 КД2 КД3". Отделните ключови думи са разделени с интервал. Съкращенията се указват по желание. Има 2 начина за съкращения:

*необходимата част се пише с главни букви и остатъкът с малки;

"LTYP,LT"

**необходимата част се разделя със запетая от ключовата дума.

"Ltyp"

Тези 2 спецификации са еднакви. Двете позволяват въвеждането на "LTYP", "LTY" или "LT", но не биха приели "L" (недостатъчна спе­ци­фи­ка­ция), "LTFAKTOR" и "LTYPX" (не съвпадат).



Пример 2:

(defun getnum ( / x)

(initget 1 "Pi Zwei-Pi")

(setq x (getreal "Pi/Zwei-Pi/<число>: "))

(cond ((eq x "Pi") Pi)

((eq x "Zwei-Pi") (* 2.0 Pi))

(T x)

)

Тази INIGET-функция предпазва от въвеждане на интервали и де­фи­ни­ра списък от 2 ключови думи, а именно "Pi" и "Zwei-Pi". С GETREAL се по­лучава реално число, което извиква въпроса "Pi/Zwei-Pi/<число>:". Ре­зултатът се записва в локалната променлива X. Когато потребителят въ­веде число, то се дава като резултат от GETNUM. Ако обаче по­тре­би­те­лят зададе "Pi" като ключова дума (или просто "P"), GETPOINT ще даде като резултат ключовата дума "Pi". Функцията COND отбелязва това и в то­зи случай връща стойността Pi. Ключовата дума "Zwei-Pi" се управлява по същия начин.



ЗАБЕЛЕЖКА: Дефинираните от INITGET управляващи флагове и списъци от ключови думи се използват при следващото извикване на GETxxx-фун­к­ци­ята и тогава автоматично се изтриват. По този начин се спестява вто­ра функция, която да изтрива отделните условия.
1.61 (inters <точка 1> <точка 2> <точка 3> <точка 4> [])

Функцията INTERS проверява две линии и дава тяхната пресечна точ­ка, или Nil, ако линиите не се пресичат. <Точка1> и <точка2> означават крайните точки на първата линия; <точка3> и <точка4> означават край­ни­те точки на втората линия. Ако е налице избираемия аргумент и е Nil, дължината на двете линии се приема като безкрайна. INTERS дава ка­то резултат пресечната точка, ако тази точка се намира от страната на крайната точка на едната или двете линии. Ако аргументът е про­пуснат или не е Nil, пресечната точка трябва да се намира на двете ли­нии, в противен случай INTERS дава Nil.

Пример:

(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)
1.62 (itoa <цяло число>)

Тази функция преобразува цяло число в символен низ.

Пример:

(itoa 33) резултат "33"



(itoa -17) резултат "-17"
1.63 (lambda <аргументи> <израз> ...)

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)

)

‘(2 4 -6 10.2)



) резултат (10 20 -30 51.000000)
1.64 (last <списък>)

Тази функция дава като резултат последния елемент на <списък>. <Списък> не трябва да е Nil. LAST може да даде резултат, който е атом или списък.


Пример:

(last ‘(a b c d e)) резултат E

(last ‘(a b c (d e))) резултат (D E)

На пръв поглед изглежда, че LAST е идеалната възможност за по­лу­ча­ване на Y-координатата на точка. Това е в сила за 2D-точки, но при 3D-точките тя дава Z-координатата. За да действат идентично Вашите фун­кции при 2D и 3D-точките, препоръчваме Ви да използвате CADR за из­чи­сление на Y-координати и CADDR - за изчисление на Z-координати.


1.65 (length <списък>)

Тази функция дава като резултат цяло число, което съответства на броя елементи в <списък>.

Пример:

(length ‘(a b c d)) резултат 4



(length ‘(a b (c d))) резултат 3

(length ‘()) резултат 0


1.66 (list <израз> ...)

Тази функция приема произволно много изрази, свързва ги и дава ка­то резултат 1 списък. В AutoLISP тя често се използва за дефиниране на 2D и 3D-точкови променливи (списък от 2 или 3 реални числа).

Пример:

(list ‘a ‘b ‘c) резултат (A B C)



(list ‘a ‘(b c) ‘d) резултат (A (B C) D)

(list ‘3.9 ‘6.7) резултат (3.900000 6.700000)


1.67 (listp <елемент>)

Тази функция дава Т, ако <елемент> е списък, ако не - Nil.

Пример:

(listp ‘(a b c)) резултат Т



(listp ‘a) резултат Nil

(listp 4.343) резултат Nil


1.68 (load <име на файл>)

Тази функция зарежда файл с AutoLISP-изрази и ги оценява. <Име на файл> е символен низ, който е без тип на файл (автоматично ".lsp"). Пред името на файла може да се зададе указателен префикс (напр. "/Funktion/test1"). При MS-DOS / PC-DOS системите е позволена и буква за директорията и може да се използва обратна наклонена черта, вместо обик­новената (обратна наклонена черта се задава в символен низ "\\").

Ако операцията протече успешно, LOAD ще даде името на последната фун­кция, дефинирана във файла. Ако операцията е неуспешна, LOAD ще да­де името на файла като символен низ.
Пример:

Ако файлът "test1.lsp" съдържа DEFUN на функцията MYFUNC:

(load "test1") резултат MYFUNC

Ако файлът "test2.lsp" не съществува:

(load "test2") резултат "test2"

Функцията LOAD не може да се извика от друга AutoLISP-функция. Тя тряб­ва да се въведе директно от клавиатурата, от меню-файл или от ко­ман­ден(.scr) файл, докато не е активна друга AutoLISP-функция.

Всеки път, когато извикате чертожния редактор, AutoLISP зарежда фай­ла "acad.lsp" (ако съществува). Този файл може да съдържа дефиниции на функции, които се оценяват автоматично в началото на редактирането.
1.69 (log <число>)

Функцията дава натурален логаритъм на <число> като реално число.

Пример:

(log 4.5) резултат 1.504077



(log 1.22) резултат 0.198850
1.70 (logand <число> <число> ...)

Тази функция дава резултата на логическото AND по битове на спи­сък от <числа>. <Числа> трябва да са цели и резултатът също е цяло чис­ло.

Пример:

(logand 7 15 3) резултат 3



(logand 2 3 15) резултат 2

(logand 8 3 4) резултат 0


1.71 (logior <число> <число> ...)

Тази функция дава резултата на логическото OR по битове на списък от <числа>. <Числа> трябва да са цели и резултатът също е цяло число.

Пример:

(logior 1 2 3) резултат 7



(logand 9 3) резултат 11
1.72 (lsh <число1> <брой битове>)

Тази функция дава резултата от логическото преместване на би­то­ве­те на <число1>. <Число1> и <брой битова> трябва да са цели числа и ре­зул­татът също е цяло число. Ако <брой битове> е положителен, <число1> се премества наляво, ако е отрицателен - надясно. И в двата случая се до­пълват "нулеви" битове, а изместените битове се изключват. Когато в пър­вия бит (16-та позиция) на едно цяло число се появи единица или бъ­де изместена оттам - знакът се променя.


Пример:

(lsh 2 1) резултат 4

(lsh 2 -1) резултат 1

(lsh 40 2) резултат 160

(lsh 16384 1) резултат -32768

1.73 (mapcar <функция> <списък 1> ... <списък N>)

MAPCAR дава резултата от изпълнението на <функция> с отделните еле­менти от <списък 1> до <списък N>, които са аргументи на <функция>. Бро­ят списъци трябва да съответства на броя аргументи на <функция>.

Пример 1:

(mapcar ‘1+ ‘(10 20 30)) резултат (11 21 31)

което съответства на:

(1+ 10)


(1+ 20)

(1+ 30)


като MAPCAR дава резултатите във вид на списък.

Пример 2:

(mapcar ‘+ ‘(10 20 30) ‘(4 3 2)) резултат (14 23 32)

което съответства на:

(+ 10 4)

(+ 20 3)


(+ 30 2)

Функцията LAMBDA може да специфицира анонимна функция, която може да се изпълни от MAPCAR. Това е особено практично, когато някои ар­гу­мен­ти на функцията са постоянни или са предоставени по друг начин.

Пример 3:

(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.000000)

1.74 (max <число> <число> ...)

Тази функция дава като резултат най-голямото от зададените <число>. Всяко <число> може да е реално или цяло.

Пример:

(max 4.07 -144) резултат 4.070000



(max -88 19 5 2) резултат 19
1.75 (member <израз> <списък>)

Тази функция претърсва <списък> за съответен <израз> и като ре­зул­тат дава остатъка от <списък>, започващ с първия <израз>. Ако в <списък> не е намерен <израз>, MEMBER дава Nil.

Пример:

(member ‘c ‘(a b c d e)) резултат (C D E)



(member ‘q ‘(a b c d e)) резултат Nil
1.76 (menucmd <символен низ>)

Тази функция позволява на AutoLISP-програмите превключване между об­ластите на менютата на AutoCAD. Поради това една AutoLISP-програма мо­же да работи с асоцииран меню-файл, като като съответното подменю се изо­бразява при всякакви задания на потребителя. Аргументите <символен низ> имат формата:

Секция = Подменю

при което:

Секцията специфицира меню-секцията.

Валидни имена (типове на менюта) са:



S екранно меню

K бутонно меню

B картинно меню

A1 - A10 горни екранни менюта от 1 до 10

T1 - T4 таблетни менюта от 1 до 4

Z1 AUX-менюта

Подменю специфицира активираното подменю. Името трябва да съответства или на едно от имената на подменютата (без "**") в на­сто­ящия зареден меню-файл, или на името на един от типовете менюта, де­финирани по-горе.

Стоящия отпред знак "$", който е необходим за информация за под­ме­нютата в меню-файла, тук не се появява.

Пример 1:

(menucmd "S=OFANG")

Така се извиква подменюто "OFANG" на екрана (ако такова подменю съ­ществува в активния меню-файл).

Пример 2:

(menucmd "K=MY-BUTTON")

Така на бутонното меню се присвоява подменюто "MY-BUTTON".

За картинните и горните екранни менюта - "*" е валидно име на под­меню и предизвиква изобразяването на подменюто, което е присвоено по­настоящем на специфицираната меню-секция.

Пример 3:

(menucmd "A1=ЧИСЛОВО")

(menucmd "A1=*")

Тази последователност от команди би присвоила на горното картинно ме­ню 1 - подменюто "ЧИСЛОВО" и непосредствено след това би го изо­бра­зи­ла на екрана.


1.77 (min <число> <число> ...)

Тази функция дава като резултат най-малкото от зададените <число>. Всяко <число> може да е реално или цяло.

Пример:

(min 683 -10.0) резултат -10.000000



(min 73 2 48 5) резултат 2
1.78 (minusp <елемент>)

Тази функция дава Т, ако <елемент> е реално или цяло число и се оце­нява като отрицателна стойност, ако не - Nil. Тази функция не е де­фи­нирана за други типове <елемент>.

Пример:

(minusp -1) резултат Т



(minusp -4.293) резултат Т

(minusp 830.2) резултат Nil


1.79 (not <елемент>)

Тази функция дава Т, ако изразът е Nil, в противен случай дава Nil. Функцията NULL често се използва за списъци, а NOT - за други ти­по­ве данни, заедно с някаква управляваща функция.

Пример:

(setq a 123)



(setq b "Text")

(setq c Nil)

От това следва:

(not a) резултат Nil

(not b) резултат Nil

(not c) резултат Т

(not ‘()) резултат Т
1.80 (nth <списък>)

Тази функция дава като резултат "N-тия" елемент на <списък>, при ко­ето е позицията на елемента, който е резултат (първият елемент Nil). Ако е по-голямо от максималния брой елементи на <списък>, ре­зултатът е Nil.

Пример:

(nth 3 ‘(a b c d e)) резултат D



(nth 0 ‘(a b c d e)) резултат A

(nth 5 ‘(a b c d e)) резултат Nil


1.81 (null <елемент>)

Тази функция дава като резултат Т, ако <елемент> е присвоен на Nil, в противен случай резултатът е Nil.

Пример:

(setq a 123)



(setq b "Text")

(setq c Nil)

От това следва:

(null a) резултат Nil

(null b) резултат Nil

(null c) резултат Т

(null ‘()) резултат Т
1.82 (numberp <елемент>)

Тази функция дава като резултат Т, ако <елемент> е реално или ця­ло число, в противен случай - Nil.

Пример:

(setq a 123)



(setq b ‘a)

От това следва:

(numberp 4) резултат Т

(numberp 3.8348) резултат Т

(numberp "Juhui") резултат Nil

(numberp ‘a) резултат Nil

(numberp a) резултат Т

(numberp b) резултат Nil

(numberp (eval b)) резултат Т
1.83 (open <име на файл> <режим>)

Тази функция отваря файл, до който I/O-функциите на AutoLISP имат дос­тъп. Функцията дава като резултат файлов дескриптор, който може да се използва от другите I/O-функции. Затова трябва да ú се присвои една про­менлива със SETQ. <Име на файл> е текст, който определя името и ти­па на отворения файл. <Режим> е read/write флаг. Той трябва да е сим­волен низ с една малка буква. Валидните букви за <режим> са следните:



OPEN-режим О п и с а н и е .

"r" Отворен за четене ("read"). Ако <име на файл> не съществува, ре­зултатът е Nil.

"w" Отворен за писане ("write"). Ако <име на файл> не съ­ще­ст­ву­ва, създава се и се отваря нов файл. Ако <име на файл> вече съ­ществува, съдържащите се в него данни се презаписват.

"a" Отворен за добавяне ("append"). Ако <име на файл> не съ­ще­ст­ву­ва, създава се и се отваря нов файл. Ако <име на файл> ве­че съществува, той се отваря и се прибавя към края на вече съ­ществуващите данни, така че данни, които са нови, въведени във файла, автоматично се добавят към вече съществуващите.


ЗАБЕЛЕЖКА: При DOS системите някои програми и текстови редактори пи­шат текстовите файлове със знак за край на файл в края на текста (CTRL+Z с десетичен ASCII код 26). При четене на текстов файл, DOS да­ва съобщение за край на файл, ако е намерил CTRL+Z, дори когато след­ват други данни. Следователно, когато използвате <режим> "a" на фун­к­ци­ята OPEN за добавяне на данни към файлове, които са създадени от дру­ги програми, подсигурете се най-напред, че тази програма не вмъква CTRL+Z в края на текстовия файл.

Пример 1:

Да приемем, че имената на файловете в примера на съществуват

(setq f (open "new.tst" "w")) резултат

(setq f (open "kk.dat" "r")) резултат Nil

(setq f (open "logfile" "a")) резултат

На <име на файл> може да бъде зададен указващ префикс, като напр. "/test/func3". При MS-DOS / PC-DOS системите е позволена също буква за ди­ректорията и може да се използва обратна наклонена черта, вместо обик­новената (обратна наклонена черта се задава в символен низ "\\").

Пример 2:

(setq f (open "/x/new.tst" "w")) резултат

(setq f (open "kk.dat" "r")) резултат Nil


1.84 (or <израз> ...)

Тази функция дава като резултат логическото OR на списък от из­ра­зи. OR оценява изразите отляво надясно и търси <израз>, различен от Nil. Когато бъде намерен такъв, OR прекъсва процеса на оценяване и да­ва Т. Ако всички изрази са Nil, OR дава Nil.

Пример:

(or Nil 45 ‘()) резултат Т



(or Nil ‘()) резултат Nil
1.85 (osnap <точка> <режим за текст>)

Тази функция дава точка (списък от 2 реални числа), която се по­лу­чава от прилагането на режима на захват (описано чрез <режим за текст>) върху <точка>. <Режим за текст> описва един или повече от ва­лид­ните режими на захват на обект, например средна точка, център и т.н., разделени със запетая.


Пример:

(setq pt2 (osnap pt1 "mid"))

(setq pt2 (osnap pt1 "mid,end,cen"))

Ако <точка> е 2D-точка, резултатът е 2D-точка. Ако <точка> е 3D-точ­ка, резултатът е 3D-точка. Ако за <точка> не е намерена точка със за­хвата, която да съвпада със специфицирания <режим>, резултат - Nil.


1.86 (pi)

Това не е функция, а константата Pi. Тя се оценява на закръглена­та стойност 3.1415926.


1.87 (polar <точка> <ъгъл> <разстояние>)

Тази функция дава точката в <ъгъл> и <разстояние> от <точка>. Точ­ката е списък от 2 реални числа, а <ъгъл> се въвежда в радиани.

Пример:

(polar ‘(1.0 1.0) 0.785398 1.414214) рез.(2.000000 2.000000)


1.88 (prin1 <израз> [<променлива, указваща файл>])

Тази функция изобразява <израз> на екрана и дава като резултат <израз>. <Израз> може да е произволен и не е задължително да е сим­во­лен низ. Ако е налице <променлива, указваща файл> и се касае за файл, от­ворен за писане, <израз> се записва в този файл точно така, както се по­явява на екрана. Записва се само <израз> (без знак за нов ред или ин­тервал).

Пример 1:

(setq a 123)

(setq b ‘a)

От това следва:

(prin1 ‘a) изобразява A и резултат A

(prin1 a) изобразява 123 и резултат 123

(prin1 b) изобразява (A) и резултат (A)

(prin1 "Hallo") изобразява "Hallo" и резултат "Hallo"

Всеки от горните примери се изобразява на екрана, тъй като не е спе­цифицирана <променлива, указваща файл>. Ако f е валидна променлива, указ­ваща отворен файл: (prin1 "Hallo" f), то "Hallo" се записва в опре­де­ления файл и резултатът е "Hallo".

Ако <израз> съдържа управляващи символи, PRIN1 ги редактира с "\" пред тях:

\e за Escape

\n за знак на нов ред

\r за Return

\t за Tabulator

\nnn за символа, чиито осмичен код е nnn

Пример 2:

(prin1 (chr 2)) изобразява "\002" и резултат "\002"

(prin1 (chr 10)) изобразява "\n" и резултат "\n"

PRIN1 може да се използва без аргументи и дава символ, чието име е нулев символен низ. Ако използвате PRIN1 без аргументи като последен из­раз в дефинирана от потребителя функция, след приключване на фун­к­ци­я­та се изобразява само празен ред.

Пример 3:

(defun C:AUF ()

(setvar "Lunits" 4)

(setvar "BLIPMODE" 0)

(prin1)


)

Тогава, след задействане на дефинираната функция, ще се изпълнят за­дадените действия и без да се изобразяват други съобщения, се по­я­вя­ва "Command:".


1.89 (princ <израз> [<променлива, указваща файл>])

Тази функция е еквивалентна на PRIN1, с изключение на това, че упра­вляващите символи в <израз> се изобразяват без разширение. В общи ли­нии PRIN1 изобразява изрази, съвместими с LOAD, докато PRINC изо­бра­зя­ва онези, които могат да се четат от функции като READ-LINE.


1.90 (print <израз> [<променлива, указваща файл>])

Тази функция е еквивалентна на PRIN1, с изключение на това, че пред <израз> се пише знак за нов ред и след <израз> - празен ред.


1.91 (progn <израз> ...)

Тази функция оценява всеки <израз> по ред и дава стойността на по­следния израз. С PROGN могат да се оценяват повече изрази, особено при функции, определящи само един израз.

Пример:

(if (= a b) (progn (setq a (+ a 10))



(setq b (- b 10)))

)

Функцията IF оценява в общия случай 1 израз-следствие, ако те­с­то­вия израз има стойност, различна от Nil. В горния пример сме оценили 2 из­раза с PROGN.


1.92 (prompt <символен низ>)

Тази функция изобразява <символен низ> в областта за въпроси на екра­на. При двуекранни системи PROMPT изобразява <символен низ> на два­та екрана и затова за предпочитане е PRINC.


Пример:

(prompt "Стойност:") резултат "Стойност:" и връща Nil


1.93 (quote <израз>)

Дава като резултат неоценения <израз>. Това би могло да се запише и така: ‘израз.

Пример:

(quote a) резултат A



(quote cat) резултат CAT

(quote (a b)) резултат (A B)

‘a резултат A

‘cat резултат CAT

‘(a b) резултат (A B)

Последните 3 примера не функционират, ако се набират директно от кла­виатурата като отговор на "Command:" в AutoCAD. Не забравяйте, че та­кива данни трябва да започват с "(" или "!", за да се отбележат като AutoLISP-изрази.


1.94 (read <символен низ>)

Тази функция дава като резултат първия списък или атом, който се по­лучава от <символен низ>. <Символен низ> не трябва да съдържа ин­тер­ва­ли.

Пример:

(read "Hallo") резултат HALLO



(read "Bye") резултат BYE

(read "(a)") резултат (A)


1.95 (read-char [<променлива, указваща файл>])

Тази функция чете само 1 символ от буфера за въвеждане от кла­ви­а­ту­рата или от отворения файл, който е описан чрез <променлива, указваща файл>. Резултатът е цяло число, съответстващо на ASCII-кода на про­че­тения символ.

Ако не е специфицирана <променлива, указваща файл> и в буфера за въ­веждане от клавиатурата няма символи, READ-CHAR очаква, че ще въ­ве­де­те данни от клавиатурата, последвани от RETURN. Да приемем, че този бу­фер е празен. READ-CHAR чака въвеждане на данни. Ако наберете "ABC", по­следвано от RETURN, READ-CHAR ще даде резултат 65 (ASCII-кода на бук­вата "A"). Следващите 3 извиквания на READ-CHAR дават съответно 66, 67 и 10 (нов ред). Ако още веднъж се извика READ-CHAR, тя ще очаква въ­веждане на данни от потребителя.
1.96 (read-line [<променлива, указваща файл>])

Тази функция чете символен низ от клавиатурата или от отворен файл, който е описан от <променлива, указваща файл>. Ако е намерен края на файла, READ-LINE дава резултат Nil, в противен случай дава про­четения символен низ. Да приемем, че F е променлива, указваща от­во­рен файл:

(read-line f) , резултатът би бил следващия ред за данни от фай­ла или Nil, ако е намерен края на файла.
1.97 (redraw [<име на елемент> [<режим>]])

Ефектът на функцията зависи от броя на зададените аргументи.


(Redraw) изчертава отново целия чертеж, ка­то REDRAW на AutoCAD

(redraw <име на елемент>) изчертава отново избрания елемент. Така един елемент може да бъде иден­тифициран, след използване на GRCLEAR (из­триване на екрана).

(redraw <име на елемент> <режим>)осигурява пълен контрол на но­во­то из­чертаване на елементи. <Режим> е ця­ло число с една от следните стой­­ности:
Режим-REDRAW Д е й с т в и е .

1 Отново изчертава елемент на екрана

2 Изтрива елемент от екрана

3 Маркира елемент (ако се поддържа от дисплея)

4 Изключва маркирането
Ако <име на елемент> е Header на сложен елемент (полилиния или блок с атрибути), главният елемент и всички негови поделементи се пре­ра­ботват, ако <режим> е положителен. Ако последният е отрицателен, REDRAW обработва само Header-елемента.

REDRAW винаги дава Nil, ако не са намерени грешки.


1.98 (rem <число 1> <число 2> ...)

Тази функция разделя <число 1> от <число 2> и дава резултата (<число 1> MOD <число 2>). REM се използва с цели или реални числа.

Пример:

(rem 42 12) резултат 6



(rem 12.0 16) резултат 12.000000

(rem 60 3) резултат 0


1.99 (repeat <число> <израз> ...)

При тази функция <число> е цяло положително. Функцията оценява все­ки <израз> всеки път, когато се укаже от <число> и резултатът е стой­ността на последния <израз>.

Пример:

(setq a 10)



(setq b 100)

От това следва:

(repeat 4 (setq a (+ a 10))

(setq b (+ b 10))

) резултат 140
1.100 (reverse <списък>)

Тази функция дава списък, чиито елементи са обърнати спрямо <списък>. Пример:

(reverse ‘((a) b c)) резултат (C B (A))
1.101 (rtos <число> [<режим> [<точност>]])

Тази функция дава като резултат символен низ, който представя <число>, съответно на стойностите, поставени от <режим>, <точност> и ораз­мерителната променлива на AutoCAD - DIMZIN. <Режим> и <точност> са це­ли числа, които определят режима на линейни единици и точността. Под­държани стойности на <режим>:



RTOS-режим Ф о р м а т н а р е д а к т и р а н е

1 Научен (десетични числа с експонента)

2 Десетичен (десетични числа)

3 Инженерен (инчове с десетична дробна част)

4 Архитектурен (инчове с дроби)

5 Дробен


<Режим> и <точност> съответстват на системните променливи на AutoCAD - LUNITS и LUPREC. Ако се пропуснат аргументите, използват се ак­туалните стойности на двете променливи.

Пример:


(rtos 17.5 1 4) резултат "1.7500Е+01"

(rtos 17.5 2 2) резултат "17.50"

(rtos 17.5 3 2) резултат "1-5.50""

(rtos 17.5 4 2) резултат "1-5½""

(rtos 17.5 5 2) резултат "17½"
1.102 (set <символ> <израз>)

Присвоява на <израз> стойността на <символ>, при което <символ> е име на символ с quote и дава като резултат тази стойност.

Пример 1:

(setq ‘a 5.0) резултат 5.000000 и дефинира символа A

(set (quote b) ‘a) резултат A и дефинира символа B

Ако SET се използва с име на символ без quote, функцията може да при­свои нова стойност индиректно на друг символ.

Пример 2:

(set b 640) резултат 640

Тази операция присвоява на символа A стойност 640, защото се съ­дър­жа в символа B.(Виж също SETQ.)
1.103 (setq <символ1> <израз1> [<символ2> <израз2>] ...)

Присвоява на <символ1> стойността на <израз1>, на <символ2> стой­но­стта на <израз2> и т.н. Това е основната присвояваща функция на AutoLISP. Дава се последния <израз>.

Пример 1:

(setq a 5.0) резултат 5.000000

(setq b 123 c 4.7) резултат 4.700000

(setq s "es") резултат "es"

(setq x ‘(a b)) резултат (A B)

Функциите SET и SETQ създават или модифицират глобални символи, с из­ключение на случаите, когато се използват вътре в DEFUN, за да при­сво­ят стойност на аргумент на функцията или символ, който се използва ло­кално за тази DEFUN.

Пример 2:

(setq glo1 123) създава глобален символ

(defun demo (arg1 /loc1)

(setq arg1 234) присвоява локално нова стойност

(setq loc1 345) присвоява локално нова стойност

(setq glo1 456) присвоява глобално нова стойност

(setq glo2 567) създава глобален символ

)

Глобалните символи могат да се задействат и модифицират от всяка фун­кция и да се използват в произволен израз. Локалните символи и ар­гу­менти на функцията притежават значение само по време на оценяването на функцията, от която са дефинирани или по време на функции, извикани от тази функция. ВНИМАВАЙТЕ, аргументите на функцията могат да се из­пол­зват като локални символи; функцията може да променя стойностите им до прекъсването ú, след което тези промени не се запазват.



SET и SETQ могат да присвояват нови стойности на вградени символи и имена на функции, при което първоначалните стойности се изтриват или се правят недостъпни. Дори на опитни потребители могат да се случат след­ните грешки:

Г Р Е Ш К И:

(setq angle (...))

(setq length (...))

(setq max (...))

(setq t (...))


За да се избегнат необичайни грешки, бъдете внимателни при избора на имена на собствените Ви символи. Никога не използвайте името на сис­темен символ или функция за Вашия собствен символ! За да получите спи­сък на имената на символите, които не трябва да използвате, на­бе­ре­те "!ATOMLIST" след "Command:" в AutoCAD, но преди да е заредена ня­как­ва AutoLISP-функция.
1.104 (setvar <име променлива> <стойност>)

Тази функция присвоява на системна променлива на AutoCAD <стойност> и резултатът е тази стойност. <Име на променлива> трябва да е в кавички.

Пример:

(setvar "FILLETRAD" 0.50) резултат 0.500000



Някои команди на AutoCAD приемат стойностите на системните про­мен­ливи преди да са извикани някакви запитвания. Ако използвате SETVAR за поставяне на нова стойност по време, когато е активна една команда, мо­же да стане така, че новата стойност да се взема предвид едва при сле­дващото изпълнение на командата. (Виж също GETVAR.)
1.105 (sin <ъгъл>)

Тази функция дава синуса на <ъгъл> (в радиани).

Пример:

(sin 1.0) резултат 0.841471



(sin 0.0) резултат 1.414214
1.106 (sqrt <число>)

Тази функция дава квадратен корен на <число> като реално число.

Пример:

(sqrt 4) резултат 2.000000



(sqrt 2.0) резултат 1.414214
1.107 (strcase <символен низ> [<как?>])

STRCASE взема <символен низ> и дава като резултат копие, при ко­е­то всички буквени символи се преобразуват съгласно <как?> в малки или глав­ни букви. Ако <как?> е пропуснат или е оценен на Nil, всички съ­дър­жащи се в <символен низ> буквени символи се преобразуват в главни бук­ви. Ако <как?> е зададен и не е равен на Nil, всички съдържащи се в <символен низ> буквени символи се преобразуват в малки букви.

Пример:

(strcase "Muster") резултат "MUSTER"



(strcase "Muster" Т) резултат "muster"

1.108 (strcat <символен низ 1> <символен низ 2> ...)

Тази функция дава като резултат символен низ, който се състои от свър­заните < символен низ 1> и < символен низ 2>.

Пример:

(strcat "cam" "era") резултат "camera"



(strcat "a" "b" "c") резултат "abc"

(strcat "a" "" "c") резултат "ac"


1.109 (strlen <символен низ>)

Тази функция дава дължината на <символен низ> в символи като цяло число.

Пример:

(strlen "abcd") резултат 4



(strlen "ab") резултат 2

(strlen "") резултат 0


1.110 (subst <нов елемент> <стар елемент> <списък>)

Тази функция претърсва <списък> за <стар елемент> и дава копие на <списък> с <нов елемент> за всеки намерен <стар елемент>. Ако в <списък> не е намерен <стар елемент>, SUBST дава непроменен <списък>.

Пример 1:

(setq Muster ‘(a b (c d) b))

От това следва:

(subst ‘qq ‘b Muster) резултат (A QQ (C D) QQ)

(subst ‘qq ‘z Muster) резултат (A B (C D) B)

(subst ‘qq ‘(c d) Muster) резултат (A B QQ B)

(subst ‘(qq rr) ‘(c d) Muster) резултат(A B (QQ RR) QQ)

(subst ‘(qq rr) ‘z Muster) резултат (A B (C D) B)

Като се прилага заедно с ASSOC, SUBST позволява да се замени стой­ността, която е присвоена на наименование от в асоциативен списък.

Пример 2:

(setq wer ‘((vorname karl) (bez der) (name kahle)))

От това следва:

(setq alt (assoc ‘vorname wer)) резултат (VORNAME KARL)

(setq neu ‘(erster k)) резултат (VORNAME K)

(subst neu alt wer) резул.((VORNAME K)(BEZ DER)(NAME KAHLE))
1.111 (substr <символен низ> <старт> [<дължина>])

Тази функция дава част от <символен низ>, започваща от <старт>-сим­вола и е толкова знака, колкото са определени от <дължина>. Ако <дължина> не е определена, се връща останалото от <символен низ> до края. <Старт> и <дължина> трябва да са положителни числа. Първият знак от <символен низ> съответства на номер 1.

Пример:

(substr "abcde" 2) резултат "bcde"



(substr "abcde" 2 1) резултат "b"

(substr "abcde" 3 2) резултат "cd"


1.112 (terpri )

Тази функция пише нов ред на екрана. Като резултат се дава нов ред. TERPRI не се използва за I/O-файл. За да напишете нов ред във файл, можете да използвате PRINT или PRINC.


1.113 (taxtscr )

Тази функция превключва графичния монитор в текстов при системи с един екран (като клавиша "FLIP SCREEN" при AutoCAD). TEXTSCR винаги да­ва Nil. (Виж също GRAPHSCR.)


1.114 (trace <функция> ...)

Тази функция е в помощ при търсене на грешки. Тя маркира спе­ци­фи­ци­раните <функции> и дава името на последната функция. Всеки път, ко­га­то се оценява <функция>, се появява индикация, която показва зада­ва­не­то на функцията (в областта за извикване на команди). След това на екра­на се появява резултата от функцията.


Пример:

(trace my-func) резултат MY-FUNC и поставя маркирането на функцията. (Виж също UNTRACE.)


1.115 (type <елемент>)

Тази функция дава типа (TYPE) на <елемент>, при което TYPE е един от следните типове (като атом):

REAL Числа с плаваща запетая

FILE Файлови дескриптори (променливи, указващи файлове)

STR Символни низове

INT Цели числа

SYM Символи

LIST Списъци и потребителски функции

SUBR Вътрешни AutoLISP-функции

PICKSET AutoCAD-изборни записи

ENAME AutoCAD-имена на елементи

PAGETB Funktionspaginierungstabelle


Пример 1:

(setq a 123 r 3.45 s "Hallo" x ‘(a b c))

(setq f (open "Name" "r"))

От това следва:

(type ‘a) резултат SYM

(type a) резултат INT

(type f) резултат FILE

(type r) резултат REAL

(type s) резултат STR

(type x) резултат LIST

(type +) резултат SUBR

Пример 2:

(defun isint (a)

(if (= (type a) ‘INT) дали типът е цяло число

Т ако ДА - дава Т

Nil ако НЕ - дава Nil

)

)
1.116 (untrace <функция> ...)



Тази функция изтрива маркирането на специфицираните <функции> и да­ва името на последната функция. По този начин може да се изключи чрез избор възможността за търсене на грешки.

Пример:


(untrace my-func) резултат MY-FUNC и изтрива маркиране­то на функцията. (Виж също TRACE.)
1.117 (ver)

Тази функция дава символен низ, който съдържа номера на акту­ал­на­та версия на AutoCAD. Може да се използва с EQUAL за проверка на про­грам­ната съвместимост.

Пример:

(ver) резултат "AutoLISP Releasse 9.0”


1.118 (while <тестов израз> <израз> ...)

Тази функция оценява <тестов израз> и (ако не е равен на Nil) оце­нява другите изрази и още веднъж <тестов израз>. Този процес про­дъл­жава, докато <тестов израз> е Nil. WHILE дава като резултат по­след­на­та стойност на последния <израз>.

Пример:

(setq a 1)



От това следва:

(while (<= a 10)

(new-func a)

(setq a (1+ a)

)

Потребителската функция NEW-FUNC ще бъде извикана 10 пъти, при ко­ето "а" ще получи стойности от 1 до 10. Резултатът, който ще се по­я­ви е 11, т.е. стойността на последния оценен <израз>.


1.119 (write-char <число> [<променлива, указваща файл>])

Тази функция пише символ на екрана или в отворен файл, който е опи­сан чрез <променлива, указваща файл>. Число е ASCII-кода на сим­во­ла и също е стойността, която се дава като резултат от функцията.

Пример 1:

(write-char 67) дава резултат 67 и пише "C" на екрана.

(write-char 67 f) резултат 67 и пише "C" във файл F.
1.120 (write-line <символен низ> [<променлива, указваща файл>])

Тази функция пише <символен низ> на екрана или в отворен файл, кой­то е описан чрез <променлива, указваща файл>. <Символен низ> се да­ва обикновено с quote като резултат, при което се пропускат кавичките при записването във файла.

Пример:

(write-line "Test" f) резултат "Test" и записва Test


1.121 (zerop <елемент>)

Тази функция дава Т, ако <елемент> е реално или цяло число и е оце­нено на 0, в противен случай се дава Nil. Тя не е дефинирана за дру­ги типове <елементи>.

Пример:

(zerop 0) резултат Т



(zerop 0.0) резултат Т

(zerop 0.0001) резултат Nil


1.122 (*error* <символен низ>)

Това е функция за отстраняване на грешки, която може да бъде де­фи­нирана от потребителя. Ако не е равна на 0, тя се изпълнява като фун­кция, докато се появи AutoLISP-грешка. Единственият аргумент съ­дър­жа текстово описание на грешката.

Пример:

(defun *error* (st)



(princ "Error: ")

(princ st)

(terpri)

)

Тази функция действа точно като стандартното търсене на грешки на AutoLISP. (За съжаление в превода липсва описание на грешките!!!)


Глава 2
Достъп до елементи и устройства
Голям избор от AutoLISP-функции позволява достъпа до елементи на AutoCAD, както и до графичния монитор и входните устройства. Можете да из­берете елементи, чиито стойности се извикват и променят. LISP-овите про­менливи могат да управляват множества от избрани елементи, за да мо­гат да се обработват групи елементи. Не са предоставени функции, ко­и­то директно създават елементи, тъй като функцията COMMAND може да за­дей­ства и изпълнява обичайните за тази цел команди на AutoCAD.

Специални типове данни


Реализирани са два специални типа данни, които позволяват достъпа до елементите на AutoCAD: ИМЕ НА ЕЛЕМЕНТ и МНОЖЕСТВО ОТ ИЗБРАНИ ОБЕКТИ. Тези типове данни могат да бъдат манипулирани само чрез ди­рект­но присвоени на тях функции и тяхната вътрешна структура е не­съ­ще­ст­вена за програмиста на AutoLISP. ИМЕТО НА ЕЛЕМЕНТА показва все едно точ­ка в управляван от графичния редактор на AutoCAD файл, в който AutoLISP може да намери информацията от базата данни и векторите (в слу­чай, че тези се намират на екрана) на елемента. МНОЖЕСТВОТО ОТ ИЗ­БРА­НИ ОБЕКТИ е просто група от имена на елементи.

Имената на елементи и множествата от избрани обекти са валидни са­мо за действащото състояние на редактиране, в което те са били съз­да­дени от AutoCAD.

Функции за манипулация с множеството избрани обекти
2.2.1 (ssget [<режим>] [<точка1> [<точка2>]])

С функцията SSGET можете да образувате множество от избрани обек­ти. <Режим> може да се указва по желание и е символен низ, който опре­де­ля типа на избора на обект. Може да се касае за "З", "С", "П" и "Н", ана­логично на режимите за избор в AutoCAD - "Прозорец", "Пресичащ", "Последен" и "Набор". <Точка1> и <точка2> са списъци от точки, които указ­ват основните точки на множеството от обекти. Ако една точка е спе­цифицирана без <режим>, този избор на елемент става с посочване на точ­ка. Ако се пропуснат всички аргументи, SSGET задава на потребителя въ­проса на AutoCAD "Select objects:", чрез което интерактивно може да се създаде множеството от избрани елементи.

Пример 1:

(ssget) Изисква от потребителя произволен избор на обекти

(ssget "V") Избира последния избран запис

(ssget "L") Избира елемент, който последен е вмъкнат в ба­зата данни

(ssget ‘(2 2)) Избира елемент, преминаващи през точка 2,2

(ssget "F" ‘(0 0) ‘(5 5)) Избира елементи, намиращи се изцяло в про­зо­реца, дефиниран чрез 0,0 и 5,5

(ssget "K" ‘(0 0) ‘(1 1)) Избира елементи, които се намират в или пре­сичат прозорец, дефиниран с 0,0 и 1,1

(ssget "X" <списък-филтър>) Избира елементи, съдържащи се в <списък-фил­тър>

Избраните елементи се маркират само, ако SSGET се използва без ар­гументи. Не се записва информация за това с какъв метод е избран един елемент (вижте обаче ENTSEL за една алтернативна възможност). Мно­жествата от избрани обекти използват временно файлово пространство на AutoCAD, затова AutoLISP не може да поддържа отворени повече от 6 мно­жества едновременно. Ако се премине тази граница, AutoCAD отказва съз­даването на други множества от избрани обекти и дава Nil на въ­про­си­те на SSGET.

Опциите за избор на обекти могат да бъдат въвеждани след въпроса на AutoCAD "Select objects:" и то тогава, когато е възможен избор с "Последен". По този начин се избират всички обекти в LISP-множеството на избраните обекти.



(ssget "X" <списък-филтър)

Към функцията SSGET на AutoLISP беше допълнен новия режим "X", кой­то прочита целия чертеж и създава едно множество от избрани обекти. То­ва множество съдържа имената на всички обекти, които изпълняват опре­делени критерии. Например с този механизъм може да се състави мно­же­ство от обекти, в което всички обекти са от определен тип и се на­ми­рат на определен пласт или притежават определен цвят.



<Списък-филтър> е списък от точкови двойки, подобно на списъка, кой­то се дава от функцията ENTDET. <Списък-филтър> определя признаците на проверяваните обекти и стойностите, които съответстват.

Пример 2:

(ssget "X" ‘((0 , "CIRCLE")))

Тази поредица ще даде множество, което съдържа всичките кръгове от чертежа (код на група 0 е типът на елемента).

Пример 3:

(ssget "X" ‘((8 , "ST3")))

Тази поредица ще даде множество, което съдържа всички обекти на слой "ST3" (код на група 8 е име на слой). Ако в <списък-филтър> е опре­делена повече от една точкова двойка, обектът трябва да изпълнява всич­ки условия, за да бъде включен в множеството.
Пример 4:

(ssget "X" ‘((0 , "CIRCLE") (8 , "ST3") (62 , 1)))

Тази поредица ще даде множество, което съдържа всички червени кръ­гове на слой "СТ3”.

Въпреки, че списъкът от филтрирани обекти притежава същия формат, как­то създадения с ENTGET списък, SSGET познава само определени кодове на групи. Функцията SSGET "X" прочита целия чертеж и сравнява полетата на всеки обект с определения <списък-филтър>. Ако признаците на един обект съвпадат с всички специфицирани полета на <списък-филтър>, този обект ще бъде включен в резултантното множество от избрани обекти. В про­тивен случай обектът няма да бъде приет в множеството. Ако няма обек­ти, изпълняващи определените от филтъра критерии, SSGET дава Nil. Ако <списък-филтър> е празен или не съществува, SSGET избира всички обек­ти в базата данни.


Код З н а ч е н и е .

0 Тип на елемент

2 Име на блок за вмъкване на блокове (INSERT)

3 Име на шрифт за оразмеряване

6 Име на тип линия

7 Име на шрифт за текст, атрибути и дефиниране на атрибути

8 Име на слой

38 Елевация (реал.)

39 Дебелина на обект (реал.)

62 Номер на цвят (0="VONBLOCK", 256="VONLAYER")

66 Флаг (следват атрибути) за вмъкване на блок (INSERT)

210 3D вектор на посоката


За да тествате кодовете на групи, които са означени с (реал.), тряб­ва за проверяваща стойност да се зададе реално число. Ако например тряб­ва да се търсят обекти с елевация 2.0, първия вариант би бил гре­шен, но втория - верен:

(ssget "X" ‘((38 , 2))) грешно

(ssget "X" ‘((38 , 2.0))) вярно

SSGET "X" дава Nil, ако <списък-филтър> съдържа кодове на групи, ко­ито не са посочени в горната таблица. По този начин се осигурява AutoLISP-програмите с SSGET "X" да функционират и когато в бъдещите вер­сии бъдат вмъкнати допълнителни кодове.


2.2.2 (sslength <избрани обекти>)

Тази функция дава като резултат цяло число, което обозначава броя еле­менти на едно множество от избрани обекти. Множествата никога не съ­държат двоен избор на един и същ елемент.

Пример:

(setq a (ssget "L"))поставя в множество [a] последния обект



(sslength sset) дава 1 като резултат
2.2.3 (ssname <избрани обекти> <индекс>)

Тази функция дава името на елемента, който се намира в мно­же­ст­во­то на маркираната с <индекс> позиция. Ако <индекс> е отрицателен или по-голям от броя на елементите, резултатът е Nil. Първият елемент от мно­жеството притежава индекс 0. Имената на елементи от множеството, ко­ито са извикани с SSGET, винаги са имена на главни елементи. Под­е­ле­мен­ти (например атрибути на блокове или върхове на полилиния) не се да­ват като резултат. (ENTNEXT позволява достъп до поделементите.)

Пример 1:

(setq a (ssget)) създава ново множество с име A

(setq ent1 (ssname a 0)) извиква името на I елемент в A

(setq ent4 (ssname a 3)) извиква името на IV елем. в A

За да е възможен достъпът до елементи, по-големи от 32767-мия, ар­гументът <индекс> трябва да се специфицира като реално число.

Пример 2:

(setq entx(ssname a 50843.0)) извиква името на 50844-ти ел.
2.2.4 (ssadd [<име на елемент> [<избрани обекти>]])

Ако се извика без аргументи, SSADD създава ново множество без чле­нове. Ако се извика с аргумент - едно единствено име на елемент, SSADD създава ново множество с това единствено име на елемент. Ако се из­вика с едно име на елемент и едно множество, назованият елемент се при­бавя към това множество. SSADD винаги дава новото или модифицирано мно­жество от елементи. Ако назования елемент вече се намира в мно­же­ст­во­то, SSADD-операцията се игнорира и не се появява съобщение за греш­ка.

Пример:

(setq e1 (entnext)) дава E1 - име на I елемент на чертежа



(setq ss (ssadd)) поставя име "ss" на нулево множество

(ssadd e1 ss) дава множеството "ss" с вмъкнат елемент E1

(setq e2 (entnext e1)) извиква елементът след E1

(ssadd e2 ss) дава множеството "ss" с вмъкнат елемент E2


2.2.5 (ssdel <име на елемент> <избрани обекти>)

SSDEL изтрива <име на елемент> от множеството <избрани обекти> и да­ва като резултат името на множеството. Ако елементът не се намира в мно­жеството, дава се Nil. В следващия пример приемаме, че елементът E1 при­надлежи към множеството "ss", а елементът E2 - не.

Пример:

(ssdel e1 ss) дава множеството "ss", от което е изтрит E1



(ssdel e2 ss) дава Nil и не променя множеството "ss"
2.2.6 (ssmemb <име на елемент> <избрани обекти>)

Тази функция тества дали <име на елемент> е член на множеството <избрани обекти>. В положителния случай SSMEMB дава името на елемента; в противен случай - Nil. В следващия пример приемаме, че елементът E1 при­надлежи на множеството "ss", а елементът E2 - не.

Пример:

(ssmemb e1 ss) дава името на елемента E1



(ssmemb e2 ss) дава Nil



Сподели с приятели:
1   2   3




©obuch.info 2024
отнасят до администрацията

    Начална страница