Особенности использования блоков в Автокаде
Использование блоков в Автокад существенно облегчает повторное их применение как внутри одного чертежа, так и в других проектах.
Блоки бывают статическими и динамическими. Динамичность блока может заключаться, например, в изменении его размера, формы, масштаба и т.д.
Динамические блоки в Автокаде позволяют решить более широкий ряд задач, чем статические. На рис. 1 представлен пример блоков AutoCAD из коллекции «Автомобили».
Рис.1. Использование блоков в Автокад на примере автомобилей.
Нужно четко понимать, что такое вхождение блока в Автокаде, а что такое определение.
Определение блока Автокад
После того как вы начертили графические элементы, нужно преобразовать их в блок. Для этого выбирается команда «Создать блок». Затем задается имя, базовая точка и указываются сами элементы чертежа (читать подробнее про создание блоков в AutoCAD). Определение блока AutoCAD – это информация об имени, базовой точке и геометрических объектах, входящих в блок.
Вхождение блока в Автокаде
Вхождение блока – это вставленный в чертеж блок, который представляет собой цельный объект и отображает данные определения блока. За вхождение блока отвечает команда «Вставка» (читать подробнее про вставку блоков в AutoCAD).
Блоки для AutoCAD – очень важная особенность!
Существуют важные особенности блоков Автокад. Чтобы их понять, рассмотрим пример.
Представим ситуацию: с помощью блока создали элемент, вхождение которого на чертеже повторится очень большое количество раз (например, окна на фасаде многоэтажного здания). После завершения проекта, по просьбе заказчика, возникла необходимость изменить внешний вид данного элемента.

Рис.2. Применение блоков в Автокад на примере окон.
Преимуществом блоков является то, что достаточно отредактировать только лишь одно определение блока, т.е. основное его описание. Все остальные вхождения автоматически изменятся. В противном случае пришлось бы редактировать каждый объект отдельно или вносить изменения для одного элемента, копировать его и заново вставлять.
Таким образом можно коллективно управлять свойствами блоков.
Блоки для AutoCAD — это всего лишь графические ссылки в область данных файла, где лежит само описание блока. Именно поэтому использование блоков в Автокад существенно сокращает размер файла.
Теперь вы знаете, для чего нужны блоки в Автокаде. Главное, чтобы вы осознали всю важность их применения, это экономит ресурсы компьютера и ваше время.
Читайте в следующей статье, как выполняется создание и вставка блоков AutoCAD. Вы узнаете несколько способов, как сгруппировать элементы в Автокаде в блок, научитесь создавать собственные наборы объектов, которыми чаще всего пользуетесь.
Освойте профессию проектировщика
Научитесь быстрому черчению, освоите прикладное 3D, автоматизируете создание ведомостей и спецификаций.
Изменение базовой точки определения блока
Для выбора новой базовой точки вставки определения блока используйте команду EditBasePoint.
Чтобы войти в режим редактирования компонента и использовать данную команду, необходимо сначала воспользоваться командой EditComponent.
Для изменения базовой точки определения блока или ссылки:
- Чтобы начать редактирование размещенных блоков, нажмите Изменить> Компонент> Редактировать (или введите EditComponent в командной строке).
- В диалоговом окне Редактировать компонент выберите блок, который необходимо изменить, и нажмите OK.

