Что возвращает функция chr() в таком примере (chr (- 65 1))? |
AutoLISP в среде Visual LISP
Функции, работающие с наборами выбора
Набор - это временное множество, в которое входят имена основных примитивов рисунка (как правило, они собираются по какому-то признаку-фильтру). Неосновные примитивы (составные части блока или вершины полилинии) не могут входить в набор. Имя набора обычно сохраняется в какой-нибудь переменной AutoLISP, чтобы затем можно было извлекать из набора нужные примитивы.
При необходимости сохранять наборы примитивов в рисунке следует оформлять их в виде групп с помощью команды GROUP. Группы относятся к неграфическим объектам, существующим внутри рисунка.
Функция ssget формирует набор по запросу или признаку:
(ssget [<метод>] [<точка1> [<точка2>]] [<список>] [<фильтр>])
Аргумент <метод> - это текстовая строка, принимающая одно из следующих значений (в локализованной версии системы AutoCAD все перечисляемые строки должны спереди дополняться символом "_"), характеризующих метод выбора примитивов:
- "С" - выбор секущей рамкой;
- "СР" - выбор секущим многоугольником;
- "F" - выбор секущей линией;
- "I" - текущий выбор с помощью ручек;
- "L" - выбор последнего видимого примитива;
- "Р" - последний сформированный ранее набор;
- "W" - выбор рамкой;
- "WP" - выбор многоугольником;
- "X" - вся база примитивов рисунка, включая объекты на замороженных слоях и вне видимой части экрана, с учетом аргумента <фильтр> (в этом случае аргумент <фильтр> не должен быть опущен);
- "А" - вся база примитивов рисунка, включая объекты на замороженных слоях и вне видимой части экрана;
- ":Е" - все примитивы, попадающие в прицел устройства указания;
- ":N" - выбор основных примитивов с помощью подпримитивов (вершин полилинии или сети, компонент блока). Параматр используется только при графическом варианте выбора и только для указания рамкой, секущей рамкой и точкой. Он может привести к повторяемости примитивов в наборе, поскольку, например, можно отметить одну и ту же полилинию с помощью любой из ее вершин (см. также функцию ssnamex);
- ":S" - допускает выбор только одного объекта.
Аргумент <точка1> при отсутствии аргумента <точка2> определяет дополнительное условие для включения в набор: включаемый примитив должен проходить через точку, заданную аргументом <точка1>. Если заданы оба аргумента <точка1> и <точка2>, то заданные ими точки являются углами простой или секущей рамки (когда в качестве метода выбора применяются рамки, т. е. "W" или "С").
Аргумент <список> представляет собой список, элементами которого являются точки, используемые в методах "F", "WP", "СР".
Аргумент <фильтр> - это список со структурой, аналогичной структуре списка, возвращаемого функцией entget, что позволяет оставить только те примитивы, которые удовлетворяют дополнительным признакам (например, определенному цвету, слою, весу и т. д.).
Возвращаемое значение функции ssget - имя созданного набора (или nil, если создать набор невозможно).
Примеры:
- (ssget) - выдает стандартный запрос:
- (Select objects:) и далее создает набор в соответствии с дальнейшими указаниями пользователя;
- (ssget '(15.78 320.1)) - создает набор из примитивов, проходящих через точку (15.78 320.1);
- (ssget "_с" '(1.57 -40.4) '(15.78 320.1)) - создает набор из примитивов, выбираемых секущей рамкой с углами в точках (1.57 -40.4) и (15.78 320.1);
- (ssget "_x" '((0 . "POLYLINE") (8 . "WALLS"))) - создает набор из всех примитивов рисунка, являющихся полилиниями типа POLYLINE и лежащими на слое WALLS;
- (ssget " А") - создает набор из всех примитивов рисунка, аналогично методу "_Х" с пустым фильтром, т. е. (ssget "_Х" '()) или (ssget "_X" nil) .
В рисунке одновременно может быть открыто не более 128 наборов выбора. При достижении такого предела функция ssget отказывается создавать следующие наборы и возвращает nil. Чтобы удалить ненужные наборы, следует присвоить значение nil переменным, хранящим имена этих наборов.
Для манипуляций с наборами в языке AutoLISP предусмотрены следующие функции:
- (ssadd [<примитив> [<набор>] ]) - добавление примитива в набор; если аргумент <набор> опущен, а аргумент <примитив> задан, то создается новый набор из одного примитива; если оба аргумента опущены, то создается новый пустой набор (но его значение не равно nil); возвращается имя набора;
- (ssdei <примитив> <набор>) - удаление примитива из набора, заданных соответствующими аргументами <примитив> и <набор>; возвращается имя набора, если операция удаления выполнена, или nil, если примитив не содержится в наборе и удалить его нельзя;
- (sslength <набор>) - возвращает количество примитивов в наборе, заданном аргументом <набор>;
- (ssmemb <примитив> <набор>) - проверка вхождения примитива в набор, заданных соответствующими аргументами <примитив> и <набор>; возвращается имя примитива (т. е. значение аргумента <примитив>), если он входит в рассматриваемый набор, или nil - если не входит;
- (ssname <набор> <номер>) - извлечение примитива из набора по порядковому номеру, заданных соответствующими аргументами <набор> и <номер>; аргумент <номер> должен быть либо целым числом от 0 до 32 767, либо целым числом в вещественной форме больше 32767.0; нумерация примитивов в наборе начинается с нуля; возвращается имя примитива или nil;
- (ssnamex <набор> [<номер>]) - извлечение примитива из набора по порядковому номеру (заданных соответствующими аргументами <набор> и <номер>), но при этом выдается дополнительная информация о методах формирования набора (см. ниже); если аргумент <номер> опущен, то выводится информация обо всех примитивах набора;
- (sssetfirst <набор1> [<набор2>]) - включает ручки у примитивов, входящих в наборы, заданные аргументами <набор1> и <набор2>, но еще и подсвечивает пунктиром примитивы из набора2 (что означает выбор их для следующей операции редактирования);
- (ssgetfirst) - возвращает список с именами двух наборов, аналогичных по назначению аргументам <набор1> и <набор2> функции sssetfirst (у примитивов набора включены только ручки, у примитивов набора2 включены ручки и подсвечивание).
Функция ssnamex возвращает список, в котором элементами являются описания способа выбора примитивов, попавших в набор. Если аргумент <номер> не задан, то длина возвращаемого списка равна количеству элементов, определяемых аргументом <набор>. Если аргумент <номер> задан и задан корректно, то возвращаемым значением будет список из одного элемента - описания способа выбора примитива с порядковым номером, равным значению аргумента <номер>. Если же аргумент <номер> задан неправильно, то функция ssnamex вернет nil.
Описание способа выбора примитива - это список из трех элементов: (<метод> <примитив> <данные>). Параметр <метод> - целое число, которое соответствует методу выбора функции ssget и может принимать такие значения:
0 - неинтерактивный выбор ("L", "А", "X" и т. п.);
1 - выбор указанием точки;
2 - "W" или "WP";
3 - "С" или "СР";
4 - "F".
Если на месте параметра <метод> стоит отрицательное число, то оно определяет многоугольник выбора (см. описание многоугольника ниже).
Параметр <примитив> описания способа выбора примитива является его именем в том виде, в котором оно выводится функцией entlast. Параметр <данные> может быть либо только числом 0, либо числом 0 и списком, уточняющим выбор, либо числом 0 и номером многоугольника. В уточняющем списке может быть точка, с помощью которой выбран объект. Если использован номер многоугольника (а он должен быть отрицательным: -1 , -2 и т. п.), то далее будет следовать описание многоугольника с соответствующим номером.
Описание многоугольника - это список такого вида: (<номер_многоугольника> <точка1> ... <точкаN>) . Нумерация многоугольников начинается с -1 и наращивается путем добавления -1 к очередному номеру.
Описание точки (<точка1> и т. п.) - это список из трех (или двух) элементов: (<код> <база> [<вектор>] ) . Описание точки зависит от вида, на котором она выбиралась, и фактически представляет собой описание прямой, луча или отрезка. Параметр <код> является кодом описания точки (0 - прямая, 1 - луч, 2 - отрезок), параметр <база> представляет собой начальную точку описания, а необязательный параметр <вектор> - это либо направление, в котором продолжается бесконечная линия (прямая или луч), либо смещение в сторону, характерное для отрезка.
Пример:
Если в набор nab5 включен один объект, который был указан точкой (7.51 16.02) на обычном виде сверху в МСК, то выражение (ssnamex nab5 0) возвращает примерно следующее: ((1 <имя объекта: 14аа560> 0 (0 (7.51 16.02 0.0)))) .
В этом примере возвращенный функцией ssnamex список состоит из одного элемента (списка), в котором присутствуют следующие составные части:
- <метод> - равен 1 (соответствует выбору указанием точки);
- <примитив> - <Имя объекта: 14аа560>;
- <данные> - 0 (0 (7.51 16.02 0.0)), что соответствует точке (7.51 16.02 0.0), примененной для выбора примитива.
Другие примеры значений, возвращаемых функцией ssnamex:
- ((0 <Имя объекта: 14ае578> 0)) - один примитив, выбранный неинтерактивным методом (например, "L");
- ((3 <Имя объекта: 14ае568> О -1) (3 <Имя объекта: 14ае578> 0 -1) (-1 (0 (-147.787 129.133 0.0)) (0 (-64.2728 129.133 0.0)) (0 (- 64.2728 22.3376 0.0)) (0 (-147.787 22.3376 0.0)))) - два примитива, выбранных секущим прямоугольником с номером -1 (для прямоугольника заданы четыре точки);
- ((1 <Имя объекта: 14ае560> 0 (0 (74.2672 64.8218 0.0))) (2 <Имя объекта: 14ае570> 0 -1) (2 <Имя объекта: 14ае568> 0 -1) (-1 (0 (-177.446 158.755 0.0)) (0 (40.3151 158.755 0.0)) (0 (40.3151 83.1407 0.0)) (0 (-177.446 83.1407 0.0)))) - три примитива, первый из которых выбран указанием с помощью точки (74.2672 64.8218 0.0), а второй и третий выбраны рамкой, которая фигурирует как многоугольник с номером -1.
В этих примерах параметр <вектор> описания точек нигде не использован, т. е. объекты выбирались на виде сверху в МСК.
Наборы - удобный инструмент для выбора нужных примитивов рисунка с заданными свойствами. После формирования набора затем из него с помощью функции ssname (или ssnamex) извлекаются нужные объекты, с которыми далее выполняются необходимые операции (например: удаление, модификация и т. д.).
Функции доступа к табличным данным и неграфическим объектам
Помимо примитивов в рисунке всегда присутствует определенный объем неграфической информации: описания блоков, таблицы слоев, таблицы видовых экранов, таблицы типов линий, размерные стили и т. п. Все они хранятся в базе рисунка примерно в том же виде, что и примитивы.
Для доступа к табличным объектам в языке AutoLISP имеются такие функции:
- (tbinext <таблица> [<признак>]) - чтение характеристик очередного объекта из таблицы. Допустимые значения параметра <таблица> приведены ниже. Если параметр <признак> задан и отличен от nil, то возвращаются данные первого элемента таблицы. Иначе возвращаются данные объекта, следующего за тем, который был прочитан в предыдущем обращении к функции tbinext с той же таблицей. Если требуемого объекта нет или таблица пуста, то возвращается nil;
- (tbiobjname <таблица> <заголовок>) - определение объекта таблицы по его заголовку (имени блока, слоя и т. п.). Возвращается имя объекта (аналогично имени примитива) в базе рисунка. Если объект не найден, то возвращается nil.
- (tbisearch <таблица> <заголовок> [<следующий>]) - получение списка с характеристиками объекта таблицы по его заголовку. Возвращается список, соответствующий найденному объекту (или nil, если объект не обнаружен). Если параметр <следующий> задан и не равен nil, то указатель функции tbinext устанавливается на имя элемента <заголовок>. Следующее обращение к функции tbinext вернет данные об объекте, расположенном в таблице после объекта, использованного в качестве аргумента в функции tbisearch.
В качестве допустимых значений параметра <таблица> во всех трех функциях могут фигурировать только следующие текстовые строки:
- "BLOCK" - таблица описаний блоков;
- "LAYER" - таблица слоев;
- "LTYPE" - таблица типов линий;
- "STYLE" - таблица текстовых стилей;
- "DIMSTYLE" - таблица размерных стилей;
- "UCS" - таблица именованных систем координат;
- "VIEW" - таблица именованных видов;
- "VPORT" - таблица конфигураций видовых экранов;
- "APPID" - таблица имен приложений.
Схема использования рассмотренных функций будет ясна из примеров:
(5etq lay1 (tbinext "LAYER" T)) - возвращает список с данными первого слоя рисунка (первым слоем должен быть слой с именем "0"), например: ((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "Continuous")). В этом списке в точечной паре с DXF-кодамиотражаются следующие свойства:
0 - находится имя таблицы, в которой ищется неграфический объект,
2 - имя слоя,
6 - тип линий примитивов слоя по умолчанию (т. е. каким типом отображать объекты с типом линии BYLAYER),
62 - цвет слоя по умолчанию,
70 - состояние слоя по отношению к операциям блокирования, замораживания; нетрудно заметить, что аналогичные DXF-коды используются в списке, возвращаемом функцией entget для примитивов.
(setq lay2 (tbinext "LAYER")) - возвращает список с данными второго слоя рисунка, например: ((0 . "LAYER") (2 . "стена1") (70 . 4) (62 . 40) (6 . "ограждение1"));
(setq lay2name (tbiobjname "LAYER" "Стена1")) - возвращает <Имя объекта: 14аа570>; теперь с помощью функции entget можно получить тот же список, что и lay2 в предыдущем примере.
С помощью этих трех функций можно проанализировать наличие в рисунке таких элементов, как описания блоков, пользовательские системы координат или текстовые стили с определенными именами и выбрать соответствующий вариант работы программы.
Свойствами, аналогичными таблицам, обладают в рисунке словари (dictionaries). К ним относятся, например, словари стилей мультилиний, групп, растровых изображений, листов чертежа. Пользовательские приложения могут создавать свои словари. Следующие функции выполняют операции над словарями и их элементами:
- (dictadd <словарь> <символ> <новый>) - добавление нового объекта к словарю;
- (dictnext <словарь> [<признак>]) - чтение очередного символа из словаря (аналогична функции tbinext, но работает со словарями);
- (dictremove <словарь> <символ>) - удаление символа словаря;
- (dictrename <словарь> <старое> <новое>) - переименование символа словаря;
- (dictsearch <словарь> <символ> [<следующий>]) - поиск символа в словаре (аналогично функции tbisearch);
- (layoutlist) - получение списка имен листов текущего рисунка;
- (namedobjdict) - получение имени корневого словаря неграфических объектов рисунка;
- (setview <вид> [<в экран>]) - установка вида в видовом экране;
- (snvalid <имя>) - проверка имени таблицы символов на недопустимые знаки.