在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,并可当作新对象继续使用
完
评论