Тема: Карта соответствия скопированных-вставленных объектов
Можно ли каким-то образом получить карту, из которой по AcDbObjectId скопированных объектов (блоков, примитивов) можно было бы получить соответствующие AcDbObjectId их вставленных на чертеж копий?
1) Попробовал через AcEditorReactor::endDeepClone, ожидал, что смогу построить всю цепочку преобразований, но не складывается что-то. Приходят последовательно карты идентификаторов с DeepCloneType == kDcWblock, kDcInsert и kDcExplode, я их запротоколировал, но отследить, как последовательно из, скажем, блока с хэндлом 2b4 получается его копия с хэндлом 3dd, не выходит.
Может, протокол собираю неправильно и что-то упускаю?
void MyEdReactor::endDeepClone( AcDbIdMapping& idMapping ) { Acad::ErrorStatus es; AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase(); AcDbDatabase* pOrig; AcDbDatabase* pDest; idMapping.origDb(pOrig); idMapping.destDb(pDest); AcDb::DeepCloneType dcc = idMapping.deepCloneContext(); AcDbObject* objKey; AcDbObject* objVal; AcDbIdPair idPair; AcDbHandle hKey, hVal; AcDbIdMappingIter mapIter(idMapping); MyOutputDebugString(_T("--------------\ndcc = %d, pDbOrig=%x, pDbDest=%x, pDb=%x\n"),dcc,pOrig,pDest,pDb); for (mapIter.start(); !mapIter.done(); mapIter.next()) { if (mapIter.getMap(idPair)) { es = acdbOpenAcDbObject(objKey, idPair.key(), AcDb::kForRead); if (es == Acad::eOk) { objKey->getAcDbHandle(hKey); es = acdbOpenAcDbObject(objVal, idPair.value(), AcDb::kForRead); if(es == Acad::eOk) { objVal->getAcDbHandle(hVal); MyOutputDebugString(_T("pair: %ld [%x] --> %ld [%x]\n"),idPair.key(),MyGetHandleValue(hKey),idPair.value(),MyGetHandleValue(hVal)); objVal->close(); }else { MyOutputDebugString(_T("err open Val: %ld [%x] --> %ld %s\n"),idPair.key(),MyGetHandleValue(hKey),idPair.value(),objKey->desc()->name()); } objKey->close(); }else { MyOutputDebugString(_T("err open Key: %ld \n"),idPair.key()); } } } }
2) Попробовал зайти с другого боку - обработать AcEditorReactor::commandEnded, чтобы на COPYCLIP и COPYBASE собрать выделенные через acedGetCurrentSelectionSet, но возникает вопрос - а что собирать и как сопоставлять на PASTECLIP? (кроме того отдельно приходится что-то придумать для drag'n'drop)