Фильтры со сложными условиями



Для формирования сложных условий в фильтрах выбора применяются точечные пары со служебным DXF-кодом -4. В них используются следующие аналоги логических операторов: AND, OR, XOR, NOT. Каждый из этих операторов имеет два вида: открывающей скобки и закрывающей скобки, например, “<AND” и “AND>”. Между такими скобками размещаются проверяемые значения (AND и OR являются многоместными операторами, XOR ‒ двухместным, NOT ‒ одноместным). [5]

Функция ( SSGET “_ X ” ‘((-4 . “< OR ”) (8. “0”) (0. “ LINE ”) (-4. “ OR >”))) создает набор из тех примитивов, которые или расположены на слое 0, или являются отрезками (примитивами LINE ). [5]

Функция ( SSGET “_ X ” ‘((-4 . “< OR ”) (-4. “< AND ”) (8. “0”) (0. “ CIRCLE ”) (-4. “ AND >”) (0. “ LINE ”) (-4. “ “ OR >”))) создает набор из тех примитивов, которые или являются окружностями и расположены на слое 0, или являются отрезками. [5]

Функция ( SSGET “_ X ” ( LIST ( CONS 0 “ LINE ”) ( CONS -4 “< NOT ” ‘(8 . “0”) ( CONS -4. “ NOT >”))) создает набор из тех примитивов, которые являются отрезками, но не расположены на слое 0. [5]

В точечных парах с числовыми значениями можно использовать следующие логические операторы: * (любое ‒ не проверять); = (равно); /=, !=, <> (не равно); < (меньше); <= (меньше или равно); > (больше); >= (больше или равно); & (побитовое И для целых); &= (побитовое И с равенством для целых). [5]

Операторы & и &= работают только с целыми числами. Оператор & возвращает истинное значение, если хотя бы один из битов, установленных в маске, установлен и в проверяемом числе. Оператор &= возвращает истинное значение только тогда, когда все биты, установленные в маске, установлены и в проверяемом числе. Все остальные логические операторы, используемые в сложных фильтрах, применимы как к целым, так и к вещественным значениям. [5]

Примеры:

v (SSGET “_X” (LIST (CONS 0 “CIRCLE”) ‘(-4. “>=”) ‘(370 . 100))) создает набор из окружностей, которые имеют значение веса, большее или равное 1,00 мм (в DXF-коде 370 веса хранятся числами в 100 раз больше, т.е. 100 соответствует 1,00 мм). [5]

v ( SSGET “_ X ” ‘((0.  “ CIRCLE ”) (-4. “>=”) (370 . 100) (-4. “<”) (40. 225.0))) создает набор из окружностей, которые имеют значение веса, большее или равное 1,00 мм, и радиус меньше 225 мм. [5]

v ( SSGET “_ X ” ‘((0.  “ LWPOLYLINE ”) (-4. “&”) (70 . 1))) создает набор из замкнутых компактных полилиний (проверяется флаг на установку бита замкнутости). [5]

v ( SSGET “_ X ” ‘((0.  “ POLYLINE ”) (-4. “&”) (70 . 6))) создает набор из примитивов POLYLINE , сглаженных любой из двух опций команды PEDIT (ПОЛРЕД): Fit (СГладить) и Spline (СПлайн). [5]

v ( SSGET “_ X ” ‘((0. “ POLYLINE ”) (-4. “&=”) (70 . 6))) возвращает NIL, т.к. полилиния не может быть одновременно сглажена и вариантом Fit (СГладить), и вариантом Spline (Сплайн).[5]

v ( SSGET “_ X ” ‘((0. “ CIRCLE ”) (-4. “>,>,*”) (10 100.0 230.0 99.0))) создает набор из окружностей, точки центров которых удовлетворяют таким условиям: X>100, Y>230, Z любые (обратим внимание на комбинацию логических операторов “>,>,*” для сложного фильтра, используемую для трехкоординатного DXF-кода). [5]

При проверке значения DXF-кода 210 (вектор нормали) применимы только логические операторы *, =, /=, !=, <>. [5]

1.9. Основы работы с примитивами AutoCAD в LISP-программе

При создании прикладного программного обеспечения часто приходится работать с примитивами рисунка, из которых нужно извлекать данные, изменять их и передавать для дальнейшего использования. Самая распространенная схема получения доступа к графическим объектам такова. [5]

В качестве средств интерактивного выбора примитивов используются функции SSGET или ENTSEL. При необходимости сканирования рисунка для поиска в нем по определенному свойству (имени слоя, цвету и т.п.) выбор примитивов осуществляется с помощью функции SSGET. Функция ENTSEL возвращает список, первым элементом которого является указанный пользователем примитив. Этот примитив может быть извлечен из списка с помощью функций CAR или NTH. [5]

Функция SSGET возвращает имя набора, состоящего из некоторого количества имен примитивов (при неудачном выборе вместо имени набора может быть возвращено значение NIL). Длина набора оценивается с помощью функции SSLENGTH, а извлечение из него нужного элемента выполняется функцией SSNAME. [5]

Далее к полученному примитиву применяется функция ENTGET, которая возвращает список с набором точечных пар, содержащих характеристики рассматриваемого примитива. Затем с помощью функций CDR и ASSOC из этого списка читаются нужные свойства примитива. [5]

Рассмотрим приведенную схему на следующем примере. Предположим, что в рисунке детали на слое HOLES находятся отверстия (круги), построенные с помощью команды (CIRCLE) (КРУГ). Необходимо прочитать все эти круги и сформировать два списка, в первом из которых собрать радиусы кругов, а во втором – точки с координатами центров. [5]

Пример:

;Начальные значения списков радиусов ( LIST _ RAD ) и центров ( LIST _ CEN )

(SETQ LIST_RAD ‘() LIST_CEN ‘())

;Создание набора из кругов на слое HOLES

(SETQ NAB_CIR (SSGET “_X” (LIST CONS 8 “ HOLES”) (CONS 0 “CIRCLE”))))

