天气与日历 切换到窄版

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

图形的复制,移动,旋转,对称,缩放

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

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
    发表于 2024-3-6 11:48:13 | 显示全部楼层 |阅读模式
    1. //根据给定的字符数组获取该实体的ID
    2. //tips为acedEntSel()在暂停之前显示的可选字符串; 如果是空指针, AutoCAD将显示"选择对象"默认提示
    3. AcDbObjectId CTransUtil::GetId(const ACHAR *tips)
    4. {
    5.         ads采用name entName; //存储AutoLISP实体名称
    6.         ads采用point pt; //存储点的坐标
    7.         if (acedEntSel(tips, entName, pt) == RTNORM) {//选择AutoCAD中的实体
    8.                 AcDbObjectId oId;
    9.                 acdbGetObjectId(oId, entName);
    10.                 return oId;//根据给定的实体名称获取该实体的ID,并将该ID存储在变量oId中
    11.         }
    12.         else {
    13.                 return AcDbObjectId::kNull;
    14.         }
    15. }
    16. //通过克隆给定的对象并返回新对象的ID
    17. AcDbObjectId CTransUtil::MyClone(AcDbObjectId objId)
    18. {
    19.         if (objId == AcDbObjectId::kNull)
    20.         {
    21.                 return objId;
    22.         }
    23.         else
    24.         {
    25.                 AcDbEntity *pEnt = NULL;
    26.                 //只读方式打开实体
    27.                 if (acdbOpenAcDbEntity(pEnt, objId, AcDb::OpenMode::kForRead) != ErrorStatus::eOk)
    28.                         return AcDbObjectId::kNull;
    29.                 AcDbEntity *copyEnt = AcDbEntity::cast(pEnt->clone());
    30.                 //克隆通过指针pEnt打开的实体,并将其转换为AcDbEntity类型的指针copyEnt
    31.                 AcDbObjectId copyId=CDwgDataBaseUtil::PostToModelSpace(copyEnt);
    32.                 //将克隆的实体发布到模型空间,并将返回的ID存储在变量copyId中。
    33.                 acutPrintf(TEXT("克隆成功!"));
    34.                 pEnt->close();
    35.                 return copyId;//关闭实体并返回新克隆实体的ID。
    36.         }
    37. }
    38. //将指定的AutoCAD对象按照指定的移动点进行移动
    39. void CTransUtil::Move(const AcGePoint3d & basePoint, const AcGePoint3d & movePoint, AcDbObjectId objId)
    40. {
    41.         AcDbEntity *pEnt = NULL;
    42.         if (acdbOpenAcDbEntity(pEnt, objId, AcDb::OpenMode::kForWrite) != ErrorStatus::eOk)
    43.                 return;
    44.         AcGeMatrix3d matrxMove;//3D变换矩阵,用于进行空间变换
    45.         AcGeVector3d v = movePoint - basePoint;//从基础点到移动点的向量
    46.         matrxMove.setTranslation(v);//使用向量v设置矩阵matrxMove的平移部分。这会使实体沿着这个向量移动。
    47.         pEnt->transformBy(matrxMove);//使用矩阵matrxMove对实体进行变换。这会使实体沿着移动向量移动到新的位置。
    48.         acutPrintf(TEXT("移动成功!"));
    49.         pEnt->close();
    50. }
    51. //将指定的AutoCAD实体围绕指定的基点旋转指定的角度。
    52. void CTransUtil::Rotate(const AcGePoint3d & basePoint, const double rotation, AcDbObjectId objId)
    53. {
    54.         AcDbEntity *pEnt = NULL;
    55.         if (acdbOpenAcDbEntity(pEnt, objId, AcDb::OpenMode::kForWrite) != ErrorStatus::eOk)
    56.                 return;
    57.         AcGeVector3d normal = AcGeVector3d(0, 0, 1);//旋转轴
    58.         pEnt->transformBy(AcGeMatrix3d::rotation(rotation, normal, basePoint));
    59.         /*使用基点、旋转角度和旋转轴对实体进行变换。这是通过调用transformBy方法实现的,
    60.         该方法接受一个变换矩阵作为参数。在这个例子中,旋转矩阵是由AcGeMatrix3d::rotation函数生成的。*/
    61.         acutPrintf(TEXT("旋转成功!"));
    62.         pEnt->close();
    63. }
    64. //将指定的AutoCAD实体以指定的轴进行对称。
    65. void CTransUtil::Mirrore(AcDbObjectId entId, const AcGeLine3d& line, double rotate)
    66. {
    67.         AcGeMatrix3d xform;//定义一个三维变换矩阵
    68.         AcDbEntity *pEnt = NULL;
    69.         if (acdbOpenAcDbEntity(pEnt, entId, AcDb::OpenMode::kForWrite) != ErrorStatus::eOk)
    70.                 return;
    71.         pEnt->transformBy(AcGeMatrix3d::mirroring(line));
    72.         acutPrintf(TEXT("对称成功!"));
    73.         pEnt->close();
    74. }
    75. //将指定的AutoCAD实体以指定的基点缩放。
    76. void CTransUtil::Scale(AcDbObjectId objId, double scale,AcGePoint3d &ptBase)
    77. {
    78.         AcDbEntity *pEnt = NULL;
    79.         if (acdbOpenAcDbEntity(pEnt, objId, AcDb::OpenMode::kForWrite) != ErrorStatus::eOk)
    80.                 return;
    81.         pEnt->transformBy(AcGeMatrix3d::scaling(scale, ptBase));
    82.         //先调用AcGeMatrix3d::scaling函数创建一个表示缩放操作的矩阵,
    83.         // 然后调用实体指针pEnt的transformBy方法,将这个矩阵应用于该实体。
    84.         pEnt->close();
    85.         acutPrintf(TEXT("缩放成功!"));
    86. }
    复制代码

     

     

     

     

    图形的复制,移动,旋转,对称,缩放
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-11-1 08:11 , Processed in 0.134209 second(s), 27 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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