Skip to content

Commit 2e4b1a9

Browse files
committed
[FEATURE] save Processing model as image (fix #5926)
1 parent 269c916 commit 2e4b1a9

File tree

1 file changed

+42
-9
lines changed

1 file changed

+42
-9
lines changed

python/plugins/processing/modeler/ModelerDialog.py

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,33 +16,37 @@
1616
* *
1717
***************************************************************************
1818
"""
19-
import sys
2019

2120
__author__ = 'Victor Olaya'
2221
__date__ = 'August 2012'
2322
__copyright__ = '(C) 2012, Victor Olaya'
2423
# This will get replaced with a git SHA1 when you do a git archive
2524
__revision__ = '$Format:%H$'
2625

26+
import sys
27+
import codecs
28+
import pickle
29+
2730
from PyQt4.QtCore import *
2831
from PyQt4.QtGui import *
2932

30-
import codecs
31-
import pickle
33+
from processing.core.ProcessingConfig import ProcessingConfig
34+
from processing.core.GeoAlgorithm import GeoAlgorithm
3235

33-
from processing.tools.system import *
3436
from processing.gui.HelpEditionDialog import HelpEditionDialog
3537
from processing.gui.ParametersDialog import ParametersDialog
36-
from processing.core.ProcessingConfig import ProcessingConfig
37-
from processing.core.GeoAlgorithm import GeoAlgorithm
3838
from processing.gui.AlgorithmClassification import AlgorithmDecorator
39+
3940
from processing.modeler.ModelerParameterDefinitionDialog import ModelerParameterDefinitionDialog
4041
from processing.modeler.ModelerAlgorithm import ModelerAlgorithm
4142
from processing.modeler.ModelerParametersDialog import ModelerParametersDialog
4243
from processing.modeler.ModelerUtils import ModelerUtils
4344
from processing.modeler.WrongModelException import WrongModelException
4445
from processing.modeler.ModelerScene import ModelerScene
4546
from processing.modeler.Providers import Providers
47+
48+
from processing.tools.system import *
49+
4650
from processing.ui.ui_DlgModeler import Ui_DlgModeler
4751

4852
class ModelerDialog(QDialog, Ui_DlgModeler):
@@ -76,9 +80,12 @@ def __init__(self, alg=None):
7680
self.saveButton = QPushButton(self.tr("Save"))
7781
self.saveButton.setToolTip(self.tr("Save current model"))
7882
self.buttonBox.addButton(self.saveButton, QDialogButtonBox.ActionRole)
79-
self.saveAsButton = QPushButton(self.tr("Save as ..."))
83+
self.saveAsButton = QPushButton(self.tr("Save as..."))
8084
self.saveAsButton.setToolTip(self.tr("Save current model as"))
8185
self.buttonBox.addButton(self.saveAsButton, QDialogButtonBox.ActionRole)
86+
self.saveAsImageButton = QPushButton(self.tr("Export as image..."))
87+
self.exportAsImageButton.setToolTip(self.tr("Export current model to image"))
88+
self.buttonBox.addButton(self.saveAsImageButton, QDialogButtonBox.ActionRole)
8289

8390
# fill trees with inputs and algorithms
8491
self.fillInputsTree()
@@ -100,6 +107,7 @@ def __init__(self, alg=None):
100107
self.openButton.clicked.connect(self.openModel)
101108
self.saveButton.clicked.connect(self.save)
102109
self.saveAsButton.clicked.connect(self.saveAs)
110+
self.exportAsImageButton.clicked.connect(self.exportAsImage)
103111
self.runButton.clicked.connect(self.runModel)
104112
self.editHelpButton.clicked.connect(self.editHelp)
105113

@@ -116,7 +124,6 @@ def __init__(self, alg=None):
116124
self.help = None
117125
self.update = False #indicates whether to update or not the toolbox after closing this dialog
118126

119-
120127
def editHelp(self):
121128
dlg = HelpEditionDialog(self.alg)
122129
dlg.exec_()
@@ -159,6 +166,33 @@ def save(self):
159166
def saveAs(self):
160167
self.saveModel(True)
161168

169+
def exportAsImage(self):
170+
filename = unicode(QFileDialog.getSaveFileName(self,
171+
self.tr("Save Model As Image"),
172+
"",
173+
self.tr("PNG files (*.png *.PNG)")
174+
))
175+
if not filename:
176+
return
177+
178+
if not filename.lower().endswith(".png"):
179+
filename += ".png"
180+
181+
totalRect = QRectF(0, 0, 1, 1)
182+
for item in self.scene.items():
183+
totalRect = totalRect.united(item.sceneBoundingRect())
184+
totalRect.adjust(-10, -10, 10, 10)
185+
186+
img = QImage(totalRect.width(), totalRect.height(), QImage.Format_ARGB32_Premultiplied)
187+
img.fill(Qt.white)
188+
painter = QPainter()
189+
painter.setRenderHint(QPainter.Antialiasing)
190+
painter.begin(img)
191+
self.scene.render(painter, totalRect, totalRect)
192+
painter.end()
193+
194+
img.save(filename)
195+
162196
def saveModel(self, saveAs):
163197
if unicode(self.textGroup.text()).strip() == "" or unicode(self.textName.text()).strip() == "":
164198
QMessageBox.warning(self,
@@ -427,4 +461,3 @@ def __init__(self, alg):
427461
self.setIcon(0, icon)
428462
self.setToolTip(0, name)
429463
self.setText(0, name)
430-

0 commit comments

Comments
 (0)