//Исходный материнский блок
AcDbBlockReference* pBref = AcDbBlockReference::cast(pRx);
AcDbBlockTableRecordPointer pRecord2(pBref->blockTableRecord(), AcDb::kForRead);
if (pRecord2.openStatus() == Acad::eOk)
{
// Получаем матрицу
AcGeMatrix3d xform = pBref->blockTransform();
AcGePoint3d pt3dBlkOrigin = pRecord2->origin();
// Учитываем возможность ненулевой базовой точки блока (Block Definition)
if (pt3dBlkOrigin != AcGePoint3d::kOrigin)
{
AcGeVector3d xformOrigin = xform.translation();
AcGeVector3d vectorOrigin(pt3dBlkOrigin.x, pt3dBlkOrigin.y, pt3dBlkOrigin.x);
vectorOrigin.transformBy(xform);
xformOrigin -= vectorOrigin;
xform.setTranslation(xformOrigin);
}
// Получаем инверсную матрицу
AcGeMatrix3d xform2 = xform;
xform2.invert();
// Считываем объекты из материнского блока
AcDbObjectIdArray objList2;
AcDbBlockTableRecordIterator* TmpIter2 = NULL;
pRecord2->newIterator(TmpIter2);
if (TmpIter2)
{
TmpIter2->start();
while (!TmpIter2->done())
{
AcDbObjectId TmpId;
if (TmpIter2->getEntityId(TmpId) == Acad::eOk)
{
objList2.append(TmpId);
}
TmpIter2->step();
}
}
pRecord2.close();
// Выполняем клонирование
AcDbIdMapping idMap2;
CurDB->deepCloneObjects(objList2, InputBtrId, idMap2);
// Делаем трансформации
AcDbIdMappingIter iter(idMap2);
for (iter.start(); !iter.done(); iter.next())
{
AcDbIdPair idPair;
iter.getMap(idPair);
if (idPair.isCloned())
{
AcDbObjectPointer<AcDbEntity> pClone(idPair.value(), AcDb::kForRead);
if (pClone.openStatus() == Acad::eOk)
{
if (AcDbAssocArrayActionBody::isAssociativeArray(pClone))
{
// Если объект массив - применяем инверсную матрицу
AcDbAssocArrayActionBody* pArrayActionBody = NULL;
AcDbObjectId actionBodyId = AcDbAssocArrayActionBody::getControllingActionBody(pClone, NULL);
if ((acdbOpenAcDbObject((AcDbObject*&)pArrayActionBody, actionBodyId, AcDb::kForWrite)) == Acad::eOk)
{
pArrayActionBody->transformBy(xform2);
pArrayActionBody->close();
}
}
else
{
// Для всех остальных случаев применяем исходную матрицу
if (pClone->upgradeOpen() == Acad::eOk)
{
pClone->transformBy(xform);
}
}
}
}
}
}