Скрытие фона под AttributeReference

Автор Тема: Скрытие фона под AttributeReference  (Прочитано 9641 раз)

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

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

  • ADN Club
  • Сообщений: 16
  • Карма: 0
  • Skype: myckola_kolomoets
Доброго времени суток!

Возникла следующая проблема: решил упростить себе жизнь и одной командой скрыть фон под всеми выбранными объектами, которые в моем случае - блоки с атрибутами (многострочными).

Ниже код программы.

Код - C# [Выбрать]
  1.         // скрытие фона под выбранными пользователем вхождениями многострочных атрибутов во вставках блоков
  2.         [CommandMethod("attbackgrhide",CommandFlags.UsePickSet)]
  3.         public void HideAttributeBackground()
  4.         {
  5.             Database db = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database;
  6.             Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  7.  
  8.             PromptSelectionOptions prSelOpt = new PromptSelectionOptions();
  9.             prSelOpt.MessageForAdding = "\nВыберите объекты для скрытия фона: ";
  10.             PromptSelectionResult prSelRes = ed.GetSelection(prSelOpt);
  11.             if (prSelRes.Status == PromptStatus.OK)
  12.             {
  13.                 using (Transaction trans = db.TransactionManager.StartTransaction())
  14.                 {
  15.                     foreach (SelectedObject selObj in prSelRes.Value)
  16.                     {
  17.                         DBObject obj = trans.GetObject(selObj.ObjectId, OpenMode.ForRead);
  18.  
  19.                         if (obj is BlockReference)
  20.                         {
  21.                             BlockReference br = (BlockReference)obj;
  22.                             foreach (ObjectId attrRefObjId in br.AttributeCollection)
  23.                             {
  24.                                 AttributeReference attrRef = (AttributeReference)trans.GetObject(attrRefObjId, OpenMode.ForRead);
  25.                                 if (attrRef.IsMTextAttribute)
  26.                                 {
  27.                                     attrRef.UpgradeOpen();
  28.                                     attrRef.MTextAttribute.BackgroundFill = true;
  29.                                     attrRef.MTextAttribute.BackgroundScaleFactor = 1.1;
  30.                                     attrRef.MTextAttribute.UseBackgroundColor = true;
  31.                                 }
  32.                             }
  33.                         }
  34.  
  35.                         if (obj is MText)
  36.                         {
  37.                             MText mtxt = (MText)obj;
  38.                             mtxt.UpgradeOpen();
  39.                             mtxt.BackgroundFill = true;
  40.                             mtxt.BackgroundScaleFactor = 1.1;
  41.                             mtxt.UseBackgroundColor = true;
  42.                         }
  43.  
  44.                     }
  45.  
  46.                     trans.Commit();
  47.                 }
  48.             }
  49.         }
  50.  

Проблема в том, что программа выполняется, находит нужный атрибут, вроде меняет ему фон, но это ничего не дает. Что я забыл?

Оффлайн ElpanovEvgeniy

  • ADN
  • *
  • Сообщений: 8
  • Карма: 2
    • elpanov.com
  • Skype: ElpanovEvgeniy
Re: Скрытие фона под AttributeReference
« Ответ #1 : 16-07-2013, 18:08:42 »
может "_attsync" или программный аналог?
Тот, кто правильно указывает на мои ошибки, — мой учитель
тот, кто правильно отмечает мои верные поступки, — мой друг
тот, кто мне льстит, — мой враг.
/Сунь Цзы/

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Скрытие фона под AttributeReference
« Ответ #2 : 17-07-2013, 00:03:09 »
Я, к сожалению, не спец по .NET, поэтому могу только предполагать: для модифицируемого примитива не надо выполнять его принудительное обновление?
На крайний случай - сделать полную регенерацию хотя бы активного видового экрана.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Скрытие фона под AttributeReference
« Ответ #3 : 17-07-2013, 00:40:12 »
attrRef.MTextAttribute возвращает временную копию. Модифицируй ее и присвой attrRef.MTextAttribute
« Последнее редактирование: 29-07-2013, 21:48:08 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 16
  • Карма: 0
  • Skype: myckola_kolomoets
Re: Скрытие фона под AttributeReference
« Ответ #4 : 17-07-2013, 13:44:33 »
Спасибо всем, разобрался. Все оказалось просто в итоге - надо добавить обновление значения атрибута, именно для мультитекста:
Код - C# [Выбрать]
  1.                                 AttributeReference attrRef = (AttributeReference)trans.GetObject(attrRefObjId, OpenMode.ForRead);
  2.                                 if (attrRef.IsMTextAttribute)
  3.                                 {
  4.                                     attrRef.UpgradeOpen();
  5.                                     attrRef.MTextAttribute.BackgroundFill = true;
  6.                                     attrRef.MTextAttribute.BackgroundScaleFactor = 1.1;
  7.                                     attrRef.MTextAttribute.UseBackgroundColor = true;
  8.                                     attrRef.UpdateMTextAttribute();                              
  9.                                 }
  10.  

решило проблему!  :)
« Последнее редактирование: 29-07-2013, 21:26:40 от Александр Ривилис »