ADN Open CIS
Сообщество программистов Autodesk в СНГ

10/06/2013

ObjectId.GetObject()

Большинство примеров для AutoCAD .NET API созданы с использованием метода Transaction.GetObject() для открытия объектов, содержашихся в базе чертежа. Код, который использует этот метод, обычно выглядит приблизительно так:

Код - C#: [Выделить]
  1. [CommandMethod("test1")]
  2. public static void  transtest1()
  3. {
  4.   Document doc = Application.DocumentManager.MdiActiveDocument;
  5.   Database db = doc.Database;
  6.   using (Transaction trans = db.TransactionManager.StartTransaction())
  7.   {
  8.     BlockTable bt =
  9.         trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  10.     foreach (ObjectId btrId in bt)
  11.     {
  12.       BlockTableRecord btr =
  13.         trans.GetObject(btrId, OpenMode.ForRead) as BlockTableRecord;
  14.       // Что-нибудь делаем…
  15.     }
  16.   }
  17. }

Однако, есть более краткий способ для того, чтобы открыть объект при помощи транзакции - использование метода ObjectId.GetObject(). По некоторым причинам этот методо часто упускается из виду - возможно, потому что авторы примеров предпочитают подчеркивать, что операции, которые используются, явно используют транзакцию. Тот же код, использующий ObjectId.GetObject() выглядит следующим образом:

Код - C#: [Выделить]
  1. [CommandMethod("test2")]
  2. public static void  transtest2()
  3. {
  4.   Document doc = Application.DocumentManager.MdiActiveDocument;
  5.   Database db = doc.Database;
  6.   using (Transaction trans = db.TransactionManager.StartTransaction())
  7.   {
  8.     BlockTable bt =
  9.         db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
  10.     foreach (ObjectId btrId in bt)
  11.     {
  12.       BlockTableRecord btr =
  13.         btrId.GetObject(OpenMode.ForRead) as BlockTableRecord;
  14.      // Что-нибудь делаем…
  15.     }
  16.   }
  17. }

Неявно (и как объяснено в документации), метод ObjectId.GetObject() вызывает метод TransactionManager.GetObject() транзакции верхнего уровня. Если нет ни одной активной транзакции возбуждается исключение.

Конечно, есть и другие возможности, чтобы открыть объект из базы чертежа, которые мы обсуждали ранее в этом блоге. Существует Dynamic .NET введеный в AutoCAD 2013, а также (без транзакции) Open/Close механизм (удобно обернутый в класс OpenCloseTransaction – это если вы не хотите использовать транзакции точно так же, как если бы вы их использовали).

Источник: http://adndevblog.typepad.com/autocad/2012/07/objectidgetobject.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=97.0

Опубликовано 10.06.2013
Отредактировано 11.06.2013 в 12:58:03