Добрый день, Коллеги!
Давно ничего не писал под AutoCAD и тут столкнулся с такой проблемой - пытаюсь поменять атрибуты у определения блока, а затем сделать AttSync.
К AttSync вопросов нет, все работает как надо, если в AutoCAD'е поменять атрибуты у определения блока, то во всех вставках все корректно работает.
А вот корректной замены атрибутов не происходит, вернее они меняются, но когда заходишь в редактор блока, то они там все пропадают, но у вставки блока они есть. Чую, что что-то не совсем корректно работает в замене атрибутов и после этого начинаются какие-то проблемы с файлом.
public static void ChangeAttr(Document doc, string blockName, string oldValue, string NewValue)
{
Database sourceDb = doc.Database;
Editor ed = doc.Editor;
using (Transaction t = sourceDb.TransactionManager.StartTransaction())
{
// открываем таблицу блоков
BlockTable blockTable = t.GetObject(sourceDb.BlockTableId, OpenMode.ForWrite) as BlockTable;
foreach (ObjectId asObjId in blockTable)
{
BlockTableRecord ent = t.GetObject(asObjId, OpenMode.ForRead) as BlockTableRecord;
if (ent != null)
{
if (ent.Name != blockName)
continue;
ed.WriteMessage("\n Block Name" + ent.Name);
ed.WriteMessage("\n");
// теперь попробуем разобрать его атрибуты
IEnumerable<AttributeDefinition> attdefs = ent.Cast<ObjectId>()
.Where(n => n.ObjectClass.Name == "AcDbAttributeDefinition")
.Select(n => (AttributeDefinition)t.GetObject(n, OpenMode.ForWrite))
.Where(n => !n.Constant);
foreach (AttributeDefinition atDef in attdefs)
{
ed.WriteMessage("\n AttrDef Name: " + atDef.Tag + " Value: " + atDef.TextString + " Caption: " + atDef.Prompt);
ed.WriteMessage("\n");
// если атрибут совпадает, меняем его значение и подсказку
if (atDef.TextString == oldValue)
{
atDef.TextString = NewValue;
atDef.Prompt = NewValue;
}
}
}
}
t.Commit();
}
}
Ах, да забыл добавить - блок динамический.