Опубликован: 21.02.2012 | Уровень: специалист | Доступ: платный
Лекция 3:

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 <имя>) - проверка имени таблицы символов на недопустимые знаки.
Алексей Тимонин
Алексей Тимонин
Алексей Потапкин
Алексей Потапкин

Здравствуйте.

Подскажите, пожалуйста, каким образом можно передать параметры в макрос написанный в Autocad на VBA? Например, есть процедура, которая отрисовывает заштрихованный прямоугольник (см. ниже). Как её изменить, чтобы на входе от пользователя требовалось ввести также в качестве параметров координаты углов прямоугольника?

Public Sub DrawHatchedBox()

...

End Sub

Сергей Ивков
Сергей Ивков
Россия, Геленджик
Юлия Мягчилова
Юлия Мягчилова
Россия