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();
相关文章
相关标签/搜索