5.1.3. Открытие и закрытие объекта без использования менеджера транзакций

Источник здесь.[перевод не проверен] [переводчик: bandero]

    Транзакции облегчают открытие и работу с группой объектов, но они не единственная возможность открытия и редактирования объектов. Кроме транзакций, вы можете открывать и закрывать объекты используя методы Open и Close. Для использования метода Open вам, так же, необходимо получить идентификатор объекта (id). Как и метод GetObject используемый в транзакциях, вам нужно установить режим открытия и тип возвращаемого объекта. Если вы вносите изменения в объект после его открытия методом Open, вы должны использовать метод Cancel для отката всех изменений сделанных после его открытия. Метод Cancel нужно вызывать для каждого открытого объекта, в котором вы хотите сделать откат.

Примечание
    Объекты должны иметь спаренные операции открытия и закрытия. Если вы используете метод Open для объекта, вы должны завершить его использование одним из методов Close или Cancel. Нарушение закрытия объекта приведёт к ошибке чтения объекта и нестабильной работе AutoCAD

    Если вам нужно работать с одним объектом, использование методов Open и Close может сократить количество строк кода, по сравнению с тем, который вам иначе пришлось бы написать, работая с Менеджером Транзакции. Однако, использование транзакций является рекомендованным способом открытия и закрытия объектов.

Внимание
    Вы не должны использовать методы Open и Close когда используете транзакции,так как объекты не смогут быть открыты или закрыты Менеджером Транзакций, что приведёт AutoCAD к аварийному отказу.

Запрос объектов

    В следующем примере демонстрируется, как открыть и закрыть объекты без использования транзакции и метода GetObject. Пример использования Менеджера Транзакций, смотрите в разделе 5.1.2.1. Запуск новой транзакции (Transaction) и открытие объекта

Код VB.NET

   1:  Imports Autodesk.AutoCAD.Runtime
   2:  Imports Autodesk.AutoCAD.ApplicationServices
   3:  Imports Autodesk.AutoCAD.DatabaseServices
   4:  <CommandMethod("OpenCloseObjectId")> _
   5:  Public Sub OpenCloseObjectId()
   6:      '' Получение текущего документа и базы данных
   7:      Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
   8:      Dim acCurDb As Database = acDoc.Database
   9:      '' Открытие таблицы Блоков для чтения
  10:      Dim acBlkTbl As BlockTable
  11:      acBlkTbl = acCurDb.BlockTableId.Open(OpenMode.ForRead)
  12:      '' Открытие записи таблицы Блоков Модели для чтения
  13:      Dim acBlkTblRec As BlockTableRecord
  14:      acBlkTblRec = acBlkTbl(BlockTableRecord.ModelSpace).Open(OpenMode.ForRead)
  15:      '' Итерация по записи таблицы Блоков
  16:      For Each acObjId As ObjectId In acBlkTblRec
  17:          acDoc.Editor.WriteMessage(vbLf & "DXF name: " & acObjId.ObjectClass().DxfName)
  18:          acDoc.Editor.WriteMessage(vbLf & "ObjectID: " & acObjId.ToString())
  19:          acDoc.Editor.WriteMessage(vbLf & "Handle: " & acObjId.Handle.ToString())
  20:          acDoc.Editor.WriteMessage(vbLf)
  21:      Next
  22:      '' Закрытие записи таблицы Блоков
  23:      acBlkTblRec.Close()
  24:      acBlkTblRec.Dispose()
  25:      '' Закрытие таблицы Блоков
  26:      acBlkTbl.Close()
  27:      acBlkTbl.Dispose()
  28:  End Sub

Код C# 

   1:  using Autodesk.AutoCAD.Runtime;
   2:  using Autodesk.AutoCAD.ApplicationServices;
   3:  using Autodesk.AutoCAD.DatabaseServices; 
   4:   
   5:  [CommandMethod("OpenCloseObjectId")]
   6:  public static void OpenCloseObjectId()
   7:  {
   8:    // Получить текущий документ и его базу данных
   9:    Document acDoc = Application.DocumentManager.MdiActiveDocument;
  10:    Database acCurDb = acDoc.Database; 
  11:   
  12:    // Открыть таблицу блоков для чтения
  13:    BlockTable acBlkTbl;
  14:    acBlkTbl = acCurDb.BlockTableId.Open(OpenMode.ForRead) as BlockTable; 
  15:   
  16:    // Открыть запись таблицы блоков (ModelSpace) для чтения
  17:    BlockTableRecord acBlkTblRec;
  18:    acBlkTblRec = acBlkTbl[BlockTableRecord.ModelSpace].Open(OpenMode.ForRead) as BlockTableRecord; 
  19:   
  20:    // Итерация по записи таблицы блоков
  21:    foreach (ObjectId acObjId in acBlkTblRec)
  22:    {
  23:        acDoc.Editor.WriteMessage("\nDXF name: " + acObjId.ObjectClass.DxfName);
  24:        acDoc.Editor.WriteMessage("\nObjectID: " + acObjId.ToString());
  25:        acDoc.Editor.WriteMessage("\nHandle: " + acObjId.Handle.ToString());
  26:        acDoc.Editor.WriteMessage("\n");
  27:    } 
  28:   
  29:    // Закрыть запись таблицы блоков
  30:    acBlkTblRec.Close();
  31:    acBlkTblRec.Dispose(); 
  32:   
  33:    // Закрыть таблицу блоков
  34:    acBlkTbl.Close();
  35:    acBlkTbl.Dispose();
  36:  }