Чтобы выбрать сохранение или отмену изменений компонента после сеанса редактирования, воспользуйтесь командой CloseComponent вместо команды SaveComponent.
Меню: Изменить > Компонент > Редактировать базовую точку
Изменить точку вставки блока
Подскажите пожалуйста, как можно изменить точку вставки блока..то есть есть блок..вставлен в несколькых местах чертежа. необходимо, чтобы все они остались на месте, но точку вставки изменить на пересечение осей.
#2 Ответ от Владимир Громов 13 сентября 2007г. 15:31:03
Re: Изменить точку вставки блока
Запустить редактор блоков. Там есть «Параметр базовой точки» («Base Point Parameter»). AutoCAD 2006.
#3 Ответ от Владимир Громов 13 сентября 2007г. 15:36:40
Re: Изменить точку вставки блока
Только, кажется, потом уже не изменишь эту точку.
#4 Ответ от Владимир Громов 13 сентября 2007г. 15:42:31
Re: Изменить точку вставки блока
Нет, можно изменить через свойства базовой точки в редакторе блоков.
#5 Ответ от Ирина 13 сентября 2007г. 15:49:15
Re: Изменить точку вставки блока
так, захожу я в редактирование блока.он выделяется цветом, остальное становится едва-видимым. так как мне там точку вставки изменить?.и если можно еще и имя блока?
#6 Ответ от Ирина 13 сентября 2007г. 15:58:19
Re: Изменить точку вставки блока
извиняюсь, это не редактор блоков..зашла в редактор блоков и совсем там ничего не поняла.акад 2006 русская версия.
#7 Ответ от Владимир Громов 13 сентября 2007г. 16:10:04
Re: Изменить точку вставки блока
Я пишу про AutoCAD 2006 РУС. Щелкнуть 2 раза на блоке (или выделить его и в контекстном меню по правой кнопке мыши выбрать пункт «Редактор блоков»), попадаем в редактор блоков. По идее слева на экране должна появится палитра разработки блоков. Если ее нет, то ее можно вызвать, нажав на кнопку справа от поля с именем блока. На вкладке «Параметры» внизу есть значек базовой точки. Нажать его, будет предложено указать местоположение параметра. В новой точке встанет маркер. Выйти из редактора блоков с сохранением. Все вхождения блока переопределятся. Правда, сам блок станет динамическим.
Для переименования блока есть команда «НОВОЕИМЯ» («_RENAME»). Меню «Формат».
#8 Ответ от Владимир Громов 13 сентября 2007г. 16:12:14
Re: Изменить точку вставки блока
Может, есть другой способ изменения базовой точки, но я что-то сейчас не соображу.
#9 Ответ от subchik 13 сентября 2007г. 16:23:43
Re: Изменить точку вставки блока
> Владимир Громов
Ну, переопределить блок «по старинке», без редактора блоков. Или лиспом 🙂
#10 Ответ от Ирина 13 сентября 2007г. 17:34:47
Re: Изменить точку вставки блока
Сделала, базовая тока изменилась, но и блок сдвинулся. (. чтобы такое сделать, чтобы блок не сдвигался.
#11 Ответ от Владимир Громов 13 сентября 2007г. 18:53:54
Re: Изменить точку вставки блока
> Ирина
У меня не сдвигались. Что делал. Создал блок с базовой точкой. Вставил несколько раз. В редакторе блоков изменил базовую точку. При выделении блоков видно, что точка вставки (ручка) переместилась. Сами блоки остались на прежних местах.
#12 Ответ от Ирина 14 сентября 2007г. 14:34:46
Re: Изменить точку вставки блока
ну не знаю. что ж такое, делаю все тоже самое, и блоки съезжают на расстояние изменения точки вставки!
#13 Ответ от Владимир Громов 14 сентября 2007г. 14:46:09
Re: Изменить точку вставки блока
> Ирина
А ведь вы правы. Когда я вставил блоки с привязкой к конретным объектам (а не просто в пустоте, как делал раньше), то блоки при изменении базовой точки сдвинулись. В пустоте как-то было незаметно.
#14 Ответ от ttt 14 сентября 2007г. 23:21:02
Re: Изменить точку вставки блока
Ирина пишет:
так как мне там точку вставки изменить?.и если можно еще и имя блока?
Всё это реализовали в редакторе блоков (команда _refedit) в Autocad Mechanical 2008. Помнится, что это было и в какой-то из прежних версий Autocad Mechanical, но глючное. Версиями 2006 и 2007 я не пользовался по той же причине их глючности, а вот в Autocad Mechanical 2008 ошибок всего раза в два больше, чем в голом Автокаде — вполне приемлемо. Так вот, в Autocad’е при выходе с сохранением из редектирования по команде _refedit выскакивает окошко с идиотским предложением нажать Cancel. А в Autocad Mechanical в это окошко вставили две кнопки «Изменить имя» и «Изменить точку вставки». За эти две кнопки я Autodesk’у несколько ошибок прощаю 🙂
PS: Описываю подробно с задней мыслью: вдруг кто-то возьмется сделать такие кнопки для голого Автокада.
Урок 14. Изменение динамического блока из LISP-программы.
В последнее время в AutoCAD стали широко применяются динамические блоки.
Возможность управления динамическими блоками из LISP-программы открывает новые перспективы автоматизации проектов.
В этом уроке мы рассмотрим пример изменении динамических свойств блока из LISP-программы.
В начале, проведем не большие приготовления:
1) Создадим, блок с дополнительными данными, при помощи программы mp_kub3 .

