ADN Club > AutoCAD .NET API

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

(1/1)

nolte:
День добрый всем. Автокад 2026 кто знает как добраться до атрибута блока.

avc:
Для изменяемых атрибутов у выноски есть метод GetBlockAttribute. Для константных - просто редактируем btr блока.


--- Код - C# [Выбрать] ---    /// <summary>    /// Записать в выноску с блоком заданное значение заданного атрибута.     /// если имя атрибута пустое - атрибут должен быть единственный в блоке    /// </summary>    public static bool    SetBlockAttribute(this MLeader ml, string attTag, string value, Transaction tr, bool add = false, string separator = "")    {      if (ml is null || ml.IsErased || ml.ContentType != ContentType.BlockContent || ml.BlockContentId.IsNull)        return false;      BlockTableRecord btr = tr.GetObject(ml.BlockContentId, OpenMode.ForRead) as BlockTableRecord;      if (btr is null) return false;      ObjectId singleAtt = ObjectId.Null;      foreach (ObjectId attDefId in btr)      {        if (attDefId.IsNull || attDefId.IsErased || attDefId.ObjectClass != dbAttDef) continue;         if (IsNullOrEmpty(attTag)) // должен быть единственный атрибут          if (singleAtt.IsNull) { singleAtt = attDefId; continue; } // запомним первый и продолжим поиски          else { singleAtt = ObjectId.Null; break; } // нашелся второй атрибут         using AttributeReference attRef = ml.GetBlockAttribute(attDefId);        if (attRef is null) continue;        if (attTag == attRef.Tag)        {          SetText(attRef, value, add, separator);          ml.SetBlockAttribute(attDefId, attRef);          return true;        }      } // foreach       if (IsNullOrEmpty(attTag))        if (singleAtt.IsNull) return false;        else        {          using AttributeReference attRef = ml.GetBlockAttribute(singleAtt);          SetText(attRef, value, add, separator);          ml.SetBlockAttribute(singleAtt, attRef);          return true;        }      return false;    }      public static void    SetText(this AttributeReference attr, string contents, bool add = false, string separator = "")    {      if (attr is null || attr.IsErased) return;      contents = Concat(add, attr.GetTextWithFieldCodes(), separator, contents);      if (contents.Contains("%<\\")) // это поле      {        Field f = new(contents, true);        f.Evaluate();        attr.SetField(f);      }      else        attr.TextString = contents;    }  

nolte:
Спасибо. GetBlockAttribute - это то что искалось но не находилось в автокаде 2026 буду попробывать сообщу.

nolte:
ДА пробовал все работаем еще раз большое спасибо

Навигация

[0] Главная страница сообщений

Перейти к полной версии