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