;Проверка, сформировался ли набор NAB _ CIR

;(если нет, то предыдущая операция вернет NIL)

( IF ( NULL NAB _ CIR )

( PROGN

( PRINC “\ n Нет кругов на слое HOLES .”); сообщение об отсутствии

( PRINC ); тихий выход

); конец PROGN

( PROGN

(SETQ I-1 NAB_LEN (SSLENGTH NAB_CIR))

;Цикл по количеству элементов набора NAB _ CIR

(REPEAT NAB_LEN

(SETQ I (1+ I))

;Выбор следующего примитива и получение его списка

(SETQ CIR LIST (ENTGET (SSNAME NAB_CIR I)))

(SETQ RADCIR (CDR (ASSOC 40 CIRLIST)))

(SETQ CEN CIR (CDR (ASSOC 10 CIRLIST)))

;Добавление радиуса и точки центра к спискам LIST _ RAD и LIST _ CEN

(SETQ LIST_ RAD (APPEND LIST_RAD (LIST RAD_CIR)))

(SETQ LIST_CEN (APPEND LIST_CEN (LIST CEN_CIR)))

);конец REPEAT

;Печать результирующих списков

( PRINC “\ n Радиусы: ”)

(PRINC LIST_RAD)

(PRINC “\n Центры : ”)

(PRINC LIST_CEN)

); конец PROGN

); конец IF

Программу следует сохранить, после чего ее можно загрузить в память. Если файл загрузится без ошибок, то система AutoCAD его сразу выполнит. [5]

Разберем, как работает программа. Для того, чтобы выбрать из рисунка все круги на слое HOLES используется функция SSGET с фильтром по имени слоя и типу примитива. Результат (набор) запоминается в переменной NAB _ CIR. Количество объектов, попавших в набор NAB _ CIR, вычисляется с помощью выражения ( SSLENGTH NAB _ CIR ). Затем с помощью функции SSNAME поочередно получаются примитивы, включенные в набор. Далее формируется список с характеристиками очередного объекта-круга с помощью выражения ( SSNAME NAB _ CIR I ). После этого остается только извлечь с помощью функций CDR и ASSOC значения радиуса (DXF-код 40) и центра (DXF-код 10). Извлекаемые значения заносятся в результирующие списки. [5]


Дата добавления: 2019-09-13; просмотров: 420; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!