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:
ДА пробовал все работаем еще раз большое спасибо
Навигация
Перейти к полной версии