找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 6552|回复: 74

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

  [复制链接]

已领礼包: 13个

财富等级: 恭喜发财

发表于 2016-10-28 13:25:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
//拷贝,移动,旋转 ,镜像,缩放  


////选择一个对象  
static BOOL SelObj(ads_point& pt,AcDbObjectId& objId){  
        ads_name en;  
        if(acedEntSel(_T("\n选择对象"),en,pt) != RTNORM){  
                return false;  
        }  
        Acad::ErrorStatus es = acdbGetObjectId(objId,en);  
        return es == Acad::ErrorStatus::eOk ? true : false;  
}  


//选择一个点  
static BOOL SelPoint(ads_point& ptEnd){  
        if(acedGetPoint(NULL,_T("\n选择一个点"),ptEnd) != RTNORM){  
                return false;  
        }  
        return true;  
}  

////拷贝函数测试  


static void TESTcopycmd(){  
        AcDbObjectId objId;  
        ads_point ptStart;  
        ads_point ptEnd;  

        if(!SelObj(ptStart,objId)){  
                acutPrintf(_T("选择对象失败"));  
        };  

        if(!SelPoint(ptEnd)){  
                acutPrintf(_T("选择点失败"));  
        }  
        CopyTo(objId,ptStart,ptEnd);  
}  


////拷贝函数  


static BOOL CopyTo(AcDbObjectId entId,const ads_point& ptFrom,  
                                   const ads_point& ptTo)
{  
        AcDbEntity* pEnt = NULL;  
        if(acdbOpenObject(pEnt,entId,AcDb::kForRead) != Acad::eOk){  
                return FALSE;  
        }  
        AcDbEntity* pCopyEnt = AcDbEntity::cast(pEnt->clone());  
        AcDbObjectId copyEntId;  
        if(pCopyEnt){  
                copyEntId = LoadEntity(pCopyEnt);  
        }  

        Move(copyEntId,ptFrom,ptTo);  

}  

////移动函数测试============  
static void TESTmovecmd(){  
        AcDbObjectId objId;  
        ads_point ptStart;  
        ads_point ptEnd;  

        if(!SelObj(ptStart,objId)){  
                acutPrintf(_T("选择对象失败"));  
        };  

        if(!SelPoint(ptEnd)){  
                acutPrintf(_T("选择点失败"));  
        }  

        Move(objId,ptStart,ptEnd);  
}  

////移动函数  
static Acad::ErrorStatus Move(AcDbObjectId entId,const ads_point& ptFrom,const ads_point& ptTo){  

        AcGeVector3d vec(ptTo[X] - ptFrom[X],ptTo[Y] - ptFrom[Y],  
                ptTo[Z] - ptFrom[Z]);  

        AcGeMatrix3d mat;  
        mat.setToTranslation(vec);  
        AcDbEntity* pEnt = NULL;  
        Acad::ErrorStatus es = acdbOpenObject(pEnt,entId,AcDb::kForWrite);  
        if(es!=Acad::eOk){  
                return es;  
        }  
        es=pEnt->transformBy(mat);  
        pEnt->close();  
}  


////缩放  
static void TESTsccmd()  
{  
        ads_name name;  
        ads_point ptEnt;  
        AcDbObjectId id;  
        if(acedEntSel(_T("选择要扩大的实体"),name,ptEnt) != RTNORM)  
        {  
                acutPrintf(_T("\nno obj select"));  
                return;  
        }  
        if(Acad::ErrorStatus::eOk != acdbGetObjectId(id,name))  
        {  
                return;  
        }  
        AcDbEntity* pEnt;  

        if(Acad::ErrorStatus::eOk != acdbOpenObject(pEnt,id,AcDb::OpenMode::kForWrite))  
        {  
                acutPrintf(_T("\n打开实体失败"));  
                return;  
        }  

        ads_real num;  
        if(acedGetReal(_T("\n输入扩展倍数"),&num) != RTNORM)  
        {  
                pEnt->close();  
                return;  
        }  

        ads_point pt;  
        if(acedGetPoint(NULL,_T("\n选择基点"),pt) != RTNORM)  
        {  
                pEnt->close();  
                return;  
        }  

        AcGePoint3d pt3d = asPnt3d(pt);  
        AcGeMatrix3d mat;  
        mat.setToScaling(num,pt3d);  

        pEnt->transformBy(mat);  
        pEnt->close();  
}  

