/// <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;
}