public static int LetsMadeAnAttributeToSelectedBR(long brHandle, Document doc, string AttrName, string AttrValue)
{
int AttrCreatedCount = 0;
Database acCurDb = doc.Database;
using (DocumentLock acLckDoc = doc.LockDocument())
{
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
// Open the Block table for write
BlockTable acBlkTbl;
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForWrite) as BlockTable;
// Open the Block table record Model space for write
BlockTableRecord acBlkTblRec;
acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
//BlockReference nbr = acBlkTblRec .geto
Handle hBlock = new Handle(brHandle);
ObjectId idBlock;
BlockReference brBlock = null;
if (acCurDb.TryGetObjectId(hBlock, out idBlock))
brBlock = idBlock.GetObject(OpenMode.ForWrite) as BlockReference;
// проверяем есть ли блок с таким handle
if (brBlock == null)
return 0;
// получаем атрибуты
AttributeCollection attrC = null;
attrC = brBlock.AttributeCollection;
// проверяем есть ли атрибуты
if (attrC.Count == 0)
{
if (brBlock.IsDynamicBlock)
{
AttrCreatedCount += CreateNewAttrDynamicBlock(AttrName, AttrValue, acTrans, acBlkTbl, acBlkTblRec, brBlock);
}
else
AttrCreatedCount += CreateNewAttrSimpleBlock(AttrName, AttrValue, acTrans, acBlkTbl, acBlkTblRec, brBlock);
}
else
{
// смотрим есть ли такой атрибут
foreach (ObjectId idAtrRef in attrC)
{
// если есть, то меняем значение
using (var atrRef = idAtrRef.GetObject(OpenMode.ForWrite) as AttributeReference)
{
// если блок динамический то изменяем активные атрибуты
if (brBlock.IsDynamicBlock)
{
if (atrRef != null && atrRef.Visible)
if (ComparePrefixWithNumber(AttrName, atrRef.Tag))
{
atrRef.TextString = AttrValue;
AttrCreatedCount++;
}
}
else
// если обычный, то просто изменяем атрибут
{
if (atrRef != null)
if (ComparePrefixWithNumber(AttrName, atrRef.Tag))
{
atrRef.TextString = AttrValue;
AttrCreatedCount++;
}
}
} // using
}
// если атрибуты есть, но нет атрибута с таким именем то создаем атрибут
if (AttrCreatedCount == 0)
{
if (brBlock.IsDynamicBlock)
{
// создаем список атрибутов, которые есть у блока и совпадающие с префиксом
List<string> AttrNames = new List<string>();
foreach (ObjectId idAtrRef in attrC)
{
using (var atrRef = idAtrRef.GetObject(OpenMode.ForWrite) as AttributeReference)
{
if (atrRef != null)
if (ComparePrefixWithNumber(AttrName, atrRef.Tag))
AttrNames.Add(atrRef.TextString);
}
}
// новое имя атрибута
string NewAttrName = AttrName;
// если атрибуты есть, но не видимые, то добавляем постфикс следующее число
if (AttrNames.Count > 0)
NewAttrName = AttrName + NextAttrName(AttrNames);
// надо создать атрибуты для динамического блока
AttrCreatedCount += CreateNewAttrDynamicBlock(NewAttrName, AttrValue, acTrans, acBlkTbl, acBlkTblRec, brBlock);
}
else
//если блок обычный
AttrCreatedCount += CreateNewAttrSimpleBlock(AttrName, AttrValue, acTrans, acBlkTbl, acBlkTblRec, brBlock);
}
}
acTrans.Commit();
acTrans.Dispose();
}
}
return AttrCreatedCount;
}
private static int CreateNewAttrSimpleBlock(string AttrName, string AttrValue, Transaction acTrans, BlockTable acBlkTbl, BlockTableRecord acBlkTblRec, BlockReference brBlock)
{
int AttrCreatedCount = 0;
// создаем атрибут
using (AttributeDefinition acAttDef = new AttributeDefinition())
{
acAttDef.Position = new Point3d(0, 0, 0);
acAttDef.Invisible = false;
acAttDef.Visible = true;
acAttDef.Verifiable = false;
acAttDef.Prompt = AttrValue;
acAttDef.Tag = AttrName;
acAttDef.TextString = AttrValue;
acAttDef.Height = 5;
acAttDef.Justify = AttachmentPoint.BottomLeft;
acBlkTblRec.AppendEntity(acAttDef);
acBlkTbl.UpgradeOpen();
acBlkTbl.Add(acBlkTblRec);
AttributeReference ar = new AttributeReference();
ar.SetAttributeFromBlock(acAttDef, brBlock.BlockTransform);
brBlock.AttributeCollection.AppendAttribute(ar);
acTrans.AddNewlyCreatedDBObject(ar, true);
AttrCreatedCount++;
}
return AttrCreatedCount;
}