|
[code]最近做一个ARX项目,要求在三维空间的不同视角下用鼠标拖动绘制或布置实体
主要用到以下函数或方法:
acedGetCurrentUCS(AcGeMatrixed&) 获取当前UCS转换矩阵,通过这个矩阵可以将UCS转换为WCS
AcGeMatrixed::inverse() 获取逆向转换矩阵。
AcGePoint3d::transformBy(AcGeMatrixed&) 根据矩阵,转换点坐标。
AcDbEntity::transformBy(AcGeMatrixed&) 对实体进行矩阵转换。
AcDbExtents::transformBy(AcGeMatrixed&) 对范围进行矩阵转换。
绘制时视角为当前UCS的XY轴平面。用鼠标拖动点选的坐标肯定为UCS坐标,直接用这个坐标绘制,不用进行转换,绘制好后转换一次就好。代码如下:
AcGeMatrix3d mat;
acedGetCurrentUCS(mat);
pEnt->transformBy(mat); //pEnt为绘制好的实体指针。
如果要用鼠标拖动实体:
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); //pEnt为要移动的实体指针。
如果要判断当前点在某个实体XY轴平面范围内:
AcGePoint3d inserPt; //要判断的点
AcGeMatrix3d mat;
acedGetCurrentUCS(mat);
AcDbExtents extents;
pEnt->getGeomExtents(extents); //pEnt为实体指针。
extents.transformBy(mat.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) {.....}[/code] |
|