Перевод атрибута блока на другой слой

Автор Тема: Перевод атрибута блока на другой слой  (Прочитано 13120 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Константин СоковАвтор темы

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Всем добрый день. Как средствами .Net найти в чертеже блок по его имени и заданному значению атрибута и перевести этот атрибут на другой слой? никак не найду в справке :(

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Насколько я понял, речь идёт о вхождении блока. Думаю, что запрашиваемая тобой операция, в данном контексте, не имеет смысла, т. к. очередной вызов команды _battman для определения этого блока всё равно сбросит это изменение и приведёт все свои вхождения к "единому знаменателю".

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А ты думаешь, что в справке это должно быть? Наивный!
Теперь по поводу алгоритма:
1. Открываешь таблицу блоков (BlockTable)
2. Находишь в таблице блоков блок (BlockTableRecord) с заданным именем.
3. Используя метод BlockTableRecord.GetBlockReferenceIds получаешь все ObjectId вставленных блоков.
4. Если блок динамический, то нужно еще воспользоваться методом BlockTableRecord.GetAnonymousBlockIds для получения ObjectId всех связанных с ним BlockTableRecord и снова к пункту 3.
5. Теперь проходим по всем вставкам блоков (BlockReference), находим их атрибуты и меняем у нужных слой (возможно слой нужно предварительно создать).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Теперь по поводу алгоритма:
а затем, когда закончите велосипедостроение, читайте #1. :)

P.S. можете "ручками" проверить моё утверждение, дабы зря не писать код (проверка займёт около минуты).

Оффлайн Константин СоковАвтор темы

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
очередной вызов команды _battman
Такового не предполагается, чертеж небольшой, слой атрибутам назначается один раз навеки (непечатаемый/непечатаемый, и всего лишь)

Как найти нужный атрибут разобрался
и меняем у нужных слой
С этим-то и проблемы :-[. Как поменять слой у объекта?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Используй свойство Entity.Layer или Entity.LayerId
« Последнее редактирование: 21-01-2014, 17:27:40 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Такового не предполагается
Я бы не надеялся на это... Например: многие мои пользователи (и не только мои) нередко используют эту команду... Так что от обозначенной выше ситуации ты не застрахован - команду _battman в твоём чертеже могут запустить помимо твоего желания, а промахнуться мышкой по определению блока - "святое дело".
слой атрибутам назначается один раз навеки (непечатаемый/непечатаемый, и всего лишь)
А по какой причине ты хочешь менять слой для атрибутов вхождений блоков? Если одни и те же атрибуты у всех вхождений блока должны размещаться на одних и тех же нужных тебе слоях, то проще и правильней назначить атрибутом нужные слои всего один раз - в определении блока. В этом случае тебе _battman будет не страшен, и даже будет "работать на тебя".

Цитата: Константин Соков
найти в чертеже блок по его имени и заданному значению атрибута
Можешь озвучить задачу, для которой ты хочешь создать такое решение? Такой пример поможет мне убедиться в том, что мы с тобой говорим "на одном языке".

P.S. Я надеюсь, что ты понимаешь, в чём разница между вхождением блока и его определением, а то мало ли... :)
« Последнее редактирование: 21-01-2014, 21:11:17 от Андрей Бушман »

Оффлайн Константин СоковАвтор темы

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Дело в том что эти атрибуты используются для нумерации цепей. Если в одной вставке блока атрибут с определенным тэгом (например 7, на картинке) не нужен для отображения при печати, то в другой вставке, того же (определения) блока, он понадобится. Почему бы вообще не оставить этот атрибут (с тэгом 7) пустым? Потому что по значениям этих атрибутов будет заполняться  таблица следующим образом, по этой картинке мне нужно сделать такие записи:

3014     Х301:7       Х301:4
             Х301:4       Х2-2:33а

3027     Х302:7       Х2-2:33б

Поэтому я решил некоторые из этих атрибутов переводить в непечатаемый слой, чтобы их не было видно на бумаге, но при этом можно было полноценно заполнить таблицу (средствами .Net)
P.S. Если можно сделать то же самое (заполнить таблицу, не потеряв узлов цепей) как-то по-другому - посоветуйте.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Лично мне такое решение кажется вполне приемлимым. Допустим пользователь запустит _BATTMAN и атрибуты восстановятся и перенесутся на старый слой. Ну и что? Ну на печать попадут лишние атрибуты - это заметят, запустят твою программу повторно и всё будет нормально. Кроме того можно еще этому слою присвоить цвет отличный от цвета слоя атрибута по-умолчанию. В этом случае после _BATTMAN изменение слоя атрибута будет заметно сразу.
Есть еще один способ вместо изменения слоя атрибута - задание атрибуту свойства видимости (Entity.Visible в false). Т.е. атрибут есть, он непустой, в таблицу попадёт, но на экране невидим и на печать не попадёт. _BATTMAN возможно (не проверял) восстановит его видимость, но это сразу будет заметно. Не путай с AttributeReference.Invisible - это разные свойства.

Кстати, думаю Андрей Бушман имел в виду не _BATTMAN, а _ATTSYNC
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Поэтому я решил некоторые из этих атрибутов переводить в непечатаемый слой, чтобы их не было видно на бумаге, но при этом можно было полноценно заполнить таблицу (средствами .Net)
P.S. Если можно сделать то же самое (заполнить таблицу, не потеряв узлов цепей) как-то по-другому - посоветуйте.
Обозначенную тобой задачу можно решить штатными средствами AutoCAD: создать динамический блок с переключателем видимости интересующего тебя атрибута.

Цитата: Александр Ривилис
Кстати, думаю Андрей Бушман имел в виду не _BATTMAN, а _ATTSYNC
Нет, я имел в виду именно то, о чём писал :):
Цитата: AutoCAD documentation
This command controls all attribute properties and settings of a selected block definition. Any changes to the attributes in a block definition are reflected in the block references.
Если мне не изменяет память, то _attsync в указанной ситуации не синхронизирует слой атрибута вхождения со слоем атрибутом определения (но на всякий случай нужно проверить). Сам сейчас проверить не могу, т.к. в данный момент пишу ответ из под Linux.

Цитата: Александр Ривилис
Есть еще один способ вместо изменения слоя атрибута - задание атрибуту свойства видимости (Entity.Visible в false). Т.е. атрибут есть, он непустой, в таблицу попадёт, но на экране невидим и на печать не попадёт. _BATTMAN возможно (не проверял) восстановит его видимость, но это сразу будет заметно.
Об этом варианте я даже как-то и не вспомнил. Однако нужно проверить, как его обработают _battman и _attsync.

Цитата: Александр Ривилис
Лично мне такое решение кажется вполне приемлимым. Допустим пользователь запустит _BATTMAN и атрибуты восстановятся и перенесутся на старый слой. Ну и что? Ну на печать попадут лишние атрибуты - это заметят, запустят твою программу повторно и всё будет нормально.
Баба Яга против (с). Практика показывает, что зачастую пользователи не рассматривают то, что они распечатали. Подобные казусы, как правило, обнаруживает либо нормоконтролёр, либо заказчик. Я это отлично знаю, поскольку работаю в одном кабинете с нормоконтролёрами. Например, не так давно, на проверку поступил чертёж, в ведомости листов которого значилась запись: "я в депрессии". Причём лист был подписан несколькими людьми, якобы проверявшими его. А вы говорите "заметят... перепечатают..." - я бы не стал на это сильно надеяться. Помимо этого, "печать в ведро" - сие не есть гуд и нередко обходится организации в существенную "копеечку".

Оффлайн Константин СоковАвтор темы

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Попробывал варианты с переводом атрибута на другой слой и с использованием Entity.Visible. Для обоих вариантов и _attsync и _battman приводит атрибуты к "заводским" настройкам (положение, слой, стиль текста и т. д.). Вариант с использованием Entity.Visible устраивает, только вот он не отображается в диспетчере атрибутов блока и палитре свойств, но это уже скорее придирки.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
А чем, собственно, не устроил вариант с динамическим блоком, обозначенный выше?

« Последнее редактирование: 22-01-2014, 13:40:47 от Андрей Бушман »

Оффлайн Константин СоковАвтор темы

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
В этом блоке уже есть параметр Видимость, им определяется количество контактов (3, 4, 9), и направление блока (право, лево), а на сколько мне известно без "велосипедоизобретательства" засунуть больше одного параметра видимости в одно определение блока пока нельзя. Может можно обойтись параметром выбора, но им я, если честно, не очень владею.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вариант с использованием Entity.Visible устраивает, только вот он не отображается в диспетчере атрибутов блока и палитре свойств, но это уже скорее придирки.
В этом и прелесть, что стандартными средствами AutoCAD пользователь не может изменить эти параметры.
Кстати, никто тебе не мешает сделать реактор (обработку события) изменения видимости твоих атрибутов, который бы препятствовал пользователю изменить их видимость. Впрочем это будет работать только если твоё приложение будет загружено.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение