• 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进去。

  • 相关阅读:
    bzoj1648
    bzoj3404
    bzoj1650
    bzoj1625
    bzoj1606
    bzoj1464
    bzoj1572
    bzoj1617
    bzoj1092
    bzoj1091
  • 原文地址:https://www.cnblogs.com/xzh1993/p/5742078.html
Copyright © 2020-2023  润新知