Атрибут блока, входящего в мультивыноску

Автор Тема: Атрибут блока, входящего в мультивыноску  (Прочитано 85 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 55
  • Карма: 0
  • Skype: leoleo3172
День добрый всем. Автокад 2026 кто знает как добраться до атрибута блока.
Лень - двигатель прогресса.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 856
  • Карма: 170
    • Мои плагины к Автокаду
Для изменяемых атрибутов у выноски есть метод GetBlockAttribute. Для константных - просто редактируем btr блока.

Код - C# [Выбрать]
  1.     /// <summary>
  2.     /// Записать в выноску с блоком заданное значение заданного атрибута.
  3.     /// если имя атрибута пустое - атрибут должен быть единственный в блоке
  4.     /// </summary>
  5.     public static bool
  6.     SetBlockAttribute(this MLeader ml, string attTag, string value, Transaction tr, bool add = false, string separator = "")
  7.     {
  8.       if (ml is null || ml.IsErased || ml.ContentType != ContentType.BlockContent || ml.BlockContentId.IsNull)
  9.         return false;
  10.       BlockTableRecord btr = tr.GetObject(ml.BlockContentId, OpenMode.ForRead) as BlockTableRecord;
  11.       if (btr is null) return false;
  12.       ObjectId singleAtt = ObjectId.Null;
  13.       foreach (ObjectId attDefId in btr)
  14.       {
  15.         if (attDefId.IsNull || attDefId.IsErased || attDefId.ObjectClass != dbAttDef) continue;
  16.  
  17.         if (IsNullOrEmpty(attTag)) // должен быть единственный атрибут
  18.           if (singleAtt.IsNull) { singleAtt = attDefId; continue; } // запомним первый и продолжим поиски
  19.           else { singleAtt = ObjectId.Null; break; } // нашелся второй атрибут
  20.  
  21.         using AttributeReference attRef = ml.GetBlockAttribute(attDefId);
  22.         if (attRef is null) continue;
  23.         if (attTag == attRef.Tag)
  24.         {
  25.           SetText(attRef, value, add, separator);
  26.           ml.SetBlockAttribute(attDefId, attRef);
  27.           return true;
  28.         }
  29.       } // foreach
  30.  
  31.       if (IsNullOrEmpty(attTag))
  32.         if (singleAtt.IsNull) return false;
  33.         else
  34.         {
  35.           using AttributeReference attRef = ml.GetBlockAttribute(singleAtt);
  36.           SetText(attRef, value, add, separator);
  37.           ml.SetBlockAttribute(singleAtt, attRef);
  38.           return true;
  39.         }
  40.       return false;
  41.     }
  42.  
  43.  
  44.     public static void
  45.     SetText(this AttributeReference attr, string contents, bool add = false, string separator = "")
  46.     {
  47.       if (attr is null || attr.IsErased) return;
  48.       contents = Concat(add, attr.GetTextWithFieldCodes(), separator, contents);
  49.       if (contents.Contains("%<\\")) // это поле
  50.       {
  51.         Field f = new(contents, true);
  52.         f.Evaluate();
  53.         attr.SetField(f);
  54.       }
  55.       else
  56.         attr.TextString = contents;
  57.     }
  58.  
  59.  

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

  • ADN OPEN
  • **
  • Сообщений: 55
  • Карма: 0
  • Skype: leoleo3172
Спасибо. GetBlockAttribute - это то что искалось но не находилось в автокаде 2026 буду попробывать сообщу.
Лень - двигатель прогресса.