Skip to content

Commit

Permalink
Added first working OTB algorithm
Browse files Browse the repository at this point in the history
Added file selector for vector and raster layers
fixed bug with numbers and string in modeler dialog
added RenderingStyleFilePanel

git-svn-id: http://sextante.googlecode.com/svn/trunk/soft/bindings/qgis-plugin@73 881b9c09-3ef8-f3c2-ec3d-21d735c97f4d
  • Loading branch information
volayaf@gmail.com committed Apr 12, 2012
1 parent 4d25fbe commit 5d225c3
Show file tree
Hide file tree
Showing 13 changed files with 395 additions and 38 deletions.
10 changes: 9 additions & 1 deletion src/sextante/core/QGisLayers.py
Expand Up @@ -4,7 +4,6 @@
from PyQt4 import QtGui
from os import path
from sextante.core.SextanteConfig import SextanteConfig
import os.path

class QGisLayers:
'''This class contains method to communicate SEXTANTE with the QGIS interface,
Expand Down Expand Up @@ -123,13 +122,22 @@ def getObjectFromUri(uri, forceLoad = True):
if layer.source() == uri:
return layer
if forceLoad:
settings = QSettings()
prjSetting = settings.value("/Projections/defaultBehaviour")
settings.setValue("/Projections/defaultBehaviour", QVariant(""))
#if is not opened, we open it
layer = QgsVectorLayer(uri, uri , 'ogr')
if layer.isValid():
if prjSetting:
settings.setValue("/Projections/defaultBehaviour", prjSetting)
return layer
layer = QgsRasterLayer(uri, uri)
if layer.isValid():
if prjSetting:
settings.setValue("/Projections/defaultBehaviour", prjSetting)
return layer
if prjSetting:
settings.setValue("/Projections/defaultBehaviour", prjSetting)
else:
return None

Expand Down
7 changes: 4 additions & 3 deletions src/sextante/grass/GrassAlgorithm.py
Expand Up @@ -108,9 +108,10 @@ def addToRegion(self, layer, first):


def processAlgorithm(self, progress):
path = GrassUtils.grassPath()
if path == "":
raise GeoAlgorithmExecutionException("GRASS folder is not configured.\nPlease configure it before running GRASS algorithms.")
if SextanteUtils.isWindows():
path = GrassUtils.grassPath()
if path == "":
raise GeoAlgorithmExecutionException("GRASS folder is not configured.\nPlease configure it before running GRASS algorithms.")

commands = []
self.exportedLayers = {}
Expand Down
5 changes: 3 additions & 2 deletions src/sextante/gui/EditRenderingStylesDialog.py
Expand Up @@ -4,6 +4,7 @@
from sextante.outputs.OutputRaster import OutputRaster
from sextante.outputs.OutputVector import OutputVector
from sextante.gui.RenderingStyles import RenderingStyles
from sextante.gui.RenderingStyleFilePanel import RenderingStyleFilePanel

class EditRenderingStylesDialog(QtGui.QDialog):
def __init__(self, alg):
Expand Down Expand Up @@ -58,7 +59,7 @@ def setTableContent(self):
item = QtGui.QTableWidgetItem(output.description + "<" + output.__module__.split(".")[-1] + ">")
item.setFlags(QtCore.Qt.ItemIsEnabled)
self.tableWidget.setItem(i, 0, item)
item = QtGui.QLineEdit()
item = RenderingStyleFilePanel()
style = RenderingStyles.getStyle(self.alg.commandLineName(), output.name)
if style:
item.setText(str(style))
Expand All @@ -70,7 +71,7 @@ def setTableContent(self):
def okPressed(self):
styles = {}
for key in self.valueItems.keys():
styles[key] = str(self.valueItems[key].text())
styles[key] = str(self.valueItems[key].getValue())
RenderingStyles.addAlgStylesAndSave(self.alg.commandLineName(), styles)
self.close()

Expand Down
33 changes: 33 additions & 0 deletions src/sextante/gui/InputLayerSelectorPanel.py
@@ -0,0 +1,33 @@
from PyQt4 import QtGui, QtCore

class InputLayerSelectorPanel(QtGui.QWidget):

def __init__(self, options):
super(InputLayerSelectorPanel, self).__init__(None)
self.setObjectName("ILSPanel")
self.horizontalLayout = QtGui.QHBoxLayout(self)
self.horizontalLayout.setSpacing(2)
self.horizontalLayout.setMargin(0)
self.horizontalLayout.setObjectName("hLayout")
self.text = QtGui.QComboBox()
#self.text.setEditable(True)
for name, value in options:
self.text.addItem(name, value)
self.text.setObjectName("label")
self.text.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
self.horizontalLayout.addWidget(self.text)
self.pushButton = QtGui.QPushButton()
self.pushButton.setObjectName("pushButton")
self.pushButton.setText("...")
self.pushButton.clicked.connect(self.showSelectionDialog)
self.horizontalLayout.addWidget(self.pushButton)
self.setLayout(self.horizontalLayout)

def showSelectionDialog(self):
filename = QtGui.QFileDialog.getOpenFileName(self, "All files", "", "*.*")
if filename:
self.text.addItem(filename, filename)
self.text.setCurrentIndex(self.text.count() - 1)

def getValue(self):
return self.text.itemData(self.text.currentIndex()).toPyObject()
84 changes: 57 additions & 27 deletions src/sextante/gui/ParametersDialog.py
Expand Up @@ -22,6 +22,7 @@
from sextante.gui.HTMLViewerDialog import HTMLViewerDialog
from sextante.gui.NumberInputPanel import NumberInputPanel
from sextante.parameters.ParameterNumber import ParameterNumber
from sextante.gui.InputLayerSelectorPanel import InputLayerSelectorPanel

try:
_fromUtf8 = QtCore.QString.fromUtf8
Expand Down Expand Up @@ -87,34 +88,58 @@ def setupUi(self, dialog, alg):
QtCore.QObject.connect(self.showHelpButton, QtCore.SIGNAL("clicked()"), self.showHelp)
QtCore.QMetaObject.connectSlotsByName(dialog)

def somethingDependsOnThisParameter(self, parent):
for param in self.alg.parameters:
if isinstance(param, ParameterTableField):
if param.parent == parent.name:
return True
return False

def getWidgetFromParameter(self, param):
if isinstance(param, ParameterRaster):
item = QtGui.QComboBox()
layers = QGisLayers.getRasterLayers()
items = []
if (param.optional):
item.addItem(self.NOT_SELECTED, None)
items.append((self.NOT_SELECTED, None))
for layer in layers:
item.addItem(layer.name(), layer)
items.append((layer.name(), layer))
item = InputLayerSelectorPanel(items)
elif isinstance(param, ParameterVector):
item = QtGui.QComboBox()
layers = QGisLayers.getVectorLayers(param.shapetype)
if (param.optional):
item.addItem(self.NOT_SELECTED, None)
for layer in layers:
item.addItem(layer.name(), layer)
item.currentIndexChanged.connect(self.updateDependentFields)
item.name = param.name
if self.somethingDependsOnThisParameter(param):
item = QtGui.QComboBox()
layers = QGisLayers.getVectorLayers(param.shapetype)
if (param.optional):
item.addItem(self.NOT_SELECTED, None)
for layer in layers:
item.addItem(layer.name(), layer)
item.currentIndexChanged.connect(self.updateDependentFields)
item.name = param.name
else:
layers = QGisLayers.getVectorLayers(param.shapetype)
items = []
if (param.optional):
items.append((self.NOT_SELECTED, None))
for layer in layers:
items.append((layer.name(), layer))
item = InputLayerSelectorPanel(items)
elif isinstance(param, ParameterTable):
item = QtGui.QComboBox()
layers = QGisLayers.getTables()
QtGui.QMessageBox.critical(None, " ", str(layers))
if (param.optional):
item.addItem(self.NOT_SELECTED, None)
for layer in layers:
item.addItem(layer.name(), layer)
item.currentIndexChanged.connect(self.updateDependentFields)
item.name = param.name
if self.somethingDependsOnThisParameter(param):
item = QtGui.QComboBox()
layers = QGisLayers.getTables()
if (param.optional):
item.addItem(self.NOT_SELECTED, None)
for layer in layers:
item.addItem(layer.name(), layer)
item.currentIndexChanged.connect(self.updateDependentFields)
item.name = param.name
else:
layers = QGisLayers.getTables()
items = []
if (param.optional):
items.append((self.NOT_SELECTED, None))
for layer in layers:
items.append((layer.name(), layer))
item = InputLayerSelectorPanel(items)
elif isinstance(param, ParameterBoolean):
item = QtGui.QComboBox()
item.addItem("Yes")
Expand All @@ -131,7 +156,11 @@ def getWidgetFromParameter(self, param):
items = []
self.dependentItems[param.parent] = items
items.append(param.name)
layers = QGisLayers.getVectorLayers()
parent = self.alg.getParameterFromName(param.parent)
if isinstance(parent, ParameterVector):
layers = QGisLayers.getVectorLayers(parent.shapetype)
else:
layers = QGisLayers.getTables()
if len(layers)>0:
fields = self.getFields(layers[0])
for i in fields:
Expand Down Expand Up @@ -226,7 +255,7 @@ def setTableContent(self):

def fillParameterValuesFromHistory(self):
pass

def setParamValues(self):
params = self.alg.parameters
outputs = self.alg.outputs
Expand All @@ -244,11 +273,12 @@ def setParamValues(self):

def setParamValue(self, param, widget):
if isinstance(param, ParameterRaster):
return param.setValue(widget.itemData(widget.currentIndex()).toPyObject())
elif isinstance(param, ParameterVector):
return param.setValue(widget.itemData(widget.currentIndex()).toPyObject())
elif isinstance(param, ParameterTable):
return param.setValue(widget.itemData(widget.currentIndex()).toPyObject())
return param.setValue(widget.getValue())
elif isinstance(param, (ParameterVector, ParameterTable)):
try:
return param.setValue(widget.itemData(widget.currentIndex()).toPyObject())
except:
return param.setValue(widget.getValue())
elif isinstance(param, ParameterBoolean):
return param.setValue(widget.currentIndex() == 0)
elif isinstance(param, ParameterSelection):
Expand Down
36 changes: 36 additions & 0 deletions src/sextante/gui/RenderingStyleFilePanel.py
@@ -0,0 +1,36 @@
from PyQt4 import QtGui, QtCore
import os.path
from sextante.core.SextanteConfig import SextanteConfig


class RenderingStyleFilePanel(QtGui.QWidget):

def __init__(self):
super(RenderingStyleFilePanel, self).__init__(None)
self.setObjectName("RSFPanel")
self.horizontalLayout = QtGui.QHBoxLayout(self)
self.horizontalLayout.setSpacing(2)
self.horizontalLayout.setMargin(0)
self.horizontalLayout.setObjectName("hLayout")
self.text = QtGui.QLineEdit()
self.text.setObjectName("label")
self.text.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
self.horizontalLayout.addWidget(self.text)
self.pushButton = QtGui.QPushButton()
self.pushButton.setObjectName("pushButton")
self.pushButton.setText("...")
self.pushButton.clicked.connect(self.showSelectionDialog)
self.horizontalLayout.addWidget(self.pushButton)
self.setLayout(self.horizontalLayout)

def showSelectionDialog(self):
filename = QtGui.QFileDialog.getOpenFileName(self, "Select style file", "", "*.qml")
if filename:
self.text.setText(str(filename))

def setText(self, text):
self.text.setText(str(text))

def getValue(self):
filename = str(self.text.text())
return filename
6 changes: 4 additions & 2 deletions src/sextante/modeler/ModelerParametersDialog.py
Expand Up @@ -320,7 +320,8 @@ def setParamBooleanValue(self, param, widget):
return True

def setParamStringValue(self, param, widget):
if widget.currentIndex() < 0:
idx = widget.findText(widget.currentText())
if idx < 0:
name = self.model.getSafeNameForHarcodedParameter(param)
value = AlgorithmAndParameter(AlgorithmAndParameter.PARENT_MODEL_ALGORITHM, name)
self.params[param.name] = value
Expand All @@ -332,7 +333,8 @@ def setParamStringValue(self, param, widget):


def setParamNumberValue(self, param, widget):
if widget.currentIndex() < 0:
idx = widget.findText(widget.currentText())
if idx < 0:
name = self.model.getSafeNameForHarcodedParameter(param)
value = AlgorithmAndParameter(AlgorithmAndParameter.PARENT_MODEL_ALGORITHM, name)
self.params[param.name] = value
Expand Down
97 changes: 97 additions & 0 deletions src/sextante/otb/OTBAlgorithm.py
@@ -0,0 +1,97 @@
import os
from qgis.core import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from sextante.core.GeoAlgorithm import GeoAlgorithm
from sextante.parameters.ParameterTable import ParameterTable
from sextante.parameters.ParameterMultipleInput import ParameterMultipleInput
from sextante.parameters.ParameterRaster import ParameterRaster
from sextante.outputs.OutputRaster import OutputRaster
from sextante.parameters.ParameterVector import ParameterVector
from sextante.parameters.ParameterBoolean import ParameterBoolean
from sextante.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
from sextante.core.SextanteLog import SextanteLog
from sextante.parameters.ParameterFactory import ParameterFactory
from sextante.outputs.OutputFactory import OutputFactory
from sextante.core.SextanteUtils import SextanteUtils
from sextante.otb.OTBUtils import OTBUtils

class OTBAlgorithm(GeoAlgorithm):

def __init__(self, descriptionfile):
GeoAlgorithm.__init__(self)
self.descriptionFile = descriptionfile
self.defineCharacteristicsFromFile()
self.numExportedLayers = 0

def __deepcopy__(self,memo):
newone = OTBAlgorithm(self.descriptionFile)
newone.provider = self.provider
return newone

def getIcon(self):
return QIcon(os.path.dirname(__file__) + "/../images/otb.png")


def defineCharacteristicsFromFile(self):
lines = open(self.descriptionFile)
line = lines.readline().strip("\n").strip()
self.cliName = line
line = lines.readline().strip("\n").strip()
self.name = line
line = lines.readline().strip("\n").strip()
self.group = line
while line != "":
try:
line = line.strip("\n").strip()
if line.startswith("Parameter"):
self.addParameter(ParameterFactory.getFromString(line))
else:
self.addOutput(OutputFactory.getFromString(line))
line = lines.readline().strip("\n").strip()
except Exception,e:
SextanteLog.addToLog(SextanteLog.LOG_ERROR, "Could not open OTB algorithm: " + self.descriptionFile + "\n" + line)
raise e
lines.close()


def processAlgorithm(self, progress):
if SextanteUtils.isWindows():
path = OTBUtils.otbPath()
libpath = OTBUtils.otbLibPath()
if path == "" or libpath == "":
raise GeoAlgorithmExecutionException("OTB folder is not configured.\nPlease configure it before running OTB algorithms.")

commands = []
commands.append(path + os.sep + self.cliName)

for param in self.parameters:
if param.value == None:
continue
if isinstance(param, (ParameterRaster, ParameterVector)):
commands.append(param.name)
commands.append(param.value)
elif isinstance(param, ParameterMultipleInput):
commands.append(param.name)
commands.append(str(param.value.replace(";"," ")))
elif isinstance(param, ParameterBoolean):
if param.value:
commands.append(param.name)
commands.append(str(param.value).lower())
else:
commands.append(param.name)
commands.append(str(param.value))

for out in self.outputs:
commands.append(out.name)
commands.append(out.value);


loglines = []
loglines.append("OTB execution command")
for line in commands:
loglines.append(line)
SextanteLog.addToLog(SextanteLog.LOG_INFO, loglines)
OTBUtils.executeOtb(commands, progress)


0 comments on commit 5d225c3

Please sign in to comment.