добраться до атрибутов блока

Автор Тема: добраться до атрибутов блока  (Прочитано 9364 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн simson43Автор темы

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
накопились вопросы.. набросал некий код. вот отрывок из него(продолжение так сказать):

Код - C# [Выбрать]
  1. else if (tr.GetObject(obid, OpenMode.ForRead) is BlockReference bl)
  2.                             {
  3.                                 Autodesk.AutoCAD.DatabaseServices.AttributeCollection atCol = bl.AttributeCollection;
  4.                                 foreach(ObjectId atid in atCol)
  5.                                 {
  6.                                     AttributeReference att = tr.GetObject(atid, OpenMode.ForWrite) as AttributeReference;
  7.                                     if (!notObliq.Checked) att.Oblique = 0;
  8.                                     if (!notColor.Checked) att.Color = Autodesk.AutoCAD.Colors.Color.FromRgb(255, 255, 255);
  9.                                 }
  10.  
  11.                                 ObjectId btid;
  12.                                 if (bl.IsDynamicBlock) btid = bl.DynamicBlockTableRecord;
  13.                                 else btid = bl.BlockTableRecord;
  14.  
  15.                                 BlockTableRecord bt = tr.GetObject(btid, OpenMode.ForRead) as BlockTableRecord;
  16.                                 foreach(ObjectId p in bt)
  17.                                 {
  18.                                     if (tr.GetObject(p,OpenMode.ForRead) is BlockReference bl2)
  19.                                     {
  20.                                         atCol = bl2.AttributeCollection;
  21.                                         foreach (ObjectId atid in atCol)
  22.                                         {
  23.                                             AttributeReference att = tr.GetObject(atid, OpenMode.ForWrite) as AttributeReference;
  24.                                             if (!notObliq.Checked) att.Oblique = 0;
  25.                                             if (!notColor.Checked) att.Color = Autodesk.AutoCAD.Colors.Color.FromRgb(255, 255, 255);
  26.                                         }
  27.                                     }
  28.                                 }
  29.                             }

нужен ли здесь att.UpdateMTextAttribute для Mtext?
поможет ли att.Oblique = 0 в случае с многострочным аттрибутом(color работает)? или нужно лезть в contents
этот код вроде работает но есть один странный момент - цвет как многострочного так и однострочного меняется на белый НО!! если откатить действие то у однострочного возвращается а у многострочного нет( почему?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: добраться до атрибутов блока
« Ответ #1 : 23-09-2018, 17:50:35 »
нужен ли здесь att.UpdateMTextAttribute для Mtext?
Не помешает, если у тебя многострочный атрибут.
поможет ли att.Oblique = 0 в случае с многострочным аттрибутом(color работает)? или нужно лезть в contents
Нужно лезть. Внутри многострочного атрибута могут быть как бы разные Oblique.
Второй foreach я не понял. Ты лезешь внутрь блока верхнего уровня и ищешь внутри него все BlockReference второго уровня, у которых меняешь атрибуты. Ты именно этого добиваешься?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн simson43Автор темы

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: добраться до атрибутов блока
« Ответ #2 : 23-09-2018, 18:00:30 »
Да. Внутри блока есть и аттрибуты и еще блоки в которых есть аттрибуты.

Оффлайн simson43Автор темы

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: добраться до атрибутов блока
« Ответ #3 : 23-09-2018, 18:05:23 »
А цветов не может быть в атрибуте разных? Я не нашел как можно поменять( в автокаде самом) цвет внутри атрибута как и наклон..

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: добраться до атрибутов блока
« Ответ #4 : 23-09-2018, 18:15:11 »
А цветов не может быть в атрибуте разных?
В многострочных? Могут быть разные цвета. Код \CN; (где N-это число - номер цвета):
http://adndevblog.typepad.com/autocad/2017/09/dissecting-mtext-format-codes.html
Там же про наклон: \QN;
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн simson43Автор темы

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: добраться до атрибутов блока
« Ответ #5 : 23-09-2018, 18:20:35 »
Это я знаю. Я про то что не смог создать блок с таким извращенным аттрибутом чтоб проверить код.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: добраться до атрибутов блока
« Ответ #6 : 23-09-2018, 18:21:12 »
Да. Внутри блока есть и аттрибуты и еще блоки в которых есть аттрибуты.
Ну тогда у тебя совсем нелогичный код. Нужно делать рекурсивную функцию. И еще ты отрабатываешь только те динамические блоки, у которых не менялись динамические параметры. Только у них bl.DynamicBlockTableRecord == bl.BlockTableRecord
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: добраться до атрибутов блока
« Ответ #7 : 23-09-2018, 18:22:50 »
Это я знаю. Я про то что не смог создать блок с таким извращенным аттрибутом чтоб проверить код.
Ну на это мне нечего сказать... Настрой в качестве редактора мультитекста NOTEPAD.EXE и вставь этот код.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн simson43Автор темы

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: добраться до атрибутов блока
« Ответ #8 : 23-09-2018, 18:29:27 »
Нужно делать рекурсивную функцию.
до рекурсии еще дойдет. пока я просто попытался добраться до атрибутов блока в блоке.

а что по поводу странного поведения при ctrl+Z?

эта строчка разве не спасает ситуацию?
if (bl.IsDynamicBlock) btid = bl.DynamicBlockTableRecord;

Оффлайн simson43Автор темы

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: добраться до атрибутов блока
« Ответ #9 : 23-09-2018, 18:59:00 »
а вот .. как я сделаю метод рекурсивный? я же здесь в траанзакции. метод извне может работать с запущенной транзакцией?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: добраться до атрибутов блока
« Ответ #10 : 23-09-2018, 19:06:18 »
я же здесь в траанзакции. метод извне может работать с запущенной транзакцией?
Можешь использовать TopTransaction или передавать Transaction как параметр.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн simson43Автор темы

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: добраться до атрибутов блока
« Ответ #11 : 23-09-2018, 19:08:14 »
ее же надо передать по ссылке будет? а ее нельзя передать по ссылке.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: добраться до атрибутов блока
« Ответ #12 : 23-09-2018, 19:08:45 »
а что по поводу странного поведения при ctrl+Z?
Сделаешь нормальный тестовый проект для проверки - тогда и будет о чем говорить. Пока ничего определённого сказать не могу. Тут или ошибка у тебя в программе или баг AutoCAD. Кстати, а в какой версии ты проверяешь? И установлены ли все обновления?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: добраться до атрибутов блока
« Ответ #13 : 23-09-2018, 19:09:15 »
ее же надо передать по ссылке будет? а ее нельзя передать по ссылке.
А зачем её передавать по ссылке?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: добраться до атрибутов блока
« Ответ #14 : 23-09-2018, 19:09:45 »
эта строчка разве не спасает ситуацию?
Цитата: simson43 от 23-09-2018, 17:33:39

    if (bl.IsDynamicBlock) btid = bl.DynamicBlockTableRecord;
Нет конечно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн simson43Автор темы

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: добраться до атрибутов блока
« Ответ #15 : 23-09-2018, 19:19:50 »
Цитата: simson43 от 23-09-2018, 19:08:14
ее же надо передать по ссылке будет? а ее нельзя передать по ссылке.
А зачем её передавать по ссылке?
и то верно!
в таком виде работает
Код - C# [Выбрать]
  1. public void FormatAttributeBlocks(ref BlockReference myBlock, Transaction myTransaction)

Кстати, а в какой версии ты проверяешь?
2108

Цитата: simson43 от 23-09-2018, 18:29:27
эта строчка разве не спасает ситуацию?
Цитата: simson43 от 23-09-2018, 17:33:39

    if (bl.IsDynamicBlock) btid = bl.DynamicBlockTableRecord;
Нет конечно.

кажется у вас и стащил эти строчки
http://adn-cis.org/forum/index.php?topic=1105.0

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: добраться до атрибутов блока
« Ответ #16 : 23-09-2018, 19:23:37 »
2108
Это "версия" автомобиля Жигули, а не AutoCAD :-)
кажется у вас и стащил эти строчки
http://adn-cis.org/forum/index.php?topic=1105.0
Это уж точно не у меня.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн simson43Автор темы

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: добраться до атрибутов блока
« Ответ #17 : 23-09-2018, 19:25:35 »
2018*

определенно у вас) сообщение ваше ведь.
у девушки про динамические ни слова вовсе.
как в таком случае будет верно выглядеть?

