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




Содержание  Назад  Вперед