ObjectId.GetObject()
Большинство примеров для AutoCAD .NET API созданы с использованием метода Transaction.GetObject() для открытия объектов, содержашихся в базе чертежа. Код, который использует этот метод, обычно выглядит приблизительно так:
- [CommandMethod("test1")]
- public static void transtest1()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- using (Transaction trans = db.TransactionManager.StartTransaction())
- {
- BlockTable bt =
- trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
- foreach (ObjectId btrId in bt)
- {
- BlockTableRecord btr =
- trans.GetObject(btrId, OpenMode.ForRead) as BlockTableRecord;
- // Что-нибудь делаем…
- }
- }
- }
Однако, есть более краткий способ для того, чтобы открыть объект при помощи транзакции - использование метода ObjectId.GetObject(). По некоторым причинам этот методо часто упускается из виду - возможно, потому что авторы примеров предпочитают подчеркивать, что операции, которые используются, явно используют транзакцию. Тот же код, использующий ObjectId.GetObject() выглядит следующим образом:
- [CommandMethod("test2")]
- public static void transtest2()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- using (Transaction trans = db.TransactionManager.StartTransaction())
- {
- BlockTable bt =
- db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
- foreach (ObjectId btrId in bt)
- {
- BlockTableRecord btr =
- btrId.GetObject(OpenMode.ForRead) as BlockTableRecord;
- // Что-нибудь делаем…
- }
- }
- }
Неявно (и как объяснено в документации), метод 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
Отредактировано 11.06.2013 в 12:58:03