如何解决使用ezdxf生成DXF:包含样条曲线拟合点的折线
我正在开发一个程序,其中一项要求是将DXF作为输入。输入仅限于2D情况。该程序本身是C ++ / Qt,但是要测试它,我需要一些示例DXF输入。样条线导入已经实现,下一步是添加了样条线拟合点或控制点的多段线 。我决定使用Python / ezdxf生成这样的折线,因为我没有Autocad。
我的第一种方法是利用add_spline_control_frame
从拟合点创建样条线,然后将其转换为折线。问题是,原来没有从样条线到折线的转换(尽管我认为我在文档中看到了,但现在找不到了)。
当前方法是通过add_polyline2d(points)
制作多段线,使每个点的DXF标志字段等于8
(通过样条拟合创建的样条顶点)。问题在于,点必须为DXFVertex
类型(文档状态为Vertex
,但不存在),并且该类型对于ezdxf是私有的。
P.S。我尝试使用LibreCAD生成这样的折线,但是很难从那里的样条曲线拟合点制作闭合的折线。
解决方法
AutoCAD使用POLYLINE实体创建B样条曲线的功能,然后在DXF R2000中添加了SPLINE实体。 Autodesk没有记录该功能的使用,ezdxf也没有以任何方式推广此功能。
如果可以的话,请使用SPLINE实体,但是如果必须使用DXF R12,则ezdxf中有一个帮助器类来创建样条线ezdxf.render.R12Spline
和用法示例here。
但是您会很失望BricsCAD和AutoCAD显示非常明显的多边形结构:
由于不仅必须将控制点而且必须将近似曲线点存储为折线点,所以要获得更平滑的曲线,必须使用许多近似点,然后还可以使用常规POLYLINE作为近似值。我假设控制点只是为了使样条线可编辑而存储。
我对此主题的全部了解都记录在r12spline.py文件中。如果您找到一种更好的方法来用更少的逼近点为DXF R12创建平滑的B样条,请告诉我。
以点为单位近似SPLINE实体spline
的示例,可由POLYLINE实体使用:
bspline = spline.construction_tool()
msp.add_polyline3d(bpline.approximate(segments=20))
SPLINE实体是3D实体,如果要将样条线挤压到xy平面中,请删除z轴:
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')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。