我目前正在使用 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 的结果,还是实例化绘图类的简单继承问题?