admin 发表于 2024-3-6 11:48:13

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

//根据给定的字符数组获取该实体的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("缩放成功!"));
}
页: [1]
查看完整版本: 图形的复制,移动,旋转,对称,缩放