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

Работа с объектами AutoCAD

< Лекция 4 || Лекция 5: 123 || Лекция 6 >
Аннотация: Приводятся основные понятия о сущностях (entity) объектов AutoCAD . Они представляются в виде списка параметров, хранящемся в базе данных программы. В лекции дается методика работы с этими списками: извлечение их из базы данных, модификация, обновление объектов.

Цель лекции: приобрести навыки работы с сущностями объектов.

Получение информации об объектах

Любой объект базы данных AutoCAD является сущностью (entity ) и имеет имя сущности. По имени сущности можно получить справку об объекте из любого места процедуры. Программным путем можно получать или устанавливать набор параметров заданного объекта базы данных. Функция ENTLAST возвращает имя сущности. Функция ENTGET возвращает описание сущности в том виде, в каком она хранится в базе данных.

Задание 5.1

Постройте прямую и выведите на экран ее имя сущности

Command: (command "_line" "0,0,0" "50,0" "")
_line Specify first point: 0,0,0
Specify next point or [Undo]: 50,0
Specify next point or [Undo]:
Command: nil
Command: (entlast)
<Entity name: 7ef92198>

А теперь сделайте запрос на получение последней сущности:

Command: (setq myline (entget (entlast)))

В ответ получите возвращаемое значение:

((-1 . <Entity name: 7ef92198>) (0 . "LINE")
(330 . <Entity name: 7ef90cf8>) (5. "163")
(100 . "AcDbEntity") (67 . 0) (410 . "Model")
(8 . "0") (100 . "AcDbLine") (10 0.0 0.0 0.0)
(11 50.0 0.0 0.0) (210 0.0 0.0 1.0))

Функция возвращает большой список, состоящий из 12 вложенных списков. К каждому из вложенных списков можно обращаться как к группе, индексированной по первому элементу. Это код группы объекта. Имя сущности входит в группу с кодом -1. Тип сущности ("LINE") входит в группу с кодом 0. Однако смысл кодов может меняться в зависимости от типа объекта. В таблице приведены некоторые коды групп стандартных объектов AutoCAD :

Код Описание Код Описание
-1 Имя сущности 38 Уровень
0 Тип сущности 39 Толщина
1 Текстовое значение 40 Радиус (или высота текста)
8 Имя слоя 62 Цвет
10 Начальная точка (или центр) 67 Идентификатор пространства листа
11 Конечная точка (или точка выравнивания)

Полный список кодов можно найти в справочной системе Visual LISP по команде Help - Visual LISP Help Topics - Content - DXF Reference - Entities Section - Common Group Codes for Entities .

Информацию о начерченном нами отрезке можно просмотреть и в среде AutoLISP . Для этого нужно при выделенном отрезке открыть диалоговое окно Inspect по команде View - Browse drawing database - Browse Selection . В контекстном меню строки LINE выбрать команду LINE . Появится диалоговое окно Acad Line с информацией (рис. 5.1):

Получение информации об объекте в среде AutoLISP

Рис. 5.1. Получение информации об объекте в среде AutoLISP

Выбор и изменение различных данных сущностей выполняются функциями ASSOC и SUBST . Функция ASSOC возвращает список, найденный по коду группы. Ее параметрами являются код группы и имя большого списка. Например, если в качестве первого параметра выбрать 10 (ASSOC 10 MyLine ), то функция ASSOC возвратит значение кода и начальную точку отрезка. Функция SUBST заменяет в списке все вхождения некоторого значения другим значением. Она содержит три параметра:

Первый параметр - чем заменять;

Второй параметр - что заменять;

Третий параметр - в каком списке выполнить замены.

Сам чертеж можно модифицировать с помощью функции ENTMOD , передав ей в качестве параметра обновленный список базы данных чертежа.

Задание 5.2

Построить отрезок (0,0 50,0). Изменить координаты начальной точки на (50,50).

Command: _line Specify first point: 0,0,0↵
Specify next point or [Undo]: 50,0↵

Проверьте координаты конечной точки:

Command: id↵
Specify point:  X = 50.0000     Y = 0.0000     Z = 0.0000
Command: *Cancel*

Присвойте переменной myline значение списка параметров отрезка:

Command: (setq myline (entget (entlast))) ↵
((-1 . <Entity name: 7ef921a8>) (0 . "LINE") (330 . <Entity name: 7ef90cf8>) (5 
. "165") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . 
"AcDbLine") (10 0.0 0.0 0.0) (11 50.0 0.0 0.0) (210 0.0 0.0 1.0))

Присвойте переменной startpt значение координат начальной точки:

Command: (setq startpt (assoc 10 myline)) ↵
(10 0.0 0.0 0.0)

Присвойте переменной new_startpt новое значение координат начальной точки:

