3.3.3. Итерация по коллекции объектов

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

    Для того, чтобы получить нужный элемент из коллекции, следует использовать методы Item или GetAt. Этим методам1 передаётся ключ в виде строки, который является именем2 элемента. В большинстве коллекций метод Item подразумевается по умолчанию, что означает, что вам нет необходимости вызывать его явно.
    В некоторых коллекциях вы можете так же использовать индекс, указывающий номер позиции нужного вам элемента в данной коллекции. Метод, который вы будете использовать обусловлен выбором языка программирования, на котором вы пишете код, а так же зависит от того, с какого рода коллекцией вы работаете - с символьной таблицей или со словарём.
    Следующие операторы демонстрируют, как получить доступ к слою "MyLayer" (“MyLayer” table record) из символьной таблицы слоёв (Layer symbol table).

Код VB.NET

   1:  acObjId = acLyrTbl.Item("MyLayer") 
   2:  acObjId = acLyrTbl("MyLayer")

Код C#

   1:  acObjId = acLyrTbl["MyLayer"];

Код VBA / ActiveX

   1:  acLayer = ThisDrawing.Layers.Item("MyLayer") 
   2:  acLayer = ThisDrawing.Layers("MyLayer")

Итерация по объекту LayerTable

    Следующий пример демонстрирует итерацию по объекту LayerTable, в процессе которой происходит отображение имён всех слоёв (layer table records) входящих в таблицу слоёв (LayerTable object):

Код VB.NET

   1:  Imports Autodesk.AutoCAD.Runtime
   2:  Imports Autodesk.AutoCAD.ApplicationServices
   3:  Imports Autodesk.AutoCAD.DatabaseServices 
   4:   
   5:  <CommandMethod("IterateLayers")> _
   6:  Public Sub IterateLayers()
   7:   
   8:    '' Получение текущего документа, его базы данных и запуск транзакции
   9:    Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  10:    Dim acCurDb As Database = acDoc.Database 
  11:    Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  12:   
  13:        '' Получаем таблицу слоёв базы данных текущего документа
  14:        Dim acLyrTbl As LayerTable
  15:        acLyrTbl = acTrans.GetObject(acCurDb.LayerTableId, _
  16:                                     OpenMode.ForRead)
  17:   
  18:        '' Последовательно перебираем все записи таблицы слоёв и печатаем имя каждого слоя
  19:        For Each acObjId As ObjectId In acLyrTbl
  20:            Dim acLyrTblRec As LayerTableRecord
  21:            acLyrTblRec = acTrans.GetObject(acObjId, OpenMode.ForRead)
  22:            acDoc.Editor.WriteMessage(vbLf & acLyrTblRec.Name)
  23:        Next 
  24:   
  25:        '' Здесь происходит уничтожение объекта транзакции
  26:    End Using
  27:  End Sub

Код C#

   1:  using Autodesk.AutoCAD.Runtime;
   2:  using Autodesk.AutoCAD.ApplicationServices;
   3:  using Autodesk.AutoCAD.DatabaseServices; 
   4:   
   5:  [CommandMethod("IterateLayers")]
   6:  public static void IterateLayers()
   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:        // Последовательно перебираем все записи таблицы слоёв и печатаем имя каждого слоя
  19:        foreach (ObjectId acObjId in acLyrTbl)
  20:        {
  21:            LayerTableRecord acLyrTblRec;
  22:            acLyrTblRec = acTrans.GetObject(acObjId,
  23:                                            OpenMode.ForRead) as LayerTableRecord; 
  24:            acDoc.Editor.WriteMessage("\n" + acLyrTblRec.Name);
  25:        }
  26:        // Здесь происходит уничтожение объекта транзакции
  27:    }
  28:  }

Код VBA / ActiveX

   1:  Sub IterateLayers()
   2:      ' Итерация по коллекции
   3:      On Error Resume Next 
   4:      Dim lay As AcadLayer
   5:      Dim msg As String
   6:      msg = ""
   7:      For Each lay In ThisDrawing.Layers
   8:          msg = msg + lay.Name + vbCrLf
   9:      Next 
  10:      ThisDrawing.Utility.prompt msg
  11:  End Sub

Поиск слоя "MyLayer" (layer table record) в таблице слоёв (LayerTable object)

    Следующий пример проверяет объект LayerTable на предмет наличия в нём именованного слоя "MyLayer" с последующим выводом соответствующего сообщения по результатам поиска:

Код VB.NET

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

Код C#

   1:  using Autodesk.AutoCAD.Runtime;
   2:  using Autodesk.AutoCAD.ApplicationServices;
   3:  using Autodesk.AutoCAD.DatabaseServices; 
   4:   
   5:  [CommandMethod("FindMyLayer")]
   6:  public static void FindMyLayer()
   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:            acDoc.Editor.WriteMessage("\n'MyLayer' не существует");
  22:        }
  23:        else
  24:        {
  25:            acDoc.Editor.WriteMessage("\n'MyLayer' существует");
  26:        }
  27:        // Здесь происходит уничтожение объекта транзакции
  28:    }
  29:  }

Код VBA / ActiveX

   1:  Sub FindMyLayer()
   2:      ' Используем метод Item для поиска слоя с именем "MyLayer"
   3:      On Error Resume Next
   4:      Dim ABCLayer As AcadLayer
   5:      Set ABCLayer = ThisDrawing.Layers("MyLayer")
   6:      If Err <> 0 Then
   7:          ThisDrawing.Utility.prompt "'MyLayer' не существует"
   8:      Else
   9:          ThisDrawing.Utility.prompt "'MyLayer' существует"
  10:      End If
  11:  End Sub

Примечания переводчика:
1в качестве параметра
2нужного нам

Comments