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

04/06/2015

Программная имитация команды Burst

Команда "Burst" из Express Tools очень полезна при расчленении блока с атрибутами. В отличие от обычной команды Расчленить (Explode) она оставляет атрибуты неизменными при расчленении вставки блока.

Вот пример кода имитирующий команду Burst при помощи AutoCAD .Net API. Он сначала расчленяет блок и заменяет все определения атрибутов текстами (DBText).

Код - C#: [Выделить]
  1. [CommandMethod("EB" , CommandFlags.UsePickSet)]
  2. public  void  ExplodeBock()
  3. {
  4.     Document doc
  5.         = Application.DocumentManager.MdiActiveDocument;
  6.     Editor ed = doc.Editor;
  7.  
  8.     PromptSelectionResult psr = ed.SelectImplied();
  9.     if  (psr.Status != PromptStatus.OK)
  10.     {
  11.         ed.WriteMessage(@"Сначала выберите вставки блоков, а затем запустите команду" );
  12.  
  13.         return ;
  14.     }
  15.  
  16.     using  (SelectionSet ss = psr.Value)
  17.     {
  18.         if  (ss.Count <= 0)
  19.         {
  20.            ed.WriteMessage(@"Сначала выберите вставки блоков, а затем запустите команду" );
  21.             return ;
  22.         }
  23.  
  24.         Database db = doc.Database;
  25.         using  (Transaction tr
  26.             = db.TransactionManager.StartTransaction())
  27.         {
  28.  
  29.             ObjectId msId
  30.             = SymbolUtilityServices.GetBlockModelSpaceId(db);
  31.             BlockTableRecord ms = tr.GetObject(msId,
  32.                 OpenMode.ForWrite) as  BlockTableRecord;
  33.  
  34.             foreach  (SelectedObject selectedEnt in  ss)
  35.             {
  36.                 BlockReference blockRef = tr.GetObject(
  37.                 selectedEnt.ObjectId,
  38.                 OpenMode.ForRead) as  BlockReference;
  39.  
  40.                 if  (blockRef != null )
  41.                 {
  42.                     DBObjectCollection toAddColl
  43.                             = new  DBObjectCollection();
  44.  
  45.                     BlockTableRecord blockDef
  46.                     = tr.GetObject(
  47.                     blockRef.BlockTableRecord,
  48.                     OpenMode.ForRead) as  BlockTableRecord;
  49.  
  50.                     // Создаем текст для постоянных и видимых атрибутов
  51.                     foreach  (ObjectId entId in  blockDef)
  52.                     {
  53.                         if  (entId.ObjectClass.Name
  54.                             == "AcDbAttributeDefinition" )
  55.                         {
  56.                             AttributeDefinition attDef
  57.                             = tr.GetObject(entId,
  58.                             OpenMode.ForRead)
  59.                             as  AttributeDefinition;
  60.  
  61.                             if  ((attDef.Constant &&
  62.                                 !attDef.Invisible))
  63.                             {
  64.                                 DBText text = new  DBText();
  65.                                 text.Height = attDef.Height;
  66.  
  67.                                 text.TextString
  68.                                     = attDef.TextString;
  69.  
  70.                                 text.Position =
  71.                                 attDef.Position.TransformBy
  72.                                 (blockRef.BlockTransform);
  73.  
  74.                                 toAddColl.Add(text);
  75.                             }
  76.                         }
  77.                     }
  78.  
  79.                     // Создаем текст для непостоянных и видимых атрибутов
  80.                     foreach  (ObjectId attRefId
  81.                         in  blockRef.AttributeCollection)
  82.                     {
  83.                         AttributeReference attRef
  84.                         = tr.GetObject(attRefId,
  85.                         OpenMode.ForRead)
  86.                         as  AttributeReference;
  87.  
  88.                         if  (attRef.Invisible == false )
  89.                         {
  90.                             DBText text = new  DBText();
  91.                             text.Height = attRef.Height;
  92.  
  93.                             text.TextString
  94.                                 = attRef.TextString;
  95.  
  96.                             text.Position = attRef.Position;
  97.  
  98.                             toAddColl.Add(text);
  99.                         }
  100.                     }
  101.  
  102.                     // Получаем примитивы из вставки блока
  103.                     // Атрибуты обработаны – пропускаем их
  104.                     DBObjectCollection entityColl
  105.                     = new  DBObjectCollection();
  106.                     blockRef.Explode(entityColl);
  107.                     foreach  (Entity ent in  entityColl)
  108.                     {
  109.                         if  (! (ent is  AttributeDefinition))
  110.                         {
  111.                             toAddColl.Add(ent);
  112.                         }
  113.                     }
  114.  
  115.                     // Добавляем примитивы к Пространству Модели
  116.                     foreach  (Entity ent in  toAddColl)
  117.                     {
  118.                         ms.AppendEntity(ent);
  119.                         tr.AddNewlyCreatedDBObject
  120.                         (ent, true );
  121.                     }
  122.  
  123.                     // Удаляем вставку блока
  124.                     blockRef.UpgradeOpen();
  125.                     blockRef.Erase();
  126.  
  127.                 }
  128.  
  129.                 tr.Commit();
  130.             }
  131.         }
  132.     }
  133. }

Источник: http://adndevblog.typepad.com/autocad/2015/06/programmatically-mimic-the-burst-command.html

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=2761

Опубликовано 04.06.2015
Отредактировано 06.06.2015 в 16:00:24