3. ОСНОВЫ ГРАФИЧЕСКОГО ЯЗЫКА АВТОЛИСП .Часть 3. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
План.
3.3.8. Функции задания угла и расстояния между точками Функция (ANGLE <точка1> <точка2> возвращает угол в радианах между прямой, определенной заданными точками, и осью Х. Например: (ANGLE '(1.0 1.0) '(1.0 4.0)) ® 1.5708; (ANGLE '(5.0 1.33) '(2.4 1.33) ® 3.14159. Функция (DISTANCE <точка1> <точка2>) возвращает расстояние между точками. Например : (DISTANCE '(10 25 30) '(77 25 30)) ® 67.0; (DISTANCE '(10 20) '(60 20)) ® 50.0. 3.3.9.Функции задания координат точки Для задания значений координат точки используются функции QUOTE, POLAR, INTERS. Функция (QUOTE <выражение>) или (‘<выражение>) возвращает список координат точки. Аргумент <выражение> должен быть списком, состоящим из координат точки. Например: (SETQ PNT (QUOTE (50 50 50))) или (SETQ PNT ‘(50 50 50)) возвращают список (50 50 50), который является координатами точки PNT. Функция (POLAR <точка> <угол> <расстояние>) используется для полярного задания координат точки. POLAR возвращает координаты 3D точки в UCS. Аргумент <точка> содержит координаты точки, относительно которой определяются координаты искомой точки. Аргумент <угол> задается в радианах и отсчитывается в направлении против часовой стрелки от оси X. Хотя аргумент <точка> может быть 3D точкой, угол всегда определяется относительно текущей плоскости построения изображения. Величина вектора задается аргументом <расстояние>. Например: Необходимо определить координаты точки PNT1, которая находится под углом 90° к точке PNT0 на расстоянии 75 единиц. Присвоим точке PNT0 координаты: X=100; Y=50 (SETQ PNT0 ‘(100 50)), тогда имеем (SETQ PNT1 POLAR PNT0 (/ PI 2) 75)) ® (100.0 125.0). Функция (INTERS <PT1 PT2 PT3 PT4> [тип]) находит точку пересечения двух отрезков, заданных точками P1, P2 и P3, P4. Аргументом [тип] может быть любое выражение Автолиспа или любой символ. Если [тип] NIL или является любым символом, кроме символа t и чисел, то определяется точка пересечения, лежащая вне отрезков прямых. Если аргумент [тип] отсутствует, является любым выражением или символом t, то точка пересечения ищется внутри отрезков. При отсутствии точки пересечения функция INTERS возвращает NIL.
3.3.10. Функции обработки списков В Автолиспе имеется возможность компактной записи некоторых действий над списками. Для этого можно использовать функции APPEND, APPLY, ASSOC, REVERSE, SUBST и ряд других. Функция (APPEND <список>...) объединят любое число списков Например : (APPEND '(A B) '(C D)) ® (A B C D); (APPEND '((A)(B)) '((C)(D))) ® ((A)(B)(C)(D)). Функция (APPLY <имя функции> <список>) применяет указанную функцию к списку, возвращает результат выполнения функции. Аргумент <имя функции> заключается в кавычки. Например: (APPLY '+ '(1 2 3)) > 6 (APPLY 'STRCAT '("a" "b" "c")) > "abc"). Функция (ASSOC <элемент> <список>) возвращает найденный ассоциативный список в заданном структурированном списке, элементами которого являются списки, построенные по схеме: (< ключевой элемент > < значение>), если ассоциативный список не найден, функция возвращает NIL. Таким образом, осуществляется поиск данных по ключу в сложной структуре данных. Например : Пусть дано (SETQ detail '((CODE D0123) (Met ST045))), тогда (ASSOC 'MET detail) возвращает (Met ST045), а (ASSOC 'M detail) – NIL. Функции (CAR <список>) и (CDR <список>) возвращают соответственно первый элемент или все последующие элементы списка кроме первого. Если список пуст, функции CAR, CDR возвращают NIL. Если аргумент <список> является точечной парой, тогда функции CAR и CDR соответственно возвращают первый и второй атом точечной пары без помещения их в список. Необходимо иметь в виду, что точечная пара является специфичным типом списка и не принимается в качестве аргумента функций, которые выполняют процедуры с обычными списками. При выводе точечной пары между ее элементами Автолисп помещает точку.
Автолисп поддерживает вложение функций CAR и CDR до четвертого уровня. Ниже перечисленные функции являются синтаксически правильными: CAAADR; CADADR; CDAADR; CDDADR; CAAAR; CADAR; CDAAR; CDDAR; CAADAR; CADDAR; CDADAR; CDDDAR; CAADDR; CADDDR; CDADDR; CDDDDR; CAADR; CADDR; CDADR; CDDDR; CAAR; CADR; CDAR; CDDR. Каждый символ A и D соответствует отдельному вызову функции CAR и CDR. Например: (CAAR X) соответствует (CAR (CAR X)) (CDAR X) соответствует (CDR (CAR X)) (CADAR X) соответствует (CAR (CDR (CAR X))) (CADR X) соответствует (CAR (CDR X)) (CDDR X) соответствует (CDR (CDR X)). Функция CADR используется часто для выделения координаты Y в качестве второго элемента списка, состоящего из двух или трех элементов, а функция CADDR может быть использована для получения координаты Z трехмерной точки.
Функция (CONS <атом¦список> <список>) добавляет аргумент <атом¦список> к заданному списку в качестве первого элемента. Например : (CONS 'A '(B C D)) ® (A B C D); (CONS '(A) '(B C D)) ® ((A) B C D). Если на месте аргумента <список> указан атом, тогда функция CONS образует точечную пару. Например : (CONS 'A 2) ® (A . 2); (CAR (CONS 'A 2)) ® A. Функция (LIST <выражение> ...) объединяет любое число выражений в один список. Например : (LIST 'A 'B 'C) > (A B C) Вместо функции LIST можно использовать функцию QUOTE, если в списке отсутствуют переменные или неопределенные элементы. Выражения (‘(40 60)) или (QUOTE(40 60)) равноценны (LIST 40 60), так как возвращают один и тот же список (40 60). Функция LIST используется для задания координат точки совместно с функциями CAR , CADR и CADDR . Функция (FOREACH <имя> <список><выражение>...) вычисляет или выполняет процедуру согласно <выражения> для всех членов списка. Возвращается результат выполненного действия над последним членом списка. Например: (FOREACH N '(2 3 5) (* N 10)) равноценно (*2 10), (*3 10), (*5 10) и возвращается 50. Функция (LAST <список>) возвращает последний элемент списка. Например : (LAST '(A B C D )) ® D; (LAST '(A B (C D))) ® (C D). Как видно из примеров, последним элементом может быть либо атом, либо список. LAST можно использовать для получения координат Y и Z, однако, необходимо иметь в виду, что 2D точка имеет список координат из двух атомов, а 3D точка из трех атомов. Функция (LENGTH <список>) возвращает целое число, равное количеству элементов списка. Например : (LENGTH '(A B C D)) ® 4; (LENGTH '(A B (C D))) ® 3; (LENGTH '()) ® 0. Функция (MAPCAR <функция> <список_1> …<список_n>) возвращает список результатов выполнения функции с аргументами, указанными в одном или нескольких списках. Число списков должно соответствовать числу аргументов <функции>. Например: (MAPCAR '1+ (LIST 5 10 15)) ® (6 11 16); (MAPCAR '* (LIST 5 10 15)(LIST 2 3 4)) ® (10 30 60). Функция (MEMBER <выражение> <список>) находит в списке заданное выражение и возвращает остаток списка, начиная с первого найденного выражения. Если выражение не найдено, возвращается NIL. Например: (MEMBER 'C '(A B C D E)) ® (C D E); (MEMBER 'F '(A B C D E)) ® NIL. Функция (NTH <целое число> <список>) возвращает элемент списка, номер которого соответствует аргументу <целое число>. Нуль соответствует первому элементу списка, если заданный номер превышает число элементов списка, возвращается NIL. Например : (NTH 2 '(A B C D )) ® C; (NTH 0 '(A B C D )) ® A; (NTH 4 '(A B C D )) ® NIL. Функция (REVERSE <список>) возвращает список с элементами в обратном порядке. Например : (REVERSE '(A B C)) ® (C B A). Функция (SUBST <элемент 1> < элемент 2> <список>) возвращает список, в котором <элемент 2> заменен на <элемент 1>. Если в списке не найдено ни одного <элемента 2>, тогда возвращается первоначальный список без изменения. Например : (SUBST 'FF 'B '(A B (C D) B)) ® (A FF (C D) FF); (SUBST 'FF 'Z '(A B (C D) B)) ® (A B (C D) B). 3.3.11. Функции обработки примитивов Графическим примитивом (entity) в Автокаде является элемент изображения, полученный с помощью отдельной команды. Примитивы в Автокаде могут быть простыми (точка, линия, окружность и др.) и составными (полилиния, блоки). Составные примитивы разделяются на субпримитивы. Функции, приведенные в данном разделе, выполняют различные процедуры над примитивами и субпримитивами. Функция (ENTNEXT [<примитив>]) возвращает программное имя примитива или субпримитива. Если аргумент <примитив> не указан, тогда возвращается первый из примитивов чертежа. Если аргумент является простым примитивом, ENTNEXT возвращает следующий примитив после заданного. При указании составного примитива в качестве аргумента функция возвращает первый субпримитив составного примитива, а если указан субпримитив, то ENTNEXT возвращает субпримитив, принадлежащий указанному примитиву, и следующий за ним. Если запрашиваемый графический объект отсутствует, ENTNEXT возвращает NIL. Функция (ENTLAST) возвращает программное имя последнего не удаленного примитива графического объекта. Субпримитивы с помощью ENLAST не выделяются. Функция (ENTDEL <примитив>) удаляет заданный аргументом примитив из чертежа. Субпримитивы таким способом удалить нельзя. Удаленный примитив может быть восстановлен повторным вызовом функции ENTDEL до конца сеанса работы с изображением. Функция (ENTSEL [<подсказка>]) ожидает выбора одного графического объекта посредством его указания. Функция возвращает список, первым элементом которого является имя примитива выбранного объекта, второй элемент списка – координаты точки выбора объекта. По умолчанию подсказка выдается в виде фразы Select object. Возвращаемый список координат соответствует положению перекрестия в момент выбора. Функция (HANDENT <строка>) возвращает имя объекта (примитива), метка которого соответствует аргументу <строка>, иначе возвращается NIL. Метка примитива находится в его описании под кодом 5. Например: (HANDENT "5A2") может вернуть <Entity name: 60004722>. Функция (REDRAW <примитив > <режим>) восстанавливает изображение примитива после очистки экрана функцией GRCLEAR. Действие REDRAW зависит от значения аргумента < режим >: 1 - примитив перерисовывается; 2 - примитив стирается; 3 - примитив подсвечивается; 4 - подсветка примитива отменяется. Функция (ENTGET <примитив>) возвращает список, содержащий данные о примитиве. Аргумент <примитив> - это программное имя примитива. Например: Допустим, что последним созданным объектом чертежа является окружность с центром в точке с координатами (50,50) и радиусом 25 единиц. С помощью функции ENTLAST можно получить программное имя примитива и передать его функции ENTGET в качестве аргумента, которая вернет список данных примитива. Выражение (ENTGET (ENTLAST)) возвращает : ((-1 . <Entity name: 26a0500>) (0 . "CIRCLE") (5 . "20") (100 . "AcDbEntity") (67.0) (8."0") (100. "AcDbCircle") (10 50.0 50.0 0.0) (40. 25.0) (210 0.0 0.0 1.0)). Функция (ENTMAKE [список примитива]) создает новый графический примитив на экране. Аргумент [список примитива] должен быть списком описательных данных, подобным списку, возвращаемому функцией ENTGET Создадим с помощью функции ENTMAKE окружность желтого цвета с центром в точке 100, 100 и радиусом 50. Данные слоя и типа линии не указаны, поэтому они принимают значения по умолчанию. ENTMAKE '((0 . "CIRCLE")(62 . 2)(10 100.0 100.0 0.0)(40 . 50.0))). Изменим цвет линии и координаты центра окружности: X,Y=150,150, тогда вызов функции примет следующий вид: (ENTMAKE '((0 . "CIRCLE")(62 . 1)(10 150.0 150.0 0.0)(40 . 50.0))). Функция (ENTMOD <список данных примитива>) преобразует список данных примитива (объекта) в формат функции ENTGET. На применение ENTMODE накладываются следующие ограничения: нельзя изменить тип примитива; атрибуты списка примитива (гарнитура шрифта, тип линии, имена форм и блоков) могут принимать только те значения, которые определены до вызова функции в текущем сеансе работы графического редактора ACAD; исключением является имя слоя. Функция (ENTUPD <имя примитива>) обновляет экранное изображение объекта (примитива) после изменения его описательных данных. Например, вычертим окружность диаметром 50 и координатами центра X, Y 100, 100, тогда: ; Присвоим переменной ENT0 имя первого примитива чертежа. (SETQ ENT0 (ENTNEXT)); возвращает c я <Entity name: 26a0508>. ; Присвоим переменной ENTD данные примитива ENT0. (SETQ ENTD (ENTGET ENT0)) ; Возвращается список данных примитива: ((-1 . <Entity name: 26a0508>) (0 . "CIRCLE") (5 . "21") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbCircle") (10 100.0 100.0 0.0) (40 . 25.0) (210 0.0 0.0 1.0)) ; Изменим диаметр окружности . (SETQ ENTD (SUBST(CONS 40 50) (ASSOC 40 ENTD)ENTD)) (ENTMOD ENTD) ;Тогда функция возвращает список измененных данных примитива. ((-1 . <Entity name: 26a0508>) (0 . "CIRCLE") (5 . "21") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbCircle") (10 100.0 100.0 0.0) (40 . 50) (210 0.0 0.0 1.0)) ; Обновим экранное изображение. (ENTUPD ENT0) 3.6.12. Функция объектной привязки Функция (OSNAP <точка> <режим>) возвращает список координат 3D точки как результат применения режима объектной привязки к заданной точке. Аргумент <режим> является строкой символов одного или нескольких, разделенных запятой, идентификаторов объектной привязки MID, CEN, END, INT, INS и др. Точка, возвращаемая функцией OSNAP, зависит от текущего 3D вида и значения системной переменной APERTURE. Например: Если координаты центра окружности равны (100 100), а радиус – 50, и величина системной переменной APERTURE равна 9, тогда для точки pt1 c координатами (100 60) имеем (SETQ PT1 (GETPOINT)) 100,60 (SETQ PT2 (OSNAP PT1 "CEN")) ® NIL, а для точки с координатами (100 55) (SETQ PT1 (GETPOINT)) 100,55 (SETQ PT2 (OSNAP PT1 "CEN")) ® (100.0 100.0 0.0), т. е. найден центр окружности. 3.3.13. Функции управления дисплеем и вывода данных Функция (GRAPHSCR) включает графический режим дисплея. Возвращает всегда NIL. Функция (TEXTSCR) включает текстовый режим дисплея. Возвращает всегда NIL. Аналогичной функцией является (TEXTPAGE). Функция (MENUCMD <строка>) выводит на экран указанные разделы меню Автокада и тем самым упрощает диалог при комбинированной работе с программой и графическим редактором. Аргумент <строка> имеет следующий формат "тип меню=раздел меню". В табл. 8 приведены типы меню аргумента функции MENUCMD и их разделы. Таблица 8 Значения аргумента функции MENUCMD
Например: (MENUCMD "POP1=FORMAT") ; Присваивает POP1 разделы меню Format (MENUCMD "POP1=*") ; Выводит на экран разделы меню Format (MENUCMD "M=$(EDTIME,$(GETVAR,DATE),DDDD\",\" D MONTH YYYY)") возвращает текущую дату в виде “ День недели, Число Месяц ГГГГ”: "Monday, 25 February 2002". Функция (MENUGROUP <имя группового меню>) проверяет, загружено ли групповое меню. Если аргумент функции соответствует загруженному групповому меню, возвращается его имя, иначе возвращается NIL. Функция (GRDRAW <от> <до> <цвет> [подсветка]) вычерчивает вектор между двумя точками в текущем кадре. Аргументы <от> <до> являются координатами 2D или 3D точек, аргумент <цвет> задается целым числом, кодирующим цвет. Если аргумент [подсветка] отсутствует или равен нулю, GRDRAW использует нормальный режим дисплея, иначе применяется режим подсветки, установленный по умолчанию. Например: (GRDRAW '(100.0 100.0 0.0)'(200.0 200.0 0.0) 3 1) изображает на экране дисплея отрезок зеленого цвета с подсветкой. Функция (GRVECS <вектор-список> [матрица преобразования]) вычерчивает множественные вектора, параметры которых заданы аргументом <вектор-список>. Аргумент <вектор-список> содержит списки, элементами которых являются код цвета и координаты двух точек. Аргумент [матрица преобразования] изменяет положение или пропорции, определенные аргументом <вектор-список>. Формат аргумента <вектор-список> следующий: ([цвет1] <от> <до> [цвет2] <от> <до> ...). Например: (GRVECS '(1 (50 50)(50 150) 2 (55 50)(55 150) 3 (60 50)(60 150) 4 (65 50)(65 150) 5 (70 50)(70 150) 6 (75 50)(75 150))) Приведенная выше функция вычерчивает пять вертикальных линий различного цвета. Функция (GRTEXT [<рамка> <текст> [подсветка]]) выводит текст в строке статуса или области экранного меню. Аргумент <рамка> - целое число, которое определяет положение текста. Аргумент <текст> - это строковая переменная. Аргумент <подсветка> является целым числом, которое управляет режимом подсветки текста. Функция GRTEXT без аргументов восстанавливает стандартные значения всех текстовых участков. Например: (GRTEXT -1 "КООРДИНАТЫ") выводит слово КООРДИНАТЫ в строку координат. Функция (PRIN1 [выражение [дескриптор файла]]) выводит выражение в командную строку или записывает в открытый файл. Аргумент <выражение> необязательно должен быть строковой переменной. Например: (PRIN1 "AutoCAD") > "AutoCAD""AutoCAD" - выводит выражение и его возвращает. Функция (PRINC [выражение [дескриптор файла]]) выводит и возвращает выражение в командную строку или в открытый файл. Текст печатается без кавычек. Например: (PRINC "AutoCAD") > AutoCAD"AutoCAD" - выводит выражение и его возвращает. Функция (PRINT [выражение [дескриптор файла]]) выводит и возвращает выражение в командную строку или в открытый файл. Текст печатается в кавычках, с новой строки и последующим пробелом. Например: (PRINT "AutoCAD") > "AutoCAD" "AutoCAD" - выводит выражение и его возвращает. Функция (PROMPT <текст>) выводит текст (подсказку) и возвращает NIL. Аргумент <текст> является строковой переменной. Например: (PROMPT "Input X") > Input X NIL - выводит подсказку и возвращает NIL. Функция (TERPRI) выполняет перевод на новую строку в командной строке, возвращает NIL. 3.3.14. Функции формирования и анализа наборов примитивов К графическим объектам Автокада относятся примитивы и их совокупности, называемые в Автолиспе наборами. Графические объекты могут быть "введены в программу" путем именования этих объектов с помощью имен переменных так же, как именование чисел, строк текстов, точек. После этого можно оперировать с этими объектами, обращаясь к ним по именам, анализировать и изменять характеристики этих объектов и таким образом изменять изображение на экране дисплея. Основным средством определения наборов примитивов является функция SSGET. Функция (SSGET [режим] [точка1 [точка2]] [список точек] [фильтр]) возвращает системное имя выбранного примитива или набора примитивов. Имя выбранного примитива можно присвоить переменной с помощью функции SETQ. Аргумент [режим] является строковой переменной. Используются следующие обозначения режимов "W", "WP", "C", "CP", "L", "P", "I" и "F" и “X”, которые соответствуют режимам выбора Window, WPolygon, Crossing, CPolygon, Last, Previous, Implied и Fence, если указан режим "X", тогда выбирается вся графическая база данных примитивов. Аргументы [точка1 [точка2] и [список точек] определяют точки выбора примитивов. Если указана одна точка без аргумента [режим], то применяется выбор примитива прицелом. Аргумент [фильтр] – это список свойств объекта, по которым они добавляются в набор выбора примитивов. Если аргументы отсутствует, то создается набор, выбранный средствами графического редактора. Например, изображение состоит из квадрата и вписанной в него окружности, которая является последним примитивом. Для удаления окружности выполняем последовательно следующие функции:
Функция (SSADD [примитив [набор]]) добавляет объект (примитив) в набор или создает новый набор. Если функция SSADD вызывается без аргументов, то создается новый пустой набор. Вызов функции с одним аргументом [примитив] создает новый набор, содержащий этот примитив. Функция SSADD возвращает новый или измененный набор. Например:
Функция (SSDEL <примитив> <набор>) удаляет объект (примитив) из набора, возвращает имя набора объектов, если примитив не находится в наборе, возвращается NIL. Функция (SSLENGTH <набор>) возвращает целое число, соответствующее количеству объектов (примитивов) в наборе. Например:
Функция (SSMEMB <имя примитива> <набор>) проверяет наличие примитива в составе указанного набора. Если указанный примитив есть в наборе, возвращает его имя, иначе - NIL. Функция (SSNAME <набор> <номер примитива>) возвращает системное имя объекта (примитива) из набора по его номеру. Первый по порядку примитив имеет номер 0. Если аргумент <номер примитива> выходит за границы набора, возвращается NIL. Например: Запись вида (SETQ ENT1 (SSNAME SSET 0)) присваивает переменной ENT1 имя первого примитива набора SSET. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||