在 AutoCAD 中编辑 LW 折线内的圆弧法线 Z,而不爆炸折线

问题描述 投票:0回答:1

这篇支持文章概述了我的问题的大致来源:https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/SOLPROF-flips-Normal-Z-value-of-curved-subtracted -AutoCAD 中的几何图形.html

我在从 Rhino 导出的 DWG 文件中有弧,其中法线 Z 值为“-1”,使它们在平面上面向后。问题是,这些弧是“不可见的”,因为它们隐藏在轻量折线内。唯一出现问题的时候是当您尝试将具有 -1 法向 Z 的多段线与另一条多段线连接时,在这种情况下,新实体是样条线,因为 -1 法向 Z 弧在技术上不是 2D,因此它们不会连接到轻量级折线。

在 C# API 中,通过迭代折线中的顶点并使用 GetArcSegmentAt() 方法,我可以看到不正确的值。这将返回一个新的 CircularArc3d 对象,该对象显示不正确的法线 Z 值。但是,我无法编辑它。由于它是一条轻量级多段线(本质上是 2D),我可以就地编辑多段线弧的唯一值是凸出值,该值不会将法线 Z 重置为正确的值。

我正在尝试这样的事情:

acPlLwObj = acTrans.GetObject(acObj, OpenMode.ForWrite) as Polyline;
for (int i = 0; i < acPlLwObj.NumberOfVertices; i++)
{
    var acPlArc = acPlLwObj.GetArcSegmentAt(i);
    acPlArc.SetAxes(normalZ2d, acPlArc.ReferenceVector);
}
acTrans.Commit();

...其中,normalZ2d 是 vec3D:0, 0, 1。

如果我编辑折线对象的法线,它会将绕原点的 X 轴上的折线镜像为负值。

是否有任何方法可以使用 C# 在轻量级折线内编辑此弧的法线 Z,而无需分解折线并重新创建它?如果

c# .net autocad cad autocad-plugin
1个回答
0
投票

我找到了一个解决方法。我对此并不感到兴奋,但问题是我太关注折线内的弧形实体,而不是关注折线本身。

折线顶点有两个定义其位置的值。一个 Point3d 和一个 Point2d。 Point3d X/Y 相对于 WCS 是正常的。但是,Point2d 法线是相对于折线的法线 Z 而言的。如果您的法线 Z 为 -1,这将为您提供每个顶点的两组坐标。

解决方案是使用来自 Point3d 坐标的 X/Y 为有问题的折线中的每个顶点“重置”Point2d 坐标,然后反转任何弧的凸出值。之后,我能够重置包含多段线上的法线,而无需让任何顶点围绕 WCS 旋转。

它还没有经过战斗测试,但它适用于我拥有的一些不好的示例图:

                    Polyline acPlLwObj;
                    acPlLwObj = acTrans.GetObject(acObj, OpenMode.ForWrite) as Polyline;
                    ed.WriteMessage($"{acPlLwObj.Normal.ToString()}\r\n");
                    for (int i = 0; i < acPlLwObj.NumberOfVertices; i++)
                    {
                        var acPl3DPoint = acPlLwObj.GetPoint3dAt(i);
                        var acPl2DPoint = acPlLwObj.GetPoint2dAt(i);
                        var acPl2DPointNew = new Point2d(acPl3DPoint.X, acPl3DPoint.Y);
                        acPlLwObj.SetPointAt(i, acPl2DPointNew);
                        acPlLwObj.SetBulgeAt(i, -acPlLwObj.GetBulgeAt(i));
                    }
                    acPlLwObj.Normal = normalZ2d;
                    acTrans.Commit();
© www.soinside.com 2019 - 2024. All rights reserved.