Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: simson43 от 23-09-2018, 17:33:39

Название: добраться до атрибутов блока
Отправлено: simson43 от 23-09-2018, 17:33:39
накопились вопросы.. набросал некий код. вот отрывок из него(продолжение так сказать):

Код - 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
этот код вроде работает но есть один странный момент - цвет как многострочного так и однострочного меняется на белый НО!! если откатить действие то у однострочного возвращается а у многострочного нет( почему?
Название: Re: добраться до атрибутов блока
Отправлено: Александр Ривилис от 23-09-2018, 17:50:35
нужен ли здесь att.UpdateMTextAttribute для Mtext?
Не помешает, если у тебя многострочный атрибут.
поможет ли att.Oblique = 0 в случае с многострочным аттрибутом(color работает)? или нужно лезть в contents
Нужно лезть. Внутри многострочного атрибута могут быть как бы разные Oblique.
Второй foreach я не понял. Ты лезешь внутрь блока верхнего уровня и ищешь внутри него все BlockReference второго уровня, у которых меняешь атрибуты. Ты именно этого добиваешься?
Название: Re: добраться до атрибутов блока
Отправлено: simson43 от 23-09-2018, 18:00:30
Да. Внутри блока есть и аттрибуты и еще блоки в которых есть аттрибуты.
Название: Re: добраться до атрибутов блока
Отправлено: simson43 от 23-09-2018, 18:05:23
А цветов не может быть в атрибуте разных? Я не нашел как можно поменять( в автокаде самом) цвет внутри атрибута как и наклон..
Название: Re: добраться до атрибутов блока
Отправлено: Александр Ривилис от 23-09-2018, 18:15:11
А цветов не может быть в атрибуте разных?
В многострочных? Могут быть разные цвета. Код \CN; (где N-это число - номер цвета):
http://adndevblog.typepad.com/autocad/2017/09/dissecting-mtext-format-codes.html
Там же про наклон: \QN;
Название: Re: добраться до атрибутов блока
Отправлено: simson43 от 23-09-2018, 18:20:35
Это я знаю. Я про то что не смог создать блок с таким извращенным аттрибутом чтоб проверить код.
Название: Re: добраться до атрибутов блока
Отправлено: Александр Ривилис от 23-09-2018, 18:21:12
Да. Внутри блока есть и аттрибуты и еще блоки в которых есть аттрибуты.
Ну тогда у тебя совсем нелогичный код. Нужно делать рекурсивную функцию. И еще ты отрабатываешь только те динамические блоки, у которых не менялись динамические параметры. Только у них bl.DynamicBlockTableRecord == bl.BlockTableRecord
Название: Re: добраться до атрибутов блока
Отправлено: Александр Ривилис от 23-09-2018, 18:22:50
Это я знаю. Я про то что не смог создать блок с таким извращенным аттрибутом чтоб проверить код.
Ну на это мне нечего сказать... Настрой в качестве редактора мультитекста NOTEPAD.EXE и вставь этот код.
Название: Re: добраться до атрибутов блока
Отправлено: simson43 от 23-09-2018, 18:29:27
Нужно делать рекурсивную функцию.
до рекурсии еще дойдет. пока я просто попытался добраться до атрибутов блока в блоке.

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

эта строчка разве не спасает ситуацию?
if (bl.IsDynamicBlock) btid = bl.DynamicBlockTableRecord;
Название: Re: добраться до атрибутов блока
Отправлено: simson43 от 23-09-2018, 18:59:00
а вот .. как я сделаю метод рекурсивный? я же здесь в траанзакции. метод извне может работать с запущенной транзакцией?
Название: Re: добраться до атрибутов блока
Отправлено: Александр Ривилис от 23-09-2018, 19:06:18
я же здесь в траанзакции. метод извне может работать с запущенной транзакцией?
Можешь использовать TopTransaction или передавать Transaction как параметр.
Название: Re: добраться до атрибутов блока
Отправлено: simson43 от 23-09-2018, 19:08:14
ее же надо передать по ссылке будет? а ее нельзя передать по ссылке.
Название: Re: добраться до атрибутов блока
Отправлено: Александр Ривилис от 23-09-2018, 19:08:45
а что по поводу странного поведения при ctrl+Z?
Сделаешь нормальный тестовый проект для проверки - тогда и будет о чем говорить. Пока ничего определённого сказать не могу. Тут или ошибка у тебя в программе или баг AutoCAD. Кстати, а в какой версии ты проверяешь? И установлены ли все обновления?
Название: Re: добраться до атрибутов блока
Отправлено: Александр Ривилис от 23-09-2018, 19:09:15
ее же надо передать по ссылке будет? а ее нельзя передать по ссылке.
А зачем её передавать по ссылке?
Название: Re: добраться до атрибутов блока
Отправлено: Александр Ривилис от 23-09-2018, 19:09:45
эта строчка разве не спасает ситуацию?
Цитата: simson43 от 23-09-2018, 17:33:39

    if (bl.IsDynamicBlock) btid = bl.DynamicBlockTableRecord;
Нет конечно.
Название: Re: добраться до атрибутов блока
Отправлено: simson43 от 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
Название: Re: добраться до атрибутов блока
Отправлено: Александр Ривилис от 23-09-2018, 19:23:37
2108
Это "версия" автомобиля Жигули, а не AutoCAD :-)
кажется у вас и стащил эти строчки
http://adn-cis.org/forum/index.php?topic=1105.0
Это уж точно не у меня.
Название: Re: добраться до атрибутов блока
Отправлено: simson43 от 23-09-2018, 19:25:35
2018*

