- UID
- 1
- 积分
- 15887
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-1-3
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
方法#1:
使用acedInvoke()函数调用 AutoCAD ROTATE3D 命令.
ROTATE3D 命令是在geom3d.arx中定义的,使用acedDefun注册的外部命令,所以除了使用acedInvoke()函数调用外,不能使用acedCommand 调用.另外,你还必须要保证geom3d.arx加载,并且在你使用acedDefun()方法定义的函数内通过acedInvoke()调用它.不能在用acedRegCmds->addCommand()方法定义的命令内使用.
下面是示例代码:
- int testfunc()
- {
- // make sure that geom3d.arx is loaded
- acedArxLoad("geom3d.arx");
- ads_name pieces;
- ads_point Point1, Point2;
- Point1[X] = 1.0;
- Point1[Y] = 1.0;
- Point1[Z] = 0.0;
- Point1[X] = 10.0;
- Point1[Y] = 10.0;
- Point1[Z] = 10.0;
- ads_real Angle = 32;
-
- //Select the entities you want to rotate
- acedSSGet( NULL,NULL, NULL, NULL, pieces );
-
- resbuf* pBuf = acutBuildList(RTSTR,"c:rotate3d", RTPICKS, pieces,
- RTSTR, "", RT3DPOINT, Point1, RT3DPOINT, Point2, RTREAL, Angle,
- RTNONE);
-
- resbuf* result=NULL;
- acedInvoke(pBuf,&result);
- acutRelRb(pBuf);
- if (result!=NULL)
- acutRelRb(result);
-
- return RTNORM;
- }
复制代码
方法#2:
使用ObjectARX, 推荐使用 AcDbEntity::transformBy() 方法代替ROTATE3D命令,例如:对每一个实体以AcGePoint3d 起始点和终点为轴,和旋转角,你可以用下面的代码实现:
double pi = 3.14159265359;
AcDbObjectId objId;
acdbGetObjectId(objId, ename);
AcDbEntity* pEnt = NULL;
acdbOpenAcDbEntity(pEnt, objId, AcDb::kForWrite);
AcGeMatrix3d mat;
mat.setToRotation(angle * pi / 180, end - start, start);
pEnt->transformBy(mat);
pEnt->close(); |
|