背景
在CAD中,对于多条曲线围成的图形,如果想通过Region或者BO命令创建成闭环曲线,有时候可能会由于绘图误差或者图形转换等原因导致曲线之间并未完全连接,出现小间隙或者有交错的情况,此时对于此类”脏图形”的处理通常较为麻烦,CAD原生操作中,可通过PE-M-J来进行合并,而如果图形数量较多,则处理起来费时费力。
不巧的是,PE-M-J操作,CAD并未提供二开接口供直接调用,因此需要开发者自行编写图形处理逻辑来处理此类问题。
我的处理思路:
1、用户框选之后,通过图元之间的距离关系,对图元进行分组,以确保找到正确的邻居;找邻居时可采用包围盒重叠法或者交点法进行。如果需要处理的图形较多,可通过构建四叉树进行图元分组以提高速度;
2、分组之后,通过瞬态显示分组轮廓提示用户确认,以确保分组正确;
3、针对每个分组,通过端点距离最近的方法对曲线排序,处理过程中需考虑曲线逆向的问题,如果是逆向的,则直接对它再次逆向,以确保形成首尾相连。可采用普通的List存储,也可采用链表存储;
4、遍历列表,计算当前曲线和下一条曲线的交点。然后把当前曲线的终点、下一条曲线的起点移动到交点位置。
5、移动端点时,有四种特殊情况:
- 如果曲线是Line,则可直接重设EntPoint或者StartPoint;
- 如果曲线是Arc,则需要重设StartAngle和EndAngle,此时务必需要注意Arc的法向量。如果是朝向Z,则Arc是逆时针绘制的;如果是朝向-Z,则ARC是顺时针绘制的。这部分的处理非常容易出错,需注意;
- 如果曲线是Polyline,则有两种情况,如果与当前点(需要移动的点)相连的那一段是直的,那么可以直接修改节点位置;如果是一段圆弧,则需要在移动点之后,通过几何算法计算新的凸度,此时需要注意多段线的凸度存储在前一个节点中。计算凸度易出错,需小心。
- 如果曲线是SPLine,则需要提前把SPLine通过扫描点法转为Polyline再进行后续处理。
6、最后从端点处理完毕的曲线中获取所有的取样点,Line对象获取首尾端点,Arc对象获取首尾端点与凸度(凸度需要根据圆心角TotalAngle自行计算),Polyline对象获取所有节点和凸度。最后根据这些取样点创建新的多段线。
7、最后,判断首尾连接关系,如果距离大于容差,不闭合,小于容差,则设置新多段线Closed=True以使其闭合。
8、删除原始曲线。
操作演示如下:
欢迎交流~