|
- //根据给定的字符数组获取该实体的ID
- //tips为acedEntSel()在暂停之前显示的可选字符串; 如果是空指针, AutoCAD将显示"选择对象"默认提示
- AcDbObjectId CTransUtil::GetId(const ACHAR *tips)
- {
- ads采用name entName; //存储AutoLISP实体名称
- ads采用point pt; //存储点的坐标
- if (acedEntSel(tips, entName, pt) == RTNORM) {//选择AutoCAD中的实体
- AcDbObjectId oId;
- acdbGetObjectId(oId, entName);
- return oId;//根据给定的实体名称获取该实体的ID,并将该ID存储在变量oId中
- }
- else {
- return AcDbObjectId::kNull;
- }
- }
- //通过克隆给定的对象并返回新对象的ID
- AcDbObjectId CTransUtil::MyClone(AcDbObjectId objId)
- {
- if (objId == AcDbObjectId::kNull)
- {
- return objId;
- }
- else
- {
- AcDbEntity *pEnt = NULL;
- //只读方式打开实体
- if (acdbOpenAcDbEntity(pEnt, objId, AcDb::OpenMode::kForRead) != ErrorStatus::eOk)
- return AcDbObjectId::kNull;
- AcDbEntity *copyEnt = AcDbEntity::cast(pEnt->clone());
- //克隆通过指针pEnt打开的实体,并将其转换为AcDbEntity类型的指针copyEnt
- AcDbObjectId copyId=CDwgDataBaseUtil::PostToModelSpace(copyEnt);
- //将克隆的实体发布到模型空间,并将返回的ID存储在变量copyId中。
- acutPrintf(TEXT("克隆成功!"));
- pEnt->close();
- return copyId;//关闭实体并返回新克隆实体的ID。
- }
- }
- //将指定的AutoCAD对象按照指定的移动点进行移动
- void CTransUtil::Move(const AcGePoint3d & basePoint, const AcGePoint3d & movePoint, AcDbObjectId objId)
- {
- AcDbEntity *pEnt = NULL;
- if (acdbOpenAcDbEntity(pEnt, objId, AcDb::OpenMode::kForWrite) != ErrorStatus::eOk)
- return;
- AcGeMatrix3d matrxMove;//3D变换矩阵,用于进行空间变换
- AcGeVector3d v = movePoint - basePoint;//从基础点到移动点的向量
- matrxMove.setTranslation(v);//使用向量v设置矩阵matrxMove的平移部分。这会使实体沿着这个向量移动。
- pEnt->transformBy(matrxMove);//使用矩阵matrxMove对实体进行变换。这会使实体沿着移动向量移动到新的位置。
- acutPrintf(TEXT("移动成功!"));
- pEnt->close();
- }
- //将指定的AutoCAD实体围绕指定的基点旋转指定的角度。
- void CTransUtil::Rotate(const AcGePoint3d & basePoint, const double rotation, AcDbObjectId objId)
- {
- AcDbEntity *pEnt = NULL;
- if (acdbOpenAcDbEntity(pEnt, objId, AcDb::OpenMode::kForWrite) != ErrorStatus::eOk)
- return;
- AcGeVector3d normal = AcGeVector3d(0, 0, 1);//旋转轴
- pEnt->transformBy(AcGeMatrix3d::rotation(rotation, normal, basePoint));
- /*使用基点、旋转角度和旋转轴对实体进行变换。这是通过调用transformBy方法实现的,
- 该方法接受一个变换矩阵作为参数。在这个例子中,旋转矩阵是由AcGeMatrix3d::rotation函数生成的。*/
- acutPrintf(TEXT("旋转成功!"));
- pEnt->close();
- }
- //将指定的AutoCAD实体以指定的轴进行对称。
- void CTransUtil::Mirrore(AcDbObjectId entId, const AcGeLine3d& line, double rotate)
- {
- AcGeMatrix3d xform;//定义一个三维变换矩阵
- AcDbEntity *pEnt = NULL;
- if (acdbOpenAcDbEntity(pEnt, entId, AcDb::OpenMode::kForWrite) != ErrorStatus::eOk)
- return;
- pEnt->transformBy(AcGeMatrix3d::mirroring(line));
- acutPrintf(TEXT("对称成功!"));
- pEnt->close();
- }
-
- //将指定的AutoCAD实体以指定的基点缩放。
- void CTransUtil::Scale(AcDbObjectId objId, double scale,AcGePoint3d &ptBase)
- {
- AcDbEntity *pEnt = NULL;
- if (acdbOpenAcDbEntity(pEnt, objId, AcDb::OpenMode::kForWrite) != ErrorStatus::eOk)
- return;
- pEnt->transformBy(AcGeMatrix3d::scaling(scale, ptBase));
- //先调用AcGeMatrix3d::scaling函数创建一个表示缩放操作的矩阵,
- // 然后调用实体指针pEnt的transformBy方法,将这个矩阵应用于该实体。
- pEnt->close();
- acutPrintf(TEXT("缩放成功!"));
- }
复制代码 |
|