ObjectARX_transformBy移动、旋转、镜像、缩放实体

transformBy:对实体进行几何变换。

移动:用transformBy把一个实体从a点移动到b点:(CAD命令:_move)

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 库

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克隆:

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;
}

指定角度(用弧度值表示)旋转实体

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

缩放

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

镜像

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

 

转载于:https://my.oschina.net/u/2930533/blog/1501531

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值