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

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

< Лекция 4 || Лекция 5: 123 || Лекция 6 >

Функции доступа и функции модификации

Рассмотрим на простом примере, как свойства объектов AutoCAD экспортируются в AutoLISP . Пусть требуется получить координаты начальной точки отрезка.

;;; Эта функция создает отрезок с помощью функции COMMAND и возвращает nil
(defun make-aline()
(command "_line" "5,5" "15,5" "")
)

Загрузите функцию. Для запуска последующих функций нужно набирать их выражения в окне Console среды Visual LISP . Для получения координат начальной точки выполните следующие действия:

  1. Запустите функцию, введя в окне Console (make-aline) .
  2. Присвойте переменной LineEntity имя созданной сущности: (setq LineEntity (entlast))
  3. С помощью функции ENTGET получите список свойств этого объекта. Для этого введите в окне Console среды Visual LISP следующее выражение: (setq LinePropertyList (entget LineEntity))
  4. Извлеките из списка свойств группу с кодом 10: (setq StartOfLineList (assoc 10 LinePropertyList))
  5. Получите список только с координатами (setq StartOfLine (cdr (assoc 10 LinePropertyList)))

Если требуется получить одновременно несколько свойств объекта, то нужно несколько раз повторить всю последовательность операций. Чтобы не писать один и тот же код многократно, можно создать простую функцию-интерфейс. В этой функции нужно объединить все выполненные выше операции для получения информации из любой группы свойств объекта, а не только из группы с кодом 10.

Пример:

;;; Возвращает любую группу, значение кода которой
;;; содержится в списке свойств объекта
;;; Параметрами функции являются имя сущности и код группы
(defun Get-A-Group-Code (EntityName GroupCode)
(cdr (assoc GroupCode (entget EntityName)))
)

Определяемая функция является функцией с аргументом. Параметры, стоящие в скобках, - это формальные параметры. Вместо них могут быть подставлены фактические параметры. Проверьте, например, работу этой функции, используя определенную ранее переменную LineEntity :

(Get-A-Group-Code LineEntity 10)↵
(5.0 5.0 0.0)

Можно специализировать этот интерфейс, определив специально функцию, извлекающую данные только из группы с кодом 10. Для такой функции понадобится лишь один параметр - имя сущности. Код группы будет включен в вызов функции:

((defun Get-A-Group-10-Code (anEntityName)
(Get-A-Group-10-Code anEntityName 10)
)

Проверьте работу этой функции, используя определенную ранее переменную LineEntity :

(Get-A-Group-Code LineEntity)↵
(5.0 5.0 0.0)

Изменить свойства объекта можно с помощью функций CONS, SUBST, ENTMOD . Функция CONS создает новый список, добавляя в него первый элемент. Ее используют, если хотят присвоить группе с определенным кодом значения заданного списка. Ведите, например, в окне Console такой код:

(setq NewStartPoint (cons 10 (0 0 0)))↵
Среда AutoLISP возвратит следующее:
(10 0 0 0)

Используя переменные NewStartPoin и LinePropertyList , можно подставить вновь созданный список в группу с кодом 10. Это делается с помощью функции SUBST :

(Setq AcadLinePropertyList (subst NewStartPoin (assoc 10 AcadLinePropertyList)))

Чтобы внести выполненные в списках изменения в реальный объект AutoCAD , можно воспользоваться функцией ENTMOD :

(entmod LinePropertyList)↵

Создадим функцию-интерфейс, которая модифицирует группу с любым кодом для произвольного объекта:

(defun put-group-code-value 
(Entityname Groupcode Value / PropertyList)
(setq PropertyList (entget Entityname))
(setq PropertyList 
(subst
(cons GroupCode Value)
(assoc GroupCode PropertyList)
PropertyList
);_ завершение subst
);_ завершение setq
(entmod PropertyList)
);_ завершение put-group-code-value

В данной функции применены все выполнявшиеся ранее действия. Рассмотрим работу этой функции.

В первой и второй строках определяется функция put-group-code-value с тремя аргументами. В качестве первого выступает имя сущности Entityname , код группы Groupcode и новое значение группы с этим кодом Value . Здесь же определена локальная переменная PropertyList , предназначенная для хранения списка свойств объекта.

В третьей строке переменной PropertyList присваивается список свойств объекта, получаемый с помощью функции ENTGET .

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

В строках 5-8 выполняется подстановка новой группы, созданной функцией (cons GroupCode Value) , на место текущих значений группы в списке свойств PropertyList .

В строке 11 база данных чертежа модифицируется с помощью функции ENTMOD .

Эта функция позволяет существенно упростить модификацию любой группы списка свойств. Теперь с помощью функции put-group-code-value можно модифицировать группу с кодом 10 для нашего отрезка.

Введите и загрузите функцию. Проверьте ее работу, введя в Visual LISP следующий код:

(put-group-code-value LineEntity 10 '(5 5 0))↵

Функция изменит координаты начальной точки отрезка.

По этому принципу можно определить отдельную функцию, которая модифицирует группу с кодом 10 или с любым другим кодом.

(defun put-group-10-code (Entityname Value)
(put-a-group-code-value Entityname 10 Value)

Введите и загрузите эту функцию. Затем в окне CONSOLE введите следующий код, чтобы изменить координаты начальной точки отрезка на 15, -5,0.

(put-group-10-code LineEntity '(15 -5 0))

В окне AutoCAD убедитесь, что начальная точка отрезка изменилась.

Разработка приложений на языке LISP

Несколько выполняемых совместно и связанных между собой LISP -программ можно объединить в один проект. Каждый такой проект может работать в исходных текстах или в компилированных файлах с расширением FAS . Компиляция проекта в единый FAS -файл дает преимущества по скорости загрузки и выполнения.

Новый проект создается по команде Project - New Project . После введения имени проекта открывается диалоговое окно Project Properties с двумя вкладками (рис.5.2).


 Диалоговые окна Project properties

Рис. 5.2. Диалоговые окна Project properties

Проекты открываются по команде Project - Open Project . Окно проекта содержит перечень файлов и панель инструментов с командами, аналогичными командам в меню (рис.5.3). Файлы открываются двойным щелчком на их имени. Загрузить весь проект можно, щелкнув по кнопке Load Project FAS . Можно работать также с каждым файлом в отдельности.

 Открытие файлов LSP из окна проекта

Рис. 5.3. Открытие файлов LSP из окна проекта

Другой вид приложений - VLX -приложения, в состав которых могут входить не только LSP -файлы, но и DSL-файлы диалоговых окон, FAS -файлы и текстовые TXT -файлы. Все включаемые компоненты собираются в единый файл приложения с расширением VLX . Для создания нового VLX -приложения нужно вызвать мастера по команде File - Make Application - New Application Wizard (рис.5.4). Выбор режима, определяющего тип приложения, возможен из двух вариантов: SIMPLE или EXPERT . Простое приложение может состоять только из LSP и FAS -файлов. В сложном приложении могут присутствовать также DSL, PRJ и TXT -файлы.

 Вызов мастера создания VLX-файлов

Рис. 5.4. Вызов мастера создания VLX-файлов

Загрузить файл можно по команде File - Load File , либо с консоли с помощью функции Load , либо в сеансе AutoCAD .

Помимо примитивов, в рисунке всегда присутствует неграфическая информация: описания блоков, таблицы слоев, видовых экранов, типов линий, размерных стиле и пр. Все они хранятся в базе данных примерно в таком же виде, как примитивы.

Для доступа к табличным объектам в языке AutoLISP используют функции: tblnext, tblobjname, tblsearch . В качестве названий таблиц в этих функциях могут фигурировать только следующие текстовые строки:

  • BLOCK - таблица описаний блоков;
  • LAYER - таблица слоев;
  • LTYPE - таблица типов линий;
  • STYLE - таблица текстовых стилей;
  • DIMSTYLE - таблица размерных стилей;
  • UCS - таблица именованных систем координат;
  • VIEW - таблица именованных видов;
  • VPORT - таблица конфигураций видовых экранов;
  • APPID - таблица имен приложений.

Рассмотрим на примерах схему использования этих функций.

(setq listlay1 (tblnext "LAYER" T)) - возвращает список с данными первого слоя рисунка, например, такого типа:

((0 . "Layer") (2 . "0") (70 . 0) (62 . 7) (6 . "Continuous")).

Это список точечных пар. DXF -коды означают:

  • 0 - имя таблицы;
  • 2 - имя слоя;
  • 6 - тип линий примитивов слоя BYLAYER ;
  • 62 - цвет слоя по умолчанию;
  • 70 - состояние слоя.

Для примитивов подобный список возвращает функция entget .

(setq listlay2 (tblnext "LAYER")) - возвращает список с данными второго слоя рисунка, например, такого типа:

((0 . "Layer") (2 . "Inner") (70 . 4) (62 . 4) (6 . "Dashed")).

Если запустить функцию (setq lay2name (tblobjname "Layer" "Inner")) , то она возвратит <Entity name:14ab234> . Теперь с помощью функции entget можно получить тот же список, что и для listlay2 в предыдущем примере.

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

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

Операции над словарями и их элементами осуществляют функции: dictadd, dictnext, dictremove, dictrename, dictsearch, namedobjdict . Здесь нет операции модификации записи. Поэтому при необходимости нужно вначале удалить старую запись. Затем добавить в словарь новую.

Файлы AutoLISP можно загрузить либо непосредственно в AutoCAD , либо в среде Visual LISP . Все файлы процедур должны иметь расширение .LSP . Однако для безопасности и ускорения работы процедуры AutoLISP можно компилировать в файлы проекта с расширением .PRJ или .VLX . Программа сначала загружает одноименные файлы с расширением .VLX . Если такого файла нет, то программа ищет файл .PRJ . Если и его нет, то загружается файл .LSP . Однако, если файл LSP более новый, чем другие, то он загрузится в первую очередь.

Загpузить файл "Circle.LSP " в AutoCAD можно следующими способами:

  • из командной строки выражением LISP (load "circle") ;
  • командой appload - откроется окно Load/Appload Applications . Если файл будет использоваться постоянно, то его нужно добавить в набор Start Suit с помощью кнопки Content . Эту операцию можно выполнить путем перетаскивания пиктограммы файла в окне Load/Appload Applications . Процедура будет загружаться при каждом запуске программы AutoCAD ;
  • командой Tools - AutoLISP - Load Application - откроется диалоговое окно Load/Appload Applications ;
  • командой Tools - Load Application - откроется окно Load/Appload Applications .

Если файл находится в каталоге, не включенном в список маршрутов поддержки, то необходимо задать полный маршрут файла:

(load "c:/Programm Files/AutoCAD 2007/Support/Circle") или
(load "c:\\Programm Files\\AutoCAD 2007\\Support\\Circle")

Обычно все процедуры AutoLISP сохраняют в одном каталоге. Этому каталогу создают маршрут доступа к файлам поддержки по команде Tools - Options - Files - Support File Search Path - Add - Browse .

Программа AutoCAD автоматически загружает четыре файла AutoLISP . Первые два - системные ACAD2010.LSP и ACADDOC2010.LSP . Два других файла предназначены для пользователей: ACAD.LSP и ACADDOC.LSP . Пользователи могут загружать в эти файлы любое количество процедур.

При открытии нескольких чертежей можно по-разному организовывать процедуры AutoLISP в зависимости от того, применяются ли они ко всем чертежам или к чертежу, открытому первым. Файл ACAD.LSP загружается только для первого чертежа. Файл ACADDOC.LSP загружается при открытии каждого чертежа.

Порядок загрузки файлов:

  • ACAD2010.LSP
  • ACAD.LSP
  • ACADDOC2010.LSP
  • ACADDOC.LSP

Файлы AutoLISP , загруженные для одного конкретного чертежа со своими переменными, не будут доступны в остальных чертежах. Для совместного использования функций в нескольких чертежах вместо команды (load "circle" ) нужно применить команду (vl-load-all "circle" ). Действие функций файла будет распространяться не только на все открытые чертежи, но и на все чертежи, которые будут открыты в данном сеансе.

Упражнение

Создайте приветствие на экране. Загрузите в файл C:\Programm Files\AutoCAD2010 \Support\acad.lsp такую процедуру:

(defun c:tex (/)
     (command "-view" "_top" "_vscurrent" "_2dwireframe" "_regen")
     (entmake (list '(0 . "TEXT") '(8 . "0") '(100 . "AcDbText") '(10 0.0 0.0 0.0)
                         '(40 . 2.5) '(1 . "Hello") '(7 . "Standard") 
                     )
     )
     (command "_zoom" "_e")
)
(c:tex)

Проанализируйте каждую группу списка свойств текстового примитива.

Ключевые термины

Сущность объекта (entity ) - список параметров объекта в базе данных.

Имя сущности (entity name) - параметр сущности с кодом DXF , равным -1.

Набор объектов - совокупность объектов, выделенных по команде ssget (Selection Set Get - получение набора выделения).

Файлы инициализации - четыре файла AutoLISP , автоматически загружаемые в AutoCAD . Для пользователей предназначены два файла: ACAD.LSP и ACADDOC.LSP .

Проект - несколько выполняемых совместно и связанных между собой LISP -программ.

Краткие итоги

Любой объект AutoCAD описывается в базе данных программы списком своих параметров. С помощью функций доступа и модификации возможно редактирование этих параметров и изменение объекта.

Вопросы

  1. Какие элементы образуют структуру языка AutoLISP ?
  2. Какие элементы образуют структуру данных, используемых в процедурах?
  3. Как получить информацию об объекте AutoCAD ?
  4. Какие функции организуют ввод данных пользователем?
  5. Как работают процедуры с функциями доступа и модификации?
  6. Как создать FAS - и VLX -приложения?
< Лекция 4 || Лекция 5: 123 || Лекция 6 >
Алексей Тимонин
Алексей Тимонин
Алексей Потапкин
Алексей Потапкин

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

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

Public Sub DrawHatchedBox()

...

End Sub

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