ADN Open CIS
Сообщество программистов Autodesk в СНГ

29/11/2013

Как сделать невидимое определение атрибута в блоке видимым

Следующий код делает невидимые определения атрибутов в блоке видимыми, а также обновляет все вставки этого блока для того, чтобы отразить изменения в определении блока.

Код - C#: [Выделить]
  1. [CommandMethod("AttDefEdit")]
  2. static public void AttDefEdit()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     Database db = doc.Database;
  6.     Editor ed = doc.Editor;
  7.  
  8.     PromptStringOptions opts =
  9.        new PromptStringOptions("\nУкажите имя блока: ");
  10.     opts.AllowSpaces = true;
  11.  
  12.     PromptResult blockName = ed.GetString(opts);
  13.  
  14.     if (blockName.Status != PromptStatus.OK)
  15.         return;
  16.  
  17.     bool bEdited = false;
  18.  
  19.     using (Transaction tx = db.TransactionManager.StartTransaction())
  20.     {
  21.         BlockTable blockTable = tx.GetObject(db.BlockTableId,
  22.                                    OpenMode.ForRead) as BlockTable;
  23.  
  24.         if (blockTable.Has(blockName.StringResult))
  25.         {
  26.             BlockTableRecord block = tx.GetObject(
  27.                                   blockTable[blockName.StringResult],
  28.                                OpenMode.ForRead) as BlockTableRecord;
  29.  
  30.             if (block.HasAttributeDefinitions)
  31.             {
  32.                 foreach (ObjectId Id in block)
  33.                 {
  34.                     DBObject dbObj =
  35.                                   tx.GetObject(Id, OpenMode.ForRead);
  36.  
  37.                     if (dbObj is AttributeDefinition)
  38.                     {
  39.                         AttributeDefinition attDef =
  40.                                         dbObj as AttributeDefinition;
  41.  
  42.                         if (attDef.Invisible)
  43.                         {
  44.                             bEdited = true;
  45.                             attDef.UpgradeOpen();
  46.                             attDef.Invisible = false;
  47.                         }
  48.  
  49.                     }
  50.                 }
  51.             }
  52.  
  53.         }
  54.         tx.Commit();
  55.     }
  56.  
  57.     if(bEdited)
  58.         doc.SendStringToExecute("_.attsync " + "Name" + " " +
  59.                     blockName.StringResult + "\n", true, false, true);
  60. }

 

Источник: 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