|
ARX实现Z轴归0
有时候dwg图纸画的不规整,导致很多实体不在同一平面上,这给绘图带来了很大的麻烦,因此就有将它们
放在同一平面上的需求,理论上是在XY平面上
const TCHAR* prompt[2] = {_T("\n选择需要Z轴归0的实体<退出>:"), _T("")};
ads_name ssname;
if (RTNORM != acedSSGet(_T(":$"), prompt, NULL, NULL, ssname))
return;
AcDbObjectIdArray ids = CBaseDwg::GetObjectids(ssname);
if (ids.isEmpty())
return;
AcGePoint3d ptTop(0, 0, 1e99);
AcGePoint3d ptBelow(0, 0, -1e99);
AcGeVector3d vec1 = ptTop.asVector();
AcGeVector3d vec2 = ptBelow - ptTop;
AcGeVector3d vec3 = AcGePoint3d::kOrigin - ptBelow;
AcGeMatrix3d mat1, mat2, mat3;
mat1.setToTranslation(vec1);
mat2.setToTranslation(vec2);
mat3.setToTranslation(vec3);
for (int i = 0; i < ids.length(); i++)
{
AcDbEntityPointer pEnt(ids[i], AcDb::kForWrite);
if (Acad::eOk != pEnt.openStatus())
continue;
pEnt->transformBy(mat1);
pEnt->transformBy(mat2);
pEnt->transformBy(mat3);
}
acedSSFree(ssname);
思路很简单,将所有的实体选中,然后移动到理论上的最高处,然后移动到最低处,最后移动到XY平面上即可,这个是cad默认的一个技巧。
如果不用这种办法,那你需要将每个实体的Z坐标改为0,那就是一个费力气的活了。
当然,这个也不是全能办法,也会有一些特例出现,比如面域,比如一些特殊曲线,当然,如果这些要改为xy平面上,那可能变化太大。。。当然,使用实体的投影也是可以的。
[code]原文链接:https://blog.csdn.net/zeqi1991/article/details/113189821[/code] |
|