- added option to save objects as PDF files in File -> Save menu
This commit is contained in:
parent
b429f9b0c8
commit
6d826fa143
|
@ -23,8 +23,14 @@ from stat import S_IREAD, S_IRGRP, S_IROTH
|
||||||
import subprocess
|
import subprocess
|
||||||
import ctypes
|
import ctypes
|
||||||
|
|
||||||
import tkinter as tk
|
# import tkinter as tk
|
||||||
from PyQt5 import QtPrintSupport
|
# from PyQt5 import QtPrintSupport
|
||||||
|
|
||||||
|
from reportlab.graphics import renderPDF
|
||||||
|
from reportlab.pdfgen import canvas
|
||||||
|
from reportlab.graphics import renderPM
|
||||||
|
from reportlab.lib.units import inch, mm
|
||||||
|
from reportlab.lib.pagesizes import landscape, portrait
|
||||||
|
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
import gc
|
import gc
|
||||||
|
@ -1776,6 +1782,7 @@ class App(QtCore.QObject):
|
||||||
self.ui.menufilesaveproject.triggered.connect(self.on_file_saveproject)
|
self.ui.menufilesaveproject.triggered.connect(self.on_file_saveproject)
|
||||||
self.ui.menufilesaveprojectas.triggered.connect(self.on_file_saveprojectas)
|
self.ui.menufilesaveprojectas.triggered.connect(self.on_file_saveprojectas)
|
||||||
self.ui.menufilesaveprojectcopy.triggered.connect(lambda: self.on_file_saveprojectas(make_copy=True))
|
self.ui.menufilesaveprojectcopy.triggered.connect(lambda: self.on_file_saveprojectas(make_copy=True))
|
||||||
|
self.ui.menufilesave_object_pdf.triggered.connect(self.on_file_save_object_pdf)
|
||||||
self.ui.menufilesavedefaults.triggered.connect(self.on_file_savedefaults)
|
self.ui.menufilesavedefaults.triggered.connect(self.on_file_savedefaults)
|
||||||
|
|
||||||
self.ui.menufileexportpref.triggered.connect(self.on_export_preferences)
|
self.ui.menufileexportpref.triggered.connect(self.on_export_preferences)
|
||||||
|
@ -10127,15 +10134,15 @@ class App(QtCore.QObject):
|
||||||
filename = str(filename)
|
filename = str(filename)
|
||||||
|
|
||||||
if filename == '':
|
if filename == '':
|
||||||
self.inform.emit('[WARNING_NOTCL] %s' %
|
self.inform.emit('[WARNING_NOTCL] %s' % _("Save Project cancelled."))
|
||||||
_("Save Project cancelled."))
|
|
||||||
return
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
f = open(filename, 'r')
|
f = open(filename, 'r')
|
||||||
f.close()
|
f.close()
|
||||||
except IOError:
|
except IOError:
|
||||||
pass
|
self.inform.emit('[ERROR_NOTCL] %s' % _("The object is used by another application."))
|
||||||
|
return
|
||||||
|
|
||||||
if use_thread is True:
|
if use_thread is True:
|
||||||
self.worker_task.emit({'fcn': self.save_project,
|
self.worker_task.emit({'fcn': self.save_project,
|
||||||
|
@ -10154,6 +10161,49 @@ class App(QtCore.QObject):
|
||||||
self.set_ui_title(name=self.project_filename)
|
self.set_ui_title(name=self.project_filename)
|
||||||
self.should_we_save = False
|
self.should_we_save = False
|
||||||
|
|
||||||
|
def on_file_save_object_pdf(self, use_thread=True):
|
||||||
|
self.date = str(datetime.today()).rpartition('.')[0]
|
||||||
|
self.date = ''.join(c for c in self.date if c not in ':-')
|
||||||
|
self.date = self.date.replace(' ', '_')
|
||||||
|
|
||||||
|
try:
|
||||||
|
obj_active = self.collection.get_active()
|
||||||
|
obj_name = obj_active.options['name']
|
||||||
|
except AttributeError as err:
|
||||||
|
log.debug("App.on_file_save_object_pdf() --> %s" % str(err))
|
||||||
|
self.inform.emit('[ERROR_NOTCL] %s' % _("No object selected."))
|
||||||
|
return
|
||||||
|
|
||||||
|
filter_ = "PDF File (*.PDF);; All Files (*.*)"
|
||||||
|
try:
|
||||||
|
filename, _f = QtWidgets.QFileDialog.getSaveFileName(
|
||||||
|
caption=_("Save Object as PDF ..."),
|
||||||
|
directory=_('{l_save}/{obj_name}_{date}').format(l_save=str(self.get_last_save_folder()),
|
||||||
|
obj_name=obj_name,
|
||||||
|
date=self.date),
|
||||||
|
filter=filter_)
|
||||||
|
except TypeError:
|
||||||
|
filename, _f = QtWidgets.QFileDialog.getSaveFileName(caption=_("Save Object as PDF ..."), filter=filter_)
|
||||||
|
|
||||||
|
filename = str(filename)
|
||||||
|
|
||||||
|
if filename == '':
|
||||||
|
self.inform.emit('[WARNING_NOTCL] %s' % _("Save Object PDF cancelled."))
|
||||||
|
return
|
||||||
|
|
||||||
|
if use_thread is True:
|
||||||
|
self.worker_task.emit({'fcn': self.save_pdf, 'params': [filename, obj_name]})
|
||||||
|
else:
|
||||||
|
self.save_pdf(filename, obj_name)
|
||||||
|
|
||||||
|
# self.save_project(filename)
|
||||||
|
if self.defaults["global_open_style"] is False:
|
||||||
|
self.file_opened.emit("pdf", filename)
|
||||||
|
self.file_saved.emit("pdf", filename)
|
||||||
|
|
||||||
|
def save_pdf(self, file_name, obj_name):
|
||||||
|
self.film_tool.export_positive(obj_name=obj_name, box_name=obj_name, filename=file_name, ftype='pdf')
|
||||||
|
|
||||||
def export_svg(self, obj_name, filename, scale_stroke_factor=0.00):
|
def export_svg(self, obj_name, filename, scale_stroke_factor=0.00):
|
||||||
"""
|
"""
|
||||||
Exports a Geometry Object to an SVG file.
|
Exports a Geometry Object to an SVG file.
|
||||||
|
|
|
@ -14,6 +14,7 @@ CAD program, and create G-Code for Isolation routing.
|
||||||
- finished the Calibration Tool
|
- finished the Calibration Tool
|
||||||
- changed the Scale Entry in Object UI to FCEntry() GUI element in order to allow expressions to be entered. E.g: 1/25.4
|
- changed the Scale Entry in Object UI to FCEntry() GUI element in order to allow expressions to be entered. E.g: 1/25.4
|
||||||
- some small changes in the Scale button handler in FlatCAMObj() class
|
- some small changes in the Scale button handler in FlatCAMObj() class
|
||||||
|
- added option to save objects as PDF files in File -> Save menu
|
||||||
|
|
||||||
11.12.2019
|
11.12.2019
|
||||||
|
|
||||||
|
|
|
@ -1824,7 +1824,7 @@ class Geometry(object):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Make sure we see a Shapely Geometry class and not a list
|
# Make sure we see a Shapely Geometry class and not a list
|
||||||
if str(type(self)) == "<class 'FlatCAMObj.FlatCAMGeometry'>":
|
if self.kind.lower() == 'geometry':
|
||||||
flat_geo = []
|
flat_geo = []
|
||||||
if self.multigeo:
|
if self.multigeo:
|
||||||
for tool in self.tools:
|
for tool in self.tools:
|
||||||
|
|
|
@ -250,6 +250,13 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
|
||||||
_('Save Project C&opy ...'), self)
|
_('Save Project C&opy ...'), self)
|
||||||
self.menufile_save.addAction(self.menufilesaveprojectcopy)
|
self.menufile_save.addAction(self.menufilesaveprojectcopy)
|
||||||
|
|
||||||
|
self.menufile_save.addSeparator()
|
||||||
|
|
||||||
|
# Save Object PDF
|
||||||
|
self.menufilesave_object_pdf = QtWidgets.QAction(QtGui.QIcon('share/pdf32.png'),
|
||||||
|
_('Save Object as PDF ...'), self)
|
||||||
|
self.menufile_save.addAction(self.menufilesave_object_pdf)
|
||||||
|
|
||||||
# Separator
|
# Separator
|
||||||
self.menufile.addSeparator()
|
self.menufile.addSeparator()
|
||||||
|
|
||||||
|
|
|
@ -197,6 +197,9 @@ class ToolCalibration(FlatCAMTool):
|
||||||
self.obj_type_combo.addItem(_("Excellon"))
|
self.obj_type_combo.addItem(_("Excellon"))
|
||||||
self.obj_type_combo.setCurrentIndex(1)
|
self.obj_type_combo.setCurrentIndex(1)
|
||||||
|
|
||||||
|
self.obj_type_combo.setItemIcon(0, QtGui.QIcon("share/flatcam_icon16.png"))
|
||||||
|
self.obj_type_combo.setItemIcon(1, QtGui.QIcon("share/drill16.png"))
|
||||||
|
|
||||||
grid_lay.addWidget(self.obj_type_label, 12, 0)
|
grid_lay.addWidget(self.obj_type_label, 12, 0)
|
||||||
grid_lay.addWidget(self.obj_type_combo, 12, 1, 1, 2)
|
grid_lay.addWidget(self.obj_type_combo, 12, 1, 1, 2)
|
||||||
|
|
||||||
|
@ -631,6 +634,10 @@ class ToolCalibration(FlatCAMTool):
|
||||||
self.adj_object_type_combo.addItems([_("Gerber"), _("Excellon"), _("Geometry")])
|
self.adj_object_type_combo.addItems([_("Gerber"), _("Excellon"), _("Geometry")])
|
||||||
self.adj_object_type_combo.setCurrentIndex(0)
|
self.adj_object_type_combo.setCurrentIndex(0)
|
||||||
|
|
||||||
|
self.adj_object_type_combo.setItemIcon(0, QtGui.QIcon("share/flatcam_icon16.png"))
|
||||||
|
self.adj_object_type_combo.setItemIcon(1, QtGui.QIcon("share/drill16.png"))
|
||||||
|
self.adj_object_type_combo.setItemIcon(2, QtGui.QIcon("share/geometry16.png"))
|
||||||
|
|
||||||
self.adj_object_type_label = QtWidgets.QLabel("%s:" % _("Adjusted object type"))
|
self.adj_object_type_label = QtWidgets.QLabel("%s:" % _("Adjusted object type"))
|
||||||
self.adj_object_type_label.setToolTip(
|
self.adj_object_type_label.setToolTip(
|
||||||
_("Type of the FlatCAM Object to be adjusted.")
|
_("Type of the FlatCAM Object to be adjusted.")
|
||||||
|
|
|
@ -19,7 +19,7 @@ from reportlab.graphics import renderPDF
|
||||||
from reportlab.pdfgen import canvas
|
from reportlab.pdfgen import canvas
|
||||||
from reportlab.graphics import renderPM
|
from reportlab.graphics import renderPM
|
||||||
from reportlab.lib.units import inch, mm
|
from reportlab.lib.units import inch, mm
|
||||||
from reportlab.lib.pagesizes import landscape, portrait, A4
|
from reportlab.lib.pagesizes import landscape, portrait
|
||||||
|
|
||||||
from svglib.svglib import svg2rlg
|
from svglib.svglib import svg2rlg
|
||||||
from xml.dom.minidom import parseString as parse_xml_string
|
from xml.dom.minidom import parseString as parse_xml_string
|
||||||
|
@ -742,12 +742,18 @@ class Film(FlatCAMTool):
|
||||||
self.app.inform.emit('[WARNING_NOTCL] %s' % _("Export positive film cancelled."))
|
self.app.inform.emit('[WARNING_NOTCL] %s' % _("Export positive film cancelled."))
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
|
pagesize = self.pagesize_combo.get_value()
|
||||||
|
orientation = self.orientation_radio.get_value()
|
||||||
|
color = self.app.defaults['tools_film_color']
|
||||||
|
|
||||||
self.export_positive(name, boxname, filename,
|
self.export_positive(name, boxname, filename,
|
||||||
scale_stroke_factor=factor,
|
scale_stroke_factor=factor,
|
||||||
scale_factor_x=scale_factor_x, scale_factor_y=scale_factor_y,
|
scale_factor_x=scale_factor_x, scale_factor_y=scale_factor_y,
|
||||||
skew_factor_x=skew_factor_x, skew_factor_y=skew_factor_y,
|
skew_factor_x=skew_factor_x, skew_factor_y=skew_factor_y,
|
||||||
skew_reference=skew_reference,
|
skew_reference=skew_reference,
|
||||||
mirror=mirror, ftype=ftype
|
mirror=mirror,
|
||||||
|
pagesize=pagesize, orientation=orientation, color=color, opacity=1.0,
|
||||||
|
ftype=ftype
|
||||||
)
|
)
|
||||||
|
|
||||||
def generate_positive_punched_film(self, name, boxname, source, factor, ftype='svg'):
|
def generate_positive_punched_film(self, name, boxname, source, factor, ftype='svg'):
|
||||||
|
@ -1072,7 +1078,7 @@ class Film(FlatCAMTool):
|
||||||
scale_stroke_factor=0.00,
|
scale_stroke_factor=0.00,
|
||||||
scale_factor_x=None, scale_factor_y=None,
|
scale_factor_x=None, scale_factor_y=None,
|
||||||
skew_factor_x=None, skew_factor_y=None, skew_reference='center',
|
skew_factor_x=None, skew_factor_y=None, skew_reference='center',
|
||||||
mirror=None,
|
mirror=None, orientation='p', pagesize='A4', color='black', opacity=1.0,
|
||||||
use_thread=True, ftype='svg'):
|
use_thread=True, ftype='svg'):
|
||||||
"""
|
"""
|
||||||
Exports a Geometry Object to an SVG file in positive black.
|
Exports a Geometry Object to an SVG file in positive black.
|
||||||
|
@ -1116,6 +1122,11 @@ class Film(FlatCAMTool):
|
||||||
self.inform.emit('[WARNING_NOTCL] %s: %s' % (_("No object Box. Using instead"), obj))
|
self.inform.emit('[WARNING_NOTCL] %s: %s' % (_("No object Box. Using instead"), obj))
|
||||||
box = obj
|
box = obj
|
||||||
|
|
||||||
|
p_size = pagesize
|
||||||
|
orientation = orientation
|
||||||
|
color = color
|
||||||
|
transparency_level = opacity
|
||||||
|
|
||||||
def make_positive_film():
|
def make_positive_film():
|
||||||
log.debug("FilmTool.export_positive().make_positive_film()")
|
log.debug("FilmTool.export_positive().make_positive_film()")
|
||||||
|
|
||||||
|
@ -1131,9 +1142,9 @@ class Film(FlatCAMTool):
|
||||||
# We set the colour to WHITE
|
# We set the colour to WHITE
|
||||||
root = ET.fromstring(exported_svg)
|
root = ET.fromstring(exported_svg)
|
||||||
for child in root:
|
for child in root:
|
||||||
child.set('fill', str(self.app.defaults['tools_film_color']))
|
child.set('fill', str(color))
|
||||||
child.set('opacity', '1.0')
|
child.set('opacity', str(transparency_level))
|
||||||
child.set('stroke', str(self.app.defaults['tools_film_color']))
|
child.set('stroke', str(color))
|
||||||
|
|
||||||
exported_svg = ET.tostring(root)
|
exported_svg = ET.tostring(root)
|
||||||
|
|
||||||
|
@ -1194,7 +1205,7 @@ class Film(FlatCAMTool):
|
||||||
return 'fail'
|
return 'fail'
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
if self.units == 'INCH':
|
if self.units == 'IN':
|
||||||
unit = inch
|
unit = inch
|
||||||
else:
|
else:
|
||||||
unit = mm
|
unit = mm
|
||||||
|
@ -1202,11 +1213,10 @@ class Film(FlatCAMTool):
|
||||||
doc_final = StringIO(doc_final)
|
doc_final = StringIO(doc_final)
|
||||||
drawing = svg2rlg(doc_final)
|
drawing = svg2rlg(doc_final)
|
||||||
|
|
||||||
p_size = self.pagesize_combo.get_value()
|
|
||||||
if p_size == 'Bounds':
|
if p_size == 'Bounds':
|
||||||
renderPDF.drawToFile(drawing, filename)
|
renderPDF.drawToFile(drawing, filename)
|
||||||
else:
|
else:
|
||||||
if self.orientation_radio.get_value() == 'p':
|
if orientation == 'p':
|
||||||
page_size = portrait(self.pagesize[p_size])
|
page_size = portrait(self.pagesize[p_size])
|
||||||
else:
|
else:
|
||||||
page_size = landscape(self.pagesize[p_size])
|
page_size = landscape(self.pagesize[p_size])
|
||||||
|
|
Loading…
Reference in New Issue