コード例 #1
0
def add_layer(layer: QgsMapLayer,
              name: str = None,
              index: int = -1,
              color: typing.Tuple[int, int, int] = None,
              size: float = None,
              file: str = None,
              parent: QgsLayerTreeNode = None,
              show_feature_count: bool = True) -> None:
    if name:
        layer.setName(name)

    if isinstance(layer, QgsVectorLayer):
        if color or size or file:
            update_symbology(layer, color=color, size=size, file=file)
    elif isinstance(layer, QgsRasterLayer):
        # TODO update symbology
        pass

    instance = QgsProject.instance()
    instance.addMapLayer(layer, False)

    layerTreeNode = QgsLayerTreeLayer(layer)
    layerTreeNode.setCustomProperty('showFeatureCount', show_feature_count)

    parent = parent if parent else instance.layerTreeRoot()
    parent.insertChildNode(index, layerTreeNode)
コード例 #2
0
ファイル: main.py プロジェクト: dszrek/WellMatch
 def layers_create(self, missing=None):
     """Utworzenie warstw w projekcie. Podanie atrybutu 'missing' spowoduje, że tylko wybrane warstwy będą dodane."""
     # Ustalenie ilości dodawanych warstw:
     i_max = len(missing) if missing else self.lyr_cnt
     # Utworzenie listy ze słownikami warstw do dodania:
     lyrs = []
     if missing:
         for l_dict in self.lyrs:
             if l_dict["name"] in missing:
                 lyrs.append(l_dict)
     else:
         lyrs = self.lyrs
     i = 0
     # Dodanie warstw:
     for l_dict in lyrs:
         i += 1
         raw_uri = l_dict["uri"]
         uri = eval("f'{}'".format(raw_uri))
         if l_dict["source"] == "wms" or l_dict["source"] == "gdal":
             lyr = QgsRasterLayer(uri, l_dict["name"], l_dict["source"])
             lyr_required = False
         else:
             lyr = QgsVectorLayer(uri, l_dict["name"], l_dict["source"])
             lyr_required = True
         if not lyr.isValid() and not lyr_required:
             m_text = f'Nie udało się poprawnie wczytać podkładu mapowego: {l_dict["name"]}. Naciśnięcie Tak spowoduje kontynuowanie uruchamiania wtyczki (podkład mapowy nie będzie wyświetlany), naciśnięcie Nie przerwie proces uruchamiania wtyczki. Jeśli problem będzie się powtarzał, zaleca się powiadomienie administratora systemu.'
             reply = QMessageBox.question(dlg.app, "WellMatch", m_text,
                                          QMessageBox.Yes, QMessageBox.No)
             if reply == QMessageBox.No:
                 return False
         elif not lyr.isValid() and lyr_required:
             m_text = f'Nie udało się poprawnie wczytać warstwy: {l_dict["name"]}. Jeśli problem będzie się powtarzał, proszę o powiadomienie administratora systemu ([email protected]).'
             QMessageBox.critical(dlg.app, "WellMatch", m_text)
             return False
         if l_dict["source"] == "memory":
             lyr.setCustomProperty("skipMemoryLayersCheck", 1)
             pr = lyr.dataProvider()
             pr.addAttributes(l_dict["attrib"])
             lyr.updateFields()
         if "crs" in l_dict:
             lyr.setCrs(CRS_1992)
         dlg.proj.addMapLayer(lyr, False)
         if l_dict["root"]:
             parent_grp = self.root
             parent_grp.insertChildNode(l_dict["pos"],
                                        QgsLayerTreeLayer(lyr))
             parent_grp.findLayer(lyr).setItemVisibilityChecked(
                 l_dict["visible"])
         else:
             if "pos" in l_dict:
                 parent_grp = self.root.findGroup(l_dict["parent"])
                 parent_grp.insertChildNode(l_dict["pos"],
                                            QgsLayerTreeLayer(lyr))
                 parent_grp.findLayer(lyr).setItemVisibilityChecked(False)
             else:
                 parent_grp = self.root.findGroup(l_dict["parent"])
                 node = parent_grp.addLayer(lyr)
                 node.setItemVisibilityChecked(l_dict["visible"])
         lyr.loadNamedStyle(f'{STYLE_PATH}{l_dict["style"]}')
     return True
コード例 #3
0
ファイル: qgisred_utils.py プロジェクト: QAndrea/QGISRed
 def openLayer(self,
               group,
               name,
               ext=".shp",
               results=False,
               toEnd=False,
               sectors=False,
               issues=False):
     showName = name
     name = name.replace(' ', '')
     layerName = self.NetworkName + "_" + name
     if os.path.exists(os.path.join(self.ProjectDirectory,
                                    layerName + ext)):
         vlayer = QgsVectorLayer(
             os.path.join(self.ProjectDirectory, layerName + ext), showName,
             "ogr")
         if not ext == ".dbf":
             if results:
                 self.setResultStyle(vlayer)
             elif sectors:
                 self.setSectorsStyle(vlayer)
             elif issues:
                 pass
             else:
                 self.setStyle(vlayer, name.lower())
         QgsProject.instance().addMapLayer(vlayer, group is None)
         if group is not None:
             if toEnd:
                 group.addChildNode(QgsLayerTreeLayer(vlayer))
             else:
                 group.insertChildNode(0, QgsLayerTreeLayer(vlayer))
         del vlayer
         if results:
             self.orderResultLayers(group)
コード例 #4
0
def writeDBF(pos, pp, pr, save_file, inpname, param, idx):
    pos.startEditing()
    for i in range(len(pp)):
        feat = QgsFeature()
        feat.setAttributes(pp[i])
        pr.addFeatures([feat])
    epsgCode = pos.crs().authid()
    QgsVectorFileWriter.writeAsVectorFormat(pos, save_file + param + '.dbf', "utf-8",
                                            QgsCoordinateReferenceSystem(epsgCode), "DBF file")
    ll = QgsVectorLayer(save_file + param + '.dbf', inpname[:len(inpname) - 4] + param, "ogr")
    QgsProject.instance().addMapLayer(ll, False)
    nn = QgsLayerTreeLayer(ll)
    idx.insertChildNode(0, nn)
    nn.setCustomProperty("showFeatureCount", True)
コード例 #5
0
def addGeojsonsToMap(iface, fileList, Groupname="", size=1, color=None, geometrytype="LineString" ):
    """Add a series of geojson's to a map

    Args:
        iface (QgisInterface): the interface with the mainWindow
        fileList (list): list of path's to geojson files
        Groupname (str, optional): the name of the group of layers, Defaults to "".
        size (int, optional): the line width in mm. Defaults to 1 mm.
        color (QColor, optional):  the color of the output layers. Defaults to None in that case a random color is chosen.
        geometrytype (string, optional): the geometrytype of the outputlayers. Defaults to "LineString".
        
    Returns:
        (list): A list of added layers 
    """
    if len(fileList) > 1:
        root = QgsProject.instance().layerTreeRoot()
        shapeGroup = root.addGroup(Groupname) 
    
    lyrList = []
    for gjsFile in fileList:
        lyrName = os.path.basename( os.path.splitext(gjsFile)[0] )
        lyr = QgsVectorLayer('{0}|layername={1}|geometrytype=LineString'.format(gjsFile, lyrName), lyrName, "ogr")
        if len(fileList) == 1: 
            QgsProject.instance().addMapLayer(lyr)

        sym = lyr.renderer().symbols(QgsRenderContext())[0]
        if color: sym.setColor( color )
        if size: sym.setWidth( size )

        if len(fileList) > 1: 
            QgsProject.instance().addMapLayer(lyr, False)
            shapeGroup.insertChildNode(1, QgsLayerTreeLayer(lyr))
        lyr.triggerRepaint()
        lyrList.append(lyr)
    return lyrList
コード例 #6
0
    def test_icon_horizontal_flipped(self):
        r = QgsGradientColorRamp(QColor(200, 0, 0, 100),
                                 QColor(0, 200, 0, 200))

        # need a layer in order to make legend nodes
        layer = QgsVectorLayer('dummy', 'test', 'memory')
        layer_tree_layer = QgsLayerTreeLayer(layer)

        settings = QgsColorRampLegendNodeSettings()
        settings.setDirection(QgsColorRampLegendNodeSettings.MaximumToMinimum)
        settings.setOrientation(Qt.Horizontal)

        node = TestColorRampLegend(layer_tree_layer, r, settings, 5, 10)

        pixmap = node.data(Qt.DecorationRole)

        im = QImage(pixmap.size(), QImage.Format_ARGB32)
        im.fill(QColor(255, 255, 255))
        p = QPainter(im)
        p.drawPixmap(0, 0, pixmap)
        p.end()

        self.assertTrue(
            self.imageCheck('color_ramp_legend_node_flipped_horizontal_icon',
                            'color_ramp_legend_node_flipped_horizontal_icon',
                            im, 10))
コード例 #7
0
    def test_icon_prefix_suffix(self):
        r = QgsGradientColorRamp(QColor(200, 0, 0, 100),
                                 QColor(0, 200, 0, 200))

        # need a layer in order to make legend nodes
        layer = QgsVectorLayer('dummy', 'test', 'memory')
        layer_tree_layer = QgsLayerTreeLayer(layer)

        settings = QgsColorRampLegendNodeSettings()
        settings.setPrefix('pref ')
        settings.setSuffix(' suff')

        node = TestColorRampLegend(layer_tree_layer, r, settings, 5, 10)

        pixmap = node.data(Qt.DecorationRole)

        im = QImage(pixmap.size(), QImage.Format_ARGB32)
        im.fill(QColor(255, 255, 255))
        p = QPainter(im)
        p.drawPixmap(0, 0, pixmap)
        p.end()

        self.assertTrue(
            self.imageCheck('color_ramp_legend_node_prefix_suffix_icon',
                            'color_ramp_legend_node_prefix_suffix_icon', im,
                            10))
コード例 #8
0
    def testLegend(self):
        renderer = QgsPointCloudAttributeByRampRenderer()
        renderer.setAttribute('Intensity')
        renderer.setMinimum(200)
        renderer.setMaximum(800)
        ramp = QgsStyle.defaultStyle().colorRamp("Viridis")
        shader = QgsColorRampShader(200, 800, ramp.clone())
        shader.setClassificationMode(QgsColorRampShader.EqualInterval)
        shader.classifyColorRamp(classes=4)
        renderer.setColorRampShader(shader)

        layer = QgsPointCloudLayer(
            unitTestDataPath() + '/point_clouds/ept/sunshine-coast/ept.json',
            'test', 'ept')
        layer_tree_layer = QgsLayerTreeLayer(layer)
        nodes = renderer.createLegendNodes(layer_tree_layer)
        self.assertEqual(len(nodes), 4)
        self.assertEqual(nodes[0].data(Qt.DisplayRole), '200')
        self.assertEqual(nodes[1].data(Qt.DisplayRole), '400')
        self.assertEqual(nodes[2].data(Qt.DisplayRole), '600')
        self.assertEqual(nodes[3].data(Qt.DisplayRole), '800')

        shader = QgsColorRampShader(200, 600, ramp.clone())
        shader.setClassificationMode(QgsColorRampShader.EqualInterval)
        shader.classifyColorRamp(classes=2)
        renderer.setColorRampShader(shader)
        nodes = renderer.createLegendNodes(layer_tree_layer)
        self.assertEqual(len(nodes), 2)
        self.assertEqual(nodes[0].data(Qt.DisplayRole), '200')
        self.assertEqual(nodes[1].data(Qt.DisplayRole), '600')
