使用 ezdxf 生成 DXF:包含样条拟合点的折线

DXF generation using ezdxf: polyline containing spline fit points

我正在开发一个程序,其中一个要求是输入为DXF。输入仅限于 2D 情况。该程序本身是用 C++/Qt 编写的,但要对其进行测试,我需要一些示例 DXF 输入。样条导入已经实现,下一步是添加样条拟合点或控制点的折线。我决定使用 Python/ezdxf 生成这样的折线,因为我没有 Autocad。

我的第一种方法是利用 add_spline_control_frame 从拟合点创建样条,然后将其转换为折线。问题是没有从样条曲线到多段线的转换(虽然我想我在文档中看到了它,但再也找不到了)。

目前的方法是通过add_polyline2d(points)制作多段线,使每个点都与DXF标志字段相等8(通过样条拟合创建的样条顶点)。问题是点需要是 DXFVertex 类型(文档状态 Vertex,但它不存在),并且该类型对于 ezdxf 是私有的。

请分享您解决我遇到的 ezdxf 问题或最初问题的方法。

P.S。我尝试使用 LibreCAD 生成这样的折线,但是几乎不可能从那里的样条拟合点制作闭合折线。

在 DXF R2000 中添加 SPLINE 实体之前,AutoCAD 使用了通过 POLYLINE 实体创建 B-splines 的能力。 Autodesk 未记录此功能的用法,ezdxf 也未以任何方式推广它。

如果可以,请使用 SPLINE 实体,但如果您必须使用 DXF R12 - 在 ezdxf 中有一个助手 class 来创建这样的样条线 ezdxf.render.R12Spline 和一个用法示例 here.

但是您会失望的 BricsCAD 和 AutoCAD 显示了非常明显的多边形结构:

因为不仅控制点,而且近似曲线点都必须存储为折线点,为了获得更平滑的曲线,您必须使用许多近似点,但您也可以使用常规 POLYLINE 作为近似值.我假设仅存储控制点以保持样条曲线可编辑。

我对这个主题的了解都记录在 r12spline.py 文件中。如果您找到更好的方法来为 DXF R12 创建具有更少近似点的平滑 B-splines,请告诉我。

将 SPLINE 实体 spline 近似为点的示例,可由 POLYLINE 实体使用:

bspline = spline.construction_tool()
msp.add_polyline3d(bpline.approximate(segments=20))

SPLINE 实体是一个 3D 实体,如果您想将样条线压缩成 xy-plane,请移除 z-axis:

xy_pts = [p.xy for p in bpline.approximate(segments=20)]
msp.add_polyline2d(xy_pts)

# or as LWPOLYLINE entity:
msp.add_lwpolyline(xy_pts, format='xy')