Клонируемые Объекты от Различных Владельцев
Если Вы клонируемые набор объектов от различных владельцев, вы будете должны делить набор объектных ID в отдельные группы для каждого владельца. (Клонированные объекты и их владельцы должны принадлежать той же самой базе данных.) В примере в этой секции, объекты пространства модели, которые нужно клонировать добавлены к objListMS, и объекты пространства листа, которые нужно клонировать добавлены к objListPS:
objListMS.append(objId);
objListPS.append(objId);
DeepCloneObjects () функция тогда вызвана дважды, используя ту же самую карту ID. Необходимо делать все клонирование, используя единственную карту ID для трансляции ссылки, которая будет сделана должным образом. На первом запросе, deferXlation параметр установлен в kTrue. В секунде (последний) вызывают к deepCloneObjects (), deferXlation значения по умолчанию к kFalse:
acdbHostApplicationServices()->workingDatabase()->DeepCloneObjects (mslist, modelSpaceId, idMap, Adesk::kTrue);
acdbHostApplicationServices()->workingDatabase()->DeepCloneObjects (pslist, paperSpaceId, idMap);
В этой точке клонирование заканчивается и все ссылки оттранслированы. Следующий код глубоко клонирует объекты, принадлежащие различным владельцам:
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());
}
}