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

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

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

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

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

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

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

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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь 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 видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение