微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用ezdxf生成DXF:包含样条曲线拟合点的折线

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

我的第一种方法是利用add_spline_control_frame从拟合点创建样条线,然后将其转换为折线。问题是,原来没有从样条线到折线的转换(尽管我认为我在文档中看到了,但现在找不到了)。

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

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

P.S。我尝试使用LibreCAD生成这样的折线,但是很难从那里的样条曲线拟合点制作闭合的折线。

解决方法

AutoCAD使用POLYLINE实体创建B样条曲线的功能,然后在DXF R2000中添加了SPLINE实体。 Autodesk没有记录该功能的使用,ezdxf也没有以任何方式推广此功能。

如果可以的话,请使用SPLINE实体,但是如果必须使用DXF R12,则ezdxf中有一个帮助器类来创建样条线ezdxf.render.R12Spline和用法示例here

但是您会很失望BricsCAD和AutoCAD显示非常明显的多边形结构: enter image description here

由于不仅必须将控制点而且必须将近似曲线点存储为折线点,所以要获得更平滑的曲线,必须使用许多近似点,然后还可以使用常规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 举报,一经查实,本站将立刻删除。