29/11/2013
					Как сделать невидимое определение атрибута в блоке видимым
Следующий код делает невидимые определения атрибутов в блоке видимыми, а также обновляет все вставки этого блока для того, чтобы отразить изменения в определении блока.
Код - C#: [Выделить]
- [CommandMethod("AttDefEdit")]
 - static public void AttDefEdit()
 - {
 - Document doc = Application.DocumentManager.MdiActiveDocument;
 - Database db = doc.Database;
 - Editor ed = doc.Editor;
 - PromptStringOptions opts =
 - new PromptStringOptions("\nУкажите имя блока: ");
 - opts.AllowSpaces = true;
 - PromptResult blockName = ed.GetString(opts);
 - if (blockName.Status != PromptStatus.OK)
 - return;
 - bool bEdited = false;
 - using (Transaction tx = db.TransactionManager.StartTransaction())
 - {
 - BlockTable blockTable = tx.GetObject(db.BlockTableId,
 - OpenMode.ForRead) as BlockTable;
 - if (blockTable.Has(blockName.StringResult))
 - {
 - BlockTableRecord block = tx.GetObject(
 - blockTable[blockName.StringResult],
 - OpenMode.ForRead) as BlockTableRecord;
 - if (block.HasAttributeDefinitions)
 - {
 - foreach (ObjectId Id in block)
 - {
 - DBObject dbObj =
 - tx.GetObject(Id, OpenMode.ForRead);
 - if (dbObj is AttributeDefinition)
 - {
 - AttributeDefinition attDef =
 - dbObj as AttributeDefinition;
 - if (attDef.Invisible)
 - {
 - bEdited = true;
 - attDef.UpgradeOpen();
 - attDef.Invisible = false;
 - }
 - }
 - }
 - }
 - }
 - tx.Commit();
 - }
 - if(bEdited)
 - doc.SendStringToExecute("_.attsync " + "Name" + " " +
 - blockName.StringResult + "\n", true, false, true);
 - }
 
Источник: http://adndevblog.typepad.com/autocad/2012/07/making-invisible-attribute-definition-visible.html
Примечания переводчика:
1) Метод SendStringToExecute выполняется асинхронно, т.е. будет выполнен только тогда, когда управление будет передано AutoCAD
2) Можно обойтись и без командных методов, хотя код будет несколько сложнее
Обсуждение: http://adn-cis.org/forum/index.php?topic=367
Опубликовано 29.11.2013Отредактировано 29.11.2013 в 16:09:53