void AsdkWblockReactor::otherWblock(AcDbDatabase* pDestDb, AcDbIdMapping& idMap, AcDbDatabase* pSrcDb) { // To find the destination Model Space, you must look // it up in the ID map: AcDbBlockTable *pSrcBlockTable; pSrcDb->getSymbolTable(pSrcBlockTable, AcDb::kForRead); AcDbObjectId srcModelSpaceId; pSrcBlockTable->getAt(ACDB_MODEL_SPACE, srcModelSpaceId); pSrcBlockTable->close(); AcDbIdPair idPair; idPair.setKey(srcModelSpaceId); idMap.compute(idPair); AcDbBlockTableRecord *pDestBTR; acdbOpenAcDbObject((AcDbObject*&)pDestBTR, idPair.value(), AcDb::kForRead, Adesk::kTrue); // END CODE APPEARING IN SDK DOCUMENT. acutPrintf("\nCorrect destination BTR's ObjectId is:\t\t%Ld", pDestBTR->objectId().asOldId()); pDestBTR->close(); // Incorrect way done here so that the wrong value can be // compared to the correct value // AcDbBlockTable *pDestBlockTable; pDestDb->getSymbolTable(pDestBlockTable, AcDb::kForRead); pDestBlockTable->getAt(ACDB_MODEL_SPACE, pDestBTR, AcDb::kForRead); pDestBlockTable->close(); acutPrintf("\nIncorrect destination BTR's ObjectId is \t\t%Ld", pDestBTR->objectId().asOldId()); pDestBTR->close(); // source database Model Space BTR's ObjectId is shown to // demonstrate that this is what the incorrect method gets // pSrcDb->getSymbolTable(pSrcBlockTable, AcDb::kForRead); pSrcBlockTable->getAt(ACDB_MODEL_SPACE, srcModelSpaceId); pSrcBlockTable->close(); acutPrintf("\nSource Database's Model Space BTR's ObjectId is \t%Ld", srcModelSpaceId.asOldId()); }
Acad::ErrorStatus ArxDbgUtils::cloneAndXformObjects(AcDbDatabase* db, const AcDbObjectIdArray& entsToClone, const AcDbObjectId& ownerBlockId, const AcGeMatrix3d& xformMat, bool debugSpeak) { ASSERT(db != NULL); AcDbIdMapping idMap; Acad::ErrorStatus es = db->deepCloneObjects( const_cast<AcDbObjectIdArray&>(entsToClone), const_cast<AcDbObjectId&>(ownerBlockId), idMap); if (es != Acad::eOk) { ArxDbgUtils::rxErrorMsg(es); return es; } AcDbEntity* clonedEnt; AcDbIdPair idPair; AcDbIdMappingIter iter(idMap); for (iter.start(); !iter.done(); iter.next()) { if (!iter.getMap(idPair)) return Acad::eInvalidInput; if (idPair.isCloned()) { es = acdbOpenAcDbEntity(clonedEnt, idPair.value(), AcDb::kForWrite); if (es == Acad::eOk) { if (idPair.isPrimary()) { if (debugSpeak) acutPrintf(_T("\nCloned And Transformed: %s"), ArxDbgUtils::objToClassStr(clonedEnt)); clonedEnt->transformBy(xformMat); } else if (debugSpeak) acutPrintf(_T("\nCloned: %s"), ArxDbgUtils::objToClassStr(clonedEnt)); clonedEnt->close(); } else ArxDbgUtils::rxErrorMsg(es); } } return Acad::eOk; }