|
背景
在使用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实现镜像功能。
|
|