Ezdxf в django- не записывается в файл или не работает
В настоящее время я занимаюсь созданием веб-приложения с использованием Django и ezdxf. Конечной целью является вывод содержимого 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 я не пытаюсь синхронно представить файл. скорее, он попадает в папку static и к нему обращается следующая страница. Для последующих функций мне нужны эти файлы в базе данных.
Сталкивался ли кто-нибудь с подобными проблемами? Я думаю, что проблема заключается в том, что набор инструкций рисования не выполняется. Я не уверен, является ли эта проблема результатом запуска ezdxf из django, или это просто вопрос наследования инстанцированного класса рисования?