#python #django #matplotlib #ezdxf
Вопрос:
В настоящее время я нахожусь в середине создания веб-приложения с использованием Django и ezdxf. конечная цель состоит в том, чтобы вывести содержимое файла dxf как в формате dxf, так и в формате png. Это похоже на вопрос начинающего джанго и промежуточный вопрос 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)
However, when moving it over to Django, the files which it saves are nearly empty.
The correct layers are there, but it seems like none of the instructions in the drawing set have been executed.
I only get one error when the set of instructions for drawing is executed from the views.py file. This is UserWarning: Starting a Matplotlib GUI outside of the main thread will likely fail.
This could imply that just the png saving is failing, but then the dxf files are also empty.
В django я не пытаюсь синхронно представить файл. скорее, он переходит в статическую папку и открывается на следующей странице. Для более поздних функций мне нужны эти файлы в базе данных.
Кто-нибудь сталкивался с подобными проблемами? Я думаю, что проблема заключается в том, что набор инструкций по рисованию не выполняется. Я не уверен, является ли эта проблема результатом запуска ezdxf из django или простой проблемой наследования созданного класса рисования?