Рис. 1. Программа mp_kub3.
Эта программа рассмотрена в уроке: «LISP. Создание блока».

Скачать программу Mp_kub3.lsp (Размер файла: 993 bytes)
Откройте программу mp_kub3.lsp в редакторе Visual LISP.
Перейдите в Автокад.
Введите в командной строке: mp_kub3 и нажмите < Enter >.
На запрос « Задайте длину стороны куба : » введите например 500 и нажмите
На запрос « Укажите базовую точку : » щелкните мышкой в рабочем окне Автокад.
Программа создаст блок куба с размерами сторон 500 . См. Рис. 2.

Рис. 2. Блок с дополнительными данными.
2) Вставим динамический блок « Vyn «, при помощи программы Udim.lsp . См. Рис. 3.

Рис. 3. Программа Udim.
Динамический блок мы создавали в уроке: «Создание динамического блока» . Если у Вас нет динамического блока «Vyn» , скачайте его и разместите в путях поддержки Автокад.

Скачать динамический блок (Размер файла: 30 kB)

Скачать программу Udim.lsp (Размер файла: 538 bytes)
Откройте программу Udim.lsp в редакторе Visual LISP.
Перейдите в Автокад.
Введите в командной строке: Udim и нажмите < Enter >.
На запрос « Выберите блок : » — Укажите блок куба.
На следующий запрос « Выберите блок : » – нажмите < Esc >.
Программа нарисует выноску. См. Рис. 4

Рис. 4. Динамический блок выноска.
Мы видим, что динамический блок размещен не совсем удачно. Хотелось удлинить как выносную линию, так и длину полки.
Давайте посмотрим, какие динамические свойства нам доступны для изменения.
Выделите динамический блок и нажмите Ctrl+1 . Откроется палитра свойств. См. Рис. 5.

Рис. 5. Динамические свойства.
На вкладке « Настройка » мы видим, что для изменения нам доступны:
Положение1 X – положение точки 1 относительно точки bр по координате X;
Положение1 Y – положение точки 1 относительно точки bр по координате Y;
Расстояние1 – длина выносной линии;
Угол1 – угол наклона выносной линии к оси X.
Расстояние2 – длина полки.
Давайте начнем с параметра Расстояние1 и попробуем изменить длину выносной линии.
Сохраните программу Udim.lsp под другим именем ( Udim2.lsp ).
Измените имя функции defun ( Udim2 ).
После вставки динамического блока, используя функцию ( entlast ) , возвращаем имя вставленного объекта.
Потом переводим обычный примитив в VLA-объект:
(vlax-ename->vla-object (entlast))
И сохраняем его в переменной din_bl :
(setq din_bl (vlax-ename->vla-object (entlast)))
Кроме этого, давайте добавим переменную sv1 , в которой мы будем хранить имя изменяемого свойства:
(setq sv1 "Расстояние1")

Рис. 6. Создаем переменные din_bl и sv1.
При помощи функции vla-getdynamicblockproperties считываем динамические свойства у VLA-объект din_bl :
(vla-getdynamicblockproperties din_bl)
Давайте, чтобы следим за ходом наших действий, откроем Консоль Visual LISP .
Выделим строки, как на рис. 7, и загрузим выделенный фрагмент.

Рис. 7. Считываем динамические свойства.
В окне Консоль Visual LISP мы видим, что наши динамические свойства вернулись в виде:
Чтобы, прочитать значение типа данных variant, используем функцию vlax-variant-value:
(vlax-variant-value (vla-getdynamicblockproperties din_bl))
Выделите эту строку и загрузите выделенный фрагмент. См. Рис. 8.

