【问题标题】:DXF generation using ezdxf: polyline containing spline fit points使用 ezdxf 生成 DXF:包含样条拟合点的折线
【发布时间】:2020-09-01 22:54:26
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: dxf ezdxf


    【解决方案1】:

    在 DXF R2000 中添加 SPLINE 实体之前,AutoCAD 使用了通过 POLYLINE 实体创建 B 样条线的功能。 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')
    
    

    【讨论】:

    • 感谢您的详细解释,解决了问题。我只需要导入样条曲线,并且可以导出它们的弧近似值,因此我可以使用 R12 进行导出,并使用更新的标准进行导入。
    • 如果你为每一种 SPLINE 实体解决了这个问题,也许你可以回答我的 stackoverflow 问题:stackoverflow.com/questions/62472305/…
    猜你喜欢
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 2022-10-05
    • 2019-01-16
    • 1970-01-01
    • 2011-07-24
    相关资源
    最近更新 更多