Второй метод - это то, что Autodesk рекомендует в документации разработчика (вы можете прочитать этот раздел ).
В первом методе вы используете метод ObjectId.GetObject()
, чтобы открыть BlockTable
и пространство модели 'BlockTableRecord'.Этот метод использует верхнюю транзакцию для открытия объекта, что означает, что есть активная транзакция, которую вы должны использовать для добавления вновь созданной сущности.Вы можете получить это с Database.TransactionManager.TopTransaction
.Если вы вообще не хотите использовать транзакцию, вы должны использовать метод «только для расширенного использования» ObjectId.Open()
.
Метод Три должен использовать некоторые методы расширения, которые будут вызываться изнутрисделка.Вот упрощенный (без проверки ошибок) экстракт тех, которые я использую.
static class ExtensionMethods
{
public static T GetObject<T>(
this ObjectId id,
OpenMode mode = OpenMode.ForRead,
bool openErased = false,
bool forceOpenOnLockedLayer = false)
where T : DBObject
{
return (T)id.GetObject(mode, openErased, forceOpenOnLockedLayer);
}
public static BlockTableRecord GetModelSpace(this Database db, OpenMode mode = OpenMode.ForRead)
{
return SymbolUtilityServices.GetBlockModelSpaceId(db).GetObject<BlockTableRecord>(mode);
}
public static ObjectId Add (this BlockTableRecord owner, Entity entity)
{
var tr = owner.Database.TransactionManager.TopTransaction;
var id = owner.AppendEntity(entity);
tr.AddNewlyCreatedDBObject(entity, true);
return id;
}
}
Используя пример:
using (var tr = db.TransactionManager.StartTransaction())
{
var line = new Line(startPt, endPt) { Layer = layerName };
db.GetModelSpace(OpenMode.ForWrite).Add(line);
tr.Commit();
}