cad.net HandOverTo替换对象

在cad.net中有这样一个函数 DBObject.HandOverTo();

我曾经尝试使用此函数,但是一直报错

经过我的一番查找资料和尝试之后,我发现,此函数无法在StartTransaction()开启事务的上下文中使用

必须在OpenCloseTransaction的事务上下文中使用,成功完成了替换,代码如下

var doc = Acap.DocumentManager.MdiActiveDocument;
var r1 = doc.Editor.GetEntity("\n选择要被替换的对象");
if (r1.Status != PromptStatus.OK)
    return;
using var tr = doc.Database.TransactionManager.StartOpenCloseTransaction();
var selectEntity = (Entity)tr.GetObject(r1.ObjectId, OpenMode.ForWrite);
var newEntity = new Line(Point3d.Origin, new Point3d(100, 100, 0));
selectEntity.HandOverTo(newEntity, true, true);
tr.AddNewlyCreatedDBObject(newEntity, true);
tr.Commit();

实现效果如下图

可以看到,圆成功的被替换成了直线,并且id、句柄都保持原样(扩展数据和扩展字典也可以保留)

其实此函数从用法上来看,命名为HandOverBy会更符合直觉

替换完成后,原来的对象会变成一个类似新建的对象,IsNewObject属性为true,并可当作新对象继续使用 

 

posted @ 2024-07-19 10:07  DDYYHH  阅读(70)  评论(0编辑  收藏  举报