Рис. 8. Считывает значение типа данных variant.
В окне Консоль Visual LISP мы видим, что наши динамические свойства вернулись в виде безопасного массива:
При помощи функции vlax-safearray->list преобразуем массив в список:
(vlax-safearray->list(vlax-variant-value (vla-getdynamicblockproperties din_bl)))
Выделите эту строку и загрузите выделенный фрагмент. См. Рис. 9.

Рис. 9. Преобразуем массив в список.
Эта строка вернет нам список с нашими динамическими свойствами ( Положение1 X, Положение1 Y, Расстояние1 и так далее), которые представлены в виде VLA-объектов:
Чтобы, в списке оставить только то динамическое свойство, которое нам нужно, применим функцию vl-remove-if-not , которая в общем виде выглядит так:
(vl-remove-if-not ‘ )
Функция vl-remove-if-not удаляет из списка все элементы, возвращающие nil при проверке тест-функцией.
- функция, применяемая для проверки поочередно к каждому элементу списка. - список из которого нужно удалить объекты.
В качестве тест-функции мы будем использовать следующее выражение:
(lambda (x) (= (vla-get-propertyname x) sv1))
Функция lambda создает безымянные пользовательские функции, которые можно определить и тут же выполнить. В общем виде она выглядит так:
(lambda )
Функция vla-get-propertyname считывает имя свойства.
Выражение ( = ( vla-get-propertyname x ) sv1 ) – сравнивает имя свойства, полученное из элемента списка, с именем, которое хранится в переменной sv1 («Расстояние1»). Если они = , то возвращает Т , в противном случаи nil .
Добавляем в программу следующие строки:
(vl-remove-if-not ‘(lambda (x) (= (vla-get-propertyname x) sv1)) < наш список>) ; end vl-remove-if-not
Выделим строки, как на рис. 10, и загрузите выделенный фрагмент.

