P.S.S: Ну а это непосредственный ответ на твой вопрос:
static Acad::ErrorStatus MoveToBlockDefinition(AcDbObjectId idBlockRef, AcDbObjectIdArray &ids)
{
Acad::ErrorStatus es;
AcDbObjectPointer<AcDbBlockReference> pRef(idBlockRef,AcDb::kForRead);
if ((es = pRef.openStatus()) != Acad::eOk) return es;
// Матрица преобразования Block Reference OCS -> WCS
AcGeMatrix3d xform = pRef->blockTransform ();
pRef->close(); // Чтобы не мешалась
AcDbBlockTableRecordPointer pBtr(pRef->blockTableRecord(),AcDb::kForRead);
if ((es = pBtr.openStatus()) != Acad::eOk) return es;
AcGePoint3d pt3dBlkOrigin = pBtr->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);
}
// Инвертируем матрицу преобразования, чтобы преобразовывать
// из WCS в систему координат блока
xform.invert();
if ((es = pBtr->upgradeOpen()) != Acad::eOk) return es;
// Перебрасываем все примитивы в блок
if ((es = pBtr->assumeOwnershipOf(ids)) != Acad::eOk) return es;
// Теперь выполним трансформацию всех примитивов по матрице xform
for (int i=0; i < ids.length(); i++) {
AcDbObjectPointer<AcDbEntity> pEnt(ids[i],AcDb::kForWrite);
if (pEnt.openStatus() == Acad::eOk) {
pEnt->transformBy(xform);
}
}
// Обновим все вставки этого блока
AcDbObjectIdArray idRefs;
pBtr->getBlockReferenceIds(idRefs);
pBtr->close();
for (int i=0; i < idRefs.length(); i++) {
AcDbObjectPointer<AcDbEntity> pEnt(idRefs[i],AcDb::kForWrite);
if (pEnt.openStatus() == Acad::eOk) {
pEnt->recordGraphicsModified();
}
}
return es;
}
//------------------------------
// Команда MoveToBlock
//------------------------------
static void MoveToBlock(void)
{
Acad::ErrorStatus es;
ads_name en,ss;
ads_point p;
if (acedEntSel("\nУкажите блок: ",en,p) != RTNORM) return;
acutPrintf("\nВыберите примитивы для добавления в блок: ");
if (acedSSGet(NULL,NULL,NULL,NULL,ss) != RTNORM) return;
AcDbObjectIdArray ids;
AcDbObjectId idBlk,id; acdbGetObjectId(idBlk,en);
long nEnt = 0; acedSSLength(ss,&nEnt);
if (!nEnt) return;
ids.setLogicalLength(nEnt);
for (int i=0; i < nEnt; i++) {
acedSSName(ss,i,en);
acdbGetObjectId(id,en);
ids[i] = id;
}
if ((es = MoveToBlockDefinition(idBlk,ids)) != Acad::eOk) {
acutPrintf("\nMoveToBlockDefinition(idBlk,ids)=%s",acadErrorStatusText(es));
}
}