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

xiaoxiao2021-02-28  44

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

选择一个对象   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();   }  

转载请注明原文地址: https://www.6miu.com/read-2630636.html

最新回复(0)