CAD二次开发 C# 实现Mline效果

860 阅读1分钟

开头先示意一下CAD自带的多线效果: mline.gif 之所以想要自己模拟出多线效果,主要是在起点和终点处的两线端点不能调整位置,在部分应用场景里不够灵活。

先分析出要做的关键点:平行,线间距可调整,两端点位置可自由调整位置。
解决思路:用户选点的路径作为多线的中间线,至于两边的线用GetOffsetCurves方法得到上下线,当然你也可以自己计算得出两边线位置,不过用GetOffsetCurves方法对于调整线宽很方便,offset一正一负就行了。
image.png
下面是效果
mline.gif 可以明显看出有大问题,在有角度情况下选点的上一个点处两边线不平行了,这个时候我还是感觉用GetOffsetCurves在思路上是没问题的,于是临时用Line看了下原始效果: mline.gif 原来是需要调整点的位置,发现了问题,那简单了。这里我采用了CAD自带的IntersectWith求交点方法算出位置,要注意的是在平行的时候就不要求交点了

/// <summary>
/// 调整线交点
/// </summary>
/// <param name="polyline">上游线</param>
/// <param name="nextLine">下游线</param>
private void AdjustMlinePoint(Polyline polyline, Line nextLine)
{
    Line prevLine = polyline.GetPrevLineByPolyline(polyline.NumberOfVertices - 2);
    if (!prevLine.GetFirstDerivative(0).IsParallelTo(nextLine.GetFirstDerivative(0)))
    {
        Point3dCollection point3DCollection = new Point3dCollection();
        prevLine.IntersectWith(nextLine, Intersect.ExtendBoth, prevLine.GetPlane(), point3DCollection, IntPtr.Zero, IntPtr.Zero);
        polyline.SetPointAt(polyline.NumberOfVertices - 2, point3DCollection[0].toPoint2d());
    }
}

mline.gif 至于想要Mline那种及时显示双线绘制的效果,只要把计算的方法照搬到Jig里就行了。(需要说的是这里我选择了用两个Polyline实现效果,实际上用Line也能实现原理一样的)

image.png