mirror of
				https://github.com/qgis/QGIS.git
				synced 2025-10-31 00:06:02 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			146 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # -*- coding: utf-8 -*-
 | |
| 
 | |
| """
 | |
| ***************************************************************************
 | |
|     GdalAlgorithmDialog.py
 | |
|     ---------------------
 | |
|     Date                 : May 2015
 | |
|     Copyright            : (C) 2015 by Victor Olaya
 | |
|     Email                : volayaf at gmail dot com
 | |
| ***************************************************************************
 | |
| *                                                                         *
 | |
| *   This program is free software; you can redistribute it and/or modify  *
 | |
| *   it under the terms of the GNU General Public License as published by  *
 | |
| *   the Free Software Foundation; either version 2 of the License, or     *
 | |
| *   (at your option) any later version.                                   *
 | |
| *                                                                         *
 | |
| ***************************************************************************
 | |
| """
 | |
| 
 | |
| __author__ = 'Victor Olaya'
 | |
| __date__ = 'May 2015'
 | |
| __copyright__ = '(C) 2015, Victor Olaya'
 | |
| 
 | |
| from qgis.PyQt.QtCore import QCoreApplication
 | |
| from qgis.PyQt.QtWidgets import (QWidget,
 | |
|                                  QVBoxLayout,
 | |
|                                  QPushButton,
 | |
|                                  QLabel,
 | |
|                                  QPlainTextEdit,
 | |
|                                  QLineEdit,
 | |
|                                  QComboBox,
 | |
|                                  QCheckBox,
 | |
|                                  QSizePolicy,
 | |
|                                  QDialogButtonBox)
 | |
| 
 | |
| from qgis.core import (QgsProcessingFeedback,
 | |
|                        QgsProcessingParameterDefinition)
 | |
| from qgis.gui import (QgsMessageBar,
 | |
|                       QgsProjectionSelectionWidget,
 | |
|                       QgsProcessingAlgorithmDialogBase)
 | |
| 
 | |
| from processing.gui.AlgorithmDialog import AlgorithmDialog
 | |
| from processing.gui.AlgorithmDialogBase import AlgorithmDialogBase
 | |
| from processing.gui.ParametersPanel import ParametersPanel
 | |
| from processing.gui.MultipleInputPanel import MultipleInputPanel
 | |
| from processing.gui.NumberInputPanel import NumberInputPanel
 | |
| from processing.gui.DestinationSelectionPanel import DestinationSelectionPanel
 | |
| from processing.gui.wrappers import WidgetWrapper
 | |
| from processing.tools.dataobjects import createContext
 | |
| 
 | |
| 
 | |
| class GdalAlgorithmDialog(AlgorithmDialog):
 | |
| 
 | |
|     def __init__(self, alg, parent=None):
 | |
|         super().__init__(alg, parent=parent)
 | |
|         self.mainWidget().parametersHaveChanged()
 | |
| 
 | |
|     def getParametersPanel(self, alg, parent):
 | |
|         return GdalParametersPanel(parent, alg)
 | |
| 
 | |
| 
 | |
| class GdalParametersPanel(ParametersPanel):
 | |
| 
 | |
|     def __init__(self, parent, alg):
 | |
|         ParametersPanel.__init__(self, parent, alg)
 | |
| 
 | |
|         w = QWidget()
 | |
|         layout = QVBoxLayout()
 | |
|         layout.setMargin(0)
 | |
|         layout.setSpacing(6)
 | |
|         label = QLabel()
 | |
|         label.setText(self.tr("GDAL/OGR console call"))
 | |
|         layout.addWidget(label)
 | |
|         self.text = QPlainTextEdit()
 | |
|         self.text.setReadOnly(True)
 | |
|         layout.addWidget(self.text)
 | |
|         w.setLayout(layout)
 | |
|         self.layoutMain.addWidget(w)
 | |
| 
 | |
|         self.connectParameterSignals()
 | |
