ObjectARX 移动、拷贝、缩放、旋转、镜像代码

//拷贝,移动,旋转 ,镜像,缩放  

选择一个对象  
static BOOL SelObj(ads_point& pt,AcDbObjectId& objId){  
        ads_name en;  
        if(acedEntSel(_T("\n选择对象"),en,pt) != RTNORM){  
                return false;  
        }  
        Acad::ErrorStatus es = acdbGetObjectId(objId,en);  
        return es == Acad::ErrorStatus::eOk ? true : false;  
}  
//选择一个点  
static BOOL SelPoint(ads_point& ptEnd){  
        if(acedGetPoint(NULL,_T("\n选择一个点"),ptEnd) != RTNORM){  
                return false;  
        }  
        return true;  
}  
拷贝函数测试  
static void TESTcopycmd(){  
        AcDbObjectId objId;  
        ads_point ptStart;  
        ads_point ptEnd;  
        if(!SelObj(ptStart,objId)){  
                acutPrintf(_T("选择对象失败"));  
        };  
        if(!SelPoint(ptEnd)){  
                acutPrintf(_T("选择点失败"));  
        }  
        CopyTo(objId,ptStart,ptEnd);  
}  
拷贝函数  
static BOOL CopyTo(AcDbObjectId entId,const ads_point& ptFrom,  
                                   const ads_point& 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 = LoadEntity(pCopyEnt);  
        }  
        Move(copyEntId,ptFrom,ptTo);  
}  