コード例 #9
0
    def test_icon_with_settings(self):
        r = QgsGradientColorRamp(QColor(200, 0, 0, 100), QColor(0, 200, 0, 200))

        # need a layer in order to make legend nodes
        layer = QgsVectorLayer('dummy', 'test', 'memory')
        layer_tree_layer = QgsLayerTreeLayer(layer)

        settings = QgsColorRampLegendNodeSettings()
        format = QgsBasicNumericFormat()
        format.setShowTrailingZeros(True)
        format.setNumberDecimalPlaces(3)
        settings.setNumericFormat(format)
        settings.setDirection(QgsColorRampLegendNodeSettings.MaximumToMinimum)

        node = TestColorRampLegend(layer_tree_layer, r, settings, 5, 10)

        pixmap = node.data(Qt.DecorationRole)

        im = QImage(pixmap.size(), QImage.Format_ARGB32)
        im.fill(QColor(255, 255, 255))
        p = QPainter(im)
        p.drawPixmap(0, 0, pixmap)
        p.end()

        self.assertTrue(self.imageCheck('color_ramp_legend_node_settings_icon', 'color_ramp_legend_node_settings_icon', im, 10))
コード例 #10
0
def create_rt_avg_mon_shp(self):
    input1 = QgsProject.instance().mapLayersByName("mf_grid (MODFLOW)")[0]
    QSWATMOD_path_dict = self.dirs_and_paths()

    # Copy mf_grid shapefile to swatmf_results tree
    name = "rt_nitrate_avg_mon"
    name_ext = "rt_nitrate_avg_mon.shp"
    output_dir = QSWATMOD_path_dict['SMshps']
    # Check if there is an exsting mf_head shapefile
    if not any(lyr.name() == (name)
               for lyr in list(QgsProject.instance().mapLayers().values())):
        rt_no3_shp = os.path.join(output_dir, name_ext)
        QgsVectorFileWriter.writeAsVectorFormat(input1, rt_no3_shp, "utf-8",
                                                input1.crs(), "ESRI Shapefile")
        layer = QgsVectorLayer(rt_no3_shp, '{0}'.format(name), 'ogr')
        # Put in the group
        root = QgsProject.instance().layerTreeRoot()
        swatmf_results = root.findGroup("swatmf_results")
        QgsProject.instance().addMapLayer(layer, False)
        swatmf_results.insertChildNode(0, QgsLayerTreeLayer(layer))
        msgBox = QMessageBox()
        msgBox.setWindowIcon(QtGui.QIcon(':/QSWATMOD2/pics/sm_icon.png'))
        msgBox.setWindowTitle("Created!")
        msgBox.setText(
            "'rt_nitrate_avg_mon.shp' file has been created in 'swatmf_results' group!"
        )
        msgBox.exec_()
        msgBox = QMessageBox()
コード例 #11
0
    def test_group_layer_updates_from_node(self):
        """
        Test that group layer child layers are synced correctly from the group node
        """
        group_node = QgsLayerTreeGroup('my group')
        options = QgsGroupLayer.LayerOptions(QgsCoordinateTransformContext())
        group_layer = group_node.convertToGroupLayer(options)
        self.assertFalse(group_layer.childLayers())

        layer = QgsVectorLayer("Point?field=fldtxt:string", "layer1", "memory")
        group_node.addLayer(layer)
        self.assertEqual(group_layer.childLayers(), [layer])

        layer2 = QgsVectorLayer("Point?field=fldtxt:string", "layer2",
                                "memory")
        group_node.insertLayer(0, layer2)
        self.assertEqual(group_layer.childLayers(), [layer, layer2])

        layer3 = QgsVectorLayer("Point?field=fldtxt:string", "layer3",
                                "memory")
        layer4 = QgsVectorLayer("Point?field=fldtxt:string", "layer4",
                                "memory")
        layer3_node = QgsLayerTreeLayer(layer3)
        layer4_node = QgsLayerTreeLayer(layer4)
        group_node.insertChildNodes(1, [layer3_node, layer4_node])
        self.assertEqual(group_layer.childLayers(),
                         [layer, layer4, layer3, layer2])

        layer5 = QgsVectorLayer("Point?field=fldtxt:string", "layer5",
                                "memory")
        layer5_node = QgsLayerTreeLayer(layer5)
        group_node.addChildNode(layer5_node)
        self.assertEqual(group_layer.childLayers(),
                         [layer5, layer, layer4, layer3, layer2])

        group_node.removeChildNode(layer3_node)
        self.assertEqual(group_layer.childLayers(),
                         [layer5, layer, layer4, layer2])

        group_node.removeLayer(layer)
        self.assertEqual(group_layer.childLayers(), [layer5, layer4, layer2])

        group_node.removeChildren(0, 2)
        self.assertEqual(group_layer.childLayers(), [layer5])

        group_node.removeAllChildren()
        self.assertEqual(group_layer.childLayers(), [])
コード例 #12
0
def sub_shapefile(self):
    APEXMOD_path_dict = self.dirs_and_paths() 
    settings = QSettings()
    if settings.contains('/APEXMOD/LastInputPath'):
        path = str(settings.value('/APEXMOD/LastInputPath'))
    else:
        path = ''
    title = "Choose SUB Shapefile!"
    inFileName, __ = QFileDialog.getOpenFileNames(
        None, title, path,
        "Shapefiles (*.shp);;All files (*.*)"
        )
    if inFileName:
        settings.setValue('/APEXMOD/LastInputPath', os.path.dirname(str(inFileName)))           
        output_dir = APEXMOD_path_dict['org_shps']
        inInfo = QFileInfo(inFileName[0])
        inFile = inInfo.fileName()
        pattern = os.path.splitext(inFileName[0])[0] + '.*'
        
        inName = 'sub_org'
        for f in glob.iglob(pattern):
            suffix = os.path.splitext(f)[1]
            if os.name == 'nt':
                outfile = ntpath.join(output_dir, inName + suffix)
            else:
                outfile = posixpath.join(output_dir, inName + suffix)                    
            shutil.copy(f, outfile)
        if os.name == 'nt':
            sub_obj = ntpath.join(output_dir, inName + ".shp")
        else:
            sub_obj = posixpath.join(output_dir, inName + ".shp")
        # time stamp
        time = datetime.now().strftime('[%m/%d/%y %H:%M:%S]')
        self.dlg.textEdit_sm_link_log.append(time+' -> ' + "Checking SUB geometries ... processing")
        self.dlg.label_StepStatus.setText("Checking 'SUB' ... ")
        QCoreApplication.processEvents()
        # fixgeometries
        sub_shp_file = 'sub_apex.shp'
        sub_shp_f = os.path.join(output_dir, sub_shp_file)
        params = {
            'INPUT': sub_obj,
            'OUTPUT': sub_shp_f
        }
        processing.run('native:fixgeometries', params)
        layer = QgsVectorLayer(sub_shp_f, '{0} ({1})'.format("sub","APEX"), 'ogr')

        # Put in the group          
        root = QgsProject.instance().layerTreeRoot()
        swat_group = root.findGroup("APEX") 
        QgsProject.instance().addMapLayer(layer, False)
        swat_group.insertChildNode(0, QgsLayerTreeLayer(layer))
        self.dlg.lineEdit_subbasin_shapefile.setText(sub_shp_f)

        time = datetime.now().strftime('[%m/%d/%y %H:%M:%S]')
        self.dlg.textEdit_sm_link_log.append(time+' -> ' + "Checking SUB geometries ... passed")
        self.dlg.label_StepStatus.setText("Step Status: ")
        QCoreApplication.processEvents()   
コード例 #13
0
ファイル: zones.py プロジェクト: Kozzba/dp-test-repositary
    def _lang(self):
        '''
        Lang Simplification Algorithm
        '''

        '''
        Densify By Count >>> Delete holes >>> Smooth (QGIS) || Generalize (Grass)
        '''
        densify_by_count = processing.run('qgis:densifygeometries',
                                        {'INPUT': self.gpkg_path + '|layername=zones',
                                         'VERTICES': 3,
                                         'OUTPUT': 'ogr:dbname=\'' + self.gpkg_path + '\' table=\"densifyByCount\" ('
                                                                                      'geom)'})

        delete_holes = processing.run('qgis:deleteholes',
                                     {'INPUT': densify_by_count['OUTPUT'],
                                      'MIN_AREA': 30,
                                      'OUTPUT': 'ogr:dbname=\'' + self.gpkg_path + '\' table=\"deleteHoles\" (geom)'})

        # qgis

        # smooth = processing.run('qgis:smoothgeometry',
        #         { 'INPUT': deleteHoles['OUTPUT'],
        #           'ITERATIONS': 10,
        #           'OFFSET': 0.25,
        #           'MAX_ANGLE': 180,
        #           'OUTPUT': 'ogr:dbname=\''+ self.gpkg_path +'\' table=\"smooth\" (geom)'})

        # # extract vertices (polygon to nodes)
        # processing.run('qgis: extractvertices',
        #                { 'INPUT': self.gpkg_path + '|layername=zones',
        #                  'OUTPUT' : 'TEMPORARY_OUTPUT' })

        # grass
        grass_generalize = processing.run('grass7:v.generalize',
                                          {'input': delete_holes['OUTPUT'],
                                           'method': 2,
                                           'threshold': 1,
                                           'output': 'TEMPORARY_OUTPUT',
                                           'error': 'TEMPORARY_OUTPUT'})

        grass_generalize_converted = processing.run('gdal:convertformat', {
            'INPUT': grass_generalize['output'],
            'OPTIONS': '',
            'OUTPUT': 'grass_generalize_converted.shp'})

        grass_generalize_converted_toGpkg = QgsVectorLayer(grass_generalize_converted['OUTPUT'],
                                                           'grass_generalize_lang', "ogr")
        # self._saveIntoGpkg(grass_generalize_converted_toGpkg,'grass_generalize_lang')
        # grass_generalize_convertedd = QgsVectorLayer(grass_generalize_converted['OUTPUT'], 'grass_generalize_lang', "ogr")
        # grass_generalize_converted_toMap = QgsVectorLayer(self.gpkg_path + '|layername=grass_generalize_lang', 'grass_generalize_lang', "ogr")

        generalize_layer = QgsProject.instance().addMapLayer(grass_generalize_converted_toGpkg, False)

        root = QgsProject.instance().layerTreeRoot()
        group_gtfs = root.findGroup('zones')
        group_gtfs.insertChildNode(0, QgsLayerTreeLayer(generalize_layer))
コード例 #14
0
ファイル: qgisred_utils.py プロジェクト: QAndrea/QGISRed
 def orderResultLayers(self, group):
     layers = [tree_layer.layer()
               for tree_layer in group.findLayers()]  # Only in group
     for layer in layers:
         if not layer.geometryType() == 0:  # Point
             clonedLayer = layer.clone()
             QgsProject.instance().addMapLayer(clonedLayer, group is None)
             if group is not None:
                 group.addChildNode(QgsLayerTreeLayer(clonedLayer))
                 QgsProject.instance().removeMapLayer(layer.id())
