找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 178|回复: 0

[每日一码] ObjectARX 移动、拷贝、缩放、旋转、镜像代码

[复制链接]

1

主题

0

回帖

33

积分

管理员

积分
33
发表于 2024-3-14 20:59:07 | 显示全部楼层 |阅读模式
  1. //拷贝,移动,旋转 ,镜像,缩放  
  2. ////选择一个对象  
  3. static BOOL SelObj(ads采用point& pt,AcDbObjectId& objId){  
  4.         ads采用name en;  
  5.         if(acedEntSel(采用T("\n选择对象"),en,pt) != RTNORM){  
  6.                 return false;  
  7.         }  
  8.         Acad::ErrorStatus es = acdbGetObjectId(objId,en);  
  9.         return es == Acad::ErrorStatus::eOk ? true : false;  
  10. }  
  11. //选择一个点  
  12. static BOOL SelPoint(ads采用point& ptEnd){  
  13.         if(acedGetPoint(NULL,采用T("\n选择一个点"),ptEnd) != RTNORM){  
  14.                 return false;  
  15.         }  
  16.         return true;  
  17. }  
  18. ////拷贝函数测试  
  19. static void TESTcopycmd(){  
  20.         AcDbObjectId objId;  
  21.         ads采用point ptStart;  
  22.         ads采用point ptEnd;  
  23.         if(!SelObj(ptStart,objId)){  
  24.                 acutPrintf(采用T("选择对象失败"));  
  25.         };  
  26.         if(!SelPoint(ptEnd)){  
  27.                 acutPrintf(采用T("选择点失败"));  
  28.         }  
  29.         CopyTo(objId,ptStart,ptEnd);  
  30. }  
  31. ////拷贝函数  
  32. static BOOL CopyTo(AcDbObjectId entId,const ads采用point& ptFrom,  
  33.                                    const ads采用point& ptTo)
  34. {  
  35.         AcDbEntity* pEnt = NULL;  
  36.         if(acdbOpenObject(pEnt,entId,AcDb::kForRead) != Acad::eOk){  
  37.                 return FALSE;  
  38.         }  
  39.         AcDbEntity* pCopyEnt = AcDbEntity::cast(pEnt->clone());  
  40.         AcDbObjectId copyEntId;  
  41.         if(pCopyEnt){  
  42.                 copyEntId = LoadEntity(pCopyEnt);  
  43.         }  
  44.         Move(copyEntId,ptFrom,ptTo);  
  45. }  
  46. ////移动函数测试============  
  47. static void TESTmovecmd(){  
  48.         AcDbObjectId objId;  
  49.         ads采用point ptStart;  
  50.         ads采用point ptEnd;  
  51.         if(!SelObj(ptStart,objId)){  
  52.                 acutPrintf(采用T("选择对象失败"));  
  53.         };  
  54.         if(!SelPoint(ptEnd)){  
  55.                 acutPrintf(采用T("选择点失败"));  
  56.         }  
  57.         Move(objId,ptStart,ptEnd);  
  58. }  
  59. ////移动函数  
  60. static Acad::ErrorStatus Move(AcDbObjectId entId,const ads采用point& ptFrom,const ads采用point& ptTo){  
  61.         AcGeVector3d vec(ptTo[X] - ptFrom[X],ptTo[Y] - ptFrom[Y],  
  62.                 ptTo[Z] - ptFrom[Z]);  
  63.         AcGeMatrix3d mat;  
  64.         mat.setToTranslation(vec);  
  65.         AcDbEntity* pEnt = NULL;  
  66.         Acad::ErrorStatus es = acdbOpenObject(pEnt,entId,AcDb::kForWrite);  
  67.         if(es!=Acad::eOk){  
  68.                 return es;  
  69.         }  
  70.         es=pEnt->transformBy(mat);  
  71.         pEnt->close();  
  72. }  
  73. ////缩放  
  74. static void TESTsccmd()  
  75. {  
  76.         ads采用name name;  
  77.         ads采用point ptEnt;  
  78.         AcDbObjectId id;  
  79.         if(acedEntSel(采用T("选择要扩大的实体"),name,ptEnt) != RTNORM)  
  80.         {  
  81.                 acutPrintf(采用T("\nno obj select"));  
  82.                 return;  
  83.         }  
  84.         if(Acad::ErrorStatus::eOk != acdbGetObjectId(id,name))  
  85.         {  
  86.                 return;  
  87.         }  
  88.         AcDbEntity* pEnt;  
  89.         if(Acad::ErrorStatus::eOk != acdbOpenObject(pEnt,id,AcDb::OpenMode::kForWrite))  
  90.         {  
  91.                 acutPrintf(采用T("\n打开实体失败"));  
  92.                 return;  
  93.         }  
  94.         ads采用real num;  
  95.         if(acedGetReal(采用T("\n输入扩展倍数"),&num) != RTNORM)  
  96.         {  
  97.                 pEnt->close();  
  98.                 return;  
  99.         }  
  100.         ads采用point pt;  
  101.         if(acedGetPoint(NULL,采用T("\n选择基点"),pt) != RTNORM)  
  102.         {  
  103.                 pEnt->close();  
  104.                 return;  
  105.         }  
  106.         AcGePoint3d pt3d = asPnt3d(pt);  
  107.         AcGeMatrix3d mat;  
  108.         mat.setToScaling(num,pt3d);  
  109.         pEnt->transformBy(mat);  
  110.         pEnt->close();  
  111. }  
  112. ////旋转  
  113. static void TESTrtcmd()  
  114. {  
  115.         ads采用name name;  
  116.         ads采用point ptEnt;  
  117.         AcDbObjectId id;  
  118.         if(acedEntSel(采用T("选择要旋转的实体"),name,ptEnt) != RTNORM)  
  119.         {  
  120.                 acutPrintf(采用T("\nno obj select"));  
  121.                 return;  
  122.         }  
  123.         if(Acad::ErrorStatus::eOk != acdbGetObjectId(id,name))  
  124.         {  
  125.                 return;  
  126.         }  
  127.         AcDbEntity* pEnt;  
  128.         if(Acad::ErrorStatus::eOk != acdbOpenObject(pEnt,id,AcDb::OpenMode::kForWrite))  
  129.         {  
  130.                 acutPrintf(采用T("\n打开实体失败"));  
  131.                 return;  
  132.         }  
  133.         ads采用point ptBase;  
  134.         if(acedGetPoint(NULL,采用T("\n选择旋转的基点"),ptBase) != RTNORM)  
  135.         {  
  136.                 pEnt->close();////如果不及时关闭,会导致内存泄漏  
  137.                 return;  
  138.         }  
  139.         ads采用real angle;  
  140.         if(acedGetAngle(ptBase,采用T("\n输入旋转角度"),&angle) != RTNORM)  
  141.         {  
  142.                 pEnt->close();  
  143.                 return;  
  144.         }  
  145.         AcDbCurve* pCurve;  
  146.         pCurve = (AcDbCurve*)pEnt;  
  147.         AcGePoint3d ptCenter;  
  148.         pCurve->getStartPoint(ptCenter);  
  149.         AcGeMatrix3d mat;  
  150.         acutPrintf(采用T("angle is %.2f"),angle);  
  151.         mat.setToRotation(angle,AcGeVector3d::kZAxis,ptCenter);  
  152.         //mat.rotation(angle,AcGeVector2d::kXAxis,ptCenter);  
  153.         pEnt->transformBy(mat);  
  154.         pEnt->close();  
  155. }  
  156. ////镜像  
  157. [it618postdisplay>0]
  158. static void TESTmrcmd()  
  159. {  
  160.         ads采用name name;  
  161.         ads采用point ptEnt;  
  162.         AcDbObjectId id;  
  163.         if(acedEntSel(采用T("选择要镜像的实体"),name,ptEnt) != RTNORM)  
  164.         {  
  165.                 acutPrintf(采用T("\nno obj select"));  
  166.                 return;  
  167.         }  
  168.         if(Acad::ErrorStatus::eOk != acdbGetObjectId(id,name))  
  169.         {  
  170.                 return;  
  171.         }  
  172.         AcDbEntity* pEnt;  
  173.         if(Acad::ErrorStatus::eOk != acdbOpenObject(pEnt,id,AcDb::OpenMode::kForWrite))  
  174.         {  
  175.                 acutPrintf(采用T("\n打开实体失败"));  
  176.                 return;  
  177.         }  
  178.         ads采用point ptDis1;  
  179.         if(acedGetPoint(NULL,采用T("\n选择镜像点1"),ptDis1) !=RTNORM)  
  180.         {  
  181.                 acutPrintf(采用T("\nno point select"));  
  182.                 pEnt->close();  
  183.                 return;  
  184.         }  
  185.         ads采用point ptDis2;  
  186.         if(acedGetPoint(NULL,采用T("\n选择镜像点2"),ptDis2) !=RTNORM)  
  187.         {  
  188.                 acutPrintf(采用T("\nno point select"));  
  189.                 pEnt->close();  
  190.                 return;  
  191.         }  
  192.         AcGePoint3d ptDis3d1 = asPnt3d(ptDis1);  
  193.         AcGePoint3d ptDis3d2 = asPnt3d(ptDis2);  
  194.         AcGeLine3d line(ptDis3d1,ptDis3d2);  
  195.         AcGeMatrix3d mat ;  
  196.         mat.setToMirroring(line);  
  197.         acedInitGet(NULL,采用T("Y N"));  
  198.         CString strKW;  
  199.         if(acedGetKword(采用T("删除原对象?Y/N"),strKW.GetBuffer(1)) != RTNORM)  
  200.         {  
  201.                 return;  
  202.         }  
  203.         strKW.ReleaseBuffer();  
  204.         if(strKW.CompareNoCase(采用T("N")) == 0)  
  205.         {  
  206.                 AcDbEntity* pEnt2 = AcDbEntity::cast(pEnt->clone());  
  207.                 LoadEntity(pEnt2);  
  208.                 pEnt2->close();  
  209.         }  
  210.         pEnt->transformBy(mat);  
  211.         pEnt->close();  
  212. }  
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-29 20:46 , Processed in 0.133483 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表