If you are cloning a set of objects from different owners, you'll need to divide the set of object IDs into separate groups for each owner. (The cloned objects and their owners should belong to the same database.) In the example in this section, the model space objects to be cloned are added to objListMS, and the paper space objects to be cloned are added to objListPS:
objListMS.append(objId); objListPS.append(objId);
The deepCloneObjects() function is then called twice, using the same ID map. It is necessary to do all the cloning using a single ID map for the reference translation to be done properly. On the first call, the deferXlation parameter is set to kTrue. On the second (the last) call to deepCloneObjects(), deferXlation defaults to kFalse:
acdbHostApplicationServices()->workingDatabase()-> deepCloneObjects(mslist, modelSpaceId, idMap, Adesk::kTrue); acdbHostApplicationServices()->workingDatabase()-> deepCloneObjects(pslist, paperSpaceId, idMap);
At this point, cloning concludes and all the references are translated. The following code deep clones objects belonging to different owners:
void cloneDiffOwnerObjects() { // Step 1: Obtain the set of objects to be cloned. // For the two owners we'll use model space and // paper space, so we must perform two acedSSGet() calls. // calls. // acutPrintf("\nSelect entities to be cloned to" " Model Space"); ads_name ssetMS; acedSSGet(NULL, NULL, NULL, NULL, ssetMS); long lengthMS; acedSSLength(ssetMS, &lengthMS); acutPrintf("\nSelect entities to be cloned to" " Paper Space"); ads_name ssetPS; if (acedSSGet(NULL, NULL, NULL, NULL, ssetPS) != RTNORM && lengthMS == 0) { acutPrintf("\nNothing selected"); return; } long lengthPS; acedSSLength(ssetPS, &lengthPS); // Step 2: Add obtained object IDs to the lists of // objects to be cloned: one list for objects to // be owned by model space and one for those to // be owned by paper space. AcDbObjectId ownerId = AcDbObjectId::kNull; // For model space // AcDbObjectIdArray objListMS; for (int i = 0; i < lengthMS; i++) { ads_name ent; acedSSName(ssetMS, i, ent); AcDbObjectId objId; acdbGetObjectId(objId, ent); // Check to be sure this has the same owner as the first // object. // AcDbObject *pObj; acdbOpenObject(pObj, objId, AcDb::kForRead); if (pObj->ownerId() == ownerId) objListMS.append(objId); else if (i == 0) { ownerId = pObj->ownerId(); objListMS.append(objId); } pObj->close(); } acedSSFree(ssetMS); // For paper space // ownerId = AcDbObjectId::kNull; AcDbObjectIdArray objListPS; for (i = 0; i < lengthPS; i++) { ads_name ent; acedSSName(ssetPS, i, ent); AcDbObjectId objId; acdbGetObjectId(objId, ent); // Check to be sure this has the same owner as the first // object. // AcDbObject *pObj; acdbOpenObject(pObj, objId, AcDb::kForRead); if (pObj->ownerId() == ownerId) objListPS.append(objId); else if (i == 0) { ownerId = pObj->ownerId(); objListPS.append(objId); } pObj->close(); } acedSSFree(ssetPS); // Step 3: Get the object ID of the desired owners for // the cloned objects. We're using model space and // paper space for this example. // AcDbBlockTable *pBlockTable; acdbHostApplicationServices()->workingDatabase() ->getSymbolTable(pBlockTable, AcDb::kForRead); AcDbObjectId modelSpaceId, paperSpaceId; pBlockTable->getAt(ACDB_MODEL_SPACE, modelSpaceId); pBlockTable->getAt(ACDB_PAPER_SPACE, paperSpaceId); pBlockTable->close(); // Step 4: Create a new ID map. // AcDbIdMapping idMap; // Step 5: Call deepCloneObjects(). // acdbHostApplicationServices()->workingDatabase() ->deepCloneObjects(objListMS, modelSpaceId, idMap, Adesk::kTrue); acdbHostApplicationServices()->workingDatabase() ->deepCloneObjects(objListPS, paperSpaceId, idMap); // Now we can go through the ID map and do whatever we'd // like to the original and/or clone objects. // // For this example we'll print out the object IDs of // the new objects resulting from the cloning process. // AcDbIdMappingIter iter(idMap); for (iter.start(); !iter.done(); iter.next()) { AcDbIdPair idPair; iter.getMap(idPair); if (!idPair.isCloned()) continue; acutPrintf("\nObjectId is: %Ld", idPair.value().asOldId()); } }