Как синхронизировать блоки в автокаде
2 Вильдар
Спасибо за замечания. Разбираться с ними буду в понедельник - сегодня себе устраиваю выходной.
Hwd,
Я правлю свои посты. Удалил лапшу кода, бесполезного. Поправил замечания к твоей тулзе (в пояснении написал). И первый пост поправил, обозначил точнее проблему.
Я подумал, а как акад определяет соответствие атрибута во вхождении блока с атрибутом в описании блока.
И кажется понял. Он нумерует атрибуты и записывает это в Xdata.
Вот как это выглядит:
Здесь код 1071 и есть номер атрибута.
Например, для второго атрибута в блоке эта запись будет такой:
Такая же запись есть и у атрибута во вхождении блока.
Осталось написать функцию по нахождению AttributeDefinition по AttributeReference, на основе такой записи в Xdata.
Возможно это уже сто раз обсуждалось, но я не знал об этом. Хотя, я и не уверен, а только предполагаю.
Еще вопрос, если находить таким способом описание атрибута для анонимного блока, то лучше искать в описании анонимного блока или динамического?
И еще, что означают другие два кода 1070 и 1005? 1005 вроде как хэндл (по справке dxf), но значение 0 этому не соответствует.
. удалил бесполезный код.
И кажется понял. Он нумерует атрибуты и записывает это в Xdata.
Далеко не всегда. У меня, например, у определений атрибутов и атрибутов нет Xdata вообще. Они появляются (IMHO) только если блок динамический. Так что я бы не стал на это ориентироваться. Кроме того это всё не документировано. Так что делай выводы.
Они появляются (IMHO) только если блок динамический.
Тестировал и для простого блока, и для динамического.
А тогда, как акад это делает? Ведь при синхронизации атрибутов (команда _attsync) он должен точно определять соответствие атрибутов во вхождении блока с атрибутами в описании блока.
По порядку следования определений атрибутов и атрибутов.
Тестировал и для простого блока, и для динамического.
По порядку следования определений атрибутов и атрибутов.
Надеюсь Вы не удаляли xdata :D
А как этот блок создан?
Зашел в редактор блока, создал еще один атрибут, сохранил, вышел из редактора. Теперь xdata появились.
Надеюсь Вы не удаляли xdata smile:D
Последовательно:
1) Команда _RECTANGLE - создаю прямоугольник
2) Команда _ATTDEF - последовательно создаю определения атрибутов
3) Команда _BLOCK - создаю блок, выбрав прямоугольник и определения атрибутов.
Всё. Проверял в AutoCAD 2008, 2011, 2012
Значит дело в редакторе блоков. Он добавляет xdata.
Проверил свой рабочий блок (он создан из dwg (_insert выбрать файл)), у него тоже нет xdata :cry:
2 Вильдар
Я, пожалуй, не буду ориентироваться на XData, поскольку, как заметил Александр Ривилис - они не всегда заполнены + это не документировано. ИМХО - в определении блока каждый тэг должен иметь своё уникальное значение. Два определения атрибутов с одинаковыми значениями тэгов - это 100% путанница. Я считаю, что возможность наличия в одном определении блока двух атрибутов с одинаковым значением тэга - это баг AutoCAD. Кстати, когда редактируешь такие атрибуты у вхождения блока, второе одинаковое имя тэга подсвечивается красным цветом - AutoCAD показывает тем самым, что это неправильно. Не знаю почему Autodesk не включил программный контроль этого момента.
Я, пожалуй, не буду ориентироваться на XData
Да, это не работает.
Одинаковые тэги, это очень неправильно, согласен. Блин, у нас вся библиотека блоков сделана с одинаковыми тэгами. Это было сделано очень давно, меня еще не было. И все завязано на лиспы, которые скомпилированы в фас, фиг что сделаешь.
Одинаковые тэги, это очень неправильно, согласен. Блин, у нас вся библиотека блоков сделана с одинаковыми тэгами.
Ну. В данной ситуации я могу тебе только посочувствовать. Я вот думаю, может написать дополнительную команду, которая анализировала бы атрибуты определений блоков и убивала лишние, чтобы каждый тэг имел своё уникальное значение. Это заставит юзеров более ответственно подходить к вопросу проектирования блоков.
Не знаю почему Autodesk не включил программный контроль этого момента.
Потому что еще 20 лет назад такого запрета не было. Так что для преемственности. Правильный способ для получения соответствия AttribiteDefinition Attribute - по порядку (с учётом того, что константные атрибуты не учитываются). НО (. ) программно можно поменять порядок, так что будьте осторожны.
НО (. ) программно можно поменять порядок, так что будьте осторожны.
С учётом этого мне кажется более надёжным способом - искать соответствие по значению тэга.
С учётом этого мне кажется более надёжным способом - искать соответствие по значению тэга.
Мне так не кажется. Изменить tag для атрибута еще проще, чем порядок следования атрибутов.
Мне так не кажется. Изменить tag для атрибута еще проще, чем порядок следования атрибутов.
Другая ситуация: изначально в определении блока были атрибуты А, Б, В, Г и Д. Пользователь создал новый файл, импортировал в него это определение и создал несколько вхождений.
Через некоторое время он открыл исходный файл с определением и удалил в определении атрибуты А и В, но добавил Е и Ж. Немного подумав, юзер понимает, что зря удалил определение атрибута А и восстанавливает его ( т.о. ранее атрибут А был первым, а теперь он последний в коллекции, а следовательно и индекс у него др. ).
Теперь ему нужно обновить определение в целевом файле и выполнить синхронизацию вхождений. Определения блоков между файлами он выполнит без проблем. А дальше, если ориентироваться на индексы (порядок следования в массиве), то выйдет, что индексация атрибутов во вхождении уже не соответствует индексам атрибутов в определении (например для атрибута А).
Т.о. опираться на индексацию - не является более надёжным выбором. Поправьте меня, если я не прав.
Родная команда _attsync корректно распознаёт эту ситуацию и во вхождениях блоков не удаляются атрибуты А с их значениями - они синхронизируются с настройками нового определения атрибута А, хотя это уже др. объект (прежний был удалён). Поэтому я предполагаю, что AutoCAD не ориентируется на соответствия индексов (т.е. не факт, что индекс атрибута в определении блока 100% равен индексу атрибута во вхождении блока, если определение блока подвергалось модификации после создания этих вхождений ).
upd А синхронизация нам требуется именно потому, что определение блока было изменено. Т.о. полагаться на индекс - не лучший вариант.
Вот что у меня получилось. Синхронизация атрибутов по порядку следования (как я ее понял :D ). Смотрел на работу команды _AttSync.
Идея простая. Перебираем описания атрибутов и находим первый атрибут с таким тэгом. Далее по смыслу.
. обновил код. более рабочая версия.
Мои, гребаные, рабочие блоки у которых все атрибуты с одинаковыми тэгами, обрабатывает нормально.
Доступна новая версия BlockSync. На той же странице выложены:
Откомпилированная версия плагина для AutoCAD 2009 SP3 x86.
Полный исходный код проекта (MS Visual Studio 2010)
Исправленные ошибки:
1.Многострочные атрибуты после синхронизации не сохраняли значений
2.Для основного определения динамического блока (не его анонимные наследники) не обновлялись атрибуты во вхождениях
3. Не обновлялась геометрия в динамических блоках.
4. Во вхождениях динамических блоков позиционирование некоторых атрибутов сбрасывалось в точку 0,0.
5. Прочие мелкие ошибки.
Автор:
Изменение папки библиотек недавно использованных и избранных блоков
- На вкладке «Недавние» или «Избранное» палитры блоков нажмите «Параметры синхронизации блоков».
- В разделе «Библиотеки недавно использованных и избранных блоков» диалогового окна «Параметры синхронизации блоков» перейдите в папку облачного хранилища, в которой требуется сохранить недавно использованные и избранные блоки.
Прим.: При выборе папок для хранения библиотек блоков и последних блоков рекомендуется использовать папки поддерживаемых облачных хранилищ (Box, Dropbox и Microsoft OneDrive). Можно указать любое расположение папки, однако блоки будут доступны на различных устройствах и в веб-приложении AutoCAD только при использовании облачного хранилища.
Удаление всех блоков с вкладки «Последние» или «Избранное»
Выполните одно из следующих действий.
- Щелкните правой кнопкой мыши блок и выберите «Очистить список последних».
- Щелкните правой кнопкой мыши блок и выберите «Очистить список избранного».
Создание атрибута блока
Добавить атрибут можно разными способами, самый универсальный командой: _attdef либо в меню: Рисование/Блок/Определение атрибутов она вызывает панель определения атрибута, где можно настроить все параметры определения. Пока добавим Тэг — имя атрибута, пусть будет NUM. Жмем окей, вставляем атрибут на чертеж.
Получаем вот такой объект — Определение атрибута
Как видим в его свойствах мы можем настроить все параметры которые видели при создании блока. Впрочем в модели атрибут — бесполезен. Поэтому создадим блок test с атрибутом — num, для большей наглядности включим в наш блок еще и геометрический элемент — окружность, назовём блок — Test:
Нажимаем окей. Появляется дополнительное окно, где нас просят ввести значения атрибутов, введем — 1.
В результате получаем вхождение блока вида:
Теперь решим еще две задачи:
Просмотр последних блоков в веб-приложении AutoCAD
Добрый день.
Созданы блоки с атрибутами в одном чертеже, после этого эти блоки использованы во многих многих чертежах еще. Некоторое время назад было необходимо поменять как сам внешний вид блока, так и значение атрибутов в нем. Соответственно, хотелось бы чтобы эти блоки поменялись и в других чертежах. Можно ли этого добиться? Пробовала ставить новый блок в чертеж и нажимать кнопку "синхронизация", но не получается, блоки не обновляются.
Может быть это можно сделать макросами Autocad? Есть кто-нибудь кто может написать?
--- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
Не получается, добавляю блок, с измененным значением атрибута в чертеж со старым блоком, через DesignCenter, атрибуты на старых блоках не меняются. Через управление атрибутами пробую обновить, такая же история.
--- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
Да, нахожу новый блок через DesignCenter в том чертеже, в котором изменила его, выбираю "вставить с переопределением", он вставляется в чертеж со старыми блоками с новым значением атрибута. Потом ввожу команду _.attsync, выбираю один из старых блоков, выбираю "да"(то есть обновить атрибуты для вхождений блока"), enter --> атрибут остается со старым значением.
__________________ --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
Так значение атрибута и не будет меняться. Это значение экземпляра. В каждом экземпляре блока это значение может быть разным. Если хотите чтобы значение везде было одинаковым, надо атрибут делать постоянным, а еще лучше просто текст.
Так значение атрибута и не будет меняться. Это значение экземпляра. В каждом экземпляре блока это значение может быть разным. Если хотите чтобы значение везде было одинаковым, надо атрибут делать постоянным, а еще лучше просто текст.
То есть, если даже атрибут будет постоянный, но при его изменении в одном из определений блока, изменить его сразу во всех остальных блоках никак нельзя? Нужен именно атрибут, не текст, так как он должен попасть в файл со всеми другими блоками при извлечении данных.
на сколько я понимаю если атрибут постоянный, то везде будет одинаковым. только я не понимаю зачем такой нужен для извлечения данных
Так в диспетчере атрибутов блока как раз есть функция "обновить" для обновления нового значения атрибута во всех блоках.
на сколько я понимаю если атрибут постоянный, то везде будет одинаковым. только я не понимаю зачем такой нужен для извлечения данных
понятно
Объясню, в компании где я работаю создаются планировки магазинов в Autocad, на которых есть старые блоки оборудования с атрибутом "мощность". Они расставлены на разных планировках (чертежах). Сейчас поменялись стандарты, мощность оборудования необходимо заложить бОльшую и, соответственно, нужно во всех блоках изменить значение атрибута "мощность". Таких чертежей более 300. Атрибут попадает в извлечение данных, который формирует экселевский файл, из которого автоматически формируется таблица мощностей на магазин.
У меня стоит задача найти, как это сделать наиболее быстро, не вручную же выбирать каждый блок и менять мощность..
Я выделила все блоки (быстрым выбором) ввела эту команду, но у меня ничего не получилось. Я наверно что то не так делаю, поясните пожалуйста подробней.
вводите команду.
выбираете из списка имя блока который нужно заменить.
выбираете из списка имя блока на который нужно заменить.
twilight
Ввожу команду, нажимаю 2 раза энтер, он предлагает выбрать блок, выбираю кружочек, он открывает редактор атрибутов. Я наверно опять не то делаю
twilight
Ввожу команду, нажимаю 2 раза энтер, он предлагает выбрать блок, выбираю кружочек, он открывает редактор атрибутов. Я наверно опять не то делаю
Т.е. это все ж таки один блок с разным атрибутом. Уже легче.
Выделяете свой блок который нужно поменять,
набираете _bedit
Должен открыться блок в редакторе блоков. Меняете свой кружочек и шрифт атрибута. Сохраняете, выходите из редактора.
набираете _batman
жмете кнопку в левом верхнем углу, указываете блок, жмете кнопку в правом верхнем углу.
для одновременного назначения нескольким блокам с одинаковым именем одинаковых атрибутов следует:
1. выделить блоки
2. открыть окно свойств
3. ввести нужное значение в строку/строки свойств в разделе Атрибуты, туда, где написано "Различные"
А можно и скопировать блок с нужным значением Атрибута и вставить на нужное место несколько раз. А я использую лисп ATTRIB-COPY.lsp для назначения одинаковых текстов или значений Атрибутов.
Таааак. попробовала получилось. но теперь у меня другая загвоздка, оказывается атрибуты у этих блоков разные совершенно. Еще у меня при замене блоков сбилась нумерация. Выкладываю фото атрибута нового блока, старый и новый блок
Таааак. попробовала получилось. но теперь у меня другая загвоздка, оказывается атрибуты у этих блоков разные совершенно. Еще у меня при замене блоков сбилась нумерация. Выкладываю фото атрибута нового блока, старый и новый блок
Очень сложно понять кто на ком у вас стоял.
Например на второй и третьей картинке видно что имена блоков разные.
Вы разберитесь что у вас есть и что вам нужно. Если у вас одинаковые блоки с разными значениями атрибутов это одно, если у вас разные блоки с разными значениями атрибутов, но выглядящие одинаково это другое, если у вас сквозная нумерация по разным атрибутам разных блоков это третье.
Наверно получается сквозная нумерация по разным атрибутам разных блоков
Слуилось ужасное, у меня теперь не работает кнопка эскейп, я ей пользовалась для отмены выделения. Что делать. Это конец
Я уже перезагрузила комп и все заработало в старом режиме.
Пока перезагружала, думала что же мне все таки нужно и вот что надумала. мне нужно редактировать атрибут с сохранением старой нумерации деревьев, а потом можно отредактировать просто кружки у блока. Так вот реально ли отредактировать атрибуты с сохранением нумерации. Прикреплаю фото, они названы соответствующе
Я уже перезагрузила комп и все заработало в старом режиме.
Пока перезагружала, думала что же мне все таки нужно и вот что надумала. мне нужно редактировать атрибут с сохранением старой нумерации деревьев, а потом можно отредактировать просто кружки у блока. Так вот реально ли отредактировать атрибуты с сохранением нумерации. Прикреплаю фото, они названы соответствующе
По-моему без прыжков с лиспом - нет. При переименовании атрибута синхронизация сбросит его значения в блоках.
Нужно выгрузить атрибуты в эксель командой _attout.
После переименования и синхронизации выгрузить еще раз в другой файл. Затем, используя HANDLE как идентификатор блока заполнить таблицу новых атрибутов и загрузить ее в чертеж командой _attin
Dataextraction — получаем таблицу с данными из блока.
Один из вариантов использования атрибутов — создание спецификаций и подсчет вхождений блоков на чертеже. С версии 2011 в автокаде есть инструмент — dataextraction. Он позволяет получить таблицу в виде таблицы в автокаде, либо в виде .csv файла, который можно открыть в Excel.
Однако, настройка dataextraction процесс далеко не тривиальный. В качестве альтернативы можно использовать специализированные решения, например — автоматическую спецификацию автокад.
Копирование блока на вкладку «Избранное»
- На любой вкладке палитры «Блоки» щелкните блок правой кнопкой мыши и выберите «Копировать в избранное».
Синхронизация недавно использованных и избранных блоков
- Если вход в учетную запись на портале Autodesk Account еще не выполнен, следуйте инструкциям далее.
- Откройте палитру блоков.
- На вкладке «Последние» или «Избранные» палитры блоков нажмите «Синхронизация блоков».
- Войдите в учетную запись на портале Autodesk Account, используя адрес электронной почты или имя пользователя и пароль.
- Перейдите в папку облачного хранилища, в которой требуется сохранить недавно использованные и избранные блоки.
- Если параметр «Синхронизация блоков» не отображается на палитре «Блоки», выполните следующие действия.
Прим.: Если текущий чертеж уже содержит блоки или не выполнен вход в учетную запись на портале Autodesk Account с помощью палитры «Блоки», параметр «Синхронизация блоков» может не отображаться на палитре.
- На вкладке «Недавние» или «Избранное» палитры блоков нажмите «Параметры синхронизации блоков».
- В разделе «Библиотеки недавно использованных и избранных блоков» диалогового окна «Параметры синхронизации блоков» перейдите в папку облачного хранилища, в которой требуется сохранить недавно использованные и избранные блоки.
- В разделе «Разрешения на доступ к хранилищу» установите флажок «Запомнить имя пользователя облачного хранилища для входа на разных устройствах» (необязательно).
Прим.: Предоставляя программе AutoCAD доступ к данным облачного хранилища, вы позволяете AutoCAD сохранить ваш адрес электронной почты для входа в облачное хранилище на разных устройствах.
Добавление атрибутов к существующему блоку
В редакторе блоков копируем атрибут (если он есть, если нет, смотри выше как его создать), и меняем в свойствах копии — Тег на COMMENT, Скрытый — Да, можно добавить Подсказку и значение по умолчанию.
Закрываем редактор блока, сохраняем изменения. Логично было бы предположить что у блока появится новое свойство — комментарий, и он будет скрытым, т.е. на чертеже отображаться не будет. Однако по факту нового свойства не появилось. В чем дело?
Отображение палитры блоков
Атрибуты блока в автокаде — это текстовые переменный которые мы добавляем в блок для того чтобы хранить или выводить дополнительную информацию. Это удобно например для создания автоматических спецификаций, когда блок хранит в себе параметры реального объекта — название, наименование, производителя, комментарий, код, маркировку на чертеже, мощность и т.п.
Чтобы правильно пользоваться атрибутами необходимо понимать одну не очевидную особенность реализации этого инструмента в Автокаде. Сам блок это некоторая инструкция которая хранится в библиотечной части файла, и не видна на чертежах. А то что мы видим на чертеже это ссылка на блок — у ссылки упрощённо говоря есть четыре параметра — координаты, и название блока. Автокад видя объект ссылка на блок — берет инструкцию из библиотеки и отрисовывает экземпляр блока в указанном месте.
При чем здесь атрибуты? Атрибуты это параметры которые мы задаем в описании блока, но их значения живут только во вхождении на черетеже. Сделав это отступление перейдем к практической части.
Атрибуты блока автокад, синхронизация — команда _battman
Особенность архитектуры Автокада — определения блоков хранятся отдельно от их вхождений на чертеже. По скольку атрибут — параметрический элемент зависящий не столько от описания блока, сколько от значений во вхождении блока, то требуется дополнительная синхронизация чтобы перерисовать все атрибуты во всех вхождениях блоков. Так же нужно понимать, что все индивидуальные параметры атрибутов кроме самого значения будут сброшены (координаты, размеры текста, повороты, шрифты).
Для этого в Автокаде есть специальная команда — _battman, (набирать её нужно именно так, поскольку на русский её до последних версий автокада так и не перевели, в 2016 её можно вызвать также с помощью команды ДИСПАТБЛК).
С её помощью открывается так называемый диспетчер атрибутов, в нем сначала жмем кнопку — выбрать блок. Выбираем наш блок. И видим что в диспетчере наш новый атрибут появился. Жмем кнопку обновить. И потом ОК.
Снова смотрим в свойства блока:
Теперь у нашего блока появился новый атрибут — комментарий.
Аналогичным образом мы можем добавлять новые атрибуты к блокам.
- Редактируем блок в редакторе
- Синхронизируем вхождения блоков на чертеже с помощью команды _battman
Как редактировать блок с атрибутами
Что если мы хотим добавить еще атрибуты к блоку? И что если значения этих атрибутов нам нужно выводить только в спецификацию, а на чертеже они в общем и ни к чему, будут только мешать. Для этого перейдем в редактор блока.Тут нас ожидает небольшой сюрприз, если просто дважды кликнуть по блоку с атрибутами открывается не редактор блока, а редактор атрибутов блока.
Чтобы всё таки отредактировать блок жмем ПКМ(правая клавиша мыши) и в контекстном меню выбираем редактор блоков.
Этот момент так же надо учитывать при работе с такими блоками.
19 комментариев
Спасибо. Сначала запутался, но потом сделал.
В AutoCAD Electrical 2016 команду перевели как ДИСПАТБЛК — диспетчер атрибутов блока.
Спасибо! Именно по этому всегда запускаю оригинальные команды.
Спасибо Вам большое за автоматическую спецификацию которую Вы мне прислали по почте. Все работает. Перевел свои атрибуты блоков под эту программу и теперь легко и быстро получаю спецификацию. Сейчас дорабатываю остальные блоки. Вы мне очень сберегли время, нервы, а главное зрение. Дай Аллах вам здоровья. Привет всем из Казахстана.
Пожалуйста!
Успехов в профессиональной деятельности! Для этого и делали )
Ссылки на другие материалы:
- Возможно так же вам будет интересна тема применения полей в автокаде.
- А тут можно найти интересный скрипт который позволяет перемещать атрибуты блока у группы блоков.
Удаление блока с вкладки «Последние» или «Избранное»
Выполните одно из следующих действий.
- Щелкните правой кнопкой мыши блок и выберите «Удалить из списка последних».
- Щелкните правой кнопкой мыши блок и выберите «Удалить из списка избранного».
Читайте также: