ObjectARX, AutoCAD. Среда программирования библиотеки C++

       

Типичная операция глубокого клона


Следующая выборка кода показывает типичное использование AcDbDatabase:: deepCloneObjects ().

Инициализировать глубокую операцию клона

1 Получают набор объектов, которые нужно клонировать.

2 Помещенный объектные ID в список (типа AcDbObjectIdArray).

3 Создают новую карту ID (класса AcDbIdMapping) который будет заполнен deepCloneObjects () функция.

4 Называют deepCloneObjects () функцией, проходящей в списке объектов, которые нужно клонировать, объект ID владельца, к которому клонированные объекты должны быть добавлены в конец, и карта ID, созданная в шаге 1.

В этом примере, объект ID владельца - запись таблицы блоков пространства модели.

DeepCloneObjects () функция заполняет карту объекта ID (idMap). Приложение может тогда выполнять итерации через объекты, содержащиеся в карте, используя специальный iterator объект (AcDbIdMappingIter) и исполнять дополнительные операции на тех объектах, типа преобразования каждого объекта некоторой матрицей.

Следующий код показывает типичное использование deepCloneObjects ():

void

cloneSameOwnerObjects()

{

// Step 1: Obtain the set of objects to be cloned.

ads_name sset;

if (acedSSGet(NULL, NULL, NULL, NULL, sset) != RTNORM) {

acutPrintf("\nNothing selected");

return;

}

// Step 2: Add obtained object IDs to list of objects

// to be cloned.

long length;

acedSSLength(sset, &length);

AcDbObjectIdArray objList;

AcDbObjectId ownerId = AcDbObjectId::kNull;

for (int i = 0; i < length; i++) {

ads_name ent;

acedSSName(sset, 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)

objList.append(objId);

else if (i == 0) {

ownerId = pObj->ownerId();

objList.append(objId);

}

pObj->close();

}

acedSSFree(sset);

// Step 3: Get the object ID of the desired owner for

// the cloned objects. We’ll use model space for


// this example.

//

AcDbBlockTable *pBlockTable;

acdbHostApplicationServices()->workingDatabase()

->getSymbolTable(pBlockTable, AcDb::kForRead);

AcDbObjectId modelSpaceId;

pBlockTable->getAt(ACDB_MODEL_SPACE, modelSpaceId);

pBlockTable->close();

// Step 4: Create a new ID map.

//

AcDbIdMapping idMap;

// Step 5: Call deepCloneObjects().

//

acdbHostApplicationServices()->workingDatabase()

->deepCloneObjects(objList, modelSpaceId, 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());

}

}


Содержание раздела