3.3.4. Удаление объекта из коллекции

Источник здесь. [перевод не проверен];[перевёл Андрей Бушман]

    Члены коллекции могут быть удалени из неё с помощью экземплярного метода Erase (уничтожить) объекта, подлежащего удалению. Например, приведённый ниже код демонстрирует удаление слоя "MyLayer" из объекта LayerTable (таблица слоёв).
    Прежде чем вы приступите к удалению слоя из чертежа, необходимо убедиться в том, что данный слой действительно может быть безопасно удалён. Для определения того, может ли именованный объект, такой как блок или текстовый стиль быть удалённым, вам следует использовать метод Purge (очищение). Для получения большей информации о методе Purge, смотрите Удаление именованных объектов, на которые отсутствуют ссылки.

Код VB.NET

   1:  Imports Autodesk.AutoCAD.Runtime
   2:  Imports Autodesk.AutoCAD.ApplicationServices
   3:  Imports Autodesk.AutoCAD.DatabaseServices 
   4:   
   5:  <CommandMethod("RemoveMyLayer")> _
   6:  Public Sub RemoveMyLayer()
   7:   
   8:    '' Получаем таблицу слоёв базы данных текущего документа и запускаем транзакцию
   9:   
  10:    Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  11:    Dim acCurDb As Database = acDoc.Database 
  12:    Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  13:   
  14:   
  15:        '' Получаем таблицу слоёв базы данных текущего чертежа
  16:        Dim acLyrTbl As LayerTable
  17:        acLyrTbl = acTrans.GetObject(acCurDb.LayerTableId, _
  18:                                     OpenMode.ForRead) 
  19:   
  20:        '' Проверяем, имеется ли слой с именем "MyLayer" в таблице слоёв
  21:        If acLyrTbl.Has("MyLayer") = True Then
  22:            Dim acLyrTblRec As LayerTableRecord
  23:            acLyrTblRec = acTrans.GetObject(acLyrTbl("MyLayer"), _
  24:                                            OpenMode.ForWrite)
  25:            Try
  26:   
  27:                acLyrTblRec.Erase()
  28:                acDoc.Editor.WriteMessage(vbLf & "'MyLayer' был удалён") 
  29:   
  30:                '' Фиксируем произведённые изменения
  31:                acTrans.Commit()
  32:            Catch
  33:                acDoc.Editor.WriteMessage(vbLf & "'MyLayer' не удалось стереть")
  34:            End Try
  35:        Else
  36:            acDoc.Editor.WriteMessage(vbLf & "'MyLayer' не существует")
  37:        End If
  38:   
  39:        '' Здесь происходит уничтожение объекта транзакции
  40:    End Using
  41:  End Sub

Код C#

   1:  using Autodesk.AutoCAD.Runtime;
   2:  using Autodesk.AutoCAD.ApplicationServices;
   3:  using Autodesk.AutoCAD.DatabaseServices; 
   4:   
   5:  [CommandMethod("RemoveMyLayer")]
   6:  public static void RemoveMyLayer()
   7:  {
   8:    // Получаем таблицу слоёв базы данных текущего документа и запускаем транзакцию
   9:    Document acDoc = Application.DocumentManager.MdiActiveDocument;
  10:    Database acCurDb = acDoc.Database;
  11:    using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  12:    {
  13:        // Получаем таблицу слоёв базы данных текущего чертежа
  14:        LayerTable acLyrTbl;
  15:        acLyrTbl = acTrans.GetObject(acCurDb.LayerTableId,
  16:                                     OpenMode.ForRead) as LayerTable; 
  17:   
  18:        // Проверяем, имеется ли слой с именем "MyLayer" в таблице слоёв
  19:        if (acLyrTbl.Has("MyLayer") == true)
  20:        {
  21:            LayerTableRecord acLyrTblRec;
  22:            acLyrTblRec = acTrans.GetObject(acLyrTbl["MyLayer"],
  23:                                            OpenMode.ForWrite) as LayerTableRecord;
  24:            try
  25:            {
  26:                acLyrTblRec.Erase();
  27:                acDoc.Editor.WriteMessage("\n'MyLayer' был уничтожен"); 
  28:                // Фиксируем произведённые изменения
  29:                acTrans.Commit();
  30:            }
  31:            catch
  32:            {
  33:                acDoc.Editor.WriteMessage("\n'MyLayer' не удалось уничтожить");
  34:            }
  35:        }
  36:        else
  37:        {
  38:            acDoc.Editor.WriteMessage("\n'MyLayer' не существует");
  39:        }
  40:        // Здесь происходит уничтожение объекта транзакции
  41:    }
  42:  }

Код VBA / ActiveX

   1:  Sub RemoveMyLayer()
   2:    On Error Resume Next
   3:   
   4:    '' Получаем слой "MyLayer" из коллекции слоёв (Layers collection)
   5:    Dim ABCLayer As AcadLayer
   6:    Set ABCLayer = ThisDrawing.Layers.Item("MyLayer") 
   7:   
   8:    '' Проверяем наличие ошибки, если ошибки не происходит, значит слой существует
   9:    If Err = 0 Then 
  10:   
  11:      '' Удаляем слой
  12:      ABCLayer.Delete 
  13:   
  14:      '' Очищаем информацию об ошибке
  15:   
  16:      Err.Clear 
  17:   
  18:      ''Снова получаем слой. Если он не найден, то и удалить его не удастся 
  19:      Set ABCLayer = ThisDrawing.Layers.Item("MyLayer") 
  20:   
  21:      '' Проверяем наличие ошибки, если ошибка имеется - значит слой был удалён
  22:      If Err <> 0 Then
  23:        ThisDrawing.Utility.prompt "'MyLayer' был уничтожен"
  24:      Else
  25:        ThisDrawing.Utility.prompt "'MyLayer' не удалось уничтожить"
  26:      End If
  27:    Else
  28:      ThisDrawing.Utility.prompt "'MyLayer' не существует"
  29:    End If
  30:  End Sub

    Удалив объект один раз, вы уже не должны пытаться получить доступ к нему снова позднее, иначе произойдёт ошибка выполнения программы. Выше приведённые примеры демонстрируют, что прежде чем повторно получить доступ к объекту - необходимо проверить его на предмет существования. Если существует вероятность того, что объект мог быть удалён - вам следует проверить его существование с помощью метода Has, или же использовать блок try, обрабатывая в следующем за ним блоке catch любые исключения, которые могут произойти. Для получения большей информации по обработке исключений, читайте Обработка ошибок.


Comments