コード例 #15
0
ファイル: config_sets.py プロジェクト: spark-brc/APEXMOD
def gw_delay(self):
    APEXMOD_path_dict = self.dirs_and_paths()

    # Create apexmf_results tree inside
    root = QgsProject.instance().layerTreeRoot()
    input1 = QgsProject.instance().mapLayersByName("hru (SWAT)")[0]

    # Copy sub shapefile to be under "p from mf"
    name = "gw_delay"
    name_ext = "gw_delay.shp"
    output_dir = APEXMOD_path_dict['apexmf_shps']

    # Check if there is an exsting mf_head shapefile
    # if not any(lyr.name() == ("conv_runoff") for lyr in QgsProject.instance().mapLayers().values()):
    gw_delay_shapefile = os.path.join(output_dir, name_ext)
    QgsVectorFileWriter.writeAsVectorFormat(input1,
                                            gw_delay_shapefile, "utf-8",
                                            input1.crs(), "ESRI Shapefile")
    layer = QgsVectorLayer(gw_delay_shapefile, '{0}'.format("gw_delay"), 'ogr')

    # Put in the group
    # root = QgsProject.instance().layerTreeRoot()
    # conv_runoff = root.findGroup("Pumping from MODFLOW")
    QgsProject.instance().addMapLayer(layer, False)

    sm = root.findGroup("APEX-MODFLOW")
    sm.insertChildNode(0, QgsLayerTreeLayer(layer))

    input2 = QgsProject.instance().mapLayersByName("gw_delay")[0]
    fields = input2.dataProvider()
    fdname = [
        fields.indexFromName(field.name()) for field in fields.fields()
        if not field.name() == 'HRU_ID'
    ]
    fields.deleteAttributes(fdname)
    input2.updateFields()
    gwd = QgsField('gw_delay', QVariant.Int)
    fields.addAttributes([gwd])
    input2.updateFields()
    gwd_idx = fields.fields().indexFromName('gw_delay')

    feats = input2.getFeatures()
    input2.startEditing()

    delay_multi = self.dlg.spinBox_gw_delay_multi.value()
    for feat in feats:
        # attr = feat.attributes() #  this can be used for changing value based on value from other column
        input2.changeAttributeValue(feat.id(), gwd_idx, delay_multi)

    input2.commitChanges()

    msgBox.setWindowTitle("Created!")
    msgBox.setText("'gw_delay.shp' file has been created!")
    msgBox.exec_()
コード例 #16
0
ファイル: qgisred_utils.py プロジェクト: QAndrea/QGISRed
 def openTreeLayer(self, group, name, treeName, link=False):
     layerPath = os.path.join(
         self.ProjectDirectory,
         self.NetworkName + "_" + name + "_Tree_" + treeName + ".shp")
     if os.path.exists(layerPath):
         vlayer = QgsVectorLayer(layerPath, name, "ogr")
         if link:
             self.setTreeStyle(vlayer)
         QgsProject.instance().addMapLayer(vlayer, group is None)
         if group is not None:
             group.insertChildNode(0, QgsLayerTreeLayer(vlayer))
         del vlayer
コード例 #17
0
ファイル: test_qgslayertree.py プロジェクト: zyhgit/QGIS
    def testCustomLayerOrderChanged(self):
        layer = QgsVectorLayer("Point?field=fldtxt:string", "layer1", "memory")
        layer2 = QgsVectorLayer("Point?field=fldtxt:string", "layer2",
                                "memory")

        layer_tree = QgsLayerTree()
        layer_order_changed_spy = QSignalSpy(
            layer_tree.customLayerOrderChanged)
        layer1_node = QgsLayerTreeLayer(layer)
        layer_tree.addChildNode(layer1_node)
        self.assertEqual(len(layer_order_changed_spy), 1)
        layer2_node = QgsLayerTreeLayer(layer2)
        layer_tree.addChildNode(layer2_node)
        self.assertEqual(len(layer_order_changed_spy), 2)

        # simulate a layer move in the tree
        layer3_node = QgsLayerTreeLayer(layer)
        layer_tree.addChildNode(layer3_node)
        self.assertEqual(len(layer_order_changed_spy), 3)
        layer_tree.removeChildNode(layer1_node)
        self.assertEqual(len(layer_order_changed_spy), 4)
コード例 #18
0
 def open_layer_group(self, name):
     """ add layer group to canvas """
     project = QgsProject.instance()  # get project instance
     # enable custom layer order
     rg = self.iface.layerTreeCanvasBridge().rootGroup()
     if not rg.hasCustomLayerOrder():
         rg.setHasCustomLayerOrder(True)
     # check if thematics group in tree
     root = project.layerTreeRoot()
     themGroup = root.findGroup(self.tr("Thematics"))
     if themGroup is None:
         # create the group at the end of tree
         themGroup = root.insertGroup(-1, self.tr("Thematics"))
     if name in self.layers:
         for l in self.layers[name]:
             valid = False
             typ = ""
             if l.startswith("url="):
                 # wms layer
                 nam = self.wms_name(l)
                 if nam:
                     lobjs = project.mapLayersByName(nam)
                     if not lobjs:  # not in project yet
                         # open wms
                         r = QgsRasterLayer(l, nam, "wms")
                         valid = r.isValid()
                         typ = "wms"
             else:
                 # local vector/raster layer
                 ext = os.path.splitext(os.path.split(l)[1])[1]
                 nam = os.path.splitext(os.path.split(l)[1])[0]
                 lobjs = project.mapLayersByName(nam)
                 if lobjs:  # layer in project yet
                     continue
                 if ext in ('.tif', '.jpg', '.png', '.vrt'):
                     # open raster
                     r = QgsRasterLayer(l, nam)
                     valid = r.isValid()
                     typ = "raster"
                 else:
                     # open vector
                     r = QgsVectorLayer(l, nam, 'ogr')
                     valid = r.isValid()
                     typ = "vector"
             if valid:
                 project.addMapLayer(r, False)
                 themGroup.insertChildNode(-1, QgsLayerTreeLayer(r))
                 if typ == "vector":
                     self.reorder(r)  # change layer position in layer order
             else:
                 QMessageBox.warning(
                     None, self.tr("Layer"),
                     self.tr("Cannot open layer: {}").format(nam))
コード例 #19
0
 def addLayerToGroup(self, layer, groupname, subgroupname=None):
     """
     Adds a layer to a group into layer panel.
     :param layer: (QgsMapLayer) layer to be added to canvas.
     :param groupname: (str) name for group to nest the layer.
     :param subgroupname: (str) name for the subgroup to be added.
     """
     root = QgsProject.instance().layerTreeRoot()
     layer = layer if isinstance(layer, QgsMapLayer) \
         else QgsProcessingUtils.mapLayerFromString(layer)
     QgsProject.instance().addMapLayer(layer, False)
     root.insertChildNode(-1, QgsLayerTreeLayer(layer))
コード例 #20
0
    def test_draw_settings(self):
        r = QgsGradientColorRamp(QColor(200, 0, 0, 100),
                                 QColor(0, 200, 0, 200))

        # need a layer in order to make legend nodes
        layer = QgsVectorLayer('dummy', 'test', 'memory')
        layer_tree_layer = QgsLayerTreeLayer(layer)

        settings = QgsColorRampLegendNodeSettings()
        format = QgsBasicNumericFormat()
        format.setShowTrailingZeros(True)
        format.setNumberDecimalPlaces(3)
        settings.setNumericFormat(format)
        settings.setDirection(QgsColorRampLegendNodeSettings.MaximumToMinimum)

        node = QgsColorRampLegendNode(layer_tree_layer, r, settings, 5, 10)

        ls = QgsLegendSettings()
        item_style = ls.style(QgsLegendStyle.SymbolLabel)
        item_style.setFont(QgsFontUtils.getStandardTestFont('Bold', 18))
        ls.setStyle(QgsLegendStyle.SymbolLabel, item_style)

        item_context = QgsLayerTreeModelLegendNode.ItemContext()

        image = QImage(400, 250, QImage.Format_ARGB32)
        image.fill(QColor(255, 255, 255))

        p = QPainter(image)

        ms = QgsMapSettings()
        ms.setExtent(QgsRectangle(1, 10, 1, 10))
        ms.setOutputSize(image.size())
        context = QgsRenderContext.fromMapSettings(ms)
        context.setPainter(p)
        context.setScaleFactor(150 / 25.4)  # 150 DPI

        p.scale(context.scaleFactor(), context.scaleFactor())

        item_context.context = context
        item_context.painter = p
        item_context.top = 1
        item_context.columnLeft = 3
        item_context.columnRight = 30
        item_context.patchSize = QSizeF(12, 40)

        symbol_size = node.drawSymbol(ls, item_context, 0)
        node.drawSymbolText(ls, item_context, symbol_size)
        p.end()

        self.assertTrue(
            self.imageCheck('color_ramp_legend_node_settings_draw',
                            'color_ramp_legend_node_settings_draw', image))
コード例 #21
0
    def testLegend(self):
        renderer = QgsPointCloudClassifiedRenderer()
        renderer.setAttribute('Classification')
        renderer.setCategories([QgsPointCloudCategory(3, QColor(255, 0, 0), 'cat 3'),
                                QgsPointCloudCategory(7, QColor(0, 255, 0), 'cat 7')])

        layer = QgsPointCloudLayer(unitTestDataPath() + '/point_clouds/ept/sunshine-coast/ept.json', 'test', 'ept')
        layer_tree_layer = QgsLayerTreeLayer(layer)
        nodes = renderer.createLegendNodes(layer_tree_layer)
        self.assertEqual(len(nodes), 2)
        self.assertEqual(nodes[0].data(Qt.DisplayRole), 'cat 3')
        self.assertEqual(nodes[0].data(QgsLayerTreeModelLegendNode.RuleKeyRole), '3')
        self.assertEqual(nodes[1].data(Qt.DisplayRole), 'cat 7')
        self.assertEqual(nodes[1].data(QgsLayerTreeModelLegendNode.RuleKeyRole), '7')
コード例 #22
0
    def add_layer(self, layer):
        # add a layer to the registry, if not already there
        layers = self.project.mapLayers()
        for name, alayer in layers.items():
            if alayer == layer:
                return

        self.project.addMapLayer(layer, False)
        # make sure the mask layer is on top of other layers
        lt = QgsProject.instance().layerTreeRoot()
        # insert a new on top
        self.disable_add_layer_signal = True
        lt.insertChildNode(0, QgsLayerTreeLayer(layer))
        self.disable_add_layer_signal = False
コード例 #23
0
ファイル: QgsFmvLayers.py プロジェクト: mhugent/QGISFMV
def addLayer(layer, loadInLegend=True, group=None, isSubGroup=False):
    """
    Add one or several layers to the QGIS session and layer registry.
    @param layer: The layer object or list with layers  to add the QGIS layer registry and session.
    @param loadInLegend: True if this layer should be added to the legend.
    :return: The added layer
    """
    global groupName
    if not hasattr(layer, "__iter__"):
        layer = [layer]
    if group is not None:
        _layerreg.addMapLayers(layer, False)
        root = _layerreg.layerTreeRoot()
        if isSubGroup:
            vg = root.findGroup(groupName)
            g = vg.findGroup(group)
            g.insertChildNode(0, QgsLayerTreeLayer(layer[0]))
        else:
            g = root.findGroup(group)
            g.insertChildNode(0, QgsLayerTreeLayer(layer[0]))
    else:
        _layerreg.addMapLayers(layer, loadInLegend)
    return layer