Добавление нового объекта в базу данных

    Этот пример демонстрирует как создать новый объект и добавить его в пространство Модели без использования Менеджера Транзакций. Пример использования Менеджера транзакций смотрите в разделе 5.1.2.1. Запуск новой транзакции (Transaction) и открытие объекта.

Код VB.NET

   1:  Imports Autodesk.AutoCAD.Runtime
   2:  Imports Autodesk.AutoCAD.ApplicationServices
   3:  Imports Autodesk.AutoCAD.DatabaseServices
   4:  Imports Autodesk.AutoCAD.Geometry 
   5:   
   6:  <CommandMethod("AddNewCircleOpenClose")> _
   7:  Public Sub AddNewCircleOpenClose()
   8:    '' Получить текущий документ и его базу данных
   9:    Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  10:    Dim acCurDb As Database = acDoc.Database 
  11:   
  12:    '' Открыть таблицу блоков для чтения
  13:    Dim acBlkTbl As BlockTable
  14:    acBlkTbl = acCurDb.BlockTableId.Open(OpenMode.ForRead) 
  15:   
  16:    '' Открыть запись таблицы блоков (ModelSpace) для чтения
  17:    Dim acBlkTblRec As BlockTableRecord
  18:    acBlkTblRec = acBlkTbl(BlockTableRecord.ModelSpace).Open(OpenMode.ForWrite) 
  19:   
  20:    '' Создание окружности с радиусом 3 и 5,5
  21:    Dim acCirc As Circle = New Circle()
  22:    acCirc.SetDatabaseDefaults()
  23:    acCirc.Center = New Point3d(5, 5, 0)
  24:    acCirc.Radius = 3 
  25:   
  26:    '' Добавить новый объект в пространство модели и транзакцию
  27:    acBlkTblRec.AppendEntity(acCirc) 
  28:   
  29:    '' Закрыть объект окружности
  30:    acCirc.Close()
  31:    acCirc.Dispose() 
  32:   
  33:    '' Закрыть запись таблицы блоков
  34:    acBlkTblRec.Close()
  35:    acBlkTblRec.Dispose() 
  36:   
  37:    '' Закрыть таблицу блоков
  38:    acBlkTbl.Close()
  39:    acBlkTbl.Dispose()
  40:  End Sub

Код C#

   1:  using Autodesk.AutoCAD.Runtime;
   2:  using Autodesk.AutoCAD.ApplicationServices;
   3:  using Autodesk.AutoCAD.DatabaseServices;
   4:  using Autodesk.AutoCAD.Geometry; 
   5:   
   6:  [CommandMethod("AddNewCircleOpenClose")]
   7:  public static void AddNewCircleOpenClose()
   8:  {
   9:    // Получить текущий документ и его базу данных
  10:    Document acDoc = Application.DocumentManager.MdiActiveDocument;
  11:    Database acCurDb = acDoc.Database; 
  12:   
  13:    // Открыть таблицу блоков для чтения
  14:    BlockTable acBlkTbl;
  15:    acBlkTbl = acCurDb.BlockTableId.Open(OpenMode.ForRead) as BlockTable; 
  16:   
  17:    // Открыть запись таблицы блоков (ModelSpace) для записи
  18:    BlockTableRecord acBlkTblRec;
  19:    acBlkTblRec = acBlkTbl[BlockTableRecord.ModelSpace].Open(OpenMode.ForWrite)
  20:                    as BlockTableRecord; 
  21:   
  22:    // Создание окружности с радиусом 3 и 5,5
  23:    Circle acCirc = new Circle();
  24:    acCirc.SetDatabaseDefaults();
  25:    acCirc.Center = new Point3d(5, 5, 0);
  26:    acCirc.Radius = 3; 
  27:   
  28:    // Добавить новый объект в пространство модели и транзакцию
  29:    acBlkTblRec.AppendEntity(acCirc); 
  30:   
  31:    // Закрыть объект окружности
  32:    acCirc.Close();
  33:    acCirc.Dispose(); 
  34:   
  35:    // Закрыть запись таблицы блоков
  36:    acBlkTblRec.Close();
  37:    acBlkTblRec.Dispose(); 
  38:   
  39:    // Закрыть таблицу блоков
  40:    acBlkTbl.Close();
  41:    acBlkTbl.Dispose();
  42:  }


Comments