DeepCloneObjects 和 DeepClone
ARX AcDbDatabase 中的方法 deepCloneObjects() 和 wblock() 区别以及和 AcDbObject 方法 clone() 和 deepClone() 的关系
AcDbDataBase的deepCloneOjbects接口的功能
Acad::ErrorStatus
deepCloneObjects(AcDbObjectIdArray& objectIds,AcDbObjectId& owner,AcDbIdMapping& idMap,bool deferXlation = false);
objectIds
输入要深度克隆的对象的数组
owner
输入要作为克隆的拥有者的对象的对象ID
idMap
返回用于转化对象ID关系的AcDbIdPair对象的数组
deferXlation
输入布尔值,表示是否要执行ID转化
克隆objectId数组中的所有对象并将它们增加至由owner指定的容器对象中。idMap储存AcDbIdPair对象,这个AcDbIdPair对象包含原始的和克隆的对象对的objectId实体。这个数组可用于包含在深度克隆操作中的对象的前处理。
当所有要被克隆的对象没有相同的宿主,则必须建立独立的AcDbObjectIdArray实体,每一个AcDbObjectIdArray实体包含具有所有相同的宿主的对象。再将deferXlation设置为Adesk::kTrue,对每一个数组调用deepCloneObject方法,除了最后一个调用。
AcDbObject的deepClone接口
AcDbIdMapping IdMap;
Acad::ErrorStatus es = spEntity->deepClone(spBlkTblRcd, pClonedObject, IdMap);
spEntity:被复制对象。
spBlkTblRcd: 新创建对象的Owner,如能要放到图里,通常就是当前的Model Space指针。
pClonedObject:新创建的对象。
IdMap:可以用来创建一个对应关系,原对象的ID和新对象的ID的对应关系。
AcDbDatabase::wblock 函数
Acad::ErrorStatus wblock(AcDbDatabase*& pOutputDb,const AcDbObjectIdArray& outObjIds,const AcGePoint3d& basePoint);
pOutputDb
返回用于写出的数据库的指针
outObjIds
输入被写块的所有对象的对象ID实体的数组
basePoint
输入pOutputDb中使用的基点(在pOutputDb的WCS坐标中)
创建一个新的AcDbDatabase对象,设置pOutputDb指向它,再使用wblockClone机制将outObjId实体指定的对象的数组写出至pOutputDb指定的数据库的模型空间块表记录中,其中使用basePoint作为pOutputDb的基点值。
就是把指定的一些实体,拷贝指定数据库是的新建块中。
AcDbObject中的clone就是所谓的浅克隆,并不会将实体与其它实体的关系等相关信息clone进去。