/// <summary>
/// Adds attribute references to the block reference.
/// </summary>
/// <param name="blockReference">The block reference to add to.</param>
/// <param name="attributeValues">The attribute values.</param>
/// <exception cref="System.ArgumentNullException">
/// If the BlockTableRecord is null.
/// </exception>
/// <exception cref="Autodesk.AutoCAD.Runtime.Exception">
/// If there are no active transactions.
/// </exception>
public static void AddAttributeReferences(this BlockReference blockReference, Dictionary<string, string> attributeValues)
{
if (blockReference == null)
{
throw new ArgumentNullException
("blockReference"); }
var database = blockReference.Database;
var transaction = database.TransactionManager.TopTransaction;
if (transaction == null)
{
throw new AcRx
.Exception(ErrorStatus
.NoActiveTransactions); }
var blockTableRecord = blockReference.BlockTableRecord.GetObject<BlockTableRecord>();
foreach (var objectId in blockTableRecord)
{
if (objectId.ObjectClass != GlobalAcad.AttributeDefinitionClass)
{
continue;
}
var attributeDefinition = objectId.GetObject<AttributeDefinition>();
var attributeReference
= new AttributeReference
(); attributeReference.SetDatabaseDefaults(database);
attributeReference.SetAttributeFromBlock(attributeDefinition, blockReference.BlockTransform);
if (attributeValues != null && attributeValues.ContainsKey(attributeDefinition.Tag.ToUpper()))
{
if (attributeReference.IsMTextAttribute)
{
attributeReference.MTextAttribute.Contents = attributeValues[attributeDefinition.Tag];
}
else
{
attributeReference.TextString = attributeValues[attributeDefinition.Tag];
}
if (attributeDefinition.Justify != AttachmentPoint.BaseLeft)
{
using (new WorkingDatabaseSwitcher
(database
)) {
attributeReference.AlignmentPoint = attributeDefinition.AlignmentPoint.TransformBy(blockReference.BlockTransform);
attributeReference.AdjustAlignment(database);
}
}
}
blockReference.AttributeCollection.AppendAttribute(attributeReference);
transaction.AddNewlyCreatedDBObject(attributeReference, true);
}
}
/// <summary>
/// Resets the attributes on a block reference.
/// </summary>
/// <param name="blockReference">The block reference.</param>
/// <param name="attributeDefinitions">
/// The attribute definitions to reset.
/// </param>
public static void ResetAttributes(this BlockReference blockReference, List<AttributeDefinition> attributeDefinitions)
{
if (blockReference == null)
{
throw new ArgumentNullException
("blockReference"); }
var database = blockReference.Database;
var transaction = database.TransactionManager.TopTransaction;
if (transaction == null)
{
throw new AcRx
.Exception(ErrorStatus
.NoActiveTransactions); }
var attributeValues
= new Dictionary
<string,
string>(); foreach (ObjectId objectId in blockReference.AttributeCollection)
{
if (!objectId.IsErased)
{
var attributeReference = objectId.GetObject<AttributeReference>(OpenMode.ForWrite);
attributeValues.Add(attributeReference.Tag, attributeReference.IsMTextAttribute ? attributeReference.MTextAttribute.Contents : attributeReference.TextString);
attributeReference.Erase();
}
}
foreach (var attributeDefinition in attributeDefinitions)
{
var attributeReference
= new AttributeReference
(); attributeReference.SetAttributeFromBlock(attributeDefinition, blockReference.BlockTransform);
if (attributeValues.ContainsKey(attributeDefinition.Tag))
{
if (attributeReference.IsMTextAttribute)
{
attributeReference.MTextAttribute.Contents = attributeValues[attributeDefinition.Tag];
}
else
{
attributeReference.TextString = attributeValues[attributeDefinition.Tag];
}
if (attributeDefinition.Justify != AttachmentPoint.BaseLeft)
{
using (new WorkingDatabaseSwitcher
(database
)) {
attributeReference.AlignmentPoint = attributeDefinition.AlignmentPoint.TransformBy(blockReference.BlockTransform);
attributeReference.AdjustAlignment(database);
}
}
}
blockReference.AttributeCollection.AppendAttribute(attributeReference);
transaction.AddNewlyCreatedDBObject(attributeReference, true);
}
}