Below is sample code
I am creating new block table in target db and adding ent from xref
AcDbBlockTableRecord *pNewBlock;
AcDbObjectId newBlockId;
pNewBlock = new AcDbBlockTableRecord();
if (Acad::eOk != (es = pNewBlock->setName(_T("*U"))))
{
delete pNewBlock;
return false;
}
if (Acad::eOk != (es = m_pTable->add(pNewBlock)))// m_pTable table of target db
{
delete pNewBlock;
return false;
}
newBlockId = pNewBlock->objectId();
pNewBlock->close();
AcDbObjectIdArray objIds;
AcDbIdMapping idMap;
//AcGePoint3d insPos;
objIds.append(entId);
AcDbEntity *pEnt; // entity to copy
if (Acad::eOk == (es = acdbOpenAcDbEntity(pEnt, entId, AcDb::kForWrite)))
{
if(pEnt->isKindOf(AcDbBlockReference::desc()))
{
//blockreferences from xRefs will not be copied to newBlockId with wblockCloneObjects(return eInvalidOwner as error)
//so blockreferencse must be first exploded to normal entities to use wblockCloneObjects
es = xrefDb->getBlockTable(pTable, AcDb::kForRead);
if (Acad::eOk != es)
return false;
es = pTable->getAt(ACDB_MODEL_SPACE, pModelSpace, AcDb::kForWrite);
pTable->close();
if (Acad::eOk != es)
return false;
objIds.remove(entId);
AcDbVoidPtrArray entitySet;
es = pEnt->explode(entitySet);
pEnt->close();
for (int i = 0; i < entitySet.length(); i++)
{
AcDbEntity* ent = AcDbEntity::cast((AcRxObject*)entitySet[i]);
if (ent)
{
es = pModelSpace->appendAcDbEntity(ent);
objIds.append(ent->objectId());
ent->close();
}
}
pModelSpace->close();
if(!objIds.isEmpty())
{
es = xrefDb->wblockCloneObjects(objIds, newBlockId, idMap, AcDb::kDrcIgnore);
AcDbEntity* ent;
for(int n=0; n<objIds.length(); n++)
{
if (Acad::eOk == acdbOpenAcDbEntity(ent, objIds[n], AcDb::kForWrite))
{
ent->erase();
ent->close();
}
}
if (Acad::eOk != es)
return false;
}
}