天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 157|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
    发表于 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. }  
    复制代码

     

     

     

     

    [每日一码] ObjectARX 移动、拷贝、缩放、旋转、镜像代码
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-11-1 08:10 , Processed in 0.124945 second(s), 24 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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