コード例 #24
0
def create_sm_riv(self):
    APEXMOD_path_dict = self.dirs_and_paths()
    if not any(lyr.name() == ("apexmf_riv")
               for lyr in list(QgsProject.instance().mapLayers().values())):
        # Create apexmf_results tree inside
        root = QgsProject.instance().layerTreeRoot()
        if root.findGroup("apexmf_results"):
            sm_results_group = root.findGroup("apexmf_results")
        else:
            sm_results_group = root.insertGroup(0, "apexmf_results")

        input1 = QgsProject.instance().mapLayersByName("mf_grid (MODFLOW)")[0]
        input2 = QgsProject.instance().mapLayersByName(
            "river_grid (APEX-MODFLOW)")[0]
        feats_mf_grid = input1.getFeatures()
        feats = input2.getFeatures()
        grid_id = set([f.attribute('grid_id') for f in feats])
        #hm = set(grid_id)

        riv_mat = []
        for f in feats_mf_grid:
            grid_no = f.attribute("grid_id")
            for i in grid_id:
                if grid_no == i:
                    riv_mat.append(f.id())

        input1.selectByIds(riv_mat)
        name_ext = "apexmf_riv.shp"
        output_dir = APEXMOD_path_dict['apexmf_shps']

        # Save just the selected features of the target layer
        sm_riv_shapefile = os.path.join(output_dir, name_ext)
        # Extract selected features
        processing.run("native:saveselectedfeatures", {
            'INPUT': input1,
            'OUTPUT': sm_riv_shapefile
        })

        # Deselect the features
        input1.removeSelection()
        layer = QgsVectorLayer(sm_riv_shapefile, '{0}'.format("apexmf_riv"),
                               'ogr')

        # Put in the group
        root = QgsProject.instance().layerTreeRoot()
        sm_results_group = root.findGroup("apexmf_results")
        QgsProject.instance().addMapLayer(layer, False)
        sm_results_group.insertChildNode(0, QgsLayerTreeLayer(layer))
        layer = QgsProject.instance().addMapLayer(layer)
コード例 #25
0
 def copySelected(self, layer, mem_layer, geom_type):
     ''' Copy from selected layer to memory layer '''
     self.manageMemLayers()
     
     # Create memory layer if not already set
     if mem_layer is None: 
         uri = geom_type+"?crs=epsg:"+self.srid 
         mem_layer = QgsVectorLayer(uri, "selected_"+layer.name(), "memory")                     
      
         # Copy attributes from main layer to memory layer
         attrib_names = layer.dataProvider().fields()
         names_list = attrib_names.toList()
         newattributeList = []
         for attrib in names_list:
             aux = mem_layer.fieldNameIndex(attrib.name())
             if aux == -1:
                 newattributeList.append(QgsField(attrib.name(), attrib.type()))
         mem_layer.dataProvider().addAttributes(newattributeList)
         mem_layer.updateFields()
         
         # Insert layer in the top of the TOC           
         root = QgsProject.instance().layerTreeRoot()           
         QgsMapLayerRegistry.instance().addMapLayer(mem_layer, False)
         node_layer = QgsLayerTreeLayer(mem_layer)
         root.insertChildNode(0, node_layer)                 
  
     # Prepare memory layer for editing
     mem_layer.startEditing()
     
     # Iterate over selected features   
     cfeatures = []
     for sel_feature in layer.selectedFeatures():
         attributes = []
         attributes.extend(sel_feature.attributes())
         cfeature = QgsFeature()    
         cfeature.setGeometry(sel_feature.geometry())
         cfeature.setAttributes(attributes)
         cfeatures.append(cfeature)
                  
     # Add features, commit changes and refresh canvas
     mem_layer.dataProvider().addFeatures(cfeatures)             
     mem_layer.commitChanges()
     self.iface.mapCanvas().refresh() 
     self.iface.mapCanvas().zoomToSelected(layer)
     
     # Make sure layer is always visible 
     self.iface.legendInterface().setLayerVisible(mem_layer, True)
                 
     return mem_layer    
コード例 #26
0
ファイル: QgsFmvLayers.py プロジェクト: ltbam/QGISFMV
def addLayer(layer, loadInLegend=True, group=None):
    """
    Add one or several layers to the QGIS session and layer registry.
    :param layer: The layer object or list with layers  to add the QGIS layer registry and session.
    :param loadInLegend: True if this layer should be added to the legend.
    :return: The added layer
    """
    if not hasattr(layer, "__iter__"):
        layer = [layer]
    _layerreg.addMapLayers(layer, loadInLegend)
    if group is not None:
        root = QgsProject.instance().layerTreeRoot()
        g = root.findGroup(group)
        g.insertChildNode(0, QgsLayerTreeLayer(layer[0]))
    return layer
コード例 #27
0
 def addLayerToGroup(self, layer, groupname):
     """
     Adds a layer to a group.
     :param layer: (QgsMapLayer) layer to be added to canvas.
     :param groupname: (str) name for group to nest the layer.
     """
     root = QgsProject.instance().layerTreeRoot()
     for g in root.children():
         if g.name() == groupname:
             group = g
             break
     else:
         group = root.addGroup(groupname)
     QgsProject.instance().addMapLayer(layer, False)
     group.insertChildNode(1, QgsLayerTreeLayer(layer))
コード例 #28
0
 def add_ee_image_layer(self, date_start, image, name, shown, opacity):
     url = "type=xyz&url=" + self.get_ee_image_url(image)
     layer = QgsRasterLayer(url, name, "wms")
     self.update_ee_layer_properties(date_start, layer, image, opacity)
     QgsProject.instance().addMapLayer(layer)
     root = QgsProject.instance().layerTreeRoot()
     #layer_list = root.checkedLayers()
     #idx = self._last_raster(layer_list)
     group = root.findGroup('S2SRC')
     if not group:
         group = root.insertGroup(0, 'S2SRC')
     #root.insertChildNode(0, QgsLayerTreeLayer(layer))
     group.insertChildNode(0, QgsLayerTreeLayer(layer))
     if not (shown is None):
         root.findLayer(layer.id()).setItemVisibilityChecked(shown)
コード例 #29
0
    def _insert_layer(self, layer, qml_file, duration):

        # Build pyramids
        self.out("Building pyramids ...")
        layer = self._build_pyramids(layer)

        # Style layer with qml file
        if qml_file:
            self._set_qml(layer, qml_file)

        # Set opacity - also for black white (without QML):
        # Sets the opacity for the layer, where opacity is a value
        # between 0 (totally transparent) and 1.0 (fully opaque).
        opa = 0.6  # 0.6 = 40% transparency

        if isinstance(layer, QgsRasterLayer):
            layer.renderer().setOpacity(opa)
        else:
            # layer.setLayerTransparency(40)    # %    this method seems only be available for vector layer
            layer.setOpacity(opa)

        # Set zero values to transparent
        if self._no_zeros:
            self._set_zeroes_invisible(layer)

        # Set temporal settings for layer (since QGIS 3.14)
        if self.temporal and Qgis.QGIS_VERSION_INT >= 31400:
            self.out("Setting temporal settings ...")
            self._set_time_range(layer)

        # Insert layer at a certain position

        # Add the layer to the QGIS Map Layer Registry (the second argument must be set to False
        # to specify a custom position:
        QgsProject.instance().addMapLayer(
            layer, False)  # first add the layer without showing it

        # obtain the layer tree of the top-level group in the project
        layerTree = self._iface.layerTreeCanvasBridge().rootGroup()
        # The position is a number starting from 0, with -1 an alias for the end.
        # Index 0: ganz oben, Index 1: 2. Position unter der Vektor-Layer-Gruppe:
        layerTree.insertChildNode(1, QgsLayerTreeLayer(layer))

        # mark the new layer and zoom to it's extent:
        self._iface.setActiveLayer(layer)
        self._iface.zoomToActiveLayer()

        self._show_message(Qgis.Success, layer.name(), duration)
コード例 #30
0
    def addLayerGroup(self, muniname):
        """ Add all shapefiles in the dowload folder into a group """

        root = QgsProject.instance().layerTreeRoot()
        layerGroup = root.addGroup(muniname)

        zippath = self.dlg.lineEdit_path.text()
        wd = os.path.join(zippath, muniname)

        for shape_item in os.listdir(wd):
            if shape_item.endswith('.shp'):
                vlayer = QgsVectorLayer(os.path.join(
                    wd, shape_item), shape_item, "ogr")
                QgsProject.instance().addMapLayer(vlayer, False)
                layerGroup.insertChildNode(
                    1, QgsLayerTreeLayer(vlayer))
