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

ADN Club => AutoCAD .NET API => Тема начата: Николай Коломоец от 16-07-2013, 15:34:50

Название: Скрытие фона под AttributeReference
Отправлено: Николай Коломоец от 16-07-2013, 15:34:50
Доброго времени суток!

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

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

Код - 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.  

Проблема в том, что программа выполняется, находит нужный атрибут, вроде меняет ему фон, но это ничего не дает. Что я забыл?
Название: Re: Скрытие фона под AttributeReference
Отправлено: ElpanovEvgeniy от 16-07-2013, 18:08:42
может "_attsync" или программный аналог?
Название: Re: Скрытие фона под AttributeReference
Отправлено: Алексей Кулик от 17-07-2013, 00:03:09
Я, к сожалению, не спец по .NET, поэтому могу только предполагать: для модифицируемого примитива не надо выполнять его принудительное обновление?
На крайний случай - сделать полную регенерацию хотя бы активного видового экрана.
Название: Re: Скрытие фона под AttributeReference
Отправлено: Александр Ривилис от 17-07-2013, 00:40:12
attrRef.MTextAttribute возвращает временную копию. Модифицируй ее и присвой attrRef.MTextAttribute
Название: Re: Скрытие фона под AttributeReference
Отправлено: Николай Коломоец от 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.  

решило проблему!  :)