def getAsString(self, value): if self.datatype == dataobjects.TYPE_RASTER: if isinstance(value, QgsRasterLayer): return str(value.dataProvider().dataSourceUri()) else: s = str(value) layers = QgsProcessingUtils.compatibleRasterLayers(QgsProject.instance()) for layer in layers: if layer.name() == s: return str(layer.dataProvider().dataSourceUri()) return s if self.datatype == dataobjects.TYPE_FILE: return str(value) else: if isinstance(value, QgsVectorLayer): return str(value.source()) else: s = str(value) if self.datatype != dataobjects.TYPE_VECTOR_ANY: layers = QgsProcessingUtils.compatibleVectorLayers(QgsProject.instance(), [self.datatype], False) else: layers = QgsProcessingUtils.compatibleVectorLayers(QgsProject.instance(), [], False) for layer in layers: if layer.name() == s: return str(layer.source()) return s
def showLayerSelectionDialog(self): if (isinstance(self.param, ParameterRaster) or (isinstance(self.param, ParameterMultipleInput) and self.param.datatype == dataobjects.TYPE_RASTER)): layers = QgsProcessingUtils.compatibleRasterLayers(QgsProject.instance()) elif isinstance(self.param, ParameterTable): layers = QgsProcessingUtils.compatibleVectorLayers(QgsProject.instance()) else: if isinstance(self.param, ParameterVector): datatype = self.param.datatype else: datatype = [self.param.datatype] if datatype != dataobjects.TYPE_VECTOR_ANY: layers = QgsProcessingUtils.compatibleVectorLayers(QgsProject.instance(), [datatype]) else: layers = QgsProcessingUtils.compatibleVectorLayers(QgsProject.instance()) dlg = MultipleInputDialog([layer.name() for layer in layers]) dlg.exec_() if dlg.selectedoptions is not None: selected = dlg.selectedoptions if len(selected) == 1: self.setValue(layers[selected[0]]) else: if isinstance(self.param, ParameterMultipleInput): self.text.setText(';'.join(layers[idx].name() for idx in selected)) else: rowdif = len(selected) - (self._table().rowCount() - self.row) for i in range(rowdif): self._panel().addRow() for i, layeridx in enumerate(selected): self._table().cellWidget(i + self.row, self.col).setValue(layers[layeridx])
def showLayerSelectionDialog(self): layers = [] if (isinstance(self.param, QgsProcessingParameterRasterLayer) or (isinstance(self.param, QgsProcessingParameterMultipleLayers) and self.param.layerType() == QgsProcessing.TypeRaster)): layers = QgsProcessingUtils.compatibleRasterLayers(QgsProject.instance()) elif isinstance(self.param, QgsProcessingParameterVectorLayer): layers = QgsProcessingUtils.compatibleVectorLayers(QgsProject.instance()) elif (isinstance(self.param, QgsProcessingParameterMeshLayer) or (isinstance(self.param, QgsProcessingParameterMultipleLayers) and self.param.layerType() == QgsProcessing.TypeMesh)): layers = QgsProcessingUtils.compatibleMeshLayers(QgsProject.instance()) else: datatypes = [QgsProcessing.TypeVectorAnyGeometry] if isinstance(self.param, QgsProcessingParameterFeatureSource): datatypes = self.param.dataTypes() elif isinstance(self.param, QgsProcessingParameterMultipleLayers): datatypes = [self.param.layerType()] if QgsProcessing.TypeVectorAnyGeometry not in datatypes: layers = QgsProcessingUtils.compatibleVectorLayers(QgsProject.instance(), datatypes) else: layers = QgsProcessingUtils.compatibleVectorLayers(QgsProject.instance()) dlg = MultipleInputDialog([layer.name() for layer in layers]) dlg.exec_() def generate_layer_id(layer): # prefer layer name if unique if len([l for l in layers if l.name().lower() == layer.name().lower()]) == 1: return layer.name() else: # otherwise fall back to layer id return layer.id() if dlg.selectedoptions is not None: selected = dlg.selectedoptions if len(selected) == 1: self.setValue(generate_layer_id(layers[selected[0]])) else: if isinstance(self.param, QgsProcessingParameterMultipleLayers): self.text.setText(';'.join(layers[idx].id() for idx in selected)) else: rowdif = len(selected) - (self._table().rowCount() - self.row) for i in range(rowdif): self._panel().addRow() for i, layeridx in enumerate(selected): self._table().cellWidget(i + self.row, self.col).setValue(generate_layer_id(layers[layeridx]))
def showLayerSelectionDialog(self): layers = [] if (isinstance(self.param, QgsProcessingParameterRasterLayer) or (isinstance(self.param, QgsProcessingParameterMultipleLayers) and self.param.layerType() == QgsProcessingParameterDefinition.TypeRaster)): layers = QgsProcessingUtils.compatibleRasterLayers( QgsProject.instance()) elif isinstance(self.param, QgsProcessingParameterVectorLayer): layers = QgsProcessingUtils.compatibleVectorLayers( QgsProject.instance()) else: datatypes = [QgsProcessingParameterDefinition.TypeVectorAny] if isinstance(self.param, QgsProcessingParameterFeatureSource): datatypes = self.param.dataTypes() elif isinstance(self.param, QgsProcessingParameterMultipleLayers): datatypes = [self.param.layerType()] if QgsProcessingParameterDefinition.TypeVectorAny not in datatypes: layers = QgsProcessingUtils.compatibleVectorLayers( QgsProject.instance(), datatypes) else: layers = QgsProcessingUtils.compatibleVectorLayers( QgsProject.instance()) dlg = MultipleInputDialog([layer.name() for layer in layers]) dlg.exec_() if dlg.selectedoptions is not None: selected = dlg.selectedoptions if len(selected) == 1: self.setValue(layers[selected[0]].id()) else: if isinstance(self.param, QgsProcessingParameterMultipleLayers): self.text.setText(';'.join(layers[idx].id() for idx in selected)) else: rowdif = len(selected) - (self._table().rowCount() - self.row) for i in range(rowdif): self._panel().addRow() for i, layeridx in enumerate(selected): self._table().cellWidget(i + self.row, self.col).setValue( layers[layeridx].id())
def value(self): if self.dialogType == DIALOG_STANDARD: if self.param.datatype == dataobjects.TYPE_FILE: return self.param.setValue(self.widget.selectedoptions) else: if self.param.datatype == dataobjects.TYPE_RASTER: options = QgsProcessingUtils.compatibleRasterLayers(QgsProject.instance(), False) elif self.param.datatype == dataobjects.TYPE_VECTOR_ANY: options = QgsProcessingUtils.compatibleVectorLayers(QgsProject.instance(), [], False) else: options = QgsProcessingUtils.compatibleVectorLayers(QgsProject.instance(), [self.param.datatype], False) return [options[i] for i in self.widget.selectedoptions] elif self.dialogType == DIALOG_BATCH: return self.widget.getText() else: options = self._getOptions() values = [options[i] for i in self.widget.selectedoptions] if len(values) == 0 and not self.param.flags() & QgsProcessingParameterDefinition.FlagOptional: raise InvalidParameterValue() return values
def createWidget(self): if self.dialogType == DIALOG_STANDARD: if self.param.datatype == dataobjects.TYPE_FILE: return MultipleInputPanel(datatype=dataobjects.TYPE_FILE) else: if self.param.datatype == dataobjects.TYPE_RASTER: options = QgsProcessingUtils.compatibleRasterLayers(QgsProject.instance(), False) elif self.param.datatype in (dataobjects.TYPE_VECTOR_ANY, dataobjects.TYPE_TABLE): options = QgsProcessingUtils.compatibleVectorLayers(QgsProject.instance(), [], False) else: options = QgsProcessingUtils.compatibleVectorLayers(QgsProject.instance(), [self.param.datatype], False) opts = [getExtendedLayerName(opt) for opt in options] return MultipleInputPanel(opts) elif self.dialogType == DIALOG_BATCH: widget = BatchInputSelectionPanel(self.param, self.row, self.col, self.dialog) widget.valueChanged.connect(lambda: self.widgetValueHasChanged.emit(self)) return widget else: options = [self.dialog.resolveValueDescription(opt) for opt in self._getOptions()] return MultipleInputPanel(options)
def showLayerSelectionDialog(self): if (isinstance(self.param, ParameterRaster) or (isinstance(self.param, ParameterMultipleInput) and self.param.datatype == dataobjects.TYPE_RASTER)): layers = QgsProcessingUtils.compatibleRasterLayers( QgsProject.instance()) elif isinstance(self.param, ParameterTable): layers = QgsProcessingUtils.compatibleVectorLayers( QgsProject.instance()) else: if isinstance(self.param, ParameterVector): datatype = self.param.datatype else: datatype = [self.param.datatype] if datatype != dataobjects.TYPE_VECTOR_ANY: layers = QgsProcessingUtils.compatibleVectorLayers( QgsProject.instance(), [datatype]) else: layers = QgsProcessingUtils.compatibleVectorLayers( QgsProject.instance()) dlg = MultipleInputDialog([layer.name() for layer in layers]) dlg.exec_() if dlg.selectedoptions is not None: selected = dlg.selectedoptions if len(selected) == 1: self.setValue(layers[selected[0]]) else: if isinstance(self.param, ParameterMultipleInput): self.text.setText(';'.join(layers[idx].name() for idx in selected)) else: rowdif = len(selected) - (self._table().rowCount() - self.row) for i in range(rowdif): self._panel().addRow() for i, layeridx in enumerate(selected): self._table().cellWidget( i + self.row, self.col).setValue(layers[layeridx])
def showLayerSelectionDialog(self): layers = [] if (isinstance(self.param, QgsProcessingParameterRasterLayer) or (isinstance(self.param, QgsProcessingParameterMultipleLayers) and self.param.layerType() == QgsProcessingParameterDefinition.TypeRaster)): layers = QgsProcessingUtils.compatibleRasterLayers(QgsProject.instance()) elif isinstance(self.param, QgsProcessingParameterVectorLayer): layers = QgsProcessingUtils.compatibleVectorLayers(QgsProject.instance()) else: datatypes = [QgsProcessingParameterDefinition.TypeVectorAny] if isinstance(self.param, QgsProcessingParameterFeatureSource): datatypes = self.param.dataTypes() elif isinstance(self.param, QgsProcessingParameterMultipleLayers): datatypes = [self.param.layerType()] if QgsProcessingParameterDefinition.TypeVectorAny not in datatypes: layers = QgsProcessingUtils.compatibleVectorLayers(QgsProject.instance(), datatypes) else: layers = QgsProcessingUtils.compatibleVectorLayers(QgsProject.instance()) dlg = MultipleInputDialog([layer.name() for layer in layers]) dlg.exec_() if dlg.selectedoptions is not None: selected = dlg.selectedoptions if len(selected) == 1: self.setValue(layers[selected[0]].id()) else: if isinstance(self.param, QgsProcessingParameterMultipleLayers): self.text.setText(';'.join(layers[idx].id() for idx in selected)) else: rowdif = len(selected) - (self._table().rowCount() - self.row) for i in range(rowdif): self._panel().addRow() for i, layeridx in enumerate(selected): self._table().cellWidget(i + self.row, self.col).setValue(layers[layeridx].id())
def postInitialize(self, wrappers): for wrapper in wrappers: if wrapper.param.name == self.param.parent: wrapper.widgetValueHasChanged.connect(self.parentLayerChanged) break layers = QgsProcessingUtils.compatibleVectorLayers(QgsProject.instance()) if len(layers) > 0: # as first item in combobox is already selected self.widget.setLayer(layers[0]) # remove exiting spacers to get FieldsMappingPanel fully expanded if self.dialogType in (DIALOG_STANDARD, DIALOG_MODELER): layout = self.widget.parent().layout() spacer = layout.itemAt(layout.count() - 1) if isinstance(spacer, QSpacerItem): layout.removeItem(spacer)
def processAlgorithm(self, parameters, context, feedback): commands = self.getConsoleCommands(parameters) layers = QgsProcessingUtils.compatibleVectorLayers(QgsProject.instance()) supported = QgsVectorFileWriter.supportedFormatExtensions() for i, c in enumerate(commands): for layer in layers: if layer.source() in c: exported = dataobjects.exportVectorLayer(layer, supported) exportedFileName = os.path.splitext(os.path.split(exported)[1])[0] c = c.replace(layer.source(), exported) if os.path.isfile(layer.source()): fileName = os.path.splitext(os.path.split(layer.source())[1])[0] c = re.sub('[\s]{}[\s]'.format(fileName), ' ' + exportedFileName + ' ', c) c = re.sub('[\s]{}'.format(fileName), ' ' + exportedFileName, c) c = re.sub('["\']{}["\']'.format(fileName), "'" + exportedFileName + "'", c) commands[i] = c GdalUtils.runGdal(commands, feedback)
def updateLayerCombo(self): layers = QgsProcessingUtils.compatibleVectorLayers(QgsProject.instance()) for layer in layers: self.layerCombo.addItem(layer.name(), layer)
def updateLayerCombo(self): layers = QgsProcessingUtils.compatibleVectorLayers( QgsProject.instance()) for layer in layers: self.layerCombo.addItem(layer.name(), layer)
def showLayerSelectionDialog(self): layers = [] if isinstance(self.parameterDefinition, QgsProcessingParameterRasterLayer): layers = QgsProcessingUtils.compatibleRasterLayers( QgsProject.instance()) elif isinstance( self.parameterDefinition, QgsProcessingParameterMultipleLayers ) and self.parameterDefinition.layerType() == QgsProcessing.TypeRaster: layers = QgsProcessingUtils.compatibleRasterLayers( QgsProject.instance()) elif isinstance(self.parameterDefinition, QgsProcessingParameterVectorLayer): layers = QgsProcessingUtils.compatibleVectorLayers( QgsProject.instance()) elif isinstance(self.parameterDefinition, QgsProcessingParameterMapLayer): layers = QgsProcessingUtils.compatibleLayers(QgsProject.instance()) elif isinstance(self.parameterDefinition, QgsProcessingParameterMeshLayer): layers = QgsProcessingUtils.compatibleMeshLayers( QgsProject.instance()) elif isinstance( self.parameterDefinition, QgsProcessingParameterMultipleLayers ) and self.parameterDefinition.layerType() == QgsProcessing.TypeMesh: layers = QgsProcessingUtils.compatibleMeshLayers( QgsProject.instance()) else: datatypes = [QgsProcessing.TypeVectorAnyGeometry] if isinstance(self.parameterDefinition, QgsProcessingParameterFeatureSource): datatypes = self.parameterDefinition.dataTypes() elif isinstance(self.parameterDefinition, QgsProcessingParameterMultipleLayers): datatypes = [self.parameterDefinition.layerType()] if QgsProcessing.TypeVectorAnyGeometry not in datatypes: layers = QgsProcessingUtils.compatibleVectorLayers( QgsProject.instance(), datatypes) else: layers = QgsProcessingUtils.compatibleVectorLayers( QgsProject.instance()) dlg = MultipleInputDialog([layer.name() for layer in layers]) dlg.exec_() def generate_layer_id(layer): # prefer layer name if unique if len([ l for l in layers if l.name().lower() == layer.name().lower() ]) == 1: return layer.name() else: # otherwise fall back to layer id return layer.id() if not dlg.selectedoptions: return selected = dlg.selectedoptions context = dataobjects.createContext() first_row = self.panel.batchRowCount( ) if self.panel.batchRowCount() > 1 else 0 for row, selected_idx in enumerate(selected): layer = layers[selected_idx] value = generate_layer_id(layer) self.setRowValue(first_row + row, value, context)