////旋转  
static void TESTrtcmd()  
{  
        ads_name name;  
        ads_point ptEnt;  
        AcDbObjectId id;  
        if(acedEntSel(_T("选择要旋转的实体"),name,ptEnt) != RTNORM)  
        {  
                acutPrintf(_T("\nno obj select"));  
                return;  
        }  
        if(Acad::ErrorStatus::eOk != acdbGetObjectId(id,name))  
        {  
                return;  
        }  
        AcDbEntity* pEnt;  

        if(Acad::ErrorStatus::eOk != acdbOpenObject(pEnt,id,AcDb::OpenMode::kForWrite))  
        {  
                acutPrintf(_T("\n打开实体失败"));  
                return;  
        }  

        ads_point ptBase;  
        if(acedGetPoint(NULL,_T("\n选择旋转的基点"),ptBase) != RTNORM)  
        {  
                pEnt->close();////如果不及时关闭,会导致内存泄漏  
                return;  
        }  

        ads_real angle;  
        if(acedGetAngle(ptBase,_T("\n输入旋转角度"),&angle) != RTNORM)  
        {  
                pEnt->close();  
                return;  
        }  
        AcDbCurve* pCurve;  
        pCurve = (AcDbCurve*)pEnt;  

        AcGePoint3d ptCenter;  
        pCurve->getStartPoint(ptCenter);  

        AcGeMatrix3d mat;  
        acutPrintf(_T("angle is %.2f"),angle);  
        mat.setToRotation(angle,AcGeVector3d::kZAxis,ptCenter);  
        //mat.rotation(angle,AcGeVector2d::kXAxis,ptCenter);  

        pEnt->transformBy(mat);  
        pEnt->close();  
}  


////镜像  
[it618postdisplay>0]
static void TESTmrcmd()  
{  
        ads_name name;  
        ads_point ptEnt;  
        AcDbObjectId id;  
        if(acedEntSel(_T("选择要镜像的实体"),name,ptEnt) != RTNORM)  
        {  
                acutPrintf(_T("\nno obj select"));  
                return;  
        }  
        if(Acad::ErrorStatus::eOk != acdbGetObjectId(id,name))  
        {  
                return;  
        }  
        AcDbEntity* pEnt;  

        if(Acad::ErrorStatus::eOk != acdbOpenObject(pEnt,id,AcDb::OpenMode::kForWrite))  
        {  
                acutPrintf(_T("\n打开实体失败"));  
                return;  
        }  

        ads_point ptDis1;  
        if(acedGetPoint(NULL,_T("\n选择镜像点1"),ptDis1) !=RTNORM)  
        {  
                acutPrintf(_T("\nno point select"));  
                pEnt->close();  
                return;  
        }  
        ads_point ptDis2;  
        if(acedGetPoint(NULL,_T("\n选择镜像点2"),ptDis2) !=RTNORM)  
        {  
                acutPrintf(_T("\nno point select"));  
                pEnt->close();  
                return;  
        }  

        AcGePoint3d ptDis3d1 = asPnt3d(ptDis1);  
        AcGePoint3d ptDis3d2 = asPnt3d(ptDis2);  
        AcGeLine3d line(ptDis3d1,ptDis3d2);  

        AcGeMatrix3d mat ;  
        mat.setToMirroring(line);  

        acedInitGet(NULL,_T("Y N"));  
        CString strKW;  

        if(acedGetKword(_T("删除原对象?Y/N"),strKW.GetBuffer(1)) != RTNORM)  
        {  
                return;  
        }  
        strKW.ReleaseBuffer();  
        if(strKW.CompareNoCase(_T("N")) == 0)  
        {  
                AcDbEntity* pEnt2 = AcDbEntity::cast(pEnt->clone());  
                LoadEntity(pEnt2);  
                pEnt2->close();  
        }  

        pEnt->transformBy(mat);  
        pEnt->close();  

}  
 

[/it618postdisplay]

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 8987个

财富等级: 富甲天下

发表于 2016-10-28 20:48:10 | 显示全部楼层
啥也不说了,感谢楼主分享哇!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 60个

财富等级: 招财进宝

发表于 2016-11-3 10:56:48 | 显示全部楼层
啥也不说了,感谢楼主分享哇!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

发表于 2016-11-10 13:09:28 | 显示全部楼层
谢谢楼主分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2016-11-20 00:29:09 | 显示全部楼层
22222222222222222222222222222222
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 75个

财富等级: 招财进宝

发表于 2016-11-23 13:07:18 | 显示全部楼层
一段代码?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2016-11-25 14:51:30 | 显示全部楼层
RE: ObjectARX 移动、拷贝、缩放、旋转、镜像代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 187个

财富等级: 日进斗金

发表于 2016-12-6 15:39:21 | 显示全部楼层
努力学习代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 271个

财富等级: 日进斗金

发表于 2016-12-13 11:09:31 | 显示全部楼层
正需要,支持楼主大人了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

发表于 2016-12-25 18:17:38 | 显示全部楼层
看看思路

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 69个

财富等级: 招财进宝

发表于 2017-1-8 13:22:56 | 显示全部楼层
正需要,支持楼主大人了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 271个

财富等级: 日进斗金

发表于 2017-1-8 14:17:35 | 显示全部楼层
还有3d及2d对齐align,不知道怎么实现
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 35个

财富等级: 招财进宝

发表于 2017-2-11 18:32:37 | 显示全部楼层
非常感谢楼主! 非常受用
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2017-2-20 14:50:34 | 显示全部楼层
我来学习学习这个
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8个

财富等级: 恭喜发财

发表于 2017-3-13 00:11:01 | 显示全部楼层
RE: ObjectARX 移动、拷贝、缩放、旋转、镜像代码 [修改
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-21 23:15 , Processed in 0.274231 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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