ObjectARX_transformBy移動、旋轉、鏡像、縮放實體

transformBy:對實體進行幾何變換。函數

移動:用transformBy把一個實體從a點移動到b點:(CAD命令:_move)spa

AcGePoint3d PointA;//A點座標
AcGePoint3d PointB;//B點座標
AcGeVector3d vec(PointA.x - PointB.x, PointA.y - PointB.y,PointA.z - PointB.z);
AcDbObjectId id;//實體id
AcGeMatrix3d matrix;
matrix.setToTranslation(PointA - PointB);或者matrix.setToTranslation(vec);
AcDbEntity* pObj=NULL;
acdbOpenObject(pObj,id, AcDb::kForWrite);
pObj->transformBy( matrix );
pObj->close();

全局函數AcAxMove 移動實體 :須要連接 axauto15.lib 庫3d

BOOL AcMove(AcDbObjectId entId, const AcGePoint3d &ptFrom,const AcGePoint3d &ptTo)
{
// 將AcGePoint3d類型的點座標進行類型轉換
VARIANT *pvaFrom = Point3dToVARIANT(ptFrom);
VARIANT *pvaTo = Point3dToVARIANT(ptTo);
BOOL bRet = SUCCEEDED(AcAxMove(entId, *pvaFrom, *pvaTo));
delete pvaFrom;
delete pvaTo;
return bRet;
}
static VARIANT* Point3dToVARIANT(const AcGePoint3d &point)
{
COleSafeArray *psa = new COleSafeArray();
DOUBLE dblValues[] = {point[X], point[Y], point[Z]};
psa->CreateOneDim(VT_R8, 3, dblValues);
return (LPVARIANT)(*psa);
}

AcDbObject 類成員函數clone克隆:code

BOOL CTransUtil::Copy(AcDbObjectId entId, const AcGePoint3d &ptFrom,const AcGePoint3d &ptTo)
{
AcDbEntity *pEnt = NULL;
if (acdbOpenObject(pEnt, entId, AcDb::kForRead) != Acad::eOk)
return FALSE;
AcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());
AcDbObjectId copyEntId;
if (pCopyEnt)
copyEntId = PostToModelSpace(pCopyEnt);
Move(copyEntId, ptFrom, ptTo);//transformBy方法
return TRUE;
}

指定角度(用弧度值表示)旋轉實體orm

double rotation;//旋轉角度
AcDbObjectId entId;
AcGeMatrix3d xform;
AcGeVector3d vec(0, 0, 1);
xform.setToRotation(rotation, vec, CCalculation::Pt2dTo3d(ptBase));
AcDbEntity *pEnt=NULL;
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId, AcDb::kForWrite,false);
pEnt->transformBy(xform);
pEnt->close();

縮放it

AcDbObjectId entId;//實體id
AcGePoint3d ptBase;//基點
double scaleFactor;//縮放比例
AcGeMatrix3d xform;
xform.setToScaling(scaleFactor, ptBase);
AcDbEntity *pEnt;
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId, AcDb::kForWrite,
false);
pEnt->transformBy(xform);
pEnt->close();

鏡像io

CMdGeLine3d line(m_ptSecond, m_ptFirst);//鏡像線
AcDbObjectId entId;
AcGeMatrix3d xform;
xform.setToMirroring();
AcDbEntity *pEnt=NULL;
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId, AcDb::kForWrite,false);
pEnt->transformBy(xform);
pEnt->close();
相關文章
相關標籤/搜索