def plotSVG(self, width, height, output_file, _plotting_object = None): """Plots the data specified in the current input file as a page in a PDF file with the given width and height, writing the output to the specified output file. Returns the SVG object produced.""" printer = QPrinter() svg = QSvgGenerator() svg.setFileName(output_file) svg.setSize(QSize(width, height)) svg.setViewBox(QRect(0, 0, width, height)) svg.setResolution(printer.resolution()) return self._plot(width, height, svg, _plotting_object)[0]
def export_scene(canvas, width, height, dpi, exportFileName): """ This function exports the scene to a file. """ # need this to make sure we take away focus from # any currently selected legend items canvas.clearFocus() with HiddenStitchManager(canvas): # NOTE: We seem to need the 1px buffer region to avoid # the image being cut off margin = 10 theScene = visible_bounding_rect(canvas.items()) theScene.adjust(-margin, -margin, margin, margin) # check if user requested an svg file svg = True if QFileInfo(exportFileName).completeSuffix() == "svg" \ else False if svg: generator = QSvgGenerator() generator.setFileName(exportFileName) generator.setSize(QSize(width, height)) generator.setViewBox(QRect(0, 0, width, height)) generator.setTitle("sconcho generated SVG image") generator.setDescription("this svg image was exported from " "a sconcho project") generator.setResolution(dpi) else: generator = QImage(width+2*margin, height+2*margin, QImage.Format_ARGB32_Premultiplied) generator.fill(1) inchesToMeter = 39.3700787 generator.setDotsPerMeterX(dpi*inchesToMeter) generator.setDotsPerMeterY(dpi*inchesToMeter) painter = QPainter(generator) painter.setRenderHints(QPainter.SmoothPixmapTransform | QPainter.HighQualityAntialiasing | QPainter.TextAntialiasing ) painter.setBackgroundMode(Qt.TransparentMode ) canvas.render(painter, QRectF(), theScene ) painter.end() if not svg: generator.save(exportFileName)
def grab_svg(scene): """ Return a SVG rendering of the scene contents. Parameters ---------- scene : :class:`CanvasScene` """ from PyQt4.QtSvg import QSvgGenerator svg_buffer = QBuffer() gen = QSvgGenerator() gen.setOutputDevice(svg_buffer) items_rect = scene.itemsBoundingRect().adjusted(-10, -10, 10, 10) if items_rect.isNull(): items_rect = QRectF(0, 0, 10, 10) width, height = items_rect.width(), items_rect.height() rect_ratio = float(width) / height # Keep a fixed aspect ratio. aspect_ratio = 1.618 if rect_ratio > aspect_ratio: height = int(height * rect_ratio / aspect_ratio) else: width = int(width * aspect_ratio / rect_ratio) target_rect = QRectF(0, 0, width, height) source_rect = QRectF(0, 0, width, height) source_rect.moveCenter(items_rect.center()) gen.setSize(target_rect.size().toSize()) gen.setViewBox(target_rect) painter = QPainter(gen) # Draw background. painter.setBrush(QBrush(Qt.white)) painter.drawRect(target_rect) # Render the scene scene.render(painter, target_rect, source_rect) painter.end() buffer_str = str(svg_buffer.buffer()) return unicode(buffer_str.decode("utf-8"))
def export_scene(canvas, width, height, dpi, exportFileName): """ This function exports the scene to a file. """ # need this to make sure we take away focus from # any currently selected legend items canvas.clearFocus() with HiddenStitchManager(canvas): # NOTE: We seem to need the 1px buffer region to avoid # the image being cut off margin = 10 theScene = visible_bounding_rect(canvas.items()) theScene.adjust(-margin, -margin, margin, margin) # check if user requested an svg file svg = True if QFileInfo(exportFileName).completeSuffix() == "svg" \ else False if svg: generator = QSvgGenerator() generator.setFileName(exportFileName) generator.setSize(QSize(width, height)) generator.setViewBox(QRect(0, 0, width, height)) generator.setTitle("sconcho generated SVG image") generator.setDescription("this svg image was exported from " "a sconcho project") generator.setResolution(dpi) else: generator = QImage(width + 2 * margin, height + 2 * margin, QImage.Format_ARGB32_Premultiplied) generator.fill(1) inchesToMeter = 39.3700787 generator.setDotsPerMeterX(dpi * inchesToMeter) generator.setDotsPerMeterY(dpi * inchesToMeter) painter = QPainter(generator) painter.setRenderHints(QPainter.SmoothPixmapTransform | QPainter.HighQualityAntialiasing | QPainter.TextAntialiasing) painter.setBackgroundMode(Qt.TransparentMode) canvas.render(painter, QRectF(), theScene) painter.end() if not svg: generator.save(exportFileName)
def _get_composer_svg_image(self, width, height, dpi): # from qgscomposer.cpp, QgsComposer::on_mActionExportAsSVG_triggered, # line 1909, near end of function svgpath = getTempfilePath('svg') temp_size = os.path.getsize(svgpath) svg_g = QSvgGenerator() # noinspection PyArgumentList svg_g.setTitle(QgsProject.instance().title()) svg_g.setFileName(svgpath) # width and height in pixels # svg_w = int(self._c.paperWidth() * self._c.printResolution() / 25.4) # svg_h = int(self._c.paperHeight() * self._c.printResolution() / 25.4) svg_w = width svg_h = height svg_g.setSize(QSize(svg_w, svg_h)) svg_g.setViewBox(QRect(0, 0, svg_w, svg_h)) # because the rendering is done in mm, convert the dpi # svg_g.setResolution(self._c.printResolution()) svg_g.setResolution(dpi) sp = QPainter(svg_g) self._c.renderPage(sp, 0) sp.end() if temp_size == os.path.getsize(svgpath): # something went pear-shaped return False, '' image = QImage(width, height, QImage.Format_ARGB32) image.fill(QColor(152, 219, 249).rgb()) image.setDotsPerMeterX(dpi / 25.4 * 1000) image.setDotsPerMeterY(dpi / 25.4 * 1000) svgr = QSvgRenderer(svgpath) p = QPainter(image) svgr.render(p) p.end() filepath = getTempfilePath('png') res = image.save(filepath, 'png') if not res: os.unlink(filepath) filepath = '' # TODO: remove .svg file as well? return res, filepath
def _get_composer_svg_image(self, width, height, dpi): # from qgscomposer.cpp, QgsComposer::on_mActionExportAsSVG_triggered, # near end of function svgpath = getTempfilePath('svg') temp_size = os.path.getsize(svgpath) svg_g = QSvgGenerator() # noinspection PyArgumentList svg_g.setTitle(QgsProject.instance().title()) svg_g.setFileName(svgpath) svg_g.setSize(QSize(width, height)) svg_g.setViewBox(QRect(0, 0, width, height)) svg_g.setResolution(dpi) sp = QPainter(svg_g) self._c.renderPage(sp, 0) sp.end() if temp_size == os.path.getsize(svgpath): return False, '' image = QImage(width, height, self._TestMapSettings.outputImageFormat()) image.fill(QColor(152, 219, 249).rgb()) image.setDotsPerMeterX(dpi / 25.4 * 1000) image.setDotsPerMeterY(dpi / 25.4 * 1000) svgr = QSvgRenderer(svgpath) p = QPainter(image) p.setRenderHint( QPainter.Antialiasing, self._TestMapSettings.testFlag(QgsMapSettings.Antialiasing)) p.setRenderHint(QPainter.TextAntialiasing) svgr.render(p) p.end() filepath = getTempfilePath('png') res = image.save(filepath, 'png') if not res: os.unlink(filepath) filepath = '' # TODO: remove .svg file as well? return res, filepath
def _get_composer_svg_image(self, width, height, dpi): # from qgscomposer.cpp, QgsComposer::on_mActionExportAsSVG_triggered, # near end of function svgpath = getTempfilePath('svg') temp_size = os.path.getsize(svgpath) svg_g = QSvgGenerator() # noinspection PyArgumentList svg_g.setTitle(QgsProject.instance().title()) svg_g.setFileName(svgpath) svg_g.setSize(QSize(width, height)) svg_g.setViewBox(QRect(0, 0, width, height)) svg_g.setResolution(dpi) sp = QPainter(svg_g) self._c.renderPage(sp, 0) sp.end() if temp_size == os.path.getsize(svgpath): return False, '' image = QImage(width, height, self._TestMapSettings.outputImageFormat()) image.fill(QColor(152, 219, 249).rgb()) image.setDotsPerMeterX(dpi / 25.4 * 1000) image.setDotsPerMeterY(dpi / 25.4 * 1000) svgr = QSvgRenderer(svgpath) p = QPainter(image) p.setRenderHint( QPainter.Antialiasing, self._TestMapSettings.testFlag(QgsMapSettings.Antialiasing) ) p.setRenderHint(QPainter.TextAntialiasing) svgr.render(p) p.end() filepath = getTempfilePath('png') res = image.save(filepath, 'png') if not res: os.unlink(filepath) filepath = '' # TODO: remove .svg file as well? return res, filepath
def saveGraph(self): sizeDlg = OWChooseImageSizeDlg(self.dendrogram, parent=self) filename = sizeDlg.getFileName( "graph", "Portable Network Graphics (*.PNG);;" "Windows Bitmap (*.BMP);;" "Graphics Interchange Format (*.GIF);;" "Scalable Vector Graphics (*.SVG)", ".png", ) if not filename: return _, ext = os.path.splitext(filename) ext = ext.lower() canvases = (self.headerView.scene(), self.dendrogramView.scene(), self.footerView.scene()) width = max([c.width() for c in canvases]) height = sum([c.height() for c in canvases]) size = QSize(width, height) if ext == ".svg": device = QSvgGenerator() device.setTitle("Dendrogram Plot") device.setFileName(filename) device.setSize(size) device.setViewBox(QRect(QPoint(0, 0), size)) else: device = QPixmap(size) device.fill(Qt.white) painter = QPainter() painter.begin(device) painter.setRenderHint(QPainter.Antialiasing) self.renderDendrogram(painter) painter.end() if ext != ".svg": device.save(filename)
def saveGraph(self): sizeDlg = OWChooseImageSizeDlg(self.dendrogram, parent=self) filename = sizeDlg.getFileName( "graph", "Portable Network Graphics (*.PNG);;" "Windows Bitmap (*.BMP);;" "Graphics Interchange Format (*.GIF);;" "Scalable Vector Graphics (*.SVG)", ".png") if not filename: return _, ext = os.path.splitext(filename) ext = ext.lower() canvases = (self.headerView.scene(), self.dendrogramView.scene(), self.footerView.scene()) width = max([c.width() for c in canvases]) height = sum([c.height() for c in canvases]) size = QSize(width, height) if ext == ".svg": device = QSvgGenerator() device.setTitle("Dendrogram Plot") device.setFileName(filename) device.setSize(size) device.setViewBox(QRect(QPoint(0, 0), size)) else: device = QPixmap(size) device.fill(Qt.white) painter = QPainter() painter.begin(device) painter.setRenderHint(QPainter.Antialiasing) self.renderDendrogram(painter) painter.end() if ext != ".svg": device.save(filename)
def create_svg(text, font, rect=None): if not rect: rect = QRect(0, 0, 200, 200) f = tempfile.NamedTemporaryFile() generator = QSvgGenerator() generator.setFileName(f.name) generator.setSize(rect.size()) generator.setViewBox(rect) generator.setTitle("puddletag image") generator.setDescription("just to see") painter = QPainter() painter.begin(generator) painter.fillRect(rect, Qt.black) painter.setFont(font) painter.setPen(Qt.white) painter.setBrush(QBrush(Qt.white)) painter.drawText(rect, Qt.AlignCenter, text) painter.end() svg = open(f.name).read() f.close() return svg
def create_svg(text, font, rect=None): if not rect: rect = QRect(0, 0, 200, 200) f = tempfile.NamedTemporaryFile() generator = QSvgGenerator() generator.setFileName(f.name) generator.setSize(rect.size()) generator.setViewBox(rect); generator.setTitle("puddletag image") generator.setDescription("just to see") painter = QPainter() painter.begin(generator) painter.fillRect(rect, Qt.black) painter.setFont(font) painter.setPen(Qt.white) painter.setBrush(QBrush(Qt.white)) painter.drawText(rect, Qt.AlignCenter, text) painter.end() svg = open(f.name).read() f.close() return svg
def exportToSvg(self): size = QSize(self.logo.imageSize, self.logo.imageSize) viewport = self.viewportFromSize(QSizeF(size)) transform = self.viewportTransform(QSizeF(size), viewport) fileName = QFileDialog.getSaveFileName(self, "Save logo", "", "SVG files (*.svg)") if not fileName or fileName.isEmpty(): return svg = QSvgGenerator() svg.setFileName(fileName) svg.setTitle("Spark Logo") # save settings as description settings = self.settingsMap() settingsText = "{%s}" % ", ".join(["'%s': %s" % (k, repr(v)) for (k, v) in settings.iteritems()]) svg.setDescription("This picture was generated to be a Spark logo.\n" "The settings used were: %s" % settingsText) # crop the logo to its bounding box svg.setViewBox(transform.mapRect(viewport)) svg.setSize(size) p = QPainter() p.begin(svg) p.setTransform(transform) self.logo.draw(p) p.end()
stitches_only = "--stitches-only" in sys.argv if stitches_only: sys.argv.remove("--stitches-only") jef_file = sys.argv[1] svg_file = sys.argv[2] app = QApplication(sys.argv) svg = QSvgGenerator() svg.setFileName(svg_file) if QT_VERSION >= (4, 5, 0): svg.setDescription('Original JEF file "' + os.path.split(jef_file)[1] + '" converted ' 'to ' + os.path.split(svg_file)[1] + ' by jef2svg.py.') convertor = Convertor(jef_file, stitches_only) rect = convertor.bounding_rect() if QT_VERSION >= (4, 5, 0): svg.setViewBox(rect) svg.setSize(rect.size()) painter = QPainter() painter.begin(svg) convertor.show(painter) painter.end() sys.exit()
class NodeViewerLayout(QWidget): def __init__(self, *args, **kwargs): super(NodeViewerLayout, self).__init__(*args, **kwargs) self._node_viewer = NodeViewer() self._text_widget = QTextBrowser() self._text_widget.setStyleSheet("background-color: grey;") self._node_viewer.new_info.connect(self.display_new_info) layout = QHBoxLayout(self) layout.setSpacing(0) layout.setMargin(0) layout.addWidget(self._node_viewer, 1000) layout.addWidget(self._text_widget, 300) self.setLayout(layout) def set_node_data(self, graph): self._node_viewer.set_node_data(graph) self._text_widget.setHtml(""" <style> body {background:black} </style> <p>The <div style='color:red'>quick</div> <strong>brown</strong> fox</p> <p>asdfThe <div style='color:red'>quick</div> <strong>brown</strong> fox</p> <p>Theasdf <div style='color:red'>quick</div> <strong>brown</strong> fox</p> <p>asdfThe <div style='color:red'>quick</div> <strong>brown</strong> fox</p> <p>The <div style='color:red'>quick</div> <strong>brown</strong> fox</p> <p>The <div style='color:red'>quick</div> <strong>brown</strong> fox</p> <p>The <div style='color:red'>quick</div> <strong>brown</strong> fox</p> <p>The <div style='color:red'>quick</div> <strong>brown</strong> fox</p> <p>The <div style='color:red'>quick</div> <strong>brown</strong> fox</p> <p>The <div style='color:red'>quick</div> <strong>brown</strong> fox</p> <p>The <div style='color:red'>quick</div> <strong>brown</strong> fox</p> """) def search_return(self, search): self._search = str(search).strip() for key, item in self._node_viewer._graph.iter_nodes(): if self._search.lower() in item.label().lower(): item.ui().set_state('consider_selection') self._node_viewer.considered_selection.append(item.ui()) elif item.ui() in self._node_viewer.considered_selection: item.ui().set_state('normal') self._node_viewer.considered_selection.remove(item.ui()) def search_good(self): self._node_viewer.scene.clearSelection() for item in self._node_viewer.considered_selection: if self._search.lower() in item._dag_node.label().lower(): item.set_state('selected') item.setSelected(True) else: item.set_state('normal') item.setSelected(False) self._node_viewer._dirty_nodes.union( self._node_viewer.considered_selection) self._node_viewer._selection_changed() self._node_viewer.text.text_entry.disconnect() self._node_viewer.text.enter_pressed.disconnect() self._node_viewer.text.cancel_pressed.disconnect() self._node_viewer.text.hide() self._node_viewer.scene.clearFocus() def search_bad(self): self._node_viewer.scene.clearSelection() self._node_viewer._dirty_nodes.union( self._node_viewer.considered_selection) self._node_viewer._selection_changed() self._node_viewer.text.text_entry.disconnect() self._node_viewer.text.enter_pressed.disconnect() self._node_viewer.text.cancel_pressed.disconnect() self._node_viewer.text.hide() self._node_viewer.scene.clearFocus() def display_new_info(self, text): import simplejson import pygments.formatters from pygments import highlight import pygments.lexers text = '' for item in self._node_viewer.scene.selectedItems(): json = simplejson.dumps(item.info(), indent=2 * ' ') text += '\n' + highlight(json, pygments.lexers.JsonLexer(), pygments.formatters.HtmlFormatter()) self._text_widget.setHtml(text) def key_action_toggle_fullscreen(self): if self.windowState() == Qt.WindowFullScreen: self.showNormal() else: self.showFullScreen() def key_action_toggle_info(self): if self._text_widget.isVisible(): self._text_widget.hide() else: self._text_widget.show() def key_action_search(self): self._node_viewer.text.show() self._node_viewer.text.sync_pos() self._node_viewer.scene.setFocusItem(self._node_viewer.text) self._node_viewer.text.text_entry.connect(self.search_return) self._node_viewer.text.enter_pressed.connect(self.search_good) self._node_viewer.text.cancel_pressed.connect(self.search_bad) def key_action_rename(self): print 'rename' def key_action_reshape(self): print 'reshape' def key_action_save(self): self.gen = QSvgGenerator() self.gen.setFileName('/var/tmp/test.svg') self.gen.setSize(QSize(2000, 2000)) self.gen.setViewBox(QRect(0, 0, 2000, 2000)) self.gen.setTitle("Hello World") self.gen.setDescription("Hello Description") self.gen_painter = QPainter() self.gen_painter.begin(self.gen) self._node_viewer.scene.render(self.gen_painter) self.gen_painter.end() def key_action_test(self): print 'asdf' def key_action_quit(self): QApplication.quit() def keyPressEvent(self, event): key = event.key() modifiers = event.modifiers() shift = modifiers == Qt.ShiftModifier ctrl = modifiers == Qt.ControlModifier alt = modifiers == Qt.AltModifier if key == Qt.Key_F and not shift: self._node_viewer.key_action_focus() if key == Qt.Key_F and shift: self.key_action_toggle_fullscreen() elif key == Qt.Key_U: self._node_viewer.key_action_ungroup() elif key == Qt.Key_G: self._node_viewer.key_action_group() elif key == Qt.Key_Q: self.key_action_quit() elif key == Qt.Key_I: self.key_action_toggle_info() elif key == Qt.Key_Slash: self.key_action_search() elif key == Qt.Key_R and not shift: self.key_action_rename() elif key == Qt.Key_R and shift: self.key_action_reshape() elif key == Qt.Key_I: self.key_action_toggle_info() elif key == Qt.Key_S: self.key_action_save() elif alt and ctrl: self.key_action_test()