ObjectArx acedCommand实现镜像功能

ObjectARX acedCommand实现镜像功能

背景

在使用Arx对cad进行二次开发,实现镜像功能时,发现使用系统函数AcGeMatrix3d::mirroring和AcGeMatrix3d::setToMirroring无法对自定义实体进行镜像(或许是由于自定义实体部分实现存在问题,但没有找到原因),便想到使用acedCommand或acedCommandS给cad发送命令实现镜像功能。

介绍

在使用acedCommand或acedCommandS函数过程中,其中遇到了一些问题,由于cad的函数参数介绍不是太清晰,导致使用过程中需要摸索实验,找到最终如何填充各个参数,实现镜像功能,功夫不负有心人,通过查找及实验,成功解决了使用acedCommand或acedCommandS给cad发送命令实现镜像功能。

实现

// 对选中的实体逐个实现镜像功能
		ads_name ents;
        ads_point pt1, pt2;
        if (acedSSGet(NULL, NULL, NULL, NULL, ents) != RTNORM) {
            return;
        }

        if (acedGetPoint(NULL, L"Pt:", pt1) != RTNORM) {
            return;
        }
        if (acedGetPoint(pt1, L"Pt:", pt2) != RTNORM) {
            return;
        }
        ads_name singleEnt;
        long len = 0;
        acedSSLength(ents, &len);
        for (int i = 0; i < len; i++)
        {
            ads_name entname;
            acedSSName(ents, i, entname);
            acedSSAdd(entname, NULL, singleEnt);
#if _MSC_VER >= 1700
            acedCommandS(RTSTR, _T("MIRROR"),
                RTPICKS, singleEnt,
                RTSTR, _T(""),
                RTPOINT, pt1,
                RTPOINT, pt2,
                RTSTR, _T("N"),  // 此代表是否保留镜像之前实体
                RTSTR, _T(""),
                RTNONE);
#else                
            acedCommand(RTSTR, _T("MIRROR"),
                RTPICKS, singleEnt,
                RTSTR, _T(""),
                RTPOINT, pt1,
                RTPOINT, pt2,
                RTSTR, _T("N"),  // 此代表是否保留镜像之前实体
                RTSTR, _T(""),
                RTNONE);
#endif               
            acedSSFree(singleEnt);
        }
        acedSSFree(ents);
// 对选中的实体整体实现镜像功能
		ads_name ents;
        ads_point pt1, pt2;
        if (acedSSGet(NULL, NULL, NULL, NULL, ents) != RTNORM) {
            return;
        }

        if (acedGetPoint(NULL, L"Pt:", pt1) != RTNORM) {
            return;
        }
        if (acedGetPoint(pt1, L"Pt:", pt2) != RTNORM) {
            return;
        }
#if _MSC_VER >= 1700        
        acedCommandS(RTSTR, _T("MIRROR"),
                RTPICKS, ents,
                RTSTR, _T(""),
                RTPOINT, pt1,
                RTPOINT, pt2,
                RTSTR, _T("N"),  // 此代表是否保留镜像之前实体
                RTSTR, _T(""),
                RTNONE);
#else
        acedCommand(RTSTR, _T("MIRROR"),
                RTPICKS, ents,
                RTSTR, _T(""),
                RTPOINT, pt1,
                RTPOINT, pt2,
                RTSTR, _T("N"),  // 此代表是否保留镜像之前实体
                RTSTR, _T(""),
                RTNONE); 
#endif                         
        acedSSFree(ents);

总结

cad中函数介绍不像windows Api那样的详细,有时候使用起来比较费劲,总体来说,还是可以通过实验找到最终实现方案,另外说说感受就是编程人员一定要有耐心,有想法,敢猜想,勤验证,并对结果进行总结,最终得到满意的方案。

扩展

如果知道了所有实体Id,可以通过acdbGetAdsName函数获取实体名称,再通过acedSSAdd函数获取所有实体名称集合,通过acedCommand或acedCommandS实现镜像功能。

关于_MSC_VER的介绍,详见链接: https://blog.csdn.net/a135138/article/details/114325057?spm=1001.2014.3001.5501

原创不易,转载请注明出处。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值