Command: (setq new_startpt '(10 50.0 50.0 0.0)) ↵
(10 50.0 50.0 0.0)

Замените в списке параметров координаты начальной точки новым значением:

Command: (setq myline (subst new_startpt startpt myline)) ↵
((-1 . <Entity name: 7ef921a8>) (0 . "LINE") (330 . <Entity name: 7ef90cf8>) (5 
. "165") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . 
"AcDbLine") (10 50.0 50.0 0.0) (11 50.0 0.0 0.0) (210 0.0 0.0 1.0))

Измените сам отрезок:

Command: (entmod myline) ↵
((-1 . <Entity name: 7ef921a8>) (0 . "LINE") (330 . <Entity name: 7ef90cf8>) (5 
. "165") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . 
"AcDbLine") (10 50.0 50.0 0.0) (11 50.0 0.0 0.0) (210 0.0 0.0 1.0))

В результате этих действий горизонтальный отрезок станет вертикальным.

Создание набора выделенных объектов

С помощью функции SSGET (Selection Set Get - получение набора выделения) можно создать набор выделения. Именно эта функция выводит знакомое приглашение Select objects . Наиболее часто с наборами объектов используются следующие функции:

Функция Описание
SSGET Получает набор выделения от пользователя
SSLENGTH Возвращает число объектов в наборе
SSNAME Возвращает имя сущности заданного объекта в наборе по двум параметрам: по имени набора и номеру объекта в наборе

Пример

Построим две окружности и четыре отрезка. Затем присвоим переменной mysset выделенный набор:

Command: (setq mysset (ssget)) ↵
Select objects: Specify opposite corner: 6 found
Select objects:↵
<Selection set: d>

Проверим количество объектов в наборе mysset :

Command: (sslength mysset) ↵
6

Извлечем имя сущности нулевого элемента набора mysset :

Command: (SSNAME MYSSET 0) ↵
<Entity name: 7ef921d8>

Получим данные об этом объекте

Command: (entget (ssname mysset 0)) ↵
((-1 . <Entity name: 7ef921d8>) (0 . "LINE") (330 . <Entity name: 7ef90cf8>) (5 
. "16B") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . 
"AcDbLine") (10 -30.0 0.0 0.0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0))
Command:

Задание 5.3

Построение объектов разного типа. Распечатка типов

Постройте на экране отрезок, окружность, полилинию, прямоугольник и текст.

В новом файле AutoLISP наберите следующий код:

(defun c:listsset (/ mysset counter)
(setq mysset (ssget))
(setq counter 0)
(while (< counter (sslength mysset))
(terpri)
(princ (cdr (assoc 0 (entget (ssname mysset counter)))))
(setq counter (+ counter 1))
)
(princ)
)

Сохраните файл как Mysset.lsp в \AutoCAD2007\Support . Загрузите его.

В командной строке введите команду listsset .

В ответ на приглашение выделите все объекты чертежа. Программа выведет следующий текст:

Command: listsset↵
Select objects: all↵
5 found
Select objects:↵
MTEXT
LWPOLYLINE
LWPOLYLINE
LINE
CIRCLE

Процедура работает следующим образом.

В первой строке объявляется функция и две переменных: mysset и counter .

Во второй строке переменной mysset присваивается набор выделенных пользователем объектов по запросу функции SSGET .

В третьей строке счетчик counter устанавливается в нуль.

В четвертой строке начинается цикл WHILE . Вначале функция SSLENGTH определяет количество элементов в наборе mysset . Затем задается условие выполнения цикла: показания счетчика должны быть меньше количества элементов в наборе. Другими словами, должны быть обработаны все объекты набора.

В пятой строке стоит функция TERPRI - перевод строки.

В шестой строке описаны пять операторов, работа которых выводит содержимое списка на экран. Вначале функция SSNAME определяет имя объекта с номером COUNTER в наборе mysset . Затем с помощью функции ENTGET процедура получает список данных на объект. Далее функция ASSOC извлекает из списка имя объекта из группы с кодом 0. В результате имеется точечная пара, где первым элементом является код группы, а вторым элементом является имя объекта. Функция CDR возвращает лишь нужное нам имя объекта, пропуская первый элемент списка. Функция PRINC выводит результат на экран.

В седьмой строке значение счетчика увеличивается на 1. Цикл повторяется для следующего объекта.

В восьмой строке цикл WHILE закрывается.

В девятой строке стоит оператор корректного завершения процедуры.

Скобка в десятой строке ограничивает тело функции.

< Лекция 4 || Лекция 5: 123 || Лекция 6 >
Алексей Тимонин
Алексей Тимонин
Алексей Потапкин
Алексей Потапкин

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

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

Public Sub DrawHatchedBox()

...

End Sub