コード例 #31
0
def epa2gis(inpname):
    plugin_path = os.path.dirname(__file__)
    file_extension = os.path.dirname(inpname)
    inpname = os.path.basename(inpname)
    inp = file_extension + '/' + inpname
    if len(file_extension) == 0:
        inp = inpname
    newpath = file_extension + '/_shapefiles_'
    if not os.path.exists(newpath):
        os.makedirs(newpath)

    iface = qgis.utils.iface
    d.LoadFile(inp)
    d.BinUpdateClass()
    nlinkCount = d.getBinLinkCount()

    res = newpath + '\\'
    saveFile = res + inpname[:len(inpname) - 4]

    # Get all Sections
    mixing = d.getMixingSection()
    reactions = d.getReactionsSection()
    sources = d.getSourcesSection()
    rules = d.getRulesSection()
    quality = d.getQualitySection()
    curves = d.getCurvesSection()
    patterns = d.getPatternsSection()
    controls = d.getControlsSection()
    emitters = d.getEmittersSection()
    status = d.getStatusSection()
    demands = d.getDemandsSection()
    energy = d.getEnergySection()
    optReactions = d.getReactionsOptionsSection()
    times = d.getTimesSection()
    report = d.getReportSection()
    options = d.getOptionsSection()

    # Get all Section lengths
    allSections = [len(energy), len(optReactions), len(demands), len(status), len(emitters), len(controls),
                   len(patterns),
                   len(curves[0]), len(quality), len(rules), len(sources), len(reactions), len(mixing), len(times),
                   len(report),
                   len(options), d.getBinNodeCount(), d.getBinLinkCount()]
    ss = max(allSections)
    root = QgsProject.instance().layerTreeRoot()
    idx = root.insertGroup(0, inpname[:len(inpname) - 4])

    xy = d.getBinNodeCoordinates()
    x = xy[0]
    y = xy[1]
    vertx = xy[2]
    verty = xy[3]
    vertxyFinal = []
    for i in range(len(vertx)):
        vertxy = []
        for u in range(len(vertx[i])):
            vertxy.append([float(vertx[i][u]), float(verty[i][u])])
        if vertxy:
            vertxyFinal.append(vertxy)

    otherDemads = d.getBinNodeBaseDemandsDemSection()
    ndID = d.getBinNodeNameID()
    ndBaseD = d.getBinNodeBaseDemands()
    ndPatID = d.getBinNodeDemandPatternID()
    otherDemadsIndex = []
    otherDemadsPatterns = []
    for i, p in enumerate(otherDemads[1]):
        otherDemadsIndex.append(ndID.index(p))
        otherDemadsPatterns.append(otherDemads[2][i])

    counter = collections.Counter(otherDemadsIndex)
    maxCategories = 1
    if counter:
        maxCategories = max(counter.values())

    if not ndBaseD:
        ndBaseD = otherDemads[0]

    # Get data of Junctions
    if d.getBinNodeJunctionCount() > 0:
        ndBaseTmp = np.empty((len(ndBaseD), maxCategories,))
        ndPatTmp = []
        for t in range(0, maxCategories):
            for u in range(0, len(ndBaseD)):
                ndBaseTmp[u][t] = 0
                ndPatTmp.append(['None'] * 2)

        for uu in range(0, len(ndBaseD)):
            if d.getBinNodeBaseDemands():
                ndBaseTmp[uu][0] = ndBaseD[uu]
                ndPatTmp[uu][0] = ndPatID[uu]
        t = 0
        for i, p in enumerate(otherDemadsIndex):
            if d.getBinNodeBaseDemands():
                ndBaseTmp[p][t] = ndBaseD[otherDemadsIndex[i]]
                ndPatTmp[p][t] = ndPatID[otherDemadsIndex[i]]
            else:
                ndBaseTmp[p][t] = otherDemads[0][i]
                ndPatTmp[p][t] = otherDemads[2][i]
            t = t + 1
            if t > max(counter.values()) - 1:
                t = max(counter.values()) - 1
            if i > 0:
                if otherDemadsIndex[i - 1] == p:
                    ndBaseTmp[p][t] = otherDemads[0][i]
                    ndPatTmp[p][t] = otherDemads[2][i]
                    t = t - 1
        # Write Junction Shapefile
        fields = ["ID", "Elevation"]  # , "pattern", "demand"]
        fieldsCode = [0, 1]
        for u in range(0, maxCategories):
            fields.append('Demand' + str(u + 1))
            fields.append('Pattern' + str(u + 1))
            fieldsCode.append(1)
            fieldsCode.append(0)
        posJunction = QgsVectorLayer("point?crs=EPSG:4326", "Junctions", "memory")
        prJunction = posJunction.dataProvider()
        ndBaseTmp = ndBaseTmp.tolist()

        createColumnsAttrb(prJunction, fields, fieldsCode)
        posJunction.startEditing()
        ndEle = d.getBinNodeJunctionElevations()

    # Get data of Pipes
    # Write shapefile pipe
    if nlinkCount > 0:
        posPipe = QgsVectorLayer("LineString?crs=EPSG:4326", "Pipes", "memory")
        prPipe = posPipe.dataProvider()
        fields = ["ID", "NodeFrom", "NodeTo", "Status", "Length", "Diameter", "Roughness", "MinorLoss"]
        fieldsCode = [0, 0, 0, 0, 1, 1, 1, 1]
        createColumnsAttrb(prPipe, fields, fieldsCode)
        posPipe.startEditing()

        pIndex = d.getBinLinkPumpIndex()
        vIndex = d.getBinLinkValveIndex()
        ndlConn = d.getBinNodesConnectingLinksID()
        x1 = []
        x2 = []
        y1 = []
        y2 = []
        stat = d.getBinLinkInitialStatus()

        kk = 0
        ch = 0
        linkID = d.getBinLinkNameID()
        linkLengths = d.getBinLinkLength()
        linkDiameters = d.getBinLinkDiameter()
        linkRough = d.getBinLinkRoughnessCoeff()
        linkMinorloss = d.getBinLinkMinorLossCoeff()

    # Write Tank Shapefile and get tank data
    posTank = QgsVectorLayer("point?crs=EPSG:4326", "Tanks", "memory")
    prTank = posTank.dataProvider()

    fields = ["ID", "Elevation", "InitLevel", "MinLevel", "MaxLevel", "Diameter", "MinVolume", "VolumeCurve"]
    fieldsCode = [0, 1, 1, 1, 1, 1, 1, 0]
    createColumnsAttrb(prTank, fields, fieldsCode)
    posTank.startEditing()

    if d.getBinNodeTankCount() > 0:
        ndTankelevation = d.getBinNodeTankElevations()
        initiallev = d.getBinNodeTankInitialLevel()
        minimumlev = d.getBinNodeTankMinimumWaterLevel()
        maximumlev = d.getBinNodeTankMaximumWaterLevel()
        diameter = d.getBinNodeTankDiameter()
        minimumvol = d.getBinNodeTankMinimumWaterVolume()
        volumecurv = d.getBinNodeTankVolumeCurveID()
        ndTankID = d.getBinNodeTankNameID()

    # Write Reservoir Shapefile
    posReservoirs = QgsVectorLayer("point?crs=EPSG:4326", "Reservoirs", "memory")
    prReservoirs = posReservoirs.dataProvider()
    fields = ["ID", "Head"]
    fieldsCode = [0, 1]
    createColumnsAttrb(prReservoirs, fields, fieldsCode)
    head = d.getBinNodeReservoirElevations()
    posReservoirs.startEditing()

    if times:
        posTimes = QgsVectorLayer("point?crs=EPSG:4326", "Times", "memory")
        prTimes = posTimes.dataProvider()
    if energy:
        posE = QgsVectorLayer("point?crs=EPSG:4326", "Energy", "memory")
        prE = posE.dataProvider()
    if report:
        posRep = QgsVectorLayer("point?crs=EPSG:4326", "Report", "memory")
        prRep = posRep.dataProvider()
    if options:
        posOpt = QgsVectorLayer("point?crs=EPSG:4326", "Options", "memory")
        prOpt = posOpt.dataProvider()
    if optReactions:
        posO = QgsVectorLayer("point?crs=EPSG:4326", "Reactions", "memory")
        prO = posO.dataProvider()

    ppE = []
    ppO = []
    ppTimes = []
    ppRep = []
    ppOpt = []
    ppMix = []
    ppReactions = []
    ppSourc = []
    ppRul = []
    ppPat = []
    ppQual = []
    ppDem = []
    ppStat = []
    ppEmit = []
    ppCont = []
    ppCurv = []

    for i in range(ss):
        if i < d.getBinNodeJunctionCount():
            featJ = QgsFeature()
            point = QgsPointXY(float(x[i]), float(y[i]))
            featJ.initAttributes(2 + len(ndBaseTmp[0]) * 2)
            featJ.setGeometry(QgsGeometry.fromPointXY(point))
            featJ.setAttribute(0, ndID[i])
            featJ.setAttribute(1, ndEle[i])
            w = 2
            for j in range(0, len(ndBaseTmp[0])):
                featJ.setAttribute(w, ndBaseTmp[i][j])
                featJ.setAttribute(w + 1, ndPatTmp[i][j])
                w = w + 2
            prJunction.addFeatures([featJ])

        if i < nlinkCount:
            if len(stat) == i:
                ch = 1
            if ch == 1:
                stat.append('OPEN')

            x1.append(x[ndID.index(d.getBinLinkFromNode()[i])])
            y1.append(y[ndID.index(d.getBinLinkFromNode()[i])])
            x2.append(x[ndID.index(d.getBinLinkToNode()[i])])
            y2.append(y[ndID.index(d.getBinLinkToNode()[i])])

            if i in pIndex:
                pass
            elif i in vIndex:
                pass
            else:
                point1 = QgsPointXY(float(x1[i]), float(y1[i]))
                point2 = QgsPointXY(float(x2[i]), float(y2[i]))
                featPipe = QgsFeature()
                if vertx[i]:
                    parts = []
                    parts.append(point1)
                    for mm in range(len(vertxyFinal[kk])):
                        a = vertxyFinal[kk][mm]
                        parts.append(QgsPointXY(a[0], a[1]))
                    parts.append(point2)
                    featPipe.setGeometry((QgsGeometry.fromPolylineXY(parts)))
                    kk = kk + 1
                else:
                    featPipe.setGeometry(QgsGeometry.fromPolylineXY([point1, point2]))

                featPipe.setAttributes(
                    [linkID[i], ndlConn[0][i], ndlConn[1][i], stat[i], linkLengths[i], linkDiameters[i], linkRough[i],
                     linkMinorloss[i]])
                prPipe.addFeatures([featPipe])

        if i < d.getBinNodeTankCount():
            p = d.getBinNodeTankIndex()[i] - 1
            featTank = QgsFeature()
            point = QgsPointXY(float(x[p]), float(y[p]))
            featTank.setGeometry(QgsGeometry.fromPointXY(point))
            featTank.setAttributes(
                [ndTankID[i], ndTankelevation[i], initiallev[i], minimumlev[i], maximumlev[i], diameter[i],
                 minimumvol[i], volumecurv[i]])
            prTank.addFeatures([featTank])

        if i < d.getBinNodeReservoirCount():
            p = d.getBinNodeReservoirIndex()[i] - 1
            feature = QgsFeature()
            point = QgsPointXY(float(x[p]), float(y[p]))
            feature.setGeometry(QgsGeometry.fromPointXY(point))
            feature.setAttributes([ndID[p], head[i]])
            prReservoirs.addFeatures([feature])

        if i < allSections[12]:
            if len(mixing[i]) == 3:
                ppMix.append([mixing[i][0], mixing[i][1], mixing[i][2]])
            else:
                ppMix.append([mixing[i][0], mixing[i][1]])
        if i < allSections[11]:
            ppReactions.append([reactions[i][0], reactions[i][1], reactions[i][2]])
        if i < allSections[10]:
            if len(sources[i]) == 4:
                ppSourc.append([sources[i][0], sources[i][1], sources[i][2], sources[i][3]])
            elif len(sources[i]) == 3:
                ppSourc.append([sources[i][0], sources[i][1], sources[i][2]])
            else:
                ppSourc.append([sources[i][0], sources[i][1]])

        if i < allSections[9]:
            if len(rules[i]) > 2:
                ppRul.append([rules[i][0][1][1], rules[i][1][0] + rules[i][2][0] + rules[i][3][0]])
        if i < allSections[8]:
            ppQual.append([quality[i][0], quality[i][1]])
        if i < allSections[7]:
            ppCurv.append([str(curves[0][i][0]), str(curves[0][i][1]), str(curves[0][i][2]), str(curves[1][i])])
        if i < allSections[6]:
            ppPat.append([patterns[i][0], str(patterns[i][1])])
        if i < allSections[5]:
            ppCont.append([controls[i]])
        if i < allSections[4]:
            ppEmit.append([emitters[i][0], emitters[i][1]])
        if i < allSections[3]:
            ppStat.append([status[i][0], status[i][1]])
        if i < allSections[2]:
            if len(demands[i]) > 2:
                ppDem.append([demands[i][0], demands[i][1], demands[i][2]])
        if i < allSections[0]:
            mm = energy[i][0]
            if mm.upper() == "GLOBAL":
                prE.addAttributes([QgsField("Global" + energy[i][1], QVariant.String)])
                if len(energy[i]) > 2:
                    ppE.append(energy[i][2])
                else:
                    ppE.append('')
            if mm.upper() == "PUMP":
                prE.addAttributes([QgsField("Pump", QVariant.String)])
                if len(energy[i]) > 2:
                    ppE.append(energy[i][1] + ' ' + energy[i][2])
                else:
                    ppE.append(energy[i][1])
            elif mm.upper() == "DEMAND":
                if energy[i][1].upper() == "CHARGE":
                    prE.addAttributes([QgsField("DemCharge", QVariant.String)])
                    if len(energy[i]) > 2:
                        ppE.append(energy[i][2])
        if i < allSections[1]:
            mm = optReactions[i][0]
            if mm.upper() == "ORDER":
                prO.addAttributes([QgsField("Order" + optReactions[i][1], QVariant.String)])
                if len(optReactions[i]) > 2:
                    ppO.append(optReactions[i][2])
                else:
                    ppO.append('')
            elif mm.upper() == "GLOBAL":
                prO.addAttributes([QgsField("Global" + optReactions[i][1], QVariant.String)])
                if len(optReactions[i]) > 2:
                    ppO.append(optReactions[i][2])
                else:
                    ppO.append('')
            elif mm.upper() == "BULK":
                prO.addAttributes([QgsField("Bulk", QVariant.String)])
                if len(optReactions[i]) > 2:
                    ppO.append(optReactions[i][1] + ' ' + optReactions[i][2])
                else:
                    ppO.append(optReactions[i][1])
            elif mm.upper() == "WALL":
                prO.addAttributes([QgsField("Wall", QVariant.String)])
                if len(optReactions[i]) > 2:
                    ppO.append(optReactions[i][1] + ' ' + optReactions[i][2])
                else:
                    ppO.append(optReactions[i][1])
            elif mm.upper() == "TANK":
                prO.addAttributes([QgsField("Tank", QVariant.String)])
                if len(optReactions[i]) > 2:
                    ppO.append(optReactions[i][1] + ' ' + optReactions[i][2])
                else:
                    ppO.append(optReactions[i][1])
            elif mm.upper() == "LIMITING":
                if optReactions[i][1].upper() == "POTENTIAL":
                    prO.addAttributes([QgsField("LimPotent", QVariant.String)])
                    if len(optReactions[i]) > 2:
                        ppO.append(optReactions[i][2])
            elif mm.upper() == "ROUGHNESS":
                if optReactions[i][1].upper() == "CORRELATION":
                    prO.addAttributes([QgsField("RoughCorr", QVariant.String)])
                    if len(optReactions[i]) > 2:
                        ppO.append(optReactions[i][2])
        if i < allSections[13]:
            mm = times[i][0]
            if mm.upper() == "DURATION":
                prTimes.addAttributes([QgsField("Duration", QVariant.String)])
                ppTimes.append(times[i][1])
            if mm.upper() == "HYDRAULIC":
                prTimes.addAttributes([QgsField("HydStep", QVariant.String)])
                ppTimes.append(times[i][2])
            elif mm.upper() == "QUALITY":
                prTimes.addAttributes([QgsField("QualStep", QVariant.String)])
                ppTimes.append(times[i][2])
            elif mm.upper() == "RULE":
                prTimes.addAttributes([QgsField("RuleStep", QVariant.String)])
                ppTimes.append(times[i][2])
            elif mm.upper() == "PATTERN":
                if times[i][1].upper() == "TIMESTEP":
                    prTimes.addAttributes([QgsField("PatStep", QVariant.String)])
                    ppTimes.append(times[i][2])
                if times[i][1].upper() == "START":
                    prTimes.addAttributes([QgsField("PatStart", QVariant.String)])
                    ppTimes.append(times[i][2])
            elif mm.upper() == "REPORT":
                if times[i][1].upper() == "TIMESTEP":
                    prTimes.addAttributes([QgsField("RepStep", QVariant.String)])
                    ppTimes.append(times[i][2])
                if times[i][1].upper() == "START":
                    prTimes.addAttributes([QgsField("RepStart", QVariant.String)])
                    ppTimes.append(times[i][2])
            elif mm.upper() == "START":
                if times[i][1].upper() == "CLOCKTIME":
                    prTimes.addAttributes([QgsField("StartClock", QVariant.String)])
                    if len(times[i]) > 3:
                        ppTimes.append(times[i][2] + ' ' + times[i][3])
                    else:
                        ppTimes.append(times[i][2])
            elif mm.upper() == "STATISTIC":
                prTimes.addAttributes([QgsField("Statistic", QVariant.String)])
                if times[i][1].upper() == 'NONE' or times[i][1].upper() == 'AVERAGE' or times[i][1].upper() \
                        == 'MINIMUM' or times[i][1].upper() == 'MAXIMUM' or times[i][1].upper() == 'RANGE':
                    ppTimes.append(times[i][1])
        if i < allSections[14]:
            mm = report[i][0]
            if mm.upper() == "PAGESIZE":
                prRep.addAttributes([QgsField("PageSize", QVariant.String)])
                ppRep.append(report[i][1])
            if mm.upper() == "FILE":
                prRep.addAttributes([QgsField("FileName", QVariant.String)])
                ppRep.append(report[i][1])
            elif mm.upper() == "STATUS":
                prRep.addAttributes([QgsField("Status", QVariant.String)])
                ppRep.append(report[i][1])
            elif mm.upper() == "SUMMARY":
                prRep.addAttributes([QgsField("Summary", QVariant.String)])
                ppRep.append(report[i][1])
            elif mm.upper() == "ENERGY":
                prRep.addAttributes([QgsField("Energy", QVariant.String)])
                ppRep.append(report[i][1])
            elif mm.upper() == "NODES":
                prRep.addAttributes([QgsField("Nodes", QVariant.String)])
                if len(report[i]) > 2:
                    ppRep.append(report[i][1] + ' ' + report[i][2])
                else:
                    ppRep.append(report[i][1])
            elif mm.upper() == "LINKS":
                prRep.addAttributes([QgsField("Links", QVariant.String)])
                if len(report[i]) > 2:
                    ppRep.append(report[i][1] + ' ' + report[i][2])
                else:
                    ppRep.append(report[i][1])
            else:
                prRep.addAttributes([QgsField(mm, QVariant.String)])
                if len(report[i]) > 2:
                    ppRep.append(report[i][1] + ' ' + report[i][2])
                else:
                    ppRep.append(report[i][1])
        if i < allSections[15]:
            mm = options[i][0]
            if mm.upper() == "UNITS":
                prOpt.addAttributes([QgsField("Units", QVariant.String)])
                ppOpt.append(options[i][1])
            if mm.upper() == "HYDRAULICS":
                prOpt.addAttributes([QgsField("Hydraulics", QVariant.String)])
                if len(options[i]) > 2:
                    ppOpt.append(options[i][1] + ' ' + options[i][2])
                else:
                    ppOpt.append(options[i][1])
            elif mm.upper() == "QUALITY":
                prOpt.addAttributes([QgsField("Quality", QVariant.String)])
                if len(options[i]) > 2:
                    ppOpt.append(options[i][1] + ' ' + options[i][2])
                elif len(options[i]) > 3:
                    ppOpt.append(options[i][1] + ' ' + options[i][2] + ' ' + options[i][3])
                else:
                    ppOpt.append(options[i][1])
            elif mm.upper() == "VISCOSITY":
                prOpt.addAttributes([QgsField("Viscosity", QVariant.String)])
                ppOpt.append(options[i][1])
            elif mm.upper() == "DIFFUSIVITY":
                prOpt.addAttributes([QgsField("Diffusivity", QVariant.String)])
                ppOpt.append(options[i][1])
            elif mm.upper() == "SPECIFIC":
                if options[i][1].upper() == "GRAVITY":
                    prOpt.addAttributes([QgsField("SpecGrav", QVariant.String)])
                    ppOpt.append(options[i][2])
            elif mm.upper() == "TRIALS":
                prOpt.addAttributes([QgsField("Trials", QVariant.String)])
                ppOpt.append(options[i][1])
            elif mm.upper() == "HEADLOSS":
                prOpt.addAttributes([QgsField("Headloss", QVariant.String)])
                ppOpt.append(options[i][1])
            elif mm.upper() == "ACCURACY":
                prOpt.addAttributes([QgsField("Accuracy", QVariant.String)])
                ppOpt.append(options[i][1])
            elif mm.upper() == "UNBALANCED":
                prOpt.addAttributes([QgsField("Unbalanced", QVariant.String)])
                if len(options[i]) > 2:
                    ppOpt.append(options[i][1] + ' ' + options[i][2])
                else:
                    ppOpt.append(options[i][1])
            elif mm.upper() == "PATTERN":
                prOpt.addAttributes([QgsField("PatID", QVariant.String)])
                ppOpt.append(options[i][1])
            elif mm.upper() == "TOLERANCE":
                prOpt.addAttributes([QgsField("Tolerance", QVariant.String)])
                ppOpt.append(options[i][1])
            elif mm.upper() == "MAP":
                prOpt.addAttributes([QgsField("Map", QVariant.String)])
                ppOpt.append(options[i][1])
            elif mm.upper() == "DEMAND":
                if options[i][1].upper() == "MULTIPLIER":
                    prOpt.addAttributes([QgsField("DemMult", QVariant.String)])
                    ppOpt.append(options[i][2])
            elif mm.upper() == "EMITTER":
                if options[i][1].upper() == "EXPONENT":
                    prOpt.addAttributes([QgsField("EmitExp", QVariant.String)])
                    ppOpt.append(options[i][2])
            elif mm.upper() == "CHECKFREQ":
                prOpt.addAttributes([QgsField("CheckFreq", QVariant.String)])
                ppOpt.append(options[i][1])
            elif mm.upper() == "MAXCHECK":
                prOpt.addAttributes([QgsField("MaxCheck", QVariant.String)])
                ppOpt.append(options[i][1])
            elif mm.upper() == "DAMPLIMIT":
                prOpt.addAttributes([QgsField("DampLimit", QVariant.String)])
                ppOpt.append(options[i][1])

    writeDBF(posOpt, [ppOpt], prOpt, saveFile, inpname, "_OPTIONS", idx)

    writeDBF(posRep, [ppRep], prRep, saveFile, inpname, "_REPORT", idx)

    #if times:
    writeDBF(posTimes, [ppTimes], prTimes, saveFile, inpname, "_TIMES", idx)

    #if energy:
    writeDBF(posE, [ppE], prE, saveFile, inpname, "_ENERGY", idx)

    #if optReactions:
    writeDBF(posO, [ppO], prO, saveFile, inpname, "_REACTIONS", idx)

    posMix = QgsVectorLayer("point?crs=EPSG:4326", "Mixing", "memory")
    prMix = posMix.dataProvider()
    fields = ["Tank_ID", "Model", "Fraction"]
    fieldsCode = [0, 0, 1]  # 0 String, 1 Double
    createColumnsAttrb(prMix, fields, fieldsCode)
    writeDBF(posMix, ppMix, prMix, saveFile, inpname, "_MIXING", idx)

    posReact = QgsVectorLayer("point?crs=EPSG:4326", "ReactionsI", "memory")
    prReact = posReact.dataProvider()
    fields = ["Type", "Pipe/Tank", "Coeff."]
    fieldsCode = [0, 0, 1]
    createColumnsAttrb(prReact, fields, fieldsCode)
    writeDBF(posReact, ppReactions, prReact, saveFile, inpname, "_REACTIONS_I", idx)

    posSourc = QgsVectorLayer("point?crs=EPSG:4326", "Sources", "memory")
    prSourc = posSourc.dataProvider()
    fields = ["Node_ID", "Type", "Strength", "Pattern"]
    fieldsCode = [0, 0, 1, 0]
    createColumnsAttrb(prSourc, fields, fieldsCode)
    writeDBF(posSourc, ppSourc, prSourc, saveFile, inpname, "_SOURCES", idx)

    posRul = QgsVectorLayer("point?crs=EPSG:4326", "Rules", "memory")
    prRul = posRul.dataProvider()
    fields = ["Rule_ID", "Rule"]
    fieldsCode = [0, 0]
    createColumnsAttrb(prRul, fields, fieldsCode)
    writeDBF(posRul, ppRul, prRul, saveFile, inpname, "_RULES", idx)

    posQual = QgsVectorLayer("point?crs=EPSG:4326", "Sources", "memory")
    prQual = posQual.dataProvider()
    fields = ["Node_ID", "Init_Qual"]
    fieldsCode = [0, 1]
    createColumnsAttrb(prQual, fields, fieldsCode)
    writeDBF(posQual, ppQual, prQual, saveFile, inpname, "_QUALITY", idx)

    posStat = QgsVectorLayer("point?crs=EPSG:4326", "Status", "memory")
    prStat = posStat.dataProvider()
    fields = ["Link_ID", "Status/Setting"]
    fieldsCode = [0, 0]
    createColumnsAttrb(prStat, fields, fieldsCode)
    writeDBF(posStat, ppStat, prStat, saveFile, inpname, "_STATUS", idx)

    posEmit = QgsVectorLayer("point?crs=EPSG:4326", "Emitters", "memory")
    prEmit = posEmit.dataProvider()
    fields = ["Junc_ID", "Coeff."]
    fieldsCode = [0, 1]
    createColumnsAttrb(prEmit, fields, fieldsCode)
    writeDBF(posEmit, ppEmit, prEmit, saveFile, inpname, "_EMITTERS", idx)

    posCont = QgsVectorLayer("point?crs=EPSG:4326", "Controls", "memory")
    prCont = posCont.dataProvider()
    fields = ["Controls"]
    fieldsCode = [0]
    createColumnsAttrb(prCont, fields, fieldsCode)
    writeDBF(posCont, ppCont, prCont, saveFile, inpname, "_CONTROLS", idx)

    posPat = QgsVectorLayer("point?crs=EPSG:4326", "Patterns", "memory")
    prPat = posPat.dataProvider()
    fields = ["Pattern_ID", "Multipliers"]
    fieldsCode = [0, 0]
    createColumnsAttrb(prPat, fields, fieldsCode)
    writeDBF(posPat, ppPat, prPat, saveFile, inpname, "_PATTERNS", idx)

    posCurv = QgsVectorLayer("point?crs=EPSG:4326", "Curves", "memory")
    prCurv = posCurv.dataProvider()
    fields = ["Curve_ID", "X-Value", "Y-Value", "Type"]
    fieldsCode = [0, 0, 0, 0]
    createColumnsAttrb(prCurv, fields, fieldsCode)
    writeDBF(posCurv, ppCurv, prCurv, saveFile, inpname, "_CURVES", idx)

    # Write Valve Shapefile
    posValve = QgsVectorLayer("LineString?crs=EPSG:4326", "Valve", "memory")
    prValve = posValve.dataProvider()

    fields = ["ID", "NodeFrom", "NodeTo", "Diameter", "Type", "Setting", "MinorLoss"]
    fieldsCode = [0, 0, 0, 1, 0, 1, 1]
    createColumnsAttrb(prValve, fields, fieldsCode)
    posValve.startEditing()

    if d.getBinLinkValveCount() > 0:

        linkID = d.getBinLinkValveNameID()
        linkType = d.getBinLinkValveType()  # valve type
        linkDiameter = d.getBinLinkValveDiameters()
        linkInitSett = d.getBinLinkValveSetting()  # BinLinkValveSetting
        linkMinorloss = d.getBinLinkValveMinorLoss()

        for i, p in enumerate(d.getBinLinkValveIndex()):
            point1 = QgsPointXY(float(x[ndID.index(d.getBinLinkFromNode()[p])]), float(y[ndID.index(d.getBinLinkFromNode()[p])]))
            point2 = QgsPointXY(float(x[ndID.index(d.getBinLinkToNode()[p])]), float(y[ndID.index(d.getBinLinkToNode()[p])]))
            feature = QgsFeature()
            feature.setGeometry(QgsGeometry.fromPolylineXY([point1, point2]))

            feature.setAttributes(
                [linkID[i], ndlConn[0][p], ndlConn[1][p], linkDiameter[i], linkType[i], linkInitSett[i],
                 linkMinorloss[i]])
            prValve.addFeatures([feature])

    QgsVectorFileWriter.writeAsVectorFormat(posValve, saveFile + "_valves" + '.shp', "utf-8",
                                            QgsCoordinateReferenceSystem(posValve.crs().authid()), "ESRI Shapefile")
    ll = QgsVectorLayer(saveFile + "_valves" + '.shp', inpname[:len(inpname) - 4] + "_valves", "ogr")
    QgsProject.instance().addMapLayer(ll, False)
    nvalves = QgsLayerTreeLayer(ll)
    idx.insertChildNode(0, nvalves)
    nvalves.setCustomProperty("showFeatureCount", True)
    ll.loadNamedStyle(plugin_path + "/qmls/" + 'valvesline' + ".qml")
    ll.triggerRepaint()

    # Write Pump Shapefile
    posPump = QgsVectorLayer("LineString?crs=EPSG:4326", "Pump", "memory")
    prPump = posPump.dataProvider()
    fields = ["ID", "NodeFrom", "NodeTo", "Power", "Pattern", "Curve"]
    fieldsCode = [0, 0, 0, 0, 0, 0]
    createColumnsAttrb(prPump, fields, fieldsCode)
    posPump.startEditing()

    if d.getBinLinkPumpCount() > 0:
        curveXY = d.getBinCurvesXY()
        curvesID = d.getBinCurvesNameID()

        a = curvesID
        b = []
        for l in a:
            if l not in b:
                b.append(l)
        curvesIDunique = b
        CurvesTmpIndices = []
        for p in range(0, len(curvesIDunique)):
            CurvesTmpIndices.append(curvesID.count(curvesIDunique[p]))

        curveIndices = []
        Curve = d.getBinLinkPumpCurveNameID()
        for i in range(len(Curve)):
            curveIndices.append(curvesIDunique.index(Curve[i]))
        if d.getBinCurveCount():
            CurvesTmpIndicesFinal = []
            CurvesTmpIndicesFinal.append([CurvesTmpIndices[index] for index in curveIndices])

            CurvesTmp = []
            i = 0
            for u in range(max(CurvesTmpIndicesFinal[0])):
                fields.append('Head' + str(u + 1))
                fields.append('Flow' + str(u + 1))
                fieldsCode.append(1)
                fieldsCode.append(1)
                if u < d.getBinCurveCount():
                    tmp1 = []
                    for p in range(CurvesTmpIndices[u]):
                        tmp1.append([curveXY[i][0], curveXY[i][1]])
                        i = i + 1
                    CurvesTmp.append(tmp1)

        createColumnsAttrb(prPump, fields, fieldsCode)

        chPowerPump = d.getBinLinkPumpPower()
        pumpID = d.getBinLinkPumpNameID()
        patternsIDs = d.getBinLinkPumpPatterns()
        ppatt = d.getBinLinkPumpPatternsPumpID()
        linkID = d.getBinLinkNameID()

        for i, p in enumerate(d.getBinLinkPumpIndex()):

            Curve = []
            power = []
            pattern = []
            pumpNameIDPower = d.getBinLinkPumpNameIDPower()
            if len(pumpNameIDPower) > 0:
                for uu in range(0, len(pumpNameIDPower)):
                    if pumpNameIDPower[uu] == pumpID[i]:
                        power = chPowerPump[uu]
            if len(patternsIDs) > 0:
                for uu in range(0, len(ppatt)):
                    if ppatt[uu] == pumpID[i]:
                        pattern = patternsIDs[uu]

            point1 = QgsPointXY(float(x[ndID.index(d.getBinLinkFromNode()[p])]), float(y[ndID.index(d.getBinLinkFromNode()[p])]))
            point2 = QgsPointXY(float(x[ndID.index(d.getBinLinkToNode()[p])]), float(y[ndID.index(d.getBinLinkToNode()[p])]))
            feature = QgsFeature()
            feature.setGeometry(QgsGeometry.fromPolylineXY([point1, point2]))

            if not Curve:
                Curve = 'NULL'
            if not power:
                power = 'NULL'
            if not pattern:
                pattern = 'NULL'

            if d.getBinCurveCount() > 0 and len(pumpNameIDPower) == 0:
                Curve = d.getBinLinkPumpCurveNameID()[i]
                curveIndex = curvesIDunique.index(Curve)

            feature.initAttributes(6 + sum(CurvesTmpIndices) * 2 + 1)
            feature.setAttribute(0, linkID[p])
            feature.setAttribute(1, ndlConn[0][p])
            feature.setAttribute(2, ndlConn[1][p])
            feature.setAttribute(3, power)
            feature.setAttribute(4, pattern)
            feature.setAttribute(5, Curve)

            if d.getBinCurveCount() == 1:
                w = 6
                for p in range(CurvesTmpIndices[curveIndex]):
                    feature.setAttribute(w, CurvesTmp[curveIndex][p][0])
                    feature.setAttribute(w + 1, CurvesTmp[curveIndex][p][1])
                    w = w + 2

            for j in range(d.getBinCurveCount() - 1):
                w = 6
                for p in range(CurvesTmpIndices[curveIndex]):
                    feature.setAttribute(w, CurvesTmp[curveIndex][p][0])
                    feature.setAttribute(w + 1, CurvesTmp[curveIndex][p][1])
                    w = w + 2

            prPump.addFeatures([feature])

    QgsVectorFileWriter.writeAsVectorFormat(posPump,saveFile+"_pumps"+'.shp', "utf-8",
                                            QgsCoordinateReferenceSystem(posPump.crs().authid()), "ESRI Shapefile")
    ll = QgsVectorLayer(saveFile + "_pumps" + '.shp', inpname[:len(inpname) - 4] + "_pumps", "ogr")
    QgsProject.instance().addMapLayer(ll, False)
    npump = QgsLayerTreeLayer(ll)
    idx.insertChildNode(0, npump)
    npump.setCustomProperty("showFeatureCount", True)
    ll.loadNamedStyle(plugin_path + "/qmls/" + 'pumpsline' + ".qml")
    ll.triggerRepaint()

    QgsVectorFileWriter.writeAsVectorFormat(posPipe,saveFile+"_pipes"+'.shp', "utf-8",
                                            QgsCoordinateReferenceSystem(posPipe.crs().authid()), "ESRI Shapefile")
    ll = QgsVectorLayer(saveFile + "_pipes" + '.shp', inpname[:len(inpname) - 4] + "_pipes", "ogr")
    QgsProject.instance().addMapLayer(ll, False)
    npipe = QgsLayerTreeLayer(ll)
    idx.insertChildNode(0, npipe)
    npipe.setCustomProperty("showFeatureCount", True)
    ll.loadNamedStyle(plugin_path + "/qmls/" + 'pipes' + ".qml")
    ll.triggerRepaint()
    iface.mapCanvas().setExtent(ll.extent())

    QgsVectorFileWriter.writeAsVectorFormat(posJunction,saveFile+"_junctions"+'.shp', "utf-8",
                                            QgsCoordinateReferenceSystem(posJunction.crs().authid()), "ESRI Shapefile")
    ll = QgsVectorLayer(saveFile + "_junctions" + '.shp', inpname[:len(inpname) - 4] + "_junctions", "ogr")
    QgsProject.instance().addMapLayer(ll, False)
    njunc = QgsLayerTreeLayer(ll)
    idx.insertChildNode(0, njunc)
    njunc.setCustomProperty("showFeatureCount", True)
    ll.loadNamedStyle(plugin_path + "/qmls/" + 'junctions' + ".qml")
    ll.triggerRepaint()

    QgsVectorFileWriter.writeAsVectorFormat(posTank, saveFile + "_tanks" + '.shp', "utf-8",
                                            QgsCoordinateReferenceSystem(posTank.crs().authid()), "ESRI Shapefile")
    ll = QgsVectorLayer(saveFile + "_tanks" + '.shp', inpname[:len(inpname) - 4] + "_tanks", "ogr")
    QgsProject.instance().addMapLayer(ll, False)
    ntanks = QgsLayerTreeLayer(ll)
    idx.insertChildNode(0, ntanks)
    ntanks.setCustomProperty("showFeatureCount", True)
    ll.loadNamedStyle(plugin_path + "/qmls/" + 'tanks' + ".qml")
    ll.triggerRepaint()

    QgsVectorFileWriter.writeAsVectorFormat(posReservoirs, saveFile + "_reservoirs" + '.shp', "utf-8",
                                            QgsCoordinateReferenceSystem(posReservoirs.crs().authid()), "ESRI Shapefile")
    ll = QgsVectorLayer(saveFile + "_reservoirs" + '.shp', inpname[:len(inpname) - 4] + "_reservoirs", "ogr")
    QgsProject.instance().addMapLayer(ll, False)
    nres = QgsLayerTreeLayer(ll)
    idx.insertChildNode(0, nres)
    nres.setCustomProperty("showFeatureCount", True)
    ll.loadNamedStyle(plugin_path + "/qmls/" + 'reservoirs' + ".qml")
    ll.triggerRepaint()
