3.2.1. Ссылка на объект в объектной иерархии

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

    Когда вы работаете с объектами в .NET API, вы можете непосредственно сослаться на некоторые объекты, или же выполнить это посредством использования определённых пользователем переменных соответствующего типа. Чтобы ссылаться на объекты непосредственно - включайте объект в иерархию вызова.

    Например, следующий оператор присоединяет файл чертежа к базе данных текущего чертежа.Иерархия начинается с Application (приложение) и затем идёт до объекта Database включительно. Вызывается экземплярный метод AttachXref (присоединить внешнюю ссылку) объекта Database (база данных чертежа):

Код VB.Net

   1:  Dim strFName As String, strBlkName As String
   2:  Dim objId As Autodesk.AutoCAD.DatabaseServices.ObjectId 
   3:  strFName = "c:\clients\Proj 123\grid.dwg"
   4:  strBlkName = System.IO.Path.GetFileNameWithoutExtension(strFName) 
   5:  objId = Application.DocumentManager.MdiActiveDocument.Database.AttachXref(strFName, strBlkName)

Код C#

   1:  string strFName, strBlkName;
   2:  Autodesk.AutoCAD.DatabaseServices.ObjectId objId; 
   3:  strFName = "c:/clients/Proj 123/grid.dwg";
   4:  strBlkName = System.IO.Path.GetFileNameWithoutExtension(strFName); 
   5:  objId = Application.DocumentManager.MdiActiveDocument.Database.AttachXref(strFName, strBlkName);

    Для установки связи объектов посредством определённой пользователем переменной, следует определить переменную нужного типа, затем присвоить этой переменной ссылку на соответствующий объект. Например, следующий код определяет переменную (acCurDb) типа Autodesk.AutoCAD.DatabaseServices.Database и присваивает ей ссылку на базу данных текущего чертежа:

Код VB.Net

   1:  Dim acCurDb As Autodesk.AutoCAD.DatabaseServices.Database
   2:  acCurDb = Application.DocumentManager.MdiActiveDocument.Database

Код C#

  1:  Autodesk.AutoCAD.DatabaseServices.Database acCurDb;
  2:  acCurDb = Application.DocumentManager.MdiActiveDocument.Database;

    Затем следующий оператор присоединяет файл чертежа к базе данных используя для этого определённую пользователем переменную acCurDb:

Код VB.Net

   1:  Dim strFName As String, strBlkName As String
   2:  Dim objId As Autodesk.AutoCAD.DatabaseServices.ObjectId 
   3:  strFName = "c:\clients\Proj 123\grid.dwg"
   4:  strBlkName = System.IO.Path.GetFileNameWithoutExtension(strFName) 
   5:  objId = acCurDb.AttachXref(strFName, strBlkName)

Код C#

   1:  string strFName, strBlkName;
   2:  Autodesk.AutoCAD.DatabaseServices.ObjectId objId; 
   3:  strFName = "c:/clients/Proj 123/grid.dwg";
   4:  strBlkName = System.IO.Path.GetFileNameWithoutExtension(strFName); 
   5:  objId = acCurDb.AttachXref(strFName, strBlkName);

Поиск примитивов в постранстве модели (Model space)

    Следующий пример возвращае первый примитив, размещённый в пространстве модели. Подобный код может сделать то же самое и для примитивов пространства листа (Paper space). Примечательно, что все графические объекты определены как примитивы (Entity):

Код VB.NET:

   1:  Imports Autodesk.AutoCAD.Runtime
   2:  Imports Autodesk.AutoCAD.ApplicationServices
   3:  Imports Autodesk.AutoCAD.DatabaseServices
   4:   
   5:  <CommandMethod("ListEntities")> _
   6:  Public Sub ListEntities()
   7:   
   8:      '' Получение текущего документа и его базы данных, с последующим запуском транзакции
   9:      Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  10:      Dim acCurDb As Database = acDoc.Database
  11:   
  12:      Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  13:   
  14:          '' Открываем запись таблицы блоков для чтения
  15:          Dim acBlkTbl As BlockTable
  16:          acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, _
  17:          OpenMode.ForRead)
  18:   
  19:          '' Открываем запись таблицы блоков пространства модели для чтения
  20:          Dim acBlkTblRec As BlockTableRecord
  21:          acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
  22:          OpenMode.ForRead)
  23:   
  24:          Dim nCnt As Integer = 0
  25:          acDoc.Editor.WriteMessage(vbLf & "Model space objects: ")
  26:   
  27:          '' перебираем каждый объект из пространства модели и отображаем тип найденного нами объекта
  28:          For Each acObjId As ObjectId In acBlkTblRec
  29:              acDoc.Editor.WriteMessage(vbLf & acObjId.ObjectClass().DxfName)
  30:              nCnt = nCnt + 1
  31:          Next
  32:   
  33:          '' Если объекты не найдены, то отображаем следующее сообщение:
  34:          If nCnt = 0 Then
  35:              acDoc.Editor.WriteMessage(vbLf & " Объектов не найдено")
  36:          End If
  37:   
  38:          '' Завершаем нашу транзакцию
  39:      End Using
  40:  End Sub

Код C#

   1:  using Autodesk.AutoCAD.Runtime;
   2:  using Autodesk.AutoCAD.ApplicationServices;
   3:  using Autodesk.AutoCAD.DatabaseServices; 
   4:   
   5:  [CommandMethod("ListEntities")]
   6:  public static void ListEntities() {
   7:      // Получаем текущий документ с его базой данных и запускаем транзакцию
   8:      Document acDoc = Application.DocumentManager.MdiActiveDocument;
   9:      Database acCurDb = acDoc.Database;
  10:   
  11:      using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) {
  12:          // Открываем запись таблицы блоков для чтения
  13:          BlockTable acBlkTbl;
  14:          acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
  15:          OpenMode.ForRead) as BlockTable;
  16:   
  17:          // Открываем запись таблицы блоков пространства модели для чтения
  18:          BlockTableRecord acBlkTblRec;
  19:          acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
  20:          OpenMode.ForRead) as BlockTableRecord;
  21:          int nCnt = 0;
  22:          acDoc.Editor.WriteMessage("\nModel space objects: ");
  23:   
  24:          // Перебираем все объекты пространства модели и отображаем их тип
  25:          foreach (ObjectId acObjId in acBlkTblRec) {
  26:              acDoc.Editor.WriteMessage("\n" + acObjId.ObjectClass.DxfName);
  27:              nCnt = nCnt + 1;
  28:          }
  29:   
  30:          // Если объектов не найдено, отображаем следующее сообщение:
  31:          if (nCnt == 0) {
  32:              acDoc.Editor.WriteMessage("\n Объекты не найдены");
  33:          }
  34:          // Завершаем транзакцию
  35:      }
  36:  }

Код VBA / ActiveX:

  1:  Sub ListEntities()
   2:      ' Этот пример возвращает первый примитив пространства модели
   3:      On Error Resume Next
   4:      Dim entity As AcadEntity
   5:      If ThisDrawing.ModelSpace.count <> 0 Then
   6:          entity = ThisDrawing.ModelSpace.Item(0)
   7:          MsgBox(entity.ObjectName + _
   8:          " является первым примитивом пространства модели.")
   9:      Else
  10:          MsgBox("Пространство модели не содержит объектов.")
  11:      End If
  12:  End Sub


Comments