移动函数测试============  
static void TESTmovecmd(){  
        AcDbObjectId objId;  
        ads_point ptStart;  
        ads_point ptEnd;  
        if(!SelObj(ptStart,objId)){  
                acutPrintf(_T("选择对象失败"));  
        };  
        if(!SelPoint(ptEnd)){  
                acutPrintf(_T("选择点失败"));  
        }  
        Move(objId,ptStart,ptEnd);  
}  
移动函数  
static Acad::ErrorStatus Move(AcDbObjectId entId,const ads_point& ptFrom,const ads_point& ptTo){  
        AcGeVector3d vec(ptTo[X] - ptFrom[X],ptTo[Y] - ptFrom[Y],  
                ptTo[Z] - ptFrom[Z]);  
        AcGeMatrix3d mat;  
        mat.setToTranslation(vec);  
        AcDbEntity* pEnt = NULL;  
        Acad::ErrorStatus es = acdbOpenObject(pEnt,entId,AcDb::kForWrite);  
        if(es!=Acad::eOk){  
                return es;  
        }  
        es=pEnt->transformBy(mat);  
        pEnt->close();  
}  
缩放  
static void TESTsccmd()  
{  
        ads_name name;  
        ads_point ptEnt;  
        AcDbObjectId id;  
        if(acedEntSel(_T("选择要扩大的实体"),name,ptEnt) != RTNORM)  
        {  
                acutPrintf(_T("\nno obj select"));  
                return;  
        }  
        if(Acad::ErrorStatus::eOk != acdbGetObjectId(id,name))  
        {  
                return;  
        }  
        AcDbEntity* pEnt;  
        if(Acad::ErrorStatus::eOk != acdbOpenObject(pEnt,id,AcDb::OpenMode::kForWrite))  
        {  
                acutPrintf(_T("\n打开实体失败"));  
                return;  
        }  
        ads_real num;  
        if(acedGetReal(_T("\n输入扩展倍数"),&num) != RTNORM)  
        {  
                pEnt->close();  
                return;  
        }  
        ads_point pt;  
        if(acedGetPoint(NULL,_T("\n选择基点"),pt) != RTNORM)  
        {  
                pEnt->close();  
                return;  
        }  
        AcGePoint3d pt3d = asPnt3d(pt);  
        AcGeMatrix3d mat;  
        mat.setToScaling(num,pt3d);  
        pEnt->transformBy(mat);  
        pEnt->close();  
}  
旋转  
static void TESTrtcmd()  
{  
        ads_name name;  
        ads_point ptEnt;  
        AcDbObjectId id;  
        if(acedEntSel(_T("选择要旋转的实体"),name,ptEnt) != RTNORM)  
        {  
                acutPrintf(_T("\nno obj select"));  
                return;  
        }  
        if(Acad::ErrorStatus::eOk != acdbGetObjectId(id,name))  
        {  
                return;  
        }  
        AcDbEntity* pEnt;  
        if(Acad::ErrorStatus::eOk != acdbOpenObject(pEnt,id,AcDb::OpenMode::kForWrite))  
        {  
                acutPrintf(_T("\n打开实体失败"));  
                return;  
        }  
        ads_point ptBase;  
        if(acedGetPoint(NULL,_T("\n选择旋转的基点"),ptBase) != RTNORM)  
        {  
                pEnt->close();如果不及时关闭,会导致内存泄漏  
                return;  
        }  
        ads_real angle;  
        if(acedGetAngle(ptBase,_T("\n输入旋转角度"),&angle) != RTNORM)  
        {  
                pEnt->close();  
                return;  
        }  
        AcDbCurve* pCurve;  
        pCurve = (AcDbCurve*)pEnt;  
        AcGePoint3d ptCenter;  
        pCurve->getStartPoint(ptCenter);  
        AcGeMatrix3d mat;  
        acutPrintf(_T("angle is %.2f"),angle);  
        mat.setToRotation(angle,AcGeVector3d::kZAxis,ptCenter);  
        //mat.rotation(angle,AcGeVector2d::kXAxis,ptCenter);  
        pEnt->transformBy(mat);  
        pEnt->close();  
}  
镜像  
static void TESTmrcmd()  
{  
        ads_name name;  
        ads_point ptEnt;  
        AcDbObjectId id;  
        if(acedEntSel(_T("选择要镜像的实体"),name,ptEnt) != RTNORM)  
        {  
                acutPrintf(_T("\nno obj select"));  
                return;  
        }  
        if(Acad::ErrorStatus::eOk != acdbGetObjectId(id,name))  
        {  
                return;  
        }  
        AcDbEntity* pEnt;  
        if(Acad::ErrorStatus::eOk != acdbOpenObject(pEnt,id,AcDb::OpenMode::kForWrite))  
        {  
                acutPrintf(_T("\n打开实体失败"));  
                return;  
        }  
        ads_point ptDis1;  
        if(acedGetPoint(NULL,_T("\n选择镜像点1"),ptDis1) !=RTNORM)  
        {  
                acutPrintf(_T("\nno point select"));  
                pEnt->close();  
                return;  
        }  
        ads_point ptDis2;  
        if(acedGetPoint(NULL,_T("\n选择镜像点2"),ptDis2) !=RTNORM)  
        {  
                acutPrintf(_T("\nno point select"));  
                pEnt->close();  
                return;  
        }  
        AcGePoint3d ptDis3d1 = asPnt3d(ptDis1);  
        AcGePoint3d ptDis3d2 = asPnt3d(ptDis2);  
        AcGeLine3d line(ptDis3d1,ptDis3d2);  
        AcGeMatrix3d mat ;  
        mat.setToMirroring(line);  
        acedInitGet(NULL,_T("Y N"));  
        CString strKW;  
        if(acedGetKword(_T("删除原对象?Y/N"),strKW.GetBuffer(1)) != RTNORM)  
        {  
                return;  
        }  
        strKW.ReleaseBuffer();  
        if(strKW.CompareNoCase(_T("N")) == 0)  
        {  
                AcDbEntity* pEnt2 = AcDbEntity::cast(pEnt->clone());  
                LoadEntity(pEnt2);  
                pEnt2->close();  
        }  
        pEnt->transformBy(mat);  
        pEnt->close();  
}  


  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值