def save_polar_as_SVG(self): if self.CHART_IS_PRESENT: self.filename = QtWidgets.QFileDialog.getSaveFileName( None, "choose save file name", "./plot.svg", "SVG (*.svg)") if not self.filename[0] == "": output_size = QtCore.QSize( int(self.profileChart.size().width()), int(self.profileChart.size().height())) output_rect = QtCore.QRectF(QtCore.QPointF(0, 0), QtCore.QSizeF(output_size)) svg = QtSvg.QSvgGenerator() svg.setFileName(self.filename[0]) svg.setSize(output_size) svg.setViewBox(output_rect) painter = QtGui.QPainter() painter.begin(svg) painter.setRenderHint(QtGui.QPainter.Antialiasing) self.profileChart.scene().render( painter, source=output_rect, target=output_rect, mode=QtCore.Qt.IgnoreAspectRatio) painter.end() else: return else: self.raise_error("No plot is available")
def export(self, fname, hideHistograms=True, pngScale=4): """ Save fan diagrams to file, with the full image, and color bars on the alpha/gamma values :param fname: the fname to save as hideHistograms - (True) Prevent rendering the histograms, often ncier for figures/presentations If fname.endswith(".svg"), it outputs as an SVG. Howver, it's not the cleanest thing (the files are quite large/unoptimized, and I can't think of an easy way to correct that). Also, when the svg is converted to pdf via Inkscape, things get f****d up for some reasons (axes get thicker, fonts get borked, pixels get messed up). So, it kinda works, but there's stuff seriously wrong. One thing to make things cleaner is to use this site: https://jakearchibald.github.io/svgomg/ which optimizies the svg and makes it a lot easier to work with :return: """ doSvg = fname.endswith(".svg") if hideHistograms: # Hide the histogram data (and shrink the plot) # to avoid confusing people self.histAlpha.plot.hide() self.histAlpha.vb.setMaximumWidth(20) self.histGamma.plot.hide() self.histGamma.vb.setMaximumWidth(20) QtWidgets.QApplication.processEvents() self.histGamma.axis.setRange(-46.75, 46.75) self.histAlpha.axis.setRange(-94, 94) width, height = self.width(), self.height() if doSvg: from PyQt5 import QtSvg outputImage = QtSvg.QSvgGenerator() outputImage.setFileName(fname) outputImage.setSize(QtCore.QSize(int(width), int(height))) # I'm not sure why it has to be this, but the axis on the histogrm # were fuckingup without it outputImage.setResolution(96) else: outputImage = QtGui.QImage(width * pngScale, height * pngScale, QtGui.QImage.Format_ARGB32) outputImage.setDevicePixelRatio(pngScale) outputImage.fill(QtGui.QColor("white")) outputPainter = QtGui.QPainter(outputImage) self.render(outputPainter) if not doSvg: ret = outputImage.save(fname) outputPainter.end()
def save(self): try: with open(self.SAVE_FILE, "wb") as fd: pickle.dump(self.shapes, fd) except PicklingError: print("Error saving drawing") svg_gen = QtSvg.QSvgGenerator() svg_gen.setFileName(self.SVG_FILE) svg_gen.setSize(QtCore.QSize(self.width(), self.height())) svg_gen.setViewBox(QtCore.QRect(0, 0, self.width(), self.height())) svg_gen.setTitle("draw.py export") svg_gen.setDescription("a test...") painter = QtGui.QPainter() painter.begin(svg_gen) self.paint(painter, grid=False, black_background=False) painter.end()
def export_graph(self, export_type, export_file): """export graph to different formats""" # if export_type == 'graphml': # nx.write_graphml(self.g, export_file) if export_type == 'dot': dg = Digraph() dg.edges([i for i in self.g.edges]) for i in self.g.nodes: node_text_lines_raw = self.node_texts_raw[i] node_text_lines = [ i for i in node_text_lines_raw.split('\n') if len(i) > 0 ] node_label = self.dot_node_text(i, node_text_lines) dg.node(i, label=node_label) dg.save(export_file) # export_file = 'test.svg' if export_type == 'svg': logging.info('export as svg') logging.info(['file', export_file]) logging.info(['width: ', self.width]) logging.info(['height: ', self.height]) svg = QtSvg.QSvgGenerator() svg.setFileName(export_file) svg.setSize(QSize(int(self.width * 0.8), int(self.height * 0.8))) # svg.setSize(QSize(self.width, self.height)) # svg.PdmDpiX = 8 # svg.PdmDpiY = 8 # svg.setSize(QSize(600,700)) # svg.setViewBox(QRect(0, 0, self.width, self.height)) qp_svg = QPainter(svg) qp_svg.setRenderHint(QPainter.Antialiasing, True) self.draw_edges(qp_svg) # have to add arbitrary scale factor self.draw_texts(qp_svg, 1.333) self.draw_rects(qp_svg) # rather split up paintEvent into more funtions qp_svg.end()
def _save_svg(self): newPath, _filter = QFileDialog.getSaveFileName(self, "Save SVG", '', "SVG files (*.svg)") if newPath is "": return path = newPath generator = QtSvg.QSvgGenerator() generator.setFileName(path) rect = self.geometry() generator.setSize(QSize(rect.width(), rect.height())) generator.setViewBox(QRect(0, 0, rect.width(), rect.height())) generator.setTitle("SVG Generator Example Drawing") painter = QPainter() painter.begin(generator) #self.paint(painter) self._view.render(painter) painter.end()
def do(self): flist = 'PNG(*.png);;SVG(*.svg)' ofile = QtWidgets.QFileDialog.getSaveFileName(self.win, "Export graph", '', flist, 'PNG(*.png)') if ofile[1].startswith('SVG'): generator = QtSvg.QSvgGenerator() generator.setFileName(ofile[0]) generator.setSize(self.scene.sceneRect().size().toSize()) generator.setViewBox(self.scene.sceneRect()) painter = QtGui.QPainter() painter.begin(generator) self.scene.render(painter) painter.end() else: image = QtGui.QImage(self.scene.sceneRect().size().toSize(), QtGui.QImage.Format_ARGB32) image.fill(QtCore.Qt.white) painter = QtGui.QPainter() painter.begin(image) self.scene.render(painter) painter.end() image.save(ofile[0])
def save(self, file): filename, file_extention = file if file_extention == "SVG files (*.svg)": title = self.tr('Save in this format ?') text = self.tr( "If you save in this format, only certain properties will be retained (such as shapes and colors, not line and fill styles)" ) msgbox = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Question, title, text) msgbox.setWindowIcon(self.windowIcon()) no_button = msgbox.addButton(self.tr('No'), QtWidgets.QMessageBox.NoRole) yes_button = msgbox.addButton(self.tr('Yes'), QtWidgets.QMessageBox.YesRole) msgbox.setDefaultButton(no_button) msgbox.exec() if (msgbox.clickedButton() == yes_button): filesave = QtCore.QFile(filename) filesave.resize(0) if filesave.open(QtCore.QIODevice.WriteOnly | QtCore.QIODevice.ReadOnly): generator = QtSvg.QSvgGenerator() generator.setFileName(filename) generator.setTitle("Simply Paint") generator.setDescription("Filed created by Simply Paint.") generator.setSize( QtCore.QSize(self.scene.width(), self.scene.height())) generator.setViewBox( QtCore.QRect(0, 0, self.scene.width(), self.scene.height())) painter = QtGui.QPainter() painter.begin(generator) self.scene.render(painter) painter.end() doc = QtXml.QDomDocument() doc.setContent(filesave) filesave.close() filesave = QtCore.QFile(filename) fileStream = QtCore.QTextStream(filesave) if filesave.open(QtCore.QIODevice.WriteOnly): SVGNode = doc.lastChild() boardNode = SVGNode.lastChild() groupFormNodeList = boardNode.childNodes() count = groupFormNodeList.length() for i in range(count): groupFormNode = groupFormNodeList.item(count - i - 1) if not groupFormNode.hasChildNodes(): boardNode.removeChild(groupFormNode) groupFormNodeList = boardNode.childNodes() doc.save(fileStream, 2) filesave.close() self.srcfile = file self.scene.setSceneChanged(False) if file_extention == "JSON files (*.json)": filesave = QtCore.QFile(filename) filesave.resize(0) if filesave.open(QtCore.QIODevice.WriteOnly | QtCore.QIODevice.ReadOnly): s = SaveOpen() s.save(filesave, self.scene.items()) filesave.close() self.srcfile = file
def saveAndRenderFan(p1, p2, fname, hideHistograms=False): """ Save fan diagrams to file, with the full image, and color bars on the alpha/gamma values :param p1: palp coming from the createFan function above :param p2: pgam coming from the createFan function above :param fname: the fname to save as potential kwargs: hideHistograms - (True) Prevent rendering the histograms :return: """ # defaults = { # "hideHistograms": False # } # # defaults.update(kwargs) doSvg = fname.endswith(".svg") if hideHistograms: # Hide the histogram data (and shrink the plot) # to avoid confusing people p1.ui.histogram.plot.hide() p1.ui.histogram.vb.setMaximumWidth(20) p2.ui.histogram.plot.hide() p2.ui.histogram.vb.setMaximumWidth(20) hist1 = p1.ui.histogram.scene().getViewWidget() hist2 = p2.ui.histogram.scene().getViewWidget() center = p1.scene.getViewWidget() r1 = QtCore.QRectF(hist1.viewRect()) r2 = QtCore.QRectF(hist2.viewRect()) rc = QtCore.QRectF(center.viewRect()) QtWidgets.QApplication.processEvents() width = r1.width() + r2.width() + rc.width() height = rc.height() if doSvg: from PyQt5 import QtSvg outputImage = QtSvg.QSvgGenerator() outputImage.setFileName(fname) outputImage.setSize(QtCore.QSize(int(width), int(height))) outputImage.setResolution(96) # I'm not sure why it has to be this... else: outputImage = QtGui.QImage(width * 4, height * 4, QtGui.QImage.Format_ARGB32) # outputImage.setDotsPerMeterX(650 * 100 / 2.54) # outputImage.setDotsPerMeterY(650 * 100 / 2.54) outputImage.setDevicePixelRatio(4) outputImage.fill(QtGui.QColor("white")) outputPainter = QtGui.QPainter(outputImage) r2.setHeight(height) r1.setHeight(height) hist2.render(outputPainter, r2) rc.moveLeft(r2.width()) center.render(outputPainter, rc) r1.moveLeft(rc.width() + r2.width()) hist1.render(outputPainter, r1) if not doSvg: ret = outputImage.save(fname) outputPainter.end()
def save_picture(self): """ Invokes the GUI routine of saving of an image """ if self.ast is None: return # Ask user whether they want png or svg # If png, ask what dimensions save_option_dialog = SaveOptionDialog(self, self.sceneRect()) assert isinstance(save_option_dialog, SaveOptionDialog) dialog_code = save_option_dialog.exec_() if not dialog_code: return file_filter = "" if save_option_dialog.picture_type == save_option_dialog.PNG: file_filter = "Image (*.png)" elif save_option_dialog.picture_type == save_option_dialog.SVG: file_filter = "Scalable Vector Graphics (*.svg)" filename = QtWidgets.QFileDialog.getSaveFileName(caption="Save file", directory=self.get_root_location(with_name=True), filter=file_filter) image_location = filename[0] # getSaveFileName returns a tuple. First index of tuple is the file name if image_location.rfind('.') != -1: image_location = image_location[:image_location.rfind('.')] if len(image_location) <= 0: # Image location is not valid return rect = self.sceneRect() rect.adjust(-50, -50, 50, 50) painter = QtGui.QPainter() if save_option_dialog.picture_type == save_option_dialog.PNG: image = QtGui.QImage(save_option_dialog.user_width, save_option_dialog.user_height, QtGui.QImage.Format_ARGB32) image.fill(QtCore.Qt.transparent) painter.begin(image) painter.setRenderHint(QtGui.QPainter.Antialiasing) self.scene().render(painter, source=rect) painter.end() image.save("%s.png" % image_location) elif save_option_dialog.picture_type == save_option_dialog.SVG: generator = QtSvg.QSvgGenerator() generator.setFileName("%s.svg" % image_location) generator.setSize(QtCore.QSize(rect.width(), rect.height())) # generator.setViewBox(rect) generator.setTitle(save_option_dialog.user_title) generator.setDescription(save_option_dialog.user_description) painter.begin(generator) painter.setRenderHint(QtGui.QPainter.Antialiasing) self.scene().render(painter, source=rect) painter.end() else: return