Оффлайн simson43Автор темы

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: добраться до атрибутов блока
« Ответ #18 : 23-09-2018, 19:28:48 »
проверил на быстренько собраном простейшем динамическом блоке, поменял параметры подвигал подергал, запустил код- сработало...
я тоже усомнился.. но вроде выглядит законно. присвоил ведь динамический blocktable
а дальше тип blocktablerecord
DynamicBlockTableRecord такого типа и нет кажется...

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: добраться до атрибутов блока
« Ответ #19 : 23-09-2018, 19:29:06 »
определенно у вас) сообщение ваше ведь.
у девушки про динамические ни слова вовсе.
как в таком случае будет верно выглядеть?
Ты про это: http://adn-cis.org/forum/index.php?topic=1105.msg6224#msg6224 ???
Обрати внимание для чего используется там:
Код - C# [Выбрать]
  1.               AcDb.ObjectId idBtr;
  2.               if (bRef.IsDynamicBlock)  idBtr = bRef.DynamicBlockTableRecord;
  3.                             else        idBtr = bRef.BlockTableRecord;
Только (!!!) для получения имени блока, чтобы для динамического блока не получить имя "*UNNN" вместо имени "SHTAMP". Но внутрь этого блока в коде мы не лезем.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: добраться до атрибутов блока
« Ответ #20 : 23-09-2018, 19:31:49 »
проверил на быстренько собраном простейшем динамическом блоке, поменял параметры подвигал подергал, запустил код- сработало...
Ты в один блок вложил модифицированный динамический блок? Тогда у него изменилось имя на "*UNNN" и ты его не обрабатывал. Так что ничего сработать не могло на том коде, который ты показывал выше.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн simson43Автор темы

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: добраться до атрибутов блока
« Ответ #21 : 23-09-2018, 19:34:24 »
вы как всегда правы(

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: добраться до атрибутов блока
« Ответ #22 : 23-09-2018, 19:35:47 »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн simson43Автор темы

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: добраться до атрибутов блока
« Ответ #23 : 23-09-2018, 20:11:13 »
запутался..
т е перебирая всю blocktable я не получу всех блоков?
нужно еще getanonymous смотреть?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: добраться до атрибутов блока
« Ответ #24 : 23-09-2018, 20:51:15 »
нужно еще getanonymous смотреть?
Угу. Возможно и еще сложнее. Но я не увидел постановки задачи. Поэтому сложно что-то советовать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн simson43Автор темы

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Re: добраться до атрибутов блока
« Ответ #25 : 23-09-2018, 22:31:47 »
да она проста... перебрать все блоки ( и блоки в блоках).. все вставки все все все и залезть в атрибут каждого
разве перебирая все оъекты в BlockTableRecord пространства я переберу не все объекты данного пространства?
где можно это почитать? где это хорошо описано?

Отмечено как Решение simson43 23-09-2018, 22:50:12

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: добраться до атрибутов блока
« Ответ #26 : 23-09-2018, 22:39:56 »
да она проста... перебрать все блоки ( и блоки в блоках).. все вставки все все все и залезть в атрибут каждого
разве перебирая все оъекты в BlockTableRecord пространства я переберу не все объекты данного пространства?
где можно это почитать? где это хорошо описано?
Тогда всё намного проще.
1. Ты проходишь о всем BlockTableRecord в BlockTable
2. Находишь в каждом BlockTableRecord все BlockReference
3. В каждом BlockReference находишь все AttributeReference и модифицируешь их по своим правилам
Тебя не должна интересовать вложенность блоков, динамические они или нет (разве что если тебя интересуют не все блоки, а блоки с определёнными именами) так как ты всё-равно при такой схеме их обработаешь.
Никакая рекурсия не нужна.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: добраться до атрибутов блока
« Ответ #27 : 23-09-2018, 23:39:18 »
Напоминаю про правило "Один вопрос - одна тема". Тему разделил: http://adn-cis.org/forum/index.php?topic=8745.0
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение