Отправляет email-рассылки с помощью сервиса Sendsay

Программирование в AutoCAD

  Все выпуски  

Программирование в AutoCAD


Информационный Канал Subscribe.Ru


Здравствуйте, уважаемые мои коллеги и друзья!

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

Вопрос к аудитории: наша дальнейшая беседа (пока что, к сожалению, монолог, но я не теряю надежды) потребует от вас некоторых знаний синтаксиса LISP'а и Visual Basic'а. Если с VB, как мне кажется, особых проблем возникнуть не должно, то LISP - достаточно специфическая вещь. Я постараюсь снабдить подробными комментариями все примеры кода, однако, если кто из вас только начал освоение этой темы "с нуля", пишите мне. Что-нибудь придумаем - вплоть до того, что откроется рассылка "Visual LISP для начинающих" или вроде того ;-) .

Впрочем, общие сведения можно почерпнуть из справки "AutoCAD Visual LISP and ActiveX Help", входящей в комплект поставки AutoCAD. Вообще, хороший пользователь системы AutoCAD просто обязан владеть хотя-бы азами LISPа, даже если он не претендует на звание программиста и никогда в жизни не собирается ничего такого делать. Просто в таком случае этот пользователь получит еще один очень удобный инструмент (хотя бы даже мощнейший калькулятор, пользоваться которым можно даже внутри команд), поскольку LISP-выражения интерпретируются прямо в командной строке. И большинство наших примеров также можно воспроизвести, не загружая оболочку Visual LISP.

Представление объектов в чертеже AutoCAD

Visual LISP

Visual LISP наиболее точно и полно отражает реальное представление данных чертежа. Проделаем простой эксперимент: создадим новый чертеж и проведем отрезок:

Command: line 0,0 200,300

Теперь, для того, чтобы получить информацию об этом отрезке, введем с командной строки AutoCADа следующее:

(entget (entlast))

Функция entlast возвращает имя последнего неудаленного примитива (графического объекта) в чертеже, а entget по имени возвращает информацию о примитиве.

Таким образом, LISP возвратит нам список, содержащий примерно такие данные:

((-1 . <Entity name: 15ca990>) (0 . "LINE")
(330 . <Entity name: 15ca8f8>) (5 . "42")
(100 . "AcDbEntity") (67 . 0) (410 . "Model")
(8 . "0") (100 . "AcDbLine") (10 0.0 0.0 0.0)
(11 200.0 300.0 0.0) (210 0.0 0.0 1.0))

Если сохранить наш простенький чертеж как DXF-файл командой DXFOUT и заглянуть внутрь этого файла, мы увидим текстовое представление двоичных данных, с которыми оперирует AutoCAD. Найдем наш отрезок: он находится в секции ENTITIES ближе к концу этого файла. Вот эта секция целиком, если кроме отрезка в чертеже ничего нет:

  0
SECTION
  2
ENTITIES
  0
LINE
  5
42
330
1F
100
AcDbEntity
  8
0
100
AcDbLine
 10
0.0
 20
0.0
 30
0.0
 11
200.0
 21
300.0
 31
0.0
  0
ENDSEC

Бросается в глаза аналогия с предыдущими данными, возвращенными LISPом. Там мы имеем списки, первый элемент которых - код, указывающий, что за данные находятся в этом списке. Также и в DXF-файле каждый элемент данных записан двумя строками: первая - это тот же самый DXF-код элемента (например, 8 - имя слоя, на котором находится объект), а вторая содержит значение элемента (в нашем случае - "0"). Единственное различие - способ записи двух- и трехмерных координат. Если в LISPе это тоже список, состоящий из кода (10 для начальной и 11 для конечной точки отрезка) и последовательно X, Y и Z составляющих, то в DXF-файле каждая составляющая записывается со своим отдельным кодом (10, 20, 30 и 11, 21, 31 соответственно).

Кстати, в файле помощи (AutoCAD Visual LISP and ActiveX Help) есть раздел "DXF Reference", посвященный как раз описанию кодов DXF, большинство из которых надо знать, программируя на Visual LISP.

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

  1. Извлечь данные об объекте описанным уже способом и сохранить их в какой-нибудь переменной с помощью функции setq.
  2. Внести необходимые изменения в список данных объекта (функция subst).
  3. Использовать функцию entmod для изменения объекта в чертеже.

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

;;; Извлекаем данные последнего созданного объекта
;;; и помещаем их в переменную obj_data
(setq obj_data (entget (entlast)))
;;; Функцией subst меняем имя слоя (DXF-код 8), например, на "NEW"
(setq obj_data (subst (cons 8 "NEW") (assoc 8 obj_data) obj_data))
;;; И функцией entmod модифицируем объект в чертеже
(entmod obj_data)

Теперь в свойствах объекта можно видеть, что он лежит на слое "NEW". Если такого слоя не было, он автоматически создастся. Важное замечание: слои - единственные из табличных объектов AutoCADа, которые автоматически создаются при подобных манипуляциях. В остальных случаях, при работе с типами линий, блоками, стилями и прочее, мы должны проверять наличие желаемого объекта.

В следующем выпуске мы постараемся сделать то же самое средствами Visual Basic, и тогда уже сможем сравнивать и подводить некоторые итоги.

С вами был Алексей Краутер.

Свои вопросы, советы и пожелания присылайте на subscribe@craidell.ru

Ваши наиболее интересные письма будут опубликованы в данной рассылке. Если вы не желаете публикацию вашего письма, пожалуйста, укажите это в теле письма.

До свидания!

Количество подписчиков: 28


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное