|
- static void BasicTramsforms(AcDbEntity* pEnt)
- {
- //最近做一个ARX项目,要求在三维空间的不同视角下用鼠标拖动绘制或布置实体
- //主要用到以下函数或方法:
-
- /*
- acedGetCurrentUCS(AcGeMatrixed&); //获取当前UCS转换矩阵,通过这个矩阵可以将UCS转换为WCS
- AcGeMatrix::inverse(); //获取逆向转换矩阵。
- AcGePoint3d::transformBy(AcGeMatrixed&); //根据矩阵,转换点坐标。
- AcDbEntity::transformBy(AcGeMatrixed&); //对实体进行矩阵转换。
- AcDbExtents::transformBy(AcGeMatrixed&); //对范围进行矩阵转换。
- */
- //绘制时视角为当前UCS的XY轴平面。用鼠标拖动点选的坐标肯定为UCS坐标,直接用这个坐标绘制,不用进行转换,绘制好后转换一次就好。代码如下:
- AcGeMatrix3d mat;
- acedGetCurrentUCS(mat);
- pEnt->transformBy(mat);
- //如果要用鼠标拖动实体:
- AcGePoint3d oldPt; //原来所在位置 如果是WCS要转换为UCS
- AcGePoint3d newPt; //现在所在位置 当前鼠标所在位置,肯定是UCS
- oldPt.transformBy(mat);
- newPt.transformBy(mat);
- AcGeMatrix3d offset采用mat;
- offset采用mat.setToIdentity();
- offset采用mat(0, 3) = newPt.x - oldPt.x;
- offset采用mat(1, 3) = newPt.y - oldPt.y;
- offset采用mat(2, 3) = newPt.z - oldPt.z;
- pEnt->transformBy(mat);
- //如果要判断当前点在某个实体XY轴平面范围内:
- AcGePoint3d insertPt; //要判断的点
- AcGeMatrix3d mat2;
- acedGetCurrentUCS(mat2);
- AcDbExtents extents;
- pEnt->getGeomExtents(extents); //pEnt为实体指针。
- extents.transformBy(mat2.inverse()); //获取的范围为WCS,要转换为UCS。注意 mat.inverse()只返回值,不改变mat本身。
- if (insertPt[X] >= extents.minPoint().x && insertPt[X] <= extents.maxPoint().x &&insertPt[Y] >= extents.minPoint().y && insertPt[Y] <= extents.maxPoint().y)
- {
- //.....
- }
- }
复制代码 |
|