Рис. 10. Оставляем только нужное свойство.
Функция vl-remove-if-not оставит в списки, только одно динамическое свойство.
Чтобы получить само свойство, а не список с одним свойством, применяем функцию car , которая извлекает первый элемент из списка.
(car (vl-remove-if-not '(lambda (x) (= (vla-get-propertyname x) sv1)) (vlax-safearray->list(vlax-variant-value (vla-getdynamicblockproperties din_bl))) ); end vl-remove-if-not ); end car
И сохраняем его в переменной din_sv :
(setq din_sv (car (vl-remove-if-not '(lambda (x) (= (vla-get-propertyname x) sv1)) (vlax-safearray->list(vlax-variant-value (vla-getdynamicblockproperties din_bl))) ); end vl-remove-if-not ); end car ); end setq
Добавляем выше сказанное в программу.
Выделите строки, как на рис. 11, и загрузите выделенный фрагмент.

Рис. 11. Динамическое свойство.
Мы видим, что выделенный фрагмент возвращает нам, только одно динамическое свойство в виде VLA-объекта.
Давайте проверим то ли свойство мы получили. Для этого добавим следующую строку:
(vla-get-propertyname din_sv) – которая считывает имя свойства.

Рис. 12. Имя динамического свойства.
Мы видим, что в переменной din_sv хранится динамическое свойство (VLA-объект), которое нам нужно. Последнюю строчку из программы можно удалить (мы использовали ее, только для проверки).
Нам остается, только изменить значение динамического свойства. Давайте поменяем значение свойства « Расстояние1 » на 350 .
В начале нужно привести это значение к типу variant . Для этого используем функцию vlax-make-variant , которая в общем виде выглядит так:
(vlax-make-variant )
- значение присваиваемое варианту. - тип данных значения (вещественное число, строка и так далее)
Нужно, чтобы новое значение было того же типа, что и старое.
Чтобы определить тип старого значения, добавляем следующее выражение:
(vlax-variant-type (vla-get-value din_sv))
vla-get-value – считает значение din_sv vlax-variant-type – возвращает его тип.
Добавьте, эту строку в программу.
Выделите ее и загрузите выделенный фрагмент. См. Рис. 13.

Рис. 13. Тип данных старого значения.
Строка вернет нам код типа « 5 », что соответствует типу: Вещественное число с двойной точностью .
Преобразуем наше новое значение в тип variant :
(vlax-make-variant 350 (vlax-variant-type (vla-get-value din_sv)))
При помощи функции vla-put-value меняем старое значение на новое.
В общем виде функция vla-put-value выглядит так:
(vla-put-value )
- свойство значение которого нужно изменить; - новое значение. Должно иметь тип variant
Добавляем выражение, которое меняет значение:
(vla-put-value din_sv (vlax-make-variant 350 (vlax-variant-type (vla-get-value din_sv))))
Чтобы значение вступило в силу vla-объект динамического блока нужно обновить. Делаем это при помощи функции vla-update
(vla-update din_bl)
Добавляем все выше сказанное. Выделите строки, как на рис. 14, и загрузите выделенный фрагмент.

Рис. 14. Изменение динамического свойства.
Перейдите в Автокад. Выносная линия у динамического блока стала длинней. См. Рис. 15.

Рис. 15. Динамического блок изменился.
Чтобы остальные динамические свойства нам изменять стало проще, преобразуем часть кода в пользовательскую функцию Change_din_sv :
(defun Change_din_sv (din_bl sv new_value / din_sv) (setq din_sv (car(vl-remove-if-not '(lambda (x) (= (vla-get-propertyname x) sv)) (vlax-safearray->list(vlax-variant-value (vla-getdynamicblockproperties din_bl))) ); end vl-remove-if-not ); end car ); end setq (vla-put-value din_sv (vlax-make-variant new_value (vlax-variant-type (vla-get-value din_sv)))) (vla-update din_bl) ) ; end defun
Для вызова функции в общем виде используется выражение:
(Change_din_sv din_bl sv new_value) , где:
din_bl – динамический блок, в котором нужно поменять значение динамического свойства; sv – имя динамического свойства; new_value – новое значение динамического свойства.
Добавляем в программу пользовательскую функцию Change_din_sv , и вызываем ее используя в качестве имени динамического свойства « sv1 », а в качестве нового значения « 350 ». См. Рис. 16.

Рис. 16. Пользовательская функция изменения динамического свойства.
Теперь, для того, чтобы поменять угол наклона выносной линии достаточно добавить две строчки:
(setq sv2 "Угол1") – создаем переменную sv2 с именем изменяемого свойства
(Change_din_sv din_bl sv2 (/ pi 2)) – меняем значения свойства на (/ pi 2).
( / pi 2 ) – угол 90 градусов в радианах.
Добавляем эти строки. См. Рис. 17.

Рис. 17. Изменение свойства «Угол1».
Нажимаем кнопку « Загрузить активное окно редактора ».
Затем на кнопку «Активизация AutoCAD».
Вводим в командной строке: Udim2 и нажмите < Enter >.
На запрос « Выберите блок : » — Укажите блок куба.
На следующий запрос « Выберите блок : » – нажмите < Esc >.
Программа нарисует выноску. См. Рис. 18.

Рис. 18. Угол выносной линии изменился.
Мы видим, что значения динамических свойств ( Расстояние1 и Угол1 ) изменились.
Но в каждом конкретном случаи, мы заранее не знаем какие значения динамических свойств лучше задать. Поэтому попросим сделать это пользователя. Пусть, после указания блока базовая точка, прикрепляется к блоку сама, а точку « 1 » пользователь указывает сам.
Попросим пользователя указать точку « 1 », при помощи функции getpoint :
(setq p1 (getpoint po "\nУкажите выносную линию: "))
Значения сохраним в переменной p1 .
Расстояние между точками ро и р1 определим при помощи функции distance :
(setq ras (distance po p1))
Значения сохраним в переменной ras .
Угол наклона определим при помощи функции angle :
(setq ugl (angle po p1))
Значения сохраним в переменной ugl .
В функцию Change_din_sv меняющую свойства « Расстояние1 » вместо 350 вставим ras .
В функцию Change_din_sv меняющую свойства « Угол1 » вместо ( / pi 2 ) вставим ugl .
Добавим две сточки меняющие длину полки на значение 290 .
(setq sv3 "Расстояние2") (Change_din_sv din_bl sv3 290)
В результате наша программа примет следующий вид. См. Рис. 19.

Рис. 19. Запрос у пользователя значений динамический свойств.
Нажимаем кнопку « Загрузить активное окно редактора ».
Затем на кнопку « Активизация AutoCAD ».
Вводим в командной строке: Udim2 и нажмите < Enter >.
На запрос « Выберите блок : » — Укажите блок куба.
На запрос « Укажите выносную линию: » — Укажите вторую точку линии.
На запрос « Выберите блок : » — Снова укажите блок куба.
На запрос «У кажите выносную линию: » — Укажите вторую точку линии в другом месте.
На следующий запрос « Выберите блок : » – нажмите < Esc >.
Программа нарисует две выноски к одному блоку. См. Рис. 20.

Рис. 20. Значения динамический свойств указывает пользователь.
В заключение добавляем локальные переменные в список временных переменных функции defun .
Окончательный вариант программы. См. Рис. 21.

Рис. 21. Программа Udim2.lsp.
(defun c:Udim2 (/ obj vla_obj V po bl_name osm p1 ras ugl din_bl sv1 sv2 sv3) (vl-load-com) ; загружаем функции расширения ;---------------------------------------------------------------------------------------------------------- ;--------------- Функция изменения динамического свойства --------------------- ;---------------------------------------------------------------------------------------------------------- (defun Change_din_sv (din_bl sv new_value / din_sv) (setq din_sv (car (vl-remove-if-not '(lambda (x) (= (vla-get-propertyname x) sv)) (vlax-safearray->list(vlax-variant-value (vla-getdynamicblockproperties din_bl))) ); end vl-remove-if-not ); end car ); end setq (vla-put-value din_sv (vlax-make-variant new_value (vlax-variant-type (vla-get-value din_sv)))) (vla-update din_bl) ); end defun ;--------------------------------------------------------------------------------------------------------------- (while T (setq obj (car (entsel "\nВыберите блок: "))) (if (not (= obj nil)) (progn (setq vla_obj (vlax-ename->vla-object obj)) ; переводим в vla-object (setq V (vlax-ldata-get vla_obj "obem")) ; объем (setq po (vlax-ldata-get vla_obj "tochka")) ; координаты центра (setq p1 (getpoint po "\nУкажите выносную линию: ")) ; запрос точки 1 (setq ras (distance po p1)) ; определение расстояния (setq ugl (angle po p1)) ; угол наклона прямой (setq bl_name (cdr (assoc 2 (entget obj)))) ; имя блока (setq osm (getvar "osmode")) ; запоминаем привязки пользователя (setvar "osmode" 0) ; отключаем привязки (command "_insert" "Vyn" po 1 1 0 bl_name V) ; вставка блока (setq din_bl (vlax-ename->vla-object (entlast))) (setq sv1 "Расстояние1") (Change_din_sv din_bl sv1 ras) (setq sv2 "Угол1") (Change_din_sv din_bl sv2 ugl) (setq sv3 "Расстояние2") (Change_din_sv din_bl sv3 290) (setvar "osmode" osm) ; возвращает привязки пользователя );end progn ); end if ); end while ); end_defun

Скачать программу Udim2.lsp (Размер файла: 856 bytes)
На этом наш урок окончен. В нем мы рассмотрели, как из LISP-программы можно управлять свойствами динамического блока.
Пишите в комментариях:
Также пишите в комментариях:
Трудно ли было выполнить этот урок?
Если, что-то не получилось. Пишите, постараюсь помочь.
Была ли для Вас полезной информация, данная в этом уроке?
На какие вопросы программирования, Вы хотели бы, увидит ответы в следующих уроках?
Я с удовольствием отвечу на ваши вопросы.
Если вы хотите получать новости с моего сайта. Оформляйте подписку.