
Автоматизація графічно-конструкторських робіт
.pdf
триває доти, поки значення “перевiрки” не буде дорiвнювати nil. Функцiя WHILE повертає останнє значення останнього аргументу “вираз”.
Наприклад, якщо (setq a 1) ,
то (while (<= a 10) (some-func a)
(setq a (1+ a))) результат: 11
2.8. Виклик програм з AutoCAD
(command <аргументи>...)
За допомогою цiєї функцiї здiйснюється запуск команд AutoCAD з AutoLISP.
Приклад: (setq pt1 '(1.45 3.21)) (setq pt2 (getpoint "Enter a point")) (command "line" pt1 pt2 "")
Першi двi функцiї встановлюють двi точки pt1 i pt2, потiм викликається команда LINE i цi точки використовуються як вiдповiді на її пiдказки. Символ "" еквiвалентний введенно пробілу з клавiатури.
2.9. Функцiї керування зображенням
(graphscr)
Функцiя переключає екран AutoCAD з текстового режиму в графiчний. GRAPHSCR завжди повертає nil.
(textscr)
Функцiю TEXTSCR використовують для перемикання з екрана графiчного зображення на текстовий екран у випадку одноекранних систем. Вона завжди повертає nil (див. також функцiю GRAPHSCR).
(redraw [<примiтив> [<режим>]])
За допомогою виклику функцiї REDRAW з двома аргументами здiйснюється повний контроль над перекреслюванням “примiтив”, де “примiтив” – iм'я перекреслюваного примiтиву, а “режим” – цiле число, яке має одне з таких значень:
Режим Дія
1Перекреслити примiтив на екранi
2Не перекреслювати (погасити)
3Видiлити примiтив бiльш яскравим свiтлом
4Вiдмiнити завищену яскравiсть примiтиву
Якщо аргумент “примiтив” є заголовком складного примiтиву (полiлiнiї або блоку з атрибутами), i якщо аргумент “режим” позитивний, то оброблятися буде основний примiтив i його пiдпримiтиви. Якщо ж вiд'ємний, то функцiєю буде оброблятися тiльки заголовний примiтив. Функцiя REDRAW завжди повертає nil, якщо не виявлено ніяких помилок.
80
2.10. Функцiї для роботи
з геометричним описом об'єктiв
(angle <pt1> <pt2>)
Функцiя обчислює кут мiж двома точками “pt1” i “pt2” двовимiрного простору (точку подано у виглядi двохелементного списку).
Приклад:
(angle '(1.0 1.0) '(1.0 4.0)) результат 1.570796
(distance <точка1> <точка2>)
Функцiя повертає вiдстань мiж двома точками.
Приклад: (distance '(1.0 2.5) '(7.7 2.5)) результат 6.7
(inters <точка1> <точка1> <точка3> <точка4> [<>])
Функцiя визначає точку перетину двох лiнiй. "Точка1" i "точка2" є кiнцями вiдрiзка першої лiнiї, а "точка3" i "точка4" – другої лiнiї.
Приклад: (setq a '(1.0 1.0) b '(9.0 9.0)) (setq c '(1.0 1.0) d '(9.0 9.0)) ,
тодi (insert a b c d) результат nil
(insert a b c d nil) результат (4.000000 4.000000)
(osnap <точка> <режим>)
Функцiя повертає точку, яка є результатом використання режимiв фiксацiї об'єктiв, що задаються аргументом “режим” для точки “точка”. Аргумент “режим” є рядком, що складається з одного або бiльше найменувань режимiв фiксацiї об'єктiв, таких як "midpoint" (середина), "center" (центр), тощо. Для розподілу назв режимiв використовують кому.
Приклад: (setq pt2 (osnap pt1 "midp"))
(polar <точка> <кут> <вiдстань>)
Функцiя повертає точку, яка знаходиться на заданiй вiдстанi “вiдстань” вiд точки “точка”, i ту, яка лежить на променi, що складає кут з базовим напрямом. Точка є списком двох дiйсних чисел, а кут виражається в радiанах.
Приклад:
(polar '(1.0 1.0) 0.785398 1.414214) повертає (2.0 2.0)
(trace <функцiя> ...)
Функцiя є засобом налагодження. Вона встановлює прапорець трасування для заданих функцiй i повертає останнє iм'я функцiї. Кожного разу, коли функцiя обчислює, на екранi вiдображається її iм'я i рiвень входження (рiвень глибини виклику), результат функцiї виводиться на друк.
81
Приклад: (trace my-func) повертає MY-FUNC
i встановлює режим трасування для функцiї MY-FUNC. Режим вiдмiняється під час використання функції
(UNTRACE <функцiя> ...).
2.11. Функцiї файлових входiв/виходiв.
(open <iм'я файлу> <режим>)
Функцiя вiдкриває файл для забезпечення доступу за допомогою функцiй введення/виведенння AutoLISP. Вона повертає дескриптор файлу, який повинен використовуватись iншими функцiями введення/виведення; тому результат виконання даної функцiї присвоюється символу.
Приклад: (setq a (open "file.ext" "r"))
Допустимi режими описано в такій таблиці:
Режим |
Опис |
|
"r" |
Вiдкритий для зчитування. Якщо "iм'я файлу" не iснує, то повертається nil |
|
"w" |
Вiдкритий для запису. Якщо файл не iснує, то створюється i вiдкривається |
|
|
новий. Якщо файл iснує, то його данi будуть втрачені |
|
|
Вiдкритий для доповнення. Якщо файл не iснує, |
то створюється i |
"a" |
вiдкривається новий файл. Якщо iснує, то вiн вiдкривається i новi данi |
|
|
розміщують наступними за тими, які зберiгаються у |
ньому. Отже, реа- |
|
лiзується доповнення даних у файл |
|
<Iм'я файлу> може включати префiкс директорiї.
Приклад: (setq f (open "/x/new.tst" "w")) повертає дескриптор файлу
(close <дескриптор>)
Функцiя закриває файл i виробляє nil. Нехай Х є дескриптором вiдкритого файлу, тодi
(close X) виробляє nil i закриває файл .
(read -line [<дескриптор файлу>])
Функцiя зчитує рядок, який введено з клавiатури, або з вiдкритого файлу, заданого своїм дескриптором “дескриптор файлу”! Якщо зустрiчається кiнець файлу, то READ-LINE повертає nil, у противному разі
– повертає зчитаний рядок.
(read <рядок>)
Функцiя повертає перший список або атом, получений з рядка. У рядку не повинно бути пробілів.
Приклад: (read "hello") повертає HELLO
82
(read -char [<дескриптор файлу>])
Функцiя зчитує один символ iз вводного буфера клавiатури або з вiдкритого файлу, на який вказує аргумент “дескриптор файлу”. Вона повертає (цiле число) в кодi ASCII, яке є вiдображенням зчитаного символу.
(write-char <число> [<дескриптор файлу>])
Функцiя записує один символ на екран або у вiдкритий файл, заданий своїм дескриптором “дескриптор файлу”.
Приклад: (rite-char 67 f) повертає 67 i записує літеру C у файл.
(write-line <рядок> [<дескриптор файла>])
Функцiя вiдображає аргумент “рядок” на екранi або записує у вiдкритий файл, який визначає аргумент “дескриптор файлу”. Вiн повертає взятий у лапки аргумент “рядок”, але опускає лапки, коли проводить запис у файл.
Приклад: (write-line "Test" f) записує Test у файл з дескриптором f i повертає "Test"
2.12. Робота зі списками
(append <вираз>...)
Функцiя приймає довiльну кiлькiсть аргументiв cписочного типу і формує з них один список.
Приклад: (append '(a b) '(c d)) результат (a b c d)
(apply <функцiя> <список>)
Виконується виклик функцiї, iм'я якої є першим аргументом. Другим аргументом цiєї функцiї є список, до якого вони застосовують “функцію”.
Приклад: (apply '+ '(1 2 3)) результат 6
(assioc <елемент> <а_список>)
Функцiя шукає у списку “а_список” пiдсписок, який має “елемент”. Якщо такий пiдсписок не знайдено, то видається nil.
Приклад: нехай список AL визначено такі: ((name box) (width 3) (size 4.72) (depth 5)) , тодi (assoc 'size al) результат (size 4.72)
(assoc 'weig al) результат nil
(car <список>)
Функцiя повертає перший елемент списку. Якщо список порожнiй, то повертається nil.
Приклад: (car '(a b c)) результат a
83
(cdr <список>)
Функцiя повертає список, із якого спочатку вилучають перший елемент. Якщо список порожнiй, то повертається nil.
Приклад: (cdr '(a b c)) результат (b c)
Якщо списком є точкова пара, то CDR повертає другий елемент списку, який трактується як елемент, а не список.
Приклад: (cdr '(a . b)) результат b
(caar, cadr, cddr, cadar i т.д.
В AutoLISP можлива конкатенацiя CAR та CDR до 4-го рiвня.
Нехай має мiсце присвоювання: (setq x '((a b) c d)) ,
тодi (caar x) еквiвалентно (car (car x)) результат a
(cdar x) еквiвалентно (cdr (car x)) результат (b) (cadar x) еквiвалентно (car(cdr (car x))) результат b
(cadr x) еквiвалентно (car (cdr x)) результат c
(cddr x) еквiвалентно (cdr (cdr x)) результат (d)
(cons <новий перший елемент> <список>)
Ця функцiя є основним виробником спискiв. Вона додає "новий перший елемент" на початок iснуючого списку.
Приклад: (cons 'a '(b c d)) результат (a b c d)
(lambda <аргументи> <вираз>....)
LAMBDA дозволяє знайти безiменну функцiю. Її використовують у тому разі, якщо додатковi витрати, пов'язанi з отриманням цiєї функції, не виправданi. Крiм того, оскiльки функцiя визначається безпосередньо там, де її передбачається використовувати, вся програма тоді легше зчитується. Функція повертає значення останнього зi своїх виразiв та часто використовується разом iз APPLY чи MAPCAR для роботи зi списками.
Приклад: (apply '(lambda (x y z) (* x (- y z)) ) '(5 20 14))
результат дорiвнює 30
(last <список>)
Функцiя повертає останнiй елемент списку.
Приклад: (last '(a b c d e)) результат є (list <вираз>....)
Функцiя формує iз аргументiв ("вираз") один загальний список.
Приклад: (list 'a 'b 'c) результат (a b c)
(length <список>)
Функцiя повертає цiле число, яке дорiвнює кiлькостi елементiв у списку.
Приклад: (length '(a b c d)) результат 4
84
(mapcar <функцiя> <список1>...<список N>)
MAPCAR повертає результат виконання "функцiї", аргументи якої вибирають зi спискiв "список1", "список2" і т.д. Кiлькiсть спискiв повинна вiдповiдати кiлькостi аргументiв "функцiї".
Приклад: (mapcar '1+ '(10 20 30)) результат (11 21 31) (mapcar '+ '(10 20 30) '(4 3 2)) результат (14 23 32)
За допомогою LAMBDA визначають безiменну функцiю, виконати яку можна, скориставшись MAPCAR. Подiбний засiб доцiльно використовувати, коли деякi аргументи функцiї є константами.
Приклад: (mapcar '(lambda (x) (+x 3)) '(10 20 30)) результат (13 23 33)
(member <вираз> <список>)
Функцiя виконує пошуком "вираз" у "списку" та повертає залишок "списку", який починається з першого входження "вираз". Якщо входження вiдсутнє, то MEMBER повертає nil.
Приклад: (member 'c '(a b c d e)) результат (с d e) (member 'q '(a b c d e)) результат nil
(nth <N> <список>)
Ця функцiя повертає N-й елемент зi “списку”. Якщо N дорiвнює нулю, то повертається перший елемент. Якщо N більше від кiлькостi елементiв “списку”, то повертається nil.
Приклад: (nth 3 '(a b c d e)) результат d
(quote <вираз>)
Повертає аргумент “вираз”, не обчислюючи його. Те саме можна записати за допомогою апострофа.
Приклад: (qoute a) повертає A
'a повертає A
(reverse <список>)
Ця функцiя повертає аргумент “список” з елементами, розташованими у зворотному порядку.
Приклад: (reverse ' ((a) b c)) повертає (C B (A))
(strcat <рядок1> <рядок2> ...)
Функцiя повертає рядок, який є конкатенацiєю аргументiв “рядок1”, “рядок2” i т.д.
Приклад: (strcat "a" "bout") повертає "about"
85
(subst <новий> <старий> <список>)
Функцiя шукає у “списку” аргумент “старий” (старий елемент) та повертає копiю “списку” з аргументом “новий” (новий елемент) замiсть кожного входження старого елемента. Якщо аргумент “старий” не знайдено у “списку”, функцiя SUBST повертає список непереробленим.
Приклад: (setq sample ' (a b (c d) b)) ,
тоді (subst 'qq 'b sample) повертає (A QQ (C D ) QQ)
Якщо функцiю SUBST використовують разом з ASSOC, тj вона забезпечує доцiльну замiну значення, пов'язаного з ключовим словом в асоцiативному списку.
Приклад: Якщо
(setq who '((first join) (mid q) (last public))) , то (setq old
(assoc 'first who)
) повертає (FIRST JOHN)
(setq new '(first j)) повертає (FIRST J)
(setq new old who) повертає (FIRST J) (MID Q) LAST PUBLIC)
(substr <рядок> <початок> [<довжина>])
Функцiя повертає пiдрядок “рядка”, починаючи з позицiї “початок” у “рядку”. Довжина пiдрядка визначається аргументом “довжина”. Якщо аргумент “довжина” не заданий, то видiляється пiдрядок з вказаної позицiї i до кiнця рядка.
Приклад: (substr "abcde" 2 1) повертає "b"
2.13. Бiблiотеки функцiй, автоматичне завантаження та оброблення помилок
(load <ім'я_файлу>)
Функцiя завантажує файл, складений iз виразiв AutoLISP, та обчислює цi вирази. "Iм'я_файлу" – це iм'я файлу у системi. Розширення LSP друкувати не треба. Якщо файл знаходиться у другому каталозi, то замiсть iменi можна задати увесь шлях.
Наприклад: "function/test1".
Якщо операцiя завантаження пройшла вдало, то обчислюється iм'я останньої функцiї з файлу. Якщо нi, то повертається iм'я файлу. Нехай, наприклад, у файлi "/fred/test1.lsp задано DEFUN, яка визначає функцiю MY-FUNK, а файл test2 не iснує.
(load "/fred/test1") результат my-func (load "test2") результат "test2"
86
(defun <символ> <список аргументiв> <вираз>...)
DEFUN визначає функцiю з iменем "символ". Iм'я символу можна не брати в лапки, оскільки iнтерпретатор робить це сам. За iменем функцiї йде список її аргументiв (можливо порожній). За цим списком можуть розмiщуватися локальнi параметри функцiї, якi відокремлюють вiд списку похилою рискою (з обох боків вiд похилої риски має бути по одному пробiлу). Якщо список аргументiв i параметри вiдсутнi, то дужки все одно слід ставити.
Приклад: (defun myfunc (x y)...) визначення функцiї з двома аргументами (defun myfunc (/ x y)...) визначення функцiї з двома локальними символами.
За списком аргументiв та локальних параметрiв (символiв) записуються вирази, які складають тiло функцiї.
DEFUN повертає iм'я функцiї, котру вона визначає.
Коли визначена таким чином функцiя починає виконуватись, спочатку обчислюються значення її аргументiв. Указанi локальнi символи будуть використовуватися тiльки в тiлi цiєї функцiї, не розповсюджуючись на iншi. Функцiя повертає результат обчислень останньго виразу.
Приклад: (defun add10 (x) (+ 10 x) )
результат add10 add10 5 результат 15
add10 -7.4 результат 2.600000
Якщо ім’я функції C:XXX, то можна розширити AutoCAD, додавши до нього новi функцiї за допомогою конструкцiї DEFUN. Такi функцiї задовольняють такі вимоги:
1.Iм'я функцi повинно мати формат C:XXX. Завжди має бути, С:ХХХ – iм'я нової команди, яке не може збігатися з вже iснуючим iменем.
2.Список аргументiв команди повинен бути порожнім, але визначення локальних символiв дозволяється.
Функцiю, котра визначена як команда, можна викликати просто введенням ХХХ у вiдповiдь на пiдсказку AutoCAD Command:
(*error* <рядок>)
Цю, визначену користувачем функцiя, використовують для роботи над помилками. Якщо значення її не дорівнює nil, то кожного разу, коли утворюється помилковий стан AutoLISP, вона виконується як функцiя. Функція передає один аргумент, рядок, який вмiщує опис помилки.
Приклад: (defun *error* (msg) (princ "error: ") (princ msg) (terpri) )
Функцiя виконує те саме, що i стандартний манiпулятор помилок AutoLISP; видає на екран дисплея "error:" і опис.
87
2.14. Спецiальнi функцiї
(eval <вираз>)
Функцiя розраховує "вираз" і повертає його значення. Вираз є будьякою допустимою у LISP конструкцiєю.
Приклад: (eval (abs -10)) результат 10 (setq a '(+ 3 5)) (eval a) результат 8
(initget [<код>] [<рядок>])
Функцiя дозволяє задати режими, якi надалi будуть використовуватись у функцiях GETxxx (крiм функцiй GETSTRING та GETVAR). Результатом функцiї завжди є nil. Код є цiлим числом, яке iнтерпретується відповідно до таблиці:
Код |
Інтерпретація |
1 |
Уведення порожнього рядка не дозволяється |
2 |
Заборона введення нульових значень |
4 |
Заборона введення негативних чисел |
8 |
Вимкнення перевiрки меж (навiть при ввімкненому LIMCHECK HECK) |
Дозволяєтся складати табличнi коди. У цьому разі новий код iнтерпретується як сукупність вiдповiдних режимiв. Якщо введення користувача не задовольняє встановлені режими, то AutoCAD виводить вiдповiдне оголошення і пропонує повторити введення.
Приклад: (initget (+ 1 2 4)
(setq age (getint "введіть рiк народження: "))
Функцiя GETINT дозволяє ввести рiк народження. Якщо вводиться порожній рядок, нуль чи негативне число, то запит на введення повторюється. Режими перевiряються тiльки для тих функцiй, для яких це доцільно.
Другий необов'язковий аргумент функцiї є списком ключових слiв, якi будуть перевiрятися наступним запитом GETxxx у тому випадку, коли користувач вводить не те, на що очікує програма (наприклад, точку для GETPOINT). Якщо введення користувача збігається з одним із ключових слiв, то функцiя GETxxx повертає це слово у форматi рядка. Як правило, функцiя COND визначає подальшу дiю програм, якщо вводяться данi iншого типу або ключове слово не можна впізнати, тоді AutoCAD повторює запит на введення. Список ключових слiв має формат "Line Circle", слова відокремлено пробiлами. При вказаному запису специфiкувати словo можна за першою лiтерою. Область дiї функцiї INITGET – тiльки до першого виклику функцiї GETxxx. Потiмвсi прапорціINITGET автоматичноскидаються.
(menucmd <рядок>)
Функцiя забезпечує вiзуалiзацiю вказаної сторiнки меню. Сторiнка викликається з поточного файлу меню. Всерединi функцiї iм'я сторiнки завдається її позначкою (без "**"). Крiм того, знак $ не вказується.
88
Приклад: (menucmd "S=OSNAP ")
У результатi на екранi з'явиться меню команди OSNAP (за умови що елемент iз таким iм'ям є у поточному меню).
2.15. Системнi змiннi
Система AutoCAD має рiзнi попереднi змiннi, багато з яких можуть використовуватись для змiни рiзноманiтних режимiв та меж креслення. Доступ до системних змiнних здійснюється за допомогою функцiй
GETVAR та SETVAR.
(getvar <iм'я змiнної>)
Функцiя дозволяє одержати від AutoCAD значення системної змiнної. Iм'я змiнної необхiдно взяти у подвiйнi лапки. Нехай, наприклад, радiус спряження дорiвнює 0,25 (значення змiнної FILLETRAD дорiвнює 0,25).
(getvar "FILLETRAD") результат 0.250000
(setvar <iм'я-змiнної> значення)
Присвоює задане значення вказаній системнiй змiннiй. Iм'я змiнної слід узяти у подвiйнi лапки (у дод. 1 наведено список системних змiнних
AutoCAD).
2.16. Доступ до примітивів та пристроїв
2.16.1. Спецiальнi типи даних
(ssget [<режим>] [<точка1> [точка2>]])
Функцію використовується для організації набору та вибору. Аргументи “точка1” та “точка2” є списками, котрi задають точки вибору. Завдання точки без аргументу “режим” рiвносильно вибору примiтиву вказуванням точки. Якщо всi аргументи пропускаються, то SSGET через AutoCAD видає користувачу загальний запит "Select objects:", дозволяючи iнтерактивну конструкцiю наборiв вибору. Додатковий аргумент “режим” є рядком, котрий задає тип набору примiтиву, що виконується. Цим ти-
пом може бути "_W", "_C","_L","_P" або "_Х", чи "_I".
(ssget "_P") Вибирає останній набiр вибору
(ssget "_L") Вибирає останнiй, доданий до бази даних, примiтив (ssget '(2 2)) Вибирає примiтив, що проходить через точку 2.2
(ssget "_W" '(0 0) '(5 5)) Вибираєпримiтивиувiкнi вiдточки0.0 доточки5.5 (ssget "_C" '(0 0) '(1 1)) Вибирає примiтиви, що перерізають прямокутник вiд 0.0 до 1.1
(ssget "_X" '((0 . "TEXT ")(8 . "RAZM"))) Вибирає текстові примітиви,
89
примітиви, виконані командою "TEXT" в шари "RAZM" (ssget "_I" '((0 . "LINE ") (62 . 5))) Аналогічно "_X"
(sslegth <нв>)
Ця функцiя повертає цiле число, що мiстить номери примiтивiв у наборi вибору “нв”.
(ssname <нв> <iндекс>)
Функцiя повертає iм'я примiтиву елемента “індекс” набору вибору “нв”. Якщо аргумент “індекс” вiд'ємний або більше від номера останнього примiтиву у наборi вибору, то повертається nil. Перший елемент у наборi має нульовий номер. Iмена примiтивiв у наборах вибору, одержані за допомогою функцiї SSGET, завжди будуть iменами основних примiтивiв. Підпримiтиви (атрибути блокiв та верхiвки полiлiнiй) повертатися не будуть (доступ до них забезпечує ENTNEXT).
(ssadd [<iм'я> [<нв>]])
Якщо функцiю можна викликати без аргументiв, SSADD створює порожній набiр вибору; якщо з аргументом iменi одного примiтиву – SSADD створює новий набiр вибору, що мiстить це iм'я примiтиву. Якщо функцiю викликають з iменем примiтиву та набором вибору, то вона додає iменований примiтив до набору вибору. SSADD завжди повертає новий або модифiкований набiр. Звернiть увагу на те, що при додаваннi примiтиву до набору, новий примiтив фiзично додається до iснуючого та набiр, що передається як “нв”, повертається як результат. Отже, якщо набiр присвоєно iншим змiнним, вони також будуть вiдображати це додавання. У разі, якщо iменований примiтив вже знаходиться у наборi, функцiя SSADD буде iгноруватися; але повiдомлень про помилки не буде.
(ssdel <iм'я> <нв>)
SSDEL стирає iм'я примiтиву з набору вибору “нв” та повертає iм'я набору вибору “нв”. Звернiть увагу на те, що примiтив фiзично стирається з набору вибору та повертається новий набiр без вказаного елемента. Якщо в наборі вибору немає примітиву, то повертається nil.
(ssmemb <iм'я> <нв>)
Функцiя перевiряє, чи є iм'я примiтиву “iм'я” членом набору вибору “нв”. Якщо так, функцiя SSMEMB повертає iм'я примiтиву “iм'я”. В iншому разi, вона повертає nil.
2.16.2. Функцiї iменi примiтиву
(entnext [<iм'я>])
Якщо ця функцiя викликається без аргументiв, то вона повертає iм'я першого невидаленого примiтиву у базi даних. Якщо функцiю ENTNEXT
90
можна викликати з аргументом iменi примiтиву “iм'я”, то вона повертає iм'я першого невидаленого примiтиву, котрий є наступним за примiтивом “iм'я” у файлi креслення. Якщо у файлi вiдсутнiй такий примiтив, то повертається nil.
(entlast)
Функцiя повертає iм'я останнього невидаленого головного примiтиву у файлi креслення. Її часто використовують для отримання iменi нового примiтиву, котрий додано за допомогою функцiї COMMAND. Примiтив не обов'язково повинен бути на екранi чи на “розмерзлому” шарі.
(entsel [<пiдказка>])
Iнодi, працюючи з примiтивами, бажано одночасно вибирати примiтив та задавати точку, за якою вiн вибирався. Прикладом цього може бути використання режимiв об'єктної фiксацiї та команд BREAK , TRIM та EXTEND системи AutoCAD. Функцiя ENTSEL дає можливiсть програмам AutoLISP виконувати цю операцiю.
2.16.3. Функцiї обробки атрибутiв примiтивiв
Функцiї, наведені у цьому роздiлi, дозволяють пошук та модифiкацiю даних, що є примiтивами AutoCAD. У всiх функцiях використовуються iмена примiтивiв для iндентифiкацiї конкретних даних.
(entdel <iм'я>)
Примiтив з iменем “iм'я” вимикають з креслення, якщо вiн там є. Якщо примiтив вимикнули з креслення ранiше у даному сеансi, то функцiя повертає його. Вимкнення примiтивів з файлу креслення відбувається під час виходу з графiчного редактора, тому їх повернення за допомогою ENTDEL можливо тiльки у рамках того сеансу, у якому вони були вимкнені.
(entget <iм'я>)
Функцiя шукає примiтив “iм'я” у файлi креслення та повертає список, котрий є описом цього примiтиву. Звернiть увагу на те, що в пiдсписок, який мiстить координати точки, не входить символ "точка". Оскiльки точка є двохелементним списком, то вся група повинна бути трьохелементним списком. Функцiя CDR має завжди повертати трьохелементний список, а символ "точка" доповнює список до необхiдної довжини.
(entmake [elist])
Функція може визначати як графічні, так і неграфічні об'єкти. “elist” – список об'єктів визначення даних, який задається у форматі, подібному до формату функції ENTGET. Аргумент ELIST повинен містити всю інформацію, необхідну для визначення об'єкта. Якщо будь-які необхідні
91
визначення даних пропущені, функція ENTMAKE повертає nil і не виконуєтся. Якщо пропущені необов'язкові дані (наприклад, шар – "layer"), ENTMAKE використовує значення за замовчуванням.
Тип об'єкта (наприклад, CIRCLE чи LINE ) має займати перше чи друге поле у функції ELIST. Якщо тип об'єкта займає друге поле, то воно може бути тільки назвою об'єкта. Функція ENTMAKE ігнорує назву об'єкта під час створення нового об'єкта. Якщо ELIST містить об'єкт, створений вручну, то ENTMAKE його також ігнорує.
У разі успішного завершення функція повертає список об'єктів визначення даних. Інакше – повертає nil.
Команда при визначення блоку (ENTMAKE з ENDBLK) повертає його ім'я, а не список об’єктів. (див. "Створення складних об'єктів" в інструкції користування Visual LISP Iдля одержання більш детальні інформації щодо визначення блоків).
Приклад: наступний код створює червоне коло (колір 62), з центром у (4,4) і радіусом 1. Необов'язковий шар і тип лінії поля були опущені і тому набувають значень за замовчуванням.
Command: (entmake '((0 . "CIRCLE ") (62 . 1) (10 4.0 4.0 0.0) (40 . 1.0))
((0 . "CIRCLE") (62 . 1) (10 4.0 4.0 0.0) (40.1 ))
Групу з кодом 66 використовують тільки для вставленя об'єктів (потім іде значення атрибутів). Для об'єктів полілінії групи з кодом 66 примусово присвоюють величину, що дорівнює 1, значення (vertices – вершини), і для всіх інших об'єктів присвоюють за замовчуванням 0. Єдиний об'єкт, що може випливати за об'єктом полілінії, – об'єкт вершини.
Група з кодом 2 (ім'я блоку) об'єкта вимірювання є необов'язковою для функції ENTMAKE. Якщо ім'я блоку відсутнє у списку визначення об'єктів, AutoCAD створює новий список. Інакше кажучи, AutoCAD створює список, використовуючи вже підготовлене ім'я.
(entmod <список>)
Функцiї ENTMOD передається список у формi, котру генерує функцiя ENTGET. ENTMOD робить модифiкацiю цього списку та вiдповiдне вiдновлення файлу креслення. Механiзм оновлення файлу креслення за допомогою AutoLISP може бути таким. Спочатку за допомогою ENTGET проводиться пошук та вилучення списку примiтиву, потiм цей список модифiкується за допомогою AutoLISP (слiд звернути увагу на доцiльнiсть використання функцiї SUBST у цьому процесi) та, нарешті, за допомогою ENTMOD цей список знов запам'ятовується у файлi креслення.
Iснує ряд обмежень на можливостi модифiкацiї примiтивiв. По-перше, не змiнюйте тип примiтиву. Якщо треба це зробити, то примiтив слiд вилучити за допомогою ENTDEL та створити потрiбний примiтив за допомогою функцiї COMMAND. Усi елементи, на котрi посилаються фрагменти оброблюваного примiтиву, мають бути визначенi у програмi AutoCAD на момент виклику функцiї. Так, типи текстiв та лiнiй, форми і блоки слід визначити під час використання їх у функцiї ENTMOD. Винятком є шари. Функцiя створює новий шар, якщо зустрiчається посилання на шар, невiдомий AutoCAD. Атрибути цього шару беруть за замовчуванням.
(entupd <iм'я>)
Під час модифiкацiї вершин полiлiнiй або атрибута за допомогою ENMOD на екранi не вiдбувається вiдображення виконуваних дiй. Функцiя ENTUPD забезпечує повну регенерацiю вказаного об'єкта.
Приклад використання функцiй оброби атрибутiв примiтивiв:
(defun c:k ( )
; функція коректування полiлiнiї
(setq $os (getvar "OSMODE")) (setvar "OSMODE" 3) (princ (setq op (getpoint "\n Old point ? : ")))
(setvar "OSMODE" 0)
(setq np (getpoint op "\n New point ? : ")) (print np) (setq gn (append '(10) np) go (append '(10) op)) (setq ee (entnext ))
(while ee
(setq ee (entnext ee) ed (entget ee)) (if (equal (assoc 10 ed) go)
(setq eg (subst gn go ed) en ee ee nil)
)
); while
(entmod eg (entupd en) (setvar "OSMODE" $os)
)
2.16.4. Використання iмен примiтивiв i наборiв виборiв
Ім’я примітиву або набір виборів є допустимою вхiдною iнформацiєю, що передається з AutoLISP у AutoCAD, у вiдповiдь на запрошення вказати примiтиви. Як результат, примiтиви, вибранi у AutoLISP, можуть оброблятися Автокадом. На запрошення "Select objects" AutoLISP може вiдповiсти передачею iменi конкретного примiтиву або передачею набору виборiв. Перший випадок рiвносильний указанню цього примiтиву з екрана, а у другому випадку в AutoCAD передаються усi примiтиви набору. Передача в AutoCAD iменi примiтиву або набору виборiв допустима тiльки у тих випад-
92 |
93 |
ках, коли можливо було б використати опцiю LAST процес указання на елементи. Увсiхвипадкахпримiтивинеобов'язковомаютьбутивидимими.
2.16.5. Доступ до елементiв таблиць
Таблицями символiв AutoCAD є таблицi шарів, типiв лiнiй, видiв, описів блокiв та текстових стилiв. Функцiї TBLNEXT та TBLSEARCH забезпечують читання iнформацiї з цих таблиць.
(tblnext <iм'я таблицi> [<початок>]
Функцiю використовують для повного перегляду таблицi символiв. Допустимими iменами є “LAYER ” – таблиця шарів, “LTYPE” – таблиця типiв лiнiй, “VIEW” – таблиця видiв, “STYLE ” – таблиця текстових стилiв та “BLOC” – таблиця описів блокiв. Якщо задається другий аргумент та його значення не nil, то вiдбувається повернення до початку вiдповiдної таблицi та вибiр її першого елемента. У противному разi вибирається наступний елемент. Якщо всi елементи вичерпано, то функцiя повертає nil. Повернення вилучених елементiв не вiдбувається. Якщо вiдповiдний примiтив виявлено, то функцiя повертає його у формi "точкових пар", близькій до формату функцiї ENTGET.
Приклад: (tblnext "layer" t) повертає перший шар ((0 . "LAYER ") тип символу
(2 . "0") iм'я символу
(70 . 0) прапорці
(62 . 7) номер кольору (якщо вiд'ємний, то шар вимкнено) (6 . "CONTINIOUS") iм'я типу лiнiї)
(tblsearch <iм'я таблицi> <символ>)
Функцiя шукає у таблицi символiв символ, що має задане iм'я. Iмена таблицi та символу перетворюються до верхнього регiстра автоматично. Якщо пошук закiнчується успiшно, то символ видається у такому ж форматi, як у функцiї TBLNEXT. В iншому разi – видається nil. Наприклад: (tblsearch "style" "standart") шукає у таблицi текстових стилiв. Функцiя
TBLSEARCH не впливає на порядок виведення елементiв за допомогою
TBLNEXT.
2.16.6. Доступ до екрана та iнтерактивних пристроїв
Iснують деякi функцiї AutoLISP, що забезпечують прямий доступ до екрана дисплея та пристрою введення даних, що дає можливiсть користувачу спiлкуватися з AutoLISP, використовуючи функції AutoCAD.
(grclear)
Функцiя проводить очищення графiчного екрана AutoCAD. Рядки пiдказки та статусу не змiнюються. Попереднiй стан екрана можна вiдновити за допомогою функцiї REDRAW .
94
(grdraw <з> <в> <колiр> [<яскравість>])
Функцiя креслить вектор, що з'єднує двi точки; “з” та “в” є вiдповiдно початковою та кiнцевою точками цього вектора. Координати точок задають у математичному просторi та вiдсiкають вiдповiдно до загальних правил. Колiр вектора обумовлює третiй аргумент функцiї.
(grtext [<рамка><текст>[<яскравість>]])
Функцiя дозволяє заносити текстову iнформацiю до вiдповiдної позицiї графiчного екрана. Якщо “рамка” має номер вiд нуля до максимального номера елемента меню без одиницi, то текст потрапляє у поле вiдповiдного елемента меню. При цьому вiдбувається усiкання текстового рядка, якщо він занадто довгий та доповнення справа пробiлами, якщо навпаки – занадто короткий.
(grread [<стеження>])
Функція дозволяє напряму опитувати пристрої введення. Якщо необо- в'язковий аргумент “стеження” задано і він не є nil, то вiдбувається автоматичне стеження за пристроєм уведення, наприклад, GRREAD повертає список, першим елементом якого є код типу пристрою. Другий аргумент – це цiле число, або точковий список, залежно вiд типу пристрою введення.
Приклад: (defun c:dellayer( / e L)
(setq L (strcase (getstring "\nLayer to delite?")))
(setq e (entnext )) ; розпочати перегляд з першого примiтиву (while e ;перевiрити шар (групу 8)
(if (=L (cdr (assoc 8(entget e))))
(entdel e) ;якщо потрiбний шар, то вилучити примiтив
)
(setq e (entnext e)) ;Наступний примiтив
) ;цикл по всiх примiтивах
)
У цьому прикладі розглянуто команду, за допомогою якої видаляються усі примітиви з конкретного шару.
Індивідуальні завдання
Рекомендації щодо складання програм
Вiдзначимо, що кожне креслення є унiкальним i програма, яка його створює, може бути орiєнтованою тiльки на цей тип креслення, однак є декiлька корисних прийомiв якi необхiдно враховувати пiд час складання програм, за допомогою яких креслення.
1. Детальний аналiз креслення з метою його спрощення. Тут необхiдно умовно видiлити однотипнi елементи, якi будуються певною кiлькiстю
95
однакових примiтивiв (лiнiй, полiлiнiй, дуг, кiл тощо), дiлянки симетрiї, паралельних переносiв i т. ін.
2.Дослiдження видiленого типового елемента креслення. Потрiбно визначити точки, мiж якими слід провести примiтиви, що їх з’єднують.
3.Визначення тих вибраних точок або розмiрiв, які потрiбно задавати за допомогою команд уведення, або ж тих, як будуть визначатися за вiдомими залежностями у процесi виконання креслення.
Переважно першу точку, яку задають, називають базовою i умовно позначають bp. Визначати її в кресленнi потрiбно таким чином, щоб вiд неї було зручно проводити обчислення для усiєї конструкцiї (наприклад, на перетинi лiнiй симетрiї).
Програму потрібно скласти так, щоб запитань до користувача було якнайменше – це зменшує ймовiрнiсть помилок при введеннi. З цiєю метою слід передбачити запити таких значень на кресленнi, за допомогою яких можна однозначно визначити розмiри всiєї конструкцiї.
4.Визначення однотипних дiлянок креслення (див. п. 1) з однаковим алгоритмом креслення, за винятком, можливо, деяких формальних параметрiв (розмiри, написи, позначення i т.д.). Після цього можна зупинитись на двох шляхах розв’язання завдання:
4.1.Створити функцiю, яка креслить блок iз заданням змiнюваних параметрiв, якi вводять у функцiю як формальнi. При цьому з функцiї вищого рiвня викликають функцiю креслення потрiбну кiлькiсть разiв (наприклад, за допомогою циклу).
4.2.Органiзувати блок, який можна пiдставляти в конструкцiю, вказуючи точку вставлення, масштаби по осях X i Y nf кути повороту блокe.
5.Якщо якась область повинна бути заштрихованою, то її межi зручно креслити однiєю полiлiнiєю, тоді операцiї штрихування достатньо вказати тiльки iм'я примiтивiв i координати однiєї точки цiєї полiлiнiї.
6.Для проставлення декiлькох розмiрiв (горизонтальних або вертикальних) зручно використовувати вiдповiдну функцiю з визначеними формальними параметрами. Вигляд цiєї функцiї може бути таким:
<ф-я для проставлення гор. розмiрiв> <ф-я для проставлення верт. розмiрiв>.
7.Визначення системних змiнних, які повиннi вiдрiзнятись вiд стандартних, i введення їх нових значень у головну функцiю, при цьому використовують оператори GETVAR i SETVAR. Пiсля закiнчення роботи програми слід вiдновити початковi значення системних змiнних.
8. Під час виконання креслення зручно користуватися шарами різного кольору для виконання рiзних операцiй, це спрощує знаходження помилок, полiпшує наочність рисунка. Шари можуть бути такими:
OSN – чорного (бiлого) кольору – для креслення основних лiнiй; OSI – мажентного кольору – для нанесення осьових лiнiй; SHTR – червоного кольору – для штрихування;
RAZ – зеленого кольору – для нанесення розмiрних лiнiй i тексту; Через обмження, накладені на iснуючий нульовий шар, його краще не
використовувати в кресленнях.
Наприклад, розглянемо побудову прямокутника з нанесенням штрихування i розмiрних лiнiй.
Базовою точкою bp вибрано нижнiй лiвий кут прямокутника, а – розмiр по осi Х, b – по осi Y.
У текстi програми використовують координати точок Р1, P2, P3, P4. P1 –лiвий нижнiй кут, P2 – правий нижнiй кут, Р3 – правий верхнiй кут, Р4 – лiвий верхнiй кут.
Звернiть увагу, що точки треба знаходити, визначивши їхні координати за допомогою функцiї LIST (визначається Р2), або використовуючи функцiю POLAR (визначають P3, P4).
Лiстинг програми:
(defun c:prm ( )
; Встановлення системних змiнних для проставлення розмiрiв (setq vt (getvar "DIMTXT")) (setvar "DIMTXT" 5) ; висота тексту (setq st (getvar "DIMASZ")) (setvar "DIMASZ" 5) ; розмiр стрiлки
(setq tad (getvar "DIMTAD")) (setvar "DIMTAD" 1) ; текст над розм.
лiнiєю
(setq tih (getvar "DIMTIH")) (setvar "DIMTIH") 0); неперервність розм.
лiнiї
;створення шару для креслення контурiв (command "layer" "m" "osn" "c" "7" "" "")
;Введення вихiдних даних
(setq bp (getpoint "\n BBECTИ bp : ")) (setq a (getreal "\n BBECTИ a: ")) (setq b (getreal "\n BBECTИ b: "))
;визн. координат точки p2 (setq p2x (+ (car p1) a)) (setq p2y (cadr p1))
(setq p2 (list p2x p2y))
;визн. координат точки p3 (setq p3 (polar p2 (/ pi 2) b))
96 |
97 |
; визн. координат точки p4 (setq p4 (polar p3 pi a))
;Побудова контура прямокутника
(command "pline" p1 p2 p3 p4 "c")
;Визначення именi примітиву e1 для вказання його під час штрихування
(setq e1 (entlast ))
;Визначення точок виносних лiнiй
(setq ga (polar p1 (/ (* pi 3) 2) 10)) (setq gb (polar p1 pi 10))
; штрихування прямокутника
(command "layer" "m" "SHTR" "c" "2" "" "") (command "hatch" "u" "45" "5" "" (list e1 p3) "") ; встановлення розмірiв
(command "layer" "m" "raz" "c" "3" "" "") (command "dim" "horiz" p1 p2 ga "") (command "vertical" p1 p4 gb "") (command "exit")
; Вiдновлення змiнених системних змiнних
(setvar "DIMTXT" vt) (setvar "DIMASZ" st) (setvar "DIMTAD" tad) (setvar "DIMTIH" tih) (princ )
)
Iндивiдуальні завдання вибирають з відповідних рисунків "Завдання №..." згiдно з номером бригади.
Завдання 1. Функція введення і обчислення арифметичних виразів. Побудова елементарних фігур
Мета: навчитись, використовуючи функцiї AutoLISP, вводити в
програму значення змiнних, застосовувати математичнi функцiї i команди AutoCAD.
Порядок виконання:
1.Аналiзуючи iндивiдуальне завдання визначити? базову точку рисунка i змiннi для введення.
2.Увести за допомогою текстового редактора програму виконання рисунка, створивши файл LRn.LSP, де n – номер бригади.
3.Завантажити АutoCAD i командою LIMITS встановити формат А4.
4.Скопiювати в систему файл LRn.LSP за допомогою функцiї LOAD.
5.Виконати програму.
6.Вивести на друк результат.
98
Контрольнi запитання
1.Функцiї введення-виведення, використанi в програмi, їх структура i застосування.
2.Математичнi функцiї, використанi у програмi, їх застосування.
3.Виклик програм iз AutoCAD.
Завдання 2. функції введення-виведення, обчислення арифметичних виразів
Мета: навчитись використовувати функцiї введення-виведення, математичних обчислень у програмi мовою AutoLISP.
Порядок виконання:
1.Аналiзуючи iндивiдуальне завдання, визначити базову точку рисунка i змiннi для введення.
2.Увести за допомогою текстового редактора програму виконання рисунка, створивши файл LRn.LSP, де n – номер бригади.
3.Завантажити АutoCAD i командою LIMITS встановити формат А4.
4.Скопiювати в систему файл LRn.LSP за допомогою функцiї LOAD.
5.Виконати програму.
6.Вивести на друк результат.
Контрольнi запитання
1.Функцiї введення-виведення в програмах, написаних мовою
AutoLISP.
2.Математичнi функцiї.
3.Функцiї для роботи з геометричним описом об'єкта.
Завдання 3. Програми, які передбачають симетричне відображення примітивів і нанесення штрихування
Мета: навчитися, використовуючи можливостi AutoLISP, симетрично вiдображати або переносити дiлянки креслення i наносити штрихування.
Порядок виконання:
1.Аналiзуючи iндивiдуальне завдання, визначити базову точку креслення, осi перенесення зображення i нанесення штрихування.
2.Увести за допомогою текстового редактора програму виконання рисунка, створивши файл LRn.LSP, де n – номер бригади.
3.Завантажити АutoCAD i командою LIMITS встановити формат А4.
4.Скопiювати в систему файл LRn.LSP за допомогою функцiї LOAD.
5.Виконати програму.
6.Вивести на друк результат.
99