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