示例#1
0
 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")
示例#2
0
    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()
示例#3
0
 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()
示例#4
0
    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()
示例#5
0
    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()
示例#6
0
 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])
示例#7
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()
示例#9
0
    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