CAD二次开发StartTransaction、StartOpenCloseTransaction

在C#的CAD二次开发中,StartTransaction和StartOpenCloseTransaction都是用于启动一个新事务的方法,它们的具体作用和用法如下:

  • StartTransaction
    StartTransaction是用于启动一个新事务的方法,它是在图形数据库上下文中调用的。使用该方法可以确保在对数据库进行读写操作时,对其进行适当的锁定并避免数据冲突。

例如,以下代码演示了如何在C#中使用StartTransaction方法来创建一个新的事务,并在其中修改数据库中的实体:

using (Transaction tr = db.TransactionManager.StartTransaction())
{
    // 获取当前文档的块表
    BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
    
    // 获取块表记录
    BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
    
    // 创建一个新的直线对象
    Line line = new Line(new Point3d(0, 0, 0), new Point3d(10, 10, 0));
    
    // 将直线对象添加到块表记录中
    btr.AppendEntity(line);
    
    // 在事务完成之前将新的实体添加到数据库中
    tr.AddNewlyCreatedDBObject(line, true);
    
    // 提交事务
    tr.Commit();
}

在这个代码示例中,在Transaction块中启动了一个新的事务,并对数据库中的实体进行了修改。在事务完成之前,通过调用AddNewlyCreatedDBObject方法将新的实体添加到数据库中。最后,通过调用Commit方法来提交事务。

  • StartOpenCloseTransaction
    StartOpenCloseTransaction也是用于启动一个新事务的方法,但是它的使用场景与StartTransaction有所不同。该方法主要用于处理文档的打开和关闭操作,例如在打开或关闭文档之前,需要执行某些操作的情况。

例如,以下代码演示了如何在C#中使用StartOpenCloseTransaction方法来创建一个新的事务,并在其中打开和关闭文档:

using (Transaction tr = db.TransactionManager.StartOpenCloseTransaction())
{
    // 在打开文档之前执行某些操作
    tr.StartOpenCloseSession();
    
    // 打开文档
    Document doc = Application.DocumentManager.Open(docName, true);
    
    // 在关闭文档之前执行某些操作
    tr.Commit();
    tr.EndOpenCloseSession();
    
    // 关闭文档
    doc.CloseAndDiscard();
}

在这个代码示例中,在Transaction块中启动了一个新的事务,并在其中打开和关闭了文档。在打开文档之前,通过调用StartOpenCloseSession方法来执行某些操作。在关闭文档之前,通过调用Commit方法来提交事务,并通过调用EndOpenCloseSession方法来结束打开关闭会话。

EndOpenCloseSession方法的作用是通知AutoCAD打开关闭会话已经结束,并释放相关资源。在StartOpenCloseSession方法中,我们调用了Document.LockDocument方法来锁定文档,防止其他线程同时进行对文档的操作,因此在事务提交或回滚后,我们必须通过调用EndOpenCloseSession方法来释放该锁定,以便其他线程可以对文档进行操作。


总之,在使用StartOpenCloseTransaction方法时,必须遵循以下步骤:

  1. 在事务中调用StartOpenCloseSession方法来执行任何必要的操作。
  2. 在事务中调用Commit方法来提交事务。
  3. 在事务中调用EndOpenCloseSession方法来结束打开关闭会话,并释放相关资源。

ps: 在使用StartOpenCloseTransaction方法时,可以在事务中调用StartOpenCloseSession方法来执行任何必要的操作。这里的“必要的操作”指的是在打开和关闭文档之前需要执行的一些操作,例如设置文档的一些属性、加载特定的插件或应用程序等等。这些操作通常与文档本身的内容无关,而是与操作文档的环境和设置相关。


在StartOpenCloseSession方法中执行的任何操作都将在事务提交或回滚之前完成,以确保文档在打开或关闭时处于正确的状态。例如,在StartOpenCloseSession方法中,可以使用Document.LockDocument方法来锁定文档,以确保在事务期间不会有其他线程对文档进行更改。

需要注意的是,在调用StartOpenCloseSession方法之后,必须在事务中调用Commit方法来提交事务,以便在关闭文档之前完成所有必要的操作。如果在提交事务之前关闭文档,则可能会导致文档被永久锁定,从而无法再次打开。

另外,StartOpenCloseTransaction方法在启动事务时会将文档锁定,并且只有在事务提交或回滚后才会解锁。这意味着,在使用StartOpenCloseTransaction方法时,必须确保在操作期间不会关闭文档,否则可能会导致文档被永久锁定,从而无法再次打开。

因此,当需要在打开和关闭文档之前执行某些操作时,应使用StartOpenCloseTransaction方法,而在其他情况下则应使用StartTransaction方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python是一种功能强大的编程语言,可以用于AutoCAD二次开发。以下是一些可用的Python库和示例代码: 1. pyautocad:这是一个Python库,可用于与AutoCAD进行交互。以下是一个简单的示例代码,用于在AutoCAD中创建一个新的直线: ```python import win32com.client acad = win32com.client.Dispatch("AutoCAD.Application") doc = acad.ActiveDocument ms = doc.ModelSpace line1 = ms.AddLine((0, 0), (10, 10)) ``` 2. comtypes:这是一个Python库,可用于与COM对象进行交互。以下是一个示例代码,用于在AutoCAD中创建一个新的直线: ```python import comtypes.client acad = comtypes.client.GetActiveObject("AutoCAD.Application") doc = acad.ActiveDocument ms = doc.ModelSpace line1 = ms.AddLine((0, 0), (10, 10)) ``` 3. IronPython:这是一个Python实现,可用于与.NET框架进行交互。以下是一个示例代码,用于在AutoCAD中创建一个新的直线: ```python import clr clr.AddReference("acmgd") clr.AddReference("acdbmgd") import Autodesk.AutoCAD.ApplicationServices as appSvc import Autodesk.AutoCAD.DatabaseServices as dbSvc import Autodesk.AutoCAD.Geometry as geo doc = appSvc.Application.DocumentManager.MdiActiveDocument db = doc.Database tr = doc.TransactionManager.StartTransaction() ms = dbSvc.SymbolUtilityServices.GetBlockModelSpace(db) line1 = dbSvc.Entity("Line")(geo.Point3d(0, 0, 0), geo.Point3d(10, 10, 0)) ms.AppendEntity(line1) tr.AddNewlyCreatedDBObject(line1, True) tr.Commit() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周杰伦fans

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值