21
AutoCAD .NET API / Re: Атрибут блока, входящего в мультивыноску
« Последний ответ от avc 27-01-2026, 12:37:22 »Для изменяемых атрибутов у выноски есть метод 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;
- }
Последние сообщения