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

13/11/2013

Очистка чертежа от анонимных блоков

Вопрос:
Как я могу удалить из чертежа все неименованные (и не вставленные) блоки из чертежа программно?

Ответ:
Очистить чертеж от всех неимеющих ссылок объектов можно при помощи метода PurgeAll

Вот код на VBA:

Код - VBA: [Выделить]
  1. Sub del_all()
  2.     ThisDrawing.Application.ActiveDocument.PurgeAll()
  3. End Sub

 

А вот пример на .NET (C#), который удаляет все не вставленные блоки :

Код - C#: [Выделить]
  1. [CommandMethod("ClearUnrefedBlocks")]
  2. public void ClearUnrefedBlocks()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     Editor ed = doc.Editor;
  6.     Database db = doc.Database;
  7.  
  8.     using (Transaction trans = db.TransactionManager.StartTransaction())
  9.     {
  10.         BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForWrite)
  11.             as BlockTable;
  12.  
  13.         foreach (ObjectId oid in bt)
  14.         {
  15.             BlockTableRecord btr = trans.GetObject(oid, OpenMode.ForWrite)
  16.                 as BlockTableRecord;
  17.  
  18.             if (btr.GetBlockReferenceIds(false, false).Count == 0
  19.                 && !btr.IsLayout)
  20.             {
  21.  
  22.                 btr.Erase();
  23.             }
  24.  
  25.         }
  26.  
  27.         trans.Commit();
  28.     }
  29.  
  30. }

Другой вариант – использование метода Wblock. Любые не имеющие ссылок объекты не попадут в новую базу (что сделает новую базу потенциально чище и меньше, чем исходная).

Код - C#: [Выделить]
  1. [CommandMethod("ClrDb")]
  2. public void ClearDatabase()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     Editor ed = doc.Editor;
  6.     Database db = doc.Database;
  7.     Database newDb = db.Wblock();
  8.     newDb.SaveAs(@"c:\temp\clrdb.dwg", DwgVersion.Current);
  9. }

Источник: http://adndevblog.typepad.com/autocad/2013/01/purging-anonymous-blocks-using-vba.html

Примечание переводчика: не упомянут метод, использующий Database.Purge() для идентификации объектов, на которые нет ссылок, т.е. тех которые можно безболезненно удалить.

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

Опубликовано 13.11.2013