определенно у вас) сообщение ваше ведь.
у девушки про динамические ни слова вовсе.
как в таком случае будет верно выглядеть?
Название: Re: добраться до атрибутов блока
Отправлено: simson43 от 23-09-2018, 19:28:48
проверил на быстренько собраном простейшем динамическом блоке, поменял параметры подвигал подергал, запустил код- сработало...
я тоже усомнился.. но вроде выглядит законно. присвоил ведь динамический blocktable
а дальше тип blocktablerecord
DynamicBlockTableRecord такого типа и нет кажется...
Название: Re: добраться до атрибутов блока
Отправлено: Александр Ривилис от 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". Но внутрь этого блока в коде мы не лезем.
Название: Re: добраться до атрибутов блока
Отправлено: Александр Ривилис от 23-09-2018, 19:31:49
проверил на быстренько собраном простейшем динамическом блоке, поменял параметры подвигал подергал, запустил код- сработало...
Ты в один блок вложил модифицированный динамический блок? Тогда у него изменилось имя на "*UNNN" и ты его не обрабатывал. Так что ничего сработать не могло на том коде, который ты показывал выше.
Название: Re: добраться до атрибутов блока
Отправлено: simson43 от 23-09-2018, 19:34:24
вы как всегда правы(
Название: Re: добраться до атрибутов блока
Отправлено: Александр Ривилис от 23-09-2018, 19:35:47
вы как всегда правы(
Смотри здесь код: http://adn-cis.org/kak-najti-vse-vstavki-dinamicheskogo-bloka.html
Название: Re: добраться до атрибутов блока
Отправлено: simson43 от 23-09-2018, 20:11:13
запутался..
т е перебирая всю blocktable я не получу всех блоков?
нужно еще getanonymous смотреть?
Название: Re: добраться до атрибутов блока
Отправлено: Александр Ривилис от 23-09-2018, 20:51:15
нужно еще getanonymous смотреть?
Угу. Возможно и еще сложнее. Но я не увидел постановки задачи. Поэтому сложно что-то советовать.
Название: Re: добраться до атрибутов блока
Отправлено: simson43 от 23-09-2018, 22:31:47
да она проста... перебрать все блоки ( и блоки в блоках).. все вставки все все все и залезть в атрибут каждого
разве перебирая все оъекты в BlockTableRecord пространства я переберу не все объекты данного пространства?
где можно это почитать? где это хорошо описано?
Название: Re: добраться до атрибутов блока
Отправлено: Александр Ривилис от 23-09-2018, 22:39:56
да она проста... перебрать все блоки ( и блоки в блоках).. все вставки все все все и залезть в атрибут каждого
разве перебирая все оъекты в BlockTableRecord пространства я переберу не все объекты данного пространства?
где можно это почитать? где это хорошо описано?
Тогда всё намного проще.
1. Ты проходишь о всем BlockTableRecord в BlockTable
2. Находишь в каждом BlockTableRecord все BlockReference
3. В каждом BlockReference находишь все AttributeReference и модифицируешь их по своим правилам
Тебя не должна интересовать вложенность блоков, динамические они или нет (разве что если тебя интересуют не все блоки, а блоки с определёнными именами) так как ты всё-равно при такой схеме их обработаешь.
Никакая рекурсия не нужна.
Название: Re: добраться до атрибутов блока
Отправлено: Александр Ривилис от 23-09-2018, 23:39:18
Напоминаю про правило "Один вопрос - одна тема". Тему разделил: http://adn-cis.org/forum/index.php?topic=8745.0