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();