找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 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. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-28 14:57 , Processed in 0.125908 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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