1
+ # -*- coding: utf-8 -*-
2
+
3
+ """
4
+ ***************************************************************************
5
+ SaveAsPythonScriptAction.py
6
+ ---------------------
7
+ Date : April 2013
8
+ Copyright : (C) 2013 by Victor Olaya
9
+ Email : volayaf at gmail dot com
10
+ ***************************************************************************
11
+ * *
12
+ * This program is free software; you can redistribute it and/or modify *
13
+ * it under the terms of the GNU General Public License as published by *
14
+ * the Free Software Foundation; either version 2 of the License, or *
15
+ * (at your option) any later version. *
16
+ * *
17
+ ***************************************************************************
18
+ """
19
+ import sys
20
+ from sextante .parameters .ParameterMultipleInput import ParameterMultipleInput
21
+
22
+ __author__ = 'Victor Olaya'
23
+ __date__ = 'April 2013'
24
+ __copyright__ = '(C) 2013, Victor Olaya'
25
+ # This will get replaced with a git SHA1 when you do a git archive
26
+ __revision__ = '$Format:%H$'
27
+
28
+ from sextante .gui .ContextAction import ContextAction
29
+ from sextante .modeler .ModelerAlgorithm import ModelerAlgorithm ,\
30
+ AlgorithmAndParameter
31
+ from sextante .script .ScriptUtils import ScriptUtils
32
+ from PyQt4 .QtCore import *
33
+ from PyQt4 .QtGui import *
34
+
35
+ class SaveAsPythonScriptAction (ContextAction ):
36
+
37
+ def __init__ (self ):
38
+ self .name = "Save as Python script"
39
+
40
+ def isEnabled (self ):
41
+ return isinstance (self .alg , ModelerAlgorithm )
42
+
43
+ def execute (self ):
44
+ filename = str (QFileDialog .getSaveFileName (None , "Save Script" , ScriptUtils .scriptsFolder (), "Python scripts (*.py)" ))
45
+
46
+ if filename :
47
+ if not filename .endswith (".py" ):
48
+ filename += ".py"
49
+ text = self .translateToPythonCode (self .alg )
50
+ try :
51
+ fout = open (filename , "w" )
52
+ fout .write (text )
53
+ fout .close ()
54
+ if filename .replace ("\\ " ,"/" ).startswith (ScriptUtils .scriptsFolder ().replace ("\\ " ,"/" )):
55
+ self .toolbox .updateTree ()
56
+ except :
57
+ QMessageBox .warning (self ,
58
+ self .tr ("I/O error" ),
59
+ self .tr ("Unable to save edits. Reason:\n %1" ).arg (unicode (sys .exc_info ()[1 ]))
60
+ )
61
+
62
+ def translateToPythonCode (self , model ):
63
+ s = ["##" + model .name + "=name" ]
64
+ for param in model .parameters :
65
+ s .append (str (param .getAsScriptCode ().lower ()))
66
+ i = 0
67
+ for outs in model .algOutputs :
68
+ for out in outs .keys ():
69
+ if outs [out ]:
70
+ s .append ("##" + out .lower () + "_alg" + str (i ) + "=" + model .getOutputType (i , out ))
71
+ i += 1
72
+ i = 0
73
+ iMultiple = 0
74
+ for alg in model .algs :
75
+ multiple = []
76
+ runline = "outputs_" + str (i ) + "=Sextante.runalg(\" " + alg .commandLineName () + "\" "
77
+ for param in alg .parameters :
78
+ aap = model .algParameters [i ][param .name ]
79
+ if aap == None :
80
+ runline += ", None"
81
+ elif isinstance (param , ParameterMultipleInput ):
82
+ value = model .paramValues [aap .param ]
83
+ tokens = value .split (";" )
84
+ layerslist = []
85
+ for token in tokens :
86
+ iAlg , paramname = token .split ("|" )
87
+ if float (iAlg ) == float (AlgorithmAndParameter .PARENT_MODEL_ALGORITHM ):
88
+ if model .ismodelparam (paramname ):
89
+ value = paramname .lower ()
90
+ else :
91
+ value = model .paramValues [paramname ]
92
+ else :
93
+ value = "outputs_" + str (iAlg ) + "['" + paramname + "']"
94
+ layerslist .append (str (value ))
95
+
96
+ multiple .append ("multiple_" + str (iMultiple ) + "=[" + "," .join (layerslist ) + "]" )
97
+ runline += ", \" ;\" .join(multiple_" + str (iMultiple ) + ") "
98
+ else :
99
+ if float (aap .alg ) == float (AlgorithmAndParameter .PARENT_MODEL_ALGORITHM ):
100
+ if model .ismodelparam (aap .param ):
101
+ runline += ", " + aap .param .lower ()
102
+ else :
103
+ runline += ", " + str (model .paramValues [aap .param ])
104
+ else :
105
+ runline += ", outputs_" + str (aap .alg ) + "['" + aap .param + "']"
106
+ for out in alg .outputs :
107
+ value = model .algOutputs [i ][out .name ]
108
+ if value :
109
+ name = out .name .lower () + "_alg" + str (i )
110
+ else :
111
+ name = str (None )
112
+ runline += ", " + name
113
+ i += 1
114
+ s += multiple
115
+ s .append (str (runline + ")" ))
116
+ return "\n " .join (s )
0 commit comments