Example #1
0
    def load_vector_layer_from_parameter(self, name, parameters, context,
                                         feedback):
        """
        Creates a dedicated command to load a vector into the workspace.
        :param name: name of the parameter
        :param parameters: Parameters of the algorithm.
        :param context: Processing context
        """
        if Qgis.QGIS_VERSION_INT >= 30900 and hasattr(
                self, 'parameterAsCompatibleSourceLayerPathAndLayerName'):
            # requires qgis 3.10 or later!
            ogr_data_path, layer_name = self.parameterAsCompatibleSourceLayerPathAndLayerName(
                parameters,
                name,
                context,
                QgsVectorFileWriter.supportedFormatExtensions(),
                feedback=feedback)
            if layer_name:
                return self.r_templates.set_variable_vector(
                    name, QDir.fromNativeSeparators(ogr_data_path), layer_name)

            return self.r_templates.set_variable_vector(
                name, QDir.fromNativeSeparators(ogr_data_path))

        ogr_data_path = self.parameterAsCompatibleSourceLayerPath(
            parameters,
            name,
            context,
            QgsVectorFileWriter.supportedFormatExtensions(),
            feedback=feedback)
        ogr_layer = QgsVectorLayer(ogr_data_path, '', 'ogr')
        return self.load_vector_layer_command(name, ogr_layer, feedback)
Example #2
0
def showPluginHelp(packageName: str = None,
                   filename: str = "index",
                   section: str = ""):
    try:
        source = ""
        if packageName is None:
            import inspect
            source = inspect.currentframe().f_back.f_code.co_filename
        else:
            import sys
            source = sys.modules[packageName].__file__
    except:
        return
    path = os.path.dirname(source)
    locale = str(QLocale().name())
    helpfile = os.path.join(path, filename + "-" + locale + ".html")
    if not os.path.exists(helpfile):
        helpfile = os.path.join(
            path, filename + "-" + locale.split("_")[0] + ".html")
    if not os.path.exists(helpfile):
        helpfile = os.path.join(path, filename + "-en.html")
    if not os.path.exists(helpfile):
        helpfile = os.path.join(path, filename + "-en_US.html")
    if not os.path.exists(helpfile):
        helpfile = os.path.join(path, filename + ".html")
    if os.path.exists(helpfile):
        url = "file://" + QDir.fromNativeSeparators(helpfile)
        if section != "":
            url = url + "#" + section
        QDesktopServices.openUrl(QUrl(url, QUrl.TolerantMode))
Example #3
0
    def _set_selected_directory(self, txt_box, title):
        def_path = txt_box.text()
        sel_doc_path = QFileDialog.getExistingDirectory(self, title, def_path)

        if sel_doc_path:
            normalized_path = QDir.fromNativeSeparators(sel_doc_path)
            txt_box.clear()
            txt_box.setText(normalized_path)
Example #4
0
    def load_vector_layer_command(self, name, layer, _):
        """
        Creates a command to load a vector layer into the workspace
        """
        source_parts = QgsProviderRegistry.instance().decodeUri(
            'ogr', layer.source())
        file_path = source_parts.get('path')
        if self.pass_file_names:
            return self.r_templates.set_variable_string(
                name, QDir.fromNativeSeparators(file_path))

        layer_name = source_parts.get('layerName')
        if layer_name:
            return self.r_templates.set_variable_vector(
                name, QDir.fromNativeSeparators(file_path), layer=layer_name)

        # no layer name -- readOGR expects the folder, with the filename as layer
        return self.r_templates.set_variable_vector(
            name, QDir.fromNativeSeparators(file_path))
Example #5
0
    def load_vector_layer_command(self, name, layer, _):
        """
        Creates a command to load a vector layer into the workspace
        """
        source_parts = QgsProviderRegistry.instance().decodeUri(
            'ogr', layer.source())
        file_path = source_parts.get('path')
        if self.pass_file_names:
            return '{}="{}"'.format(name, QDir.fromNativeSeparators(file_path))

        layer_name = source_parts.get('layerName')
        if layer_name:
            # eg geopackage source
            return '{}=readOGR("{}",layer="{}")'.format(
                name, QDir.fromNativeSeparators(file_path), layer_name)

        # no layer name -- readOGR expects the folder, with the filename as layer
        folder, file_name = os.path.split(file_path)
        base_name, _ = os.path.splitext(file_name)
        return '{}=readOGR("{}",layer="{}")'.format(
            name, QDir.fromNativeSeparators(folder), base_name)
Example #6
0
    def _load_source_document_directory_selector(self):
        # Load file dialog for selecting source documents directory
        title = self.tr('Select Source Document Directory')
        def_path = self.txtRootFolder.text()

        # Use the last set source document directory
        if not def_path:
            def_path = last_document_path()

        sel_doc_path = QFileDialog.getExistingDirectory(self, title, def_path)

        if sel_doc_path:
            normalized_path = QDir.fromNativeSeparators(sel_doc_path)
            self.txtRootFolder.clear()
            self.txtRootFolder.setText(normalized_path)
