13/11/2013
Очистка чертежа от анонимных блоков
Вопрос:Как я могу удалить из чертежа все неименованные (и не вставленные) блоки из чертежа программно?
Ответ:
Очистить чертеж от всех неимеющих ссылок объектов можно при помощи метода PurgeAll
Вот код на VBA:
Код - VBA: [Выделить]
- Sub del_all()
- ThisDrawing.Application.ActiveDocument.PurgeAll()
- End Sub
А вот пример на .NET (C#), который удаляет все не вставленные блоки :
Код - C#: [Выделить]
- [CommandMethod("ClearUnrefedBlocks")]
- public void ClearUnrefedBlocks()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Editor ed = doc.Editor;
- Database db = doc.Database;
- using (Transaction trans = db.TransactionManager.StartTransaction())
- {
- BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForWrite)
- as BlockTable;
- foreach (ObjectId oid in bt)
- {
- BlockTableRecord btr = trans.GetObject(oid, OpenMode.ForWrite)
- as BlockTableRecord;
- if (btr.GetBlockReferenceIds(false, false).Count == 0
- && !btr.IsLayout)
- {
- btr.Erase();
- }
- }
- trans.Commit();
- }
- }
Другой вариант – использование метода Wblock. Любые не имеющие ссылок объекты не попадут в новую базу (что сделает новую базу потенциально чище и меньше, чем исходная).
Код - C#: [Выделить]
- [CommandMethod("ClrDb")]
- public void ClearDatabase()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Editor ed = doc.Editor;
- Database db = doc.Database;
- Database newDb = db.Wblock();
- newDb.SaveAs(@"c:\temp\clrdb.dwg", DwgVersion.Current);
- }
Источник: 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