コード例 #32
0
    def processLoading(self):
        '''
        Load all the layers in QGIS
        and apply corresponding style
        '''
        self.startTime = datetime.now()
        QApplication.setOverrideCursor(Qt.WaitCursor)

        # default style to apply for Cadastre layers
        self.themeDir = str(self.dialog.liTheme.currentText())
        if not os.path.exists(os.path.join(
            self.qc.plugin_dir,
            "styles/%s" % self.themeDir
        )):
            self.themeDir = self.defaultThemeDir

        # set Cadastre SVG path if not set
        cadastreSvgPath = os.path.join(
            self.qc.plugin_dir,
            "styles/%s/svg" % self.themeDir
        )
        s = QSettings()
        qgisSvgPaths = s.value("svg/searchPathsForSVG", 10, type=str)
        a = list(qgisSvgPaths)
        if cadastreSvgPath not in a:
            a.append(cadastreSvgPath)
            s.setValue("svg/searchPathsForSVG", a)
            self.qc.updateLog(u"* Le chemin contenant les SVG du plugin Cadastre a été ajouté dans les options de QGIS")

        # Get selected options
        providerName = self.dialog.dbpluginclass.providerName()
        qgisCadastreLayers = []
        self.dialog.schema = str(self.dialog.liDbSchema.currentText())
        self.dialog.totalSteps = len(self.qgisCadastreLayerList)

        # Run the loading
        self.updateTimer()
        self.qc.updateLog(u'Chargement des tables :')

        # Get database list of tables
        if self.dialog.dbType == 'postgis':
            schemaSearch = [s for s in self.dialog.db.schemas() if s.name == self.dialog.schema]
            schemaInst = schemaSearch[0]
            dbTables = self.dialog.db.tables(schemaInst)
        if self.dialog.dbType == 'spatialite':
            dbTables = self.dialog.db.tables()

        # Get commune filter by expression
        communeExpression = self.dialog.communeFilter.text().strip()
        communeFilter = None
        cExp = QgsExpression(communeExpression)
        if communeExpression != '' and not cExp.hasParserError():
            self.qc.updateLog(u'Filtrage à partir des communes : %s' % communeExpression)
            cReq = QgsFeatureRequest(cExp)
            cTableList = [a for a in dbTables if a.name == 'geo_commune']
            cTable = cTableList[0]
            cUniqueCol = 'ogc_fid'
            cSchema = self.dialog.schema
            cGeomCol = 'geom'
            cLayerUri = self.dialog.db.uri()
            cLayerUri.setDataSource(
                cSchema,
                cTable.name,
                cGeomCol,
                '',
                cUniqueCol
            )
            clayer = QgsVectorLayer(cLayerUri.uri(), 'com', providerName)
            cfeatures = clayer.getFeatures( cReq )
            cids = [a['commune'] for a in cfeatures]
            if len(cids):
                communeFilter = cids
        else:
            self.qc.updateLog(u'Filtrage à partir des communes, expression invalide : %s' % cExp.parserErrorString())


        # Loop throuhg qgisQastreLayerList and load each corresponding table
        for item in self.qgisCadastreLayerList:

            if item['label'] not in self.mainLayers and self.dialog.cbMainLayersOnly.isChecked():
                continue

            if 'dbType' in item and item['dbType'] != self.dialog.dbType:
                continue

            # update progress bar
            self.qc.updateLog(u'* %s' % item['label'])
            self.dialog.step+=1
            self.qc.updateProgressBar()

            # Tables - Get db_manager table instance
            tableList = [a for a in dbTables if a.name == item['table']]
            if len(tableList) == 0 and 'isView' not in item:
                self.qc.updateLog(u'  - Aucune table trouvée pour %s' % item['label'])
                continue

            if tableList:
                table = tableList[0]
                source = table.name
                try:
                    uniqueField = table.getValidQGisUniqueFields(True)
                    uniqueCol = uniqueField.name
                except:
                    uniqueCol = 'ogc_fid'

            schema = self.dialog.schema

            # View
            if 'isView' in item:
                if self.dialog.dbType == 'spatialite':
                    schemaReplace = ''
                else:
                    schemaReplace = '"%s".' % self.dialog.schema
                source = item['table'].replace('schema.', schemaReplace)
                uniqueCol = item['key']
                schema = None

            sql = item['sql']
            geomCol = item['geom']

            if communeFilter:
                communeFilterText = "'" + "', '".join(communeFilter) + "'"
                nschema = ''
                if self.dialog.dbType == 'postgis':
                    nschema = '"%s".' % schema
                if 'subset' in item:
                    subset = item['subset']
                    sql+= subset % communeFilterText
                else:
                    itemcol = item['table']
                    if item['table'] == 'geo_label':
                        itemcol = 'ogc_fid'
                    subset = itemcol + '''
                         IN (

                            SELECT b.''' + itemcol + '''
                            FROM  ''' + nschema + item['table'] + ''' b
                            JOIN  ''' + nschema + '''geo_commune c
                            ON ST_Within(b.geom, c.geom)
                            WHERE 2>1
                            AND c.geo_commune IN ( %s )

                        )
                    '''
                    if sql:
                        sql+= ' AND '
                    sql+= subset % communeFilterText


            # Create vector layer
            alayerUri = self.dialog.db.uri()
            alayerUri.setDataSource(
                schema,
                source,
                geomCol,
                sql,
                uniqueCol
            )

            vlayer = QgsVectorLayer(alayerUri.uri(), item['label'], providerName)

            # apply style
            qmlPath = os.path.join(
                self.qc.plugin_dir,
                "styles/%s/%s.qml" % (self.themeDir, item['name'])
            )
            if os.path.exists(qmlPath):
                vlayer.loadNamedStyle(qmlPath)

            # append vector layer to the list
            qgisCadastreLayers.append(vlayer)

        self.updateTimer()

        # Get canvas and disable rendering
        from qgis.utils import iface
        canvas = iface.mapCanvas()
        canvas.freeze(True)

        # Add all layers to QGIS registry (but not yet to the layer tree)
        self.qc.updateLog(u'Ajout des couches dans le registre de QGIS')
        QgsProject.instance().addMapLayers(qgisCadastreLayers, False)
        self.updateTimer()

        # Create a group "Cadastre" and move all layers into it
        self.qc.updateLog(u'Ajout des couches dans le groupe Cadastre')
        root = QgsProject.instance().layerTreeRoot()
        g1 = root.findGroup(u"Cadastre")
        if g1:
            gf = root.findGroup(u"Fond")
            if not gf:
                gf = g1.addGroup("Fond")

            ge = root.findGroup(u'Étiquettes cadastre')
            if not ge:
                ge = gf.addGroup(u'Étiquettes cadastre')

            gd = root.findGroup(u"Données cadastre")
            if not gd:
                gd = gf.addGroup(u"Données cadastre")
        else:
            g1 = root.insertGroup(0, "Cadastre")
            gf = g1.addGroup("Fond")
            ge = gf.addGroup(u'Étiquettes cadastre')
            gd = gf.addGroup(u'Données cadastre')

        variables = QgsProject.instance().customVariables()
        for layer in qgisCadastreLayers:
            #~ layer.updateExtents()
            # Get layertree item
            nodeLayer = QgsLayerTreeLayer(layer)

            # Get layer options
            qlayer = [ a for a in self.qgisCadastreLayerList if a['label'] == layer.name() ]
            if qlayer:
                qlayer = qlayer[0]

                # Move layer to proper group
                if qlayer['group'] == 'E':
                    ge.insertChildNode(0, nodeLayer)
                elif qlayer['group'] == 'D':
                    gd.insertChildNode(0, nodeLayer)
                else:
                    g1.insertChildNode(0, nodeLayer)

                # Enable/Disable layer
                if not qlayer['active']:
                    nodeLayer.setItemVisibilityChecked(Qt.Unchecked)
            else:
                # Move layer to Cadastre group
                g1.insertChildNode(-1, nodeLayer)

            # Do not expand layer legend
            nodeLayer.setExpanded(False)

            # set varaibles
            if layer.name() in self.variableLayers:
                varlayer = self.variableLayers[layer.name()]
                variables['cadastre_'+varlayer['var_key']+'_layer_id'] = layer.id()
                variables['cadastre_'+varlayer['var_key']+'_unique_col'] = varlayer['unique_col']

        QgsProject.instance().setCustomVariables(variables)

        self.updateTimer()


        # Zoom to full extent
        self.qc.updateLog(u'Zoom sur les couches')
        canvas.zoomToFullExtent()
        canvas.freeze(False)
        canvas.refresh()
        self.updateTimer()

        # progress bar
        self.dialog.step+=1
        self.qc.updateProgressBar()

        # Emit signal
        self.qc.updateLog(u'Mise à jour des outils cadastre')
        self.cadastreLoadingFinished.emit()
        self.updateTimer()

        # Final message
        QApplication.restoreOverrideCursor()
        QMessageBox.information(
            self.dialog,
            u"Cadastre",
            u"Les données ont bien été chargées dans QGIS"
        )
        self.dialog.pbProcess.setValue(0)


        QApplication.restoreOverrideCursor()