首页 > 解决方案 > django 中的 ezdxf - 未写入文件,或无法正常工作

问题描述

我目前正在使用 Django 和 ezdxf 创建一个 Web 应用程序。最终目标是将 dxf 文件的内容输出为 dxf 文件和 png。这似乎是一个初学者 django 问题和中级 ezdxf 问题。

我为 ezdxf 编写了一组指令,用于实例化一个文件,然后绘制我的作品,然后将文件另存为 .dxf 和 png。这在 pycharm 的命令行中效果很好。

def instantiate_drawing():
    """starts a new drawing and adds all needed layers etc."""
    doc = ezdxf.new('R2010', setup=True)
    msp = doc.modelspace()
    lines_layer = doc.layers.new('python-lines', dxfattribs={'color': 0})
    dims_layer = doc.layers.new('python-dims', dxfattribs={'color': 3})
    label_layer = doc.layers.new('python-label', dxfattribs={'color': 13})
    myStandard = doc.styles.new('myStandard', dxfattribs={'font': 'Helvetica.ttf'})
    blocdoc = ezdxf.readfile('block_library.dxf')
    blocmsp = blocdoc.modelspace()
    importer = Importer(blocdoc, doc)
    return doc, msp, lines_layer, dims_layer, label_layer, myStandard, blocdoc, importer

示例绘图说明

            def create_rectangle(pt0, pt1, off=3, dims=None):
                """creates a rectangle between 2 points, and adds dims between
                take two tuples with pt coords, higer coords second"""
                width, height = pt1[0] - pt0[0], pt1[1] - pt0[1]
                lineweight = 5
                msp.add_lwpolyline([(pt0[0], pt0[1]),
                                    (pt1[0], pt0[1]),
                                    (pt1[0], pt1[1]),
                                    (pt0[0], pt1[1]),
                                    (pt0[0], pt0[1])],
                                   dxfattribs={'layer': 'python-lines'})  # rectangle
                if dims:
                    dimw = msp.add_linear_dim(base=(pt0[0], pt1[1] + off),
                                              p1=(pt0[0], pt1[1]), p2=(pt1[0], pt1[1]),
                                              dimstyle='myStandard',
                                              dxfattribs={'layer': 'python-dims'},
                                              override={'dimlwd': lineweight, 'dimlwe': lineweight,
                                                        'dimexe': 0.3})

                    dimh = msp.add_linear_dim(base=(pt0[0] + width + off, pt1[1] - (height / 2)),
                                              p1=(pt1[0], pt0[1]), p2=(pt1[0], pt1[1]),
                                              angle=90, dimstyle='myStandard',
                                              dxfattribs={'layer': 'python-dims'},
                                              override={'dimlwd': lineweight, 'dimlwe': lineweight,
                                                        'dimexe': 0.3})
                    dimw.render()
                    dimh.render()
                print("success !")

保存指令,主要基于其他栈溢出代码!!

            def save_as_png(save_to, img_format='.png', img_res=300):
                msp = doc.modelspace()
                ezdxf.addons.drawing.properties.MODEL_SPACE_BG_COLOR = "#FFFFFF"

                lines_layer.line_weight = 25
                dims_layer.rgb = (0, 0, 0)
                label_layer.rgb = (0, 0, 0)

                fig = plt.figure()
                ax = fig.add_axes([0, 0, 1, 1])
                ctx = RenderContext(doc)
                ctx.set_current_layout(msp)
                # ctx.current_layout.set_colors(bg='#FFFFFF', fg='#000000')

                out = MatplotlibBackend(ax, params={"lineweight_scaling": .5})
                Frontend(ctx, out).draw_layout(msp, finalize=True)

                fig.savefig(save_to, dpi=img_res)
                plt.close(fig)

    def save_file(name):
        filename = "str(name) + "_cadfile.dxf"
        doc.saveas(filename)

但是,当将其移至 Django 时,它保存的文件几乎是空的。正确的图层在那里,但似乎没有执行绘图集中的任何指令。

当从views.py 文件执行一组绘图指令时,我只收到一个错误。这UserWarning: Starting a Matplotlib GUI outside of the main thread will likely fail.可能意味着只有 png 保存失败,但 dxf 文件也是空的。

在 django 中,我不想同步呈现文件。相反,它转到静态文件夹并由下一页访问。对于以后的功能,我需要数据库中的这些文件。

有没有人遇到过类似的问题?我认为问题在于未执行的绘图指令集。我不确定这个问题是从 django 运行 ezdxf 的结果,还是实例化绘图类的简单继承问题?

标签: pythondjangomatplotlibezdxf

解决方案


推荐阅读