|         self.parametersHaveChanged()
 | |
| 
 | |
|     def connectParameterSignals(self):
 | |
|         for wrapper in list(self.wrappers.values()):
 | |
|             wrapper.widgetValueHasChanged.connect(self.parametersHaveChanged)
 | |
| 
 | |
|             # TODO - remove when all wrappers correctly emit widgetValueHasChanged!
 | |
| 
 | |
|             # For compatibility with 3.x API, we need to check whether the wrapper is
 | |
|             # the deprecated WidgetWrapper class. If not, it's the newer
 | |
|             # QgsAbstractProcessingParameterWidgetWrapper class
 | |
|             # TODO QGIS 4.0 - remove
 | |
|             if issubclass(wrapper.__class__, WidgetWrapper):
 | |
|                 w = wrapper.widget
 | |
|             else:
 | |
|                 w = wrapper.wrappedWidget()
 | |
| 
 | |
|             self.connectWidgetChangedSignals(w)
 | |
|             for c in w.findChildren(QWidget):
 | |
|                 self.connectWidgetChangedSignals(c)
 | |
| 
 | |
|         for output_widget in self.outputWidgets.values():
 | |
|             self.connectWidgetChangedSignals(output_widget)
 | |
| 
 | |
|     def connectWidgetChangedSignals(self, w):
 | |
|         if isinstance(w, QLineEdit):
 | |
|             w.textChanged.connect(self.parametersHaveChanged)
 | |
|         elif isinstance(w, QComboBox):
 | |
|             w.currentIndexChanged.connect(self.parametersHaveChanged)
 | |
|         elif isinstance(w, QgsProjectionSelectionWidget):
 | |
|             w.crsChanged.connect(self.parametersHaveChanged)
 | |
|         elif isinstance(w, QCheckBox):
 | |
|             w.stateChanged.connect(self.parametersHaveChanged)
 | |
|         elif isinstance(w, MultipleInputPanel):
 | |
|             w.selectionChanged.connect(self.parametersHaveChanged)
 | |
|         elif isinstance(w, NumberInputPanel):
 | |
|             w.hasChanged.connect(self.parametersHaveChanged)
 | |
|         elif isinstance(w, DestinationSelectionPanel):
 | |
|             w.destinationChanged.connect(self.parametersHaveChanged)
 | |
| 
 | |
|     def parametersHaveChanged(self):
 | |
|         context = createContext()
 | |
|         feedback = QgsProcessingFeedback()
 | |
|         try:
 | |
|             parameters = self.parent.getParameterValues()
 | |
|             for output in self.alg.destinationParameterDefinitions():
 | |
|                 if not output.name() in parameters or parameters[output.name()] is None:
 | |
|                     parameters[output.name()] = self.tr("[temporary file]")
 | |
|             for p in self.alg.parameterDefinitions():
 | |
|                 if p.flags() & QgsProcessingParameterDefinition.FlagHidden:
 | |
|                     continue
 | |
| 
 | |
|                 if (not p.name() in parameters and not p.flags() & QgsProcessingParameterDefinition.FlagOptional) \
 | |
|                         or (not p.checkValueIsAcceptable(parameters[p.name()])):
 | |
|                     # not ready yet
 | |
|                     self.text.setPlainText('')
 | |
|                     return
 | |
| 
 | |
|             commands = self.alg.getConsoleCommands(parameters, context, feedback, executing=False)
 | |
|             commands = [c for c in commands if c not in ['cmd.exe', '/C ']]
 | |
|             self.text.setPlainText(" ".join(commands))
 | |
|         except AlgorithmDialogBase.InvalidParameterValue as e:
 | |
|             self.text.setPlainText(self.tr("Invalid value for parameter '{0}'").format(e.parameter.description()))
 | |
|         except AlgorithmDialogBase.InvalidOutputExtension as e:
 | |
|             self.text.setPlainText(e.message)
 |