Example #7
0
    def build_raster_layer_import_command(self, variable_name, layer):
        """
        Returns an import command for the specified raster layer, storing it in a variable
        """
        if layer is None:
            return self.r_templates.set_variable_null(variable_name)

        if layer.dataProvider().name() != 'gdal':
            raise QgsProcessingException(
                self.
                tr("Layer {} is not a GDAL layer. Currently only GDAL based raster layers are supported."
                   ).format(variable_name))

        path = QgsProviderRegistry.instance().decodeUri(
            layer.dataProvider().name(), layer.source())['path']
        value = QDir.fromNativeSeparators(path)
        if self.pass_file_names:
            return self.r_templates.set_variable_string(variable_name, value)

        return self.r_templates.set_variable_raster(variable_name, value)
Example #8
0
    def build_import_commands(
            self,  # pylint: disable=too-many-locals,too-many-branches,too-many-statements
            parameters,
            context,
            feedback):
        """
        Builds the set of input commands for the algorithm
        """
        commands = list()

        for param in self.parameterDefinitions():
            if param.isDestination():
                continue

            if param.name(
            ) not in parameters or parameters[param.name()] is None:
                commands.append(
                    self.r_templates.set_variable_null(param.name()))
                continue

            if isinstance(param, QgsProcessingParameterRasterLayer):
                rl = self.parameterAsRasterLayer(parameters, param.name(),
                                                 context)
                commands.append(
                    self.build_raster_layer_import_command(param.name(), rl))
            elif isinstance(param, QgsProcessingParameterVectorLayer):
                commands.append(
                    self.load_vector_layer_from_parameter(
                        param.name(), parameters, context, feedback))
            elif isinstance(param, QgsProcessingParameterFeatureSource):
                commands.append(
                    self.load_vector_layer_from_parameter(
                        param.name(), parameters, context, feedback))
            elif isinstance(param, QgsProcessingParameterExtent):
                extent = self.parameterAsExtent(parameters, param.name(),
                                                context)
                # Extent from raster package is "xmin, xmax, ymin, ymax" like in Processing
                # http://www.inside-r.org/packages/cran/raster/docs/Extent
                commands.append(
                    self.r_templates.set_variable_extent(
                        param.name(), extent.xMinimum(), extent.xMaximum(),
                        extent.yMinimum(), extent.yMaximum()))
            elif isinstance(param, QgsProcessingParameterCrs):
                crs = self.parameterAsCrs(parameters, param.name(), context)
                if crs.isValid():
                    commands.append(
                        self.r_templates.set_variable_string(
                            param.name(), crs.authid()))
                else:
                    commands.append(
                        self.r_templates.set_variable_null(param.name()))
            elif isinstance(param, QgsProcessingParameterFile):
                value = self.parameterAsString(parameters, param.name(),
                                               context)
                commands.append(
                    self.r_templates.set_variable_string(
                        param.name(), QDir.fromNativeSeparators(value)))
            elif isinstance(param, QgsProcessingParameterString):
                value = self.parameterAsString(parameters, param.name(),
                                               context)
                commands.append(
                    self.r_templates.set_variable_string(param.name(), value))
            elif isinstance(param, QgsProcessingParameterField):
                if param.allowMultiple():
                    value = self.parameterAsFields(parameters, param.name(),
                                                   context)
                    commands.append(
                        self.r_templates.set_variable_string_list(
                            param.name(), value))
                else:
                    value = self.parameterAsString(parameters, param.name(),
                                                   context)
                    commands.append(
                        self.r_templates.set_variable_string(
                            param.name(), value))
            elif isinstance(param, QgsProcessingParameterNumber):
                value = self.parameterAsDouble(parameters, param.name(),
                                               context)
                commands.append(
                    self.r_templates.set_variable_directly(
                        param.name(), value))
            elif isinstance(param, QgsProcessingParameterEnum):
                value = self.parameterAsEnum(parameters, param.name(), context)
                if self.r_templates.is_literal_enum(param.name()):
                    enum_values = self.parameterDefinition(
                        param.name()).options()
                    commands.append(
                        self.r_templates.set_variable_enum_value(
                            param.name(), value, enum_values))
                else:
                    commands.append(
                        self.r_templates.set_variable_directly(
                            param.name(), value))
            elif isinstance(param, QgsProcessingParameterBoolean):
                value = self.parameterAsBool(parameters, param.name(), context)
                value = 'TRUE' if value else 'FALSE'
                commands.append(
                    self.r_templates.set_variable_directly(
                        param.name(), value))
            elif isinstance(param, QgsProcessingParameterMultipleLayers):
                layer_idx = 0
                layers = self.parameterAsLayerList(parameters, param.name(),
                                                   context)
                if param.layerType() == QgsProcessing.TypeRaster:
                    for layer in layers:
                        variable_name = 'tempvar{}'.format(layer_idx)
                        commands.append(
                            self.build_raster_layer_import_command(
                                variable_name, layer))
                        layer_idx += 1
                else:
                    for layer in layers:
                        variable_name = 'tempvar{}'.format(layer_idx)
                        commands.append(
                            self.build_vector_layer_import_command(
                                variable_name, layer, context, feedback))
                        layer_idx += 1

                s = ''
                s += param.name()
                s += ' = c('
                layer_idx = 0
                for _ in layers:
                    if layer_idx != 0:
                        s += ','
                    s += 'tempvar{}'.format(layer_idx)
                    layer_idx += 1
                s += ')'
                commands.append(s)

        # folder, file/html output paths
        for param in self.destinationParameterDefinitions():
            if isinstance(param, QgsProcessingParameterFolderDestination):
                folder = self.parameterAsString(parameters, param.name(),
                                                context)
                Path(folder).mkdir(parents=True, exist_ok=True)
                commands.append(
                    self.r_templates.set_variable_string(
                        param.name(), QDir.fromNativeSeparators(folder)))
                self.save_output_values = True
            elif isinstance(param, QgsProcessingParameterFileDestination):
                filename = self.parameterAsFileOutput(parameters, param.name(),
                                                      context)
                Path(filename).parent.mkdir(parents=True, exist_ok=True)
                commands.append(
                    self.r_templates.set_variable_string(
                        param.name(), QDir.fromNativeSeparators(filename)))
                self.save_output_values = True

        if self.show_plots:
            html_filename = self.parameterAsFileOutput(parameters,
                                                       RAlgorithm.RPLOTS,
                                                       context)
            path, _ = os.path.splitext(html_filename)
            self.plots_filename = path + '.png'
            self.plots_filename = self.plots_filename.replace('\\', '/')
            commands.append(self.r_templates.create_png(self.plots_filename))

        return commands
    def __init__(
        self,
        xml_uri=None,
        is_remote: bool = False,
        attributes={},
        geometry_mapping=None,
        output_filename=None,
        parent=None,
    ):
        """Constructor."""
        super(CreationDialog, self).__init__(parent)
        # Set up the user interface from Designer.
        # After setupUI you can access any designer object by doing
        # self.<objectname>, and you can use autoconnect slots - see
        # http://qt-project.org/doc/qt-4.8/designer-using-a-ui-file.html
        # #widgets-and-dialogs-with-auto-connect
        self.setupUi(self)

        # populate widgets if passed at the construction
        self.replaceLayerChck.setEnabled(xml_uri is not None)
        if xml_uri is not None:
            if is_remote:
                self.urlText.setText(xml_uri)
                self.urlRadio.setChecked(True)
            else:
                self.filenameText.setText(QDir.fromNativeSeparators(xml_uri))
                self.filenameRadio.setChecked(True)
            self.replaceLayerChck.setCheckState(Qt.Checked)

            for aname, v in attributes.items():
                xpath, type = v
                self.onAddMapping()  # add a row
                last = self.attributeTable.rowCount() - 1
                self.attributeTable.item(last, 0).setText(aname)
                self.attributeTable.cellWidget(last, 1).setCurrentIndex([
                    QVariant.String,
                    QVariant.Int,
                    QVariant.Double,
                    QVariant.DateTime,
                ].index(type))
                self.attributeTable.item(last, 2).setText(xpath)

            self.geometryColumnCheck.setChecked(True)
            self.geometryColumnEdit.setText(geometry_mapping)

            self.outFilenameText.setText(
                QDir.fromNativeSeparators(output_filename))

        else:
            # new dialog
            is_remote = (QSettings("complex_features").value(
                "is_remote", "false") == "true")
            source_url = QSettings("complex_features").value("source_url", "")
            if is_remote:
                self.urlRadio.setChecked(True)
                self.urlText.setText(source_url)
            else:
                self.filenameRadio.setChecked(True)
                self.filenameText.setText(
                    QDir.fromNativeSeparators(source_url))

            # output file name
            import tempfile

            f = tempfile.NamedTemporaryFile()
            self.outFilenameText.setText(QDir.fromNativeSeparators(f.name))
            f.close()

            import_type = int(
                QSettings("complex_features").value("import_type", "0"))
            self.mImportTypeCombo.setCurrentIndex(import_type)
            self.mStackedWidgets.setCurrentIndex(import_type)

        self.browseButton.clicked.connect(self.onBrowse)
        self.addMappingBtn.clicked.connect(self.onAddMapping)
        self.removeMappingBtn.clicked.connect(self.onRemoveMapping)
        self.attributeTable.selectionModel().selectionChanged.connect(
            self.onSelectMapping)
        self.browseOutButton.clicked.connect(self.onBrowseOut)