Преобразование единиц измерения блоков в файле
Известно, что при создании блока (ручного создания) можно указывать единицы, в которых этот блок будет вставляться: миллиметры, метры, дюймы и т.д. Это удобно, если гарантируется, что вся работа всегда выполняется на основе единственного шаблона с раз и навсегда настроенными единицами. Но бывает такое не всегда (да и за смежниками, бывает, приходится «доделывать»).
Оптимальным решением, как ни странно, будут «безразмерные» блоки. То есть те, у которых единицы — «Unitless» (в русской версии перевода не помню). С новыми блоками все понятно — достаточно контролировать это значение и стараться не допускать ошибок. А что делать со старыми, уже вставленными? Да очень просто — заменить!
Менять можно вручную, переопределяя блоки (к примеру). И этот подход более чем достаточен, если блоков 1-2. Ну, всяко не больше 10 (и то лично я уже на втором озверею). Программное решение намного более интересно.
Вариантов программы, конечно, может быть сколько угодно. Рассмотрим 2: либо обрабатывать все блоки в файле (независимо ни от чего), либо обрабатывать только указанные блоки. В набор обрабатываемых блоков может попадать несколько блоков. ТЗ составлено, приступаем к реализации.
Наиболее удобным будет применение ActiveX — код получится достаточно простым, читабельным и понятным.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
;; Вызов: (lispru-change-block-units)
( defun lispru — change — block — units ( / adoc )
;; Поставим метку начала отмены. Ну так, на всякий случай
( vla — startundomark ( setq adoc ( vla — get — activedocument ( vlax-get-acad-object ) ) ) )
;; Проходим по всем описаниям блоков документа
( vlax-for blk_def ( vla — get — blocks adoc )
;; Из обработки исключаем внешние ссылки, пространства модели и листа
( if ( and ( equal ( vla — get — islayout blk_def ) :vlax — false )
( equal ( vla — get — isxref blk_def ) :vlax — false )
;; И дополнительно исключаем блоки таблиц и размеров
( not ( wcmatch ( strcase ( vla — get — name blk_def ) ) «*D*,*T*» ) )
) ;_ end of and
( vl-catch-all-apply
( function
( lambda ( )
( vla — put — units blk_def 0 )
) ;_ end of lambda
) ;_ end of function
) ;_ end of vl-catch-all-apply
) ;_ end of if
) ;_ end of vlax-for
;; Теперь метка конца отмены
( vla — endundomark adoc )
;; Ну и «тихий» выход
( princ )
) ;_ end of defun
При обработке выбранных блоков код немного усложняется:
;; Вызов: (lispru-change-block-units-by-select)
( defun lispru — change — block — units — by — select ( / _dwgru — conv — pickset — to — list adoc selset blk_list name )
( defun fun_get — name ( ent )
;; Получение имени блока
( cond
( ( vlax-property-available-p ent ‘effectivename )
( vla — get — effectivename ent )
)
( ( vlax-property-available-p ent ‘name )
( vla — get — name ent )
)
) ;_ end of cond
) ;_ end of defun
( defun _dwgru — conv — pickset — to — list ( value / tab item )
;;; http://forum.dwg.ru/showpost.php?p=188342&postcount=21
( repeat ( setq tab nil
item ( sslength value )
) ;_ end setq
( setq tab ( cons ( ssname value ( setq item ( 1 — item ) ) ) tab ) )
) ;_ end repeat
) ;_ end defun
;; Поставим метку начала отмены. Ну так, на всякий случай
( vla — startundomark ( setq adoc ( vla — get — activedocument ( vlax-get-acad-object ) ) ) )
;; Получаем набор блоков, обрабатывая нажатие Esc
( if ( = ( type ( setq selset ( vl-catch-all-apply
( function
( lambda ( )
( ssget ‘ ( ( 0 . «INSERT» ) ) )
) ;_ end of lambda
) ;_ end of function
) ;_ end of vl-catch-all-apply
) ;_ end of setq
) ;_ end of type
‘pickset
) ;_ end of =
( progn
;; Сформируем список имен блоков, исключая дубликаты
( foreach ent
;; Преобразовываем набор в список элементов, исключая внешние ссылки.
;; Это при полностью программной обработке надо отслеживать блоки листов
;; и модели. Вручную их не выделить.
( vl-remove-if
( function
( lambda ( x )
( equal ( vla — get — isxref ( vla — item ( vla — get — blocks adoc ) ( vla — get — name x ) ) ) :vlax — true )
) ;_ end of lambda
) ;_ end of function
( mapcar ( function vlax — ename -> vla — object ) ( _dwgru — conv — pickset — to — list selset ) )
) ;_ end of vl-remove-if
( if ( not ( member ( setq name ( fun_get — name ent ) ) blk_list ) )
( setq blk_list ( cons name blk_list ) )
) ;_ end of if
) ;_ end of foreach
;; Запускаем новый цикл
( foreach blk_def
;; Из списка имен получаем список указателей на описания блоков
( mapcar
( function
( lambda ( x )
( vla — item ( vla — get — blocks adoc ) x )
) ;_ end of lambda
) ;_ end of function
blk_list
) ;_ end of mapcar
( vl-catch-all-apply
( function
( lambda ( )
( vla — put — units blk_def 0 )
) ;_ end of lambda
) ;_ end of function
) ;_ end of vl-catch-all-apply
) ;_ end of foreach
) ;_ end of progn
) ;_ end of if
;; Теперь метка конца отмены
( vla — endundomark adoc )
;; Ну и «тихий» выход
( princ )
) ;_ end of defun
У этого кода есть один, но очень серьезный недостаток: он не обрабатывает (по крайней мере на данный момент) вложенные блоки.
Конечно, будь этот код «для работы», я бы исправил эту ошибку и попытался его ускорить (ввел бы дополнительные переменные, логику бы немного поменял — особенно в части проверки на то, является ли блок внешней ссылкой. Если надо — можно обсудить. Нет — так нет.
Добавлено: можно за компанию потом еще и выполнить регенерацию чертежа. По вкусу, как говорится
Единицы вставки блока, как настроить?
Есть чертеж в который необходимо всавить файл(как блок). Во всавляемом файле установленны десятичные еденицы, единицы для вставки — дюймы. В целевом чертеже еденицы — десятичные, единицы для вставки — миллиметры(INSUNITS = 4)
Вопрос? какие необходимы настройки что бы блок вставлялся в целевой чертеж в миллиметрах без изменения INSUNITS в файле блока.
В 2005 каде, с настройками по умолчанию блок вставляется в миллиметрах
В 2006 каде, с настройками по умолчанию блок вставляется в дюймах
Какая переменная за это отвечает не могу найти.
#2 Ответ от kpblc 21 ноября 2006г. 12:16:47
Re: Единицы вставки блока, как настроить?
INSUNITSDEFSOURCE и INSUNITSDEFTARGET, возможно?
#3 Ответ от serzh 21 ноября 2006г. 12:20:38
Re: Единицы вставки блока, как настроить?
> kpblc
В том то и дело. что вставляемые файлов может быть много, и все могут быть с разными параметрами, а если INSUNITS не 0 то эти переменные вообще не действуют. У меня в 2004 2005 вообще проблем не было с этим, а в 2006 те же файлы вставляются в дюймах, причем настройки INSUNITS одинаковые
#4 Ответ от Valery Brelovsky 22 ноября 2006г. 07:39:46
- Valery Brelovsky
- Активный участник
- Откуда: Израиль / Север Израиля / Кирь
- На форуме с 3 июня 2005г.
- Сообщений: 2,359
- Спасибо: 19
Re: Единицы вставки блока, как настроить?
> serzh
Для этой ситуации должно быть, так как понял из вашего вопроса.
Вы имеете блок в дюймах и Вам нужно вставить в чертёж в миллиметрах.
В файле блока должны быть установлены единицы дюймы. В Вшем файле единицы миллиметры.
Проверти установки переменной в обоих файлах. DIMALTF должна быть равна 25,4
И где-то здесь быkа тема по единицам чертежа или что то похожее. Если найду, то сообщу в следующий раз.
#5 Ответ от Valery Brelovsky 22 ноября 2006г. 07:55:10
- Valery Brelovsky
- Активный участник
- Откуда: Израиль / Север Израиля / Кирь
- На форуме с 3 июня 2005г.
- Сообщений: 2,359
- Спасибо: 19
Re: Единицы вставки блока, как настроить?
#6 Ответ от serzh 22 ноября 2006г. 11:30:55
Re: Единицы вставки блока, как настроить?
Valery Brelovsky пишет:
Вы имеете блок в дюймах и Вам нужно вставить в чертёж в миллиметрах.
В файле блока должны быть установлены единицы дюймы. В Вшем файле единицы миллиметры.
Я имею блок в миллиметрах, а единицы вставки в нем указаны — дюймы. Для того чтобы нормально вставить блок мне нужно установить единицы вставки — миллиметры в файле блока. Но блоков очень много, библиотека содержит несколько тысяч файлов. Я работл с этой библиотекой в 2004 и 2005 автокаде, все всегда вставлялось в миллиметрах, а в 2006 вставляется в дюймах или в миллиметрах в зависимости от настройки INSUNITS в файле блока.
Вчера один мой знакомый сказал, что настройка единиц вставки (переменная INSUNITS) вообще игнорировалась в 2004 и 2005 кадах, а 2006 эту ошибку исправили. А я теперь получил вот такую проблему.
атрибуты блока, Autocad
Атрибуты блока в автокаде — это текстовые переменный которые мы добавляем в блок для того чтобы хранить или выводить дополнительную информацию. Это удобно например для создания автоматических спецификаций, когда блок хранит в себе параметры реального объекта — название, наименование, производителя, комментарий, код, маркировку на чертеже, мощность и т.п.
Чтобы правильно пользоваться атрибутами необходимо понимать одну не очевидную особенность реализации этого инструмента в Автокаде. Сам блок это некоторая инструкция которая хранится в библиотечной части файла, и не видна на чертежах. А то что мы видим на чертеже это ссылка на блок — у ссылки упрощённо говоря есть четыре параметра — координаты, и название блока. Автокад видя объект ссылка на блок — берет инструкцию из библиотеки и отрисовывает экземпляр блока в указанном месте.
При чем здесь атрибуты? Атрибуты это параметры которые мы задаем в описании блока, но их значения живут только во вхождении на черетеже. Сделав это отступление перейдем к практической части.
- Создание атрибута блока
- Как редактировать блок с атрибутами
- Добавление атрибутов к существующему блоку
- Команда _battman — синхронизация атрибутов
Создание атрибута блока

Добавить атрибут можно разными способами, самый универсальный командой: _attdef либо в меню: Рисование/Блок/Определение атрибутов она вызывает панель определения атрибута, где можно настроить все параметры определения. Пока добавим Тэг — имя атрибута, пусть будет NUM. Жмем окей, вставляем атрибут на чертеж.

Получаем вот такой объект — Определение атрибута
Как видим в его свойствах мы можем настроить все параметры которые видели при создании блока. Впрочем в модели атрибут — бесполезен. Поэтому создадим блок test с атрибутом — num, для большей наглядности включим в наш блок еще и геометрический элемент — окружность, назовём блок — Test:


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

Во первых, обратим внимание — атрибут num вроде бы как исчез, вместо него во вхождении блока отображается «1». Но, если посмотрим в свойства блока, то увидим там новую вкладку — атрибуты. И новый параметр, уже знакомый нам — NUM, со значением «1». Собственно это значение мы можем редактировать, выводя вместо единицы любое сообщение.
Теперь решим еще две задачи:
Как редактировать блок с атрибутами
Что если мы хотим добавить еще атрибуты к блоку? И что если значения этих атрибутов нам нужно выводить только в спецификацию, а на чертеже они в общем и ни к чему, будут только мешать. Для этого перейдем в редактор блока.Тут нас ожидает небольшой сюрприз, если просто дважды кликнуть по блоку с атрибутами открывается не редактор блока, а редактор атрибутов блока.

Чтобы всё таки отредактировать блок жмем ПКМ(правая клавиша мыши) и в контекстном меню выбираем редактор блоков.

Этот момент так же надо учитывать при работе с такими блоками.
Добавление атрибутов к существующему блоку
В редакторе блоков копируем атрибут (если он есть, если нет, смотри выше как его создать), и меняем в свойствах копии — Тег на COMMENT, Скрытый — Да, можно добавить Подсказку и значение по умолчанию.

Закрываем редактор блока, сохраняем изменения. Логично было бы предположить что у блока появится новое свойство — комментарий, и он будет скрытым, т.е. на чертеже отображаться не будет. Однако по факту нового свойства не появилось. В чем дело?
Атрибуты блока автокад, синхронизация — команда _battman
Особенность архитектуры Автокада — определения блоков хранятся отдельно от их вхождений на чертеже. По скольку атрибут — параметрический элемент зависящий не столько от описания блока, сколько от значений во вхождении блока, то требуется дополнительная синхронизация чтобы перерисовать все атрибуты во всех вхождениях блоков. Так же нужно понимать, что все индивидуальные параметры атрибутов кроме самого значения будут сброшены (координаты, размеры текста, повороты, шрифты).
Для этого в Автокаде есть специальная команда — _battman, (набирать её нужно именно так, поскольку на русский её до последних версий автокада так и не перевели, в 2016 её можно вызвать также с помощью команды ДИСПАТБЛК).
С её помощью открывается так называемый диспетчер атрибутов, в нем сначала жмем кнопку — выбрать блок. Выбираем наш блок. И видим что в диспетчере наш новый атрибут появился. Жмем кнопку обновить. И потом ОК.

Снова смотрим в свойства блока:

Теперь у нашего блока появился новый атрибут — комментарий.
Аналогичным образом мы можем добавлять новые атрибуты к блокам.
- Редактируем блок в редакторе
- Синхронизируем вхождения блоков на чертеже с помощью команды _battman
Dataextraction — получаем таблицу с данными из блока.
Один из вариантов использования атрибутов — создание спецификаций и подсчет вхождений блоков на чертеже. С версии 2011 в автокаде есть инструмент — dataextraction. Он позволяет получить таблицу в виде таблицы в автокаде, либо в виде .csv файла, который можно открыть в Excel.
Однако, настройка dataextraction процесс далеко не тривиальный. В качестве альтернативы можно использовать специализированные решения, например — автоматическую спецификацию автокад.
Ссылки на другие материалы:
- Возможно так же вам будет интересна тема применения полей в автокаде.
- А тут можно найти интересный скрипт который позволяет перемещать атрибуты блока у группы блоков.
- Выравнивание в Автокаде
- Растягивание в автокаде
- Аннотативность в автокаде
20 комментариев
- Уведомление: Автокад фишки, приемы и трюки. AutoCAD Tips&Tricks. — CadSupport
- Уведомление: Перемещение атрибутов блока, Автокад. — CadSupport
виктор 11.02.2016 в 16:11 Ответить
Спасибо. Сначала запутался, но потом сделал.
В AutoCAD Electrical 2016 команду перевели как ДИСПАТБЛК — диспетчер атрибутов блока.
DonJad 11.02.2016 в 16:24 Ответить
Спасибо! Именно по этому всегда запускаю оригинальные команды.
Абзал 20.04.2017 в 07:10 Ответить
Спасибо Вам большое за автоматическую спецификацию которую Вы мне прислали по почте. Все работает. Перевел свои атрибуты блоков под эту программу и теперь легко и быстро получаю спецификацию. Сейчас дорабатываю остальные блоки. Вы мне очень сберегли время, нервы, а главное зрение. Дай Аллах вам здоровья. Привет всем из Казахстана.
Изменение базовой точки определения блока
Для выбора новой базовой точки вставки определения блока используйте команду EditBasePoint.
Чтобы войти в режим редактирования компонента и использовать данную команду, необходимо сначала воспользоваться командой EditComponent.
Для изменения базовой точки определения блока или ссылки:
- Чтобы начать редактирование размещенных блоков, нажмите Изменить> Компонент> Редактировать (или введите EditComponent в командной строке).
- В диалоговом окне Редактировать компонент выберите блок, который необходимо изменить, и нажмите OK.

Чтобы выбрать сохранение или отмену изменений компонента после сеанса редактирования, воспользуйтесь командой CloseComponent вместо команды SaveComponent.
Меню: Изменить > Компонент > Редактировать базовую точку
