コード例 #1
0
    def test_signalConnection(self):
        # remove all layers
        QgsProject.instance().removeAllMapLayers()
        # set dependencies and add back layers
        self.pointsLayer = QgsVectorLayer(
            "dbname='%s' table=\"node\" (geom) sql=" % self.fn, "points",
            "spatialite")
        assert (self.pointsLayer.isValid())
        self.linesLayer = QgsVectorLayer(
            "dbname='%s' table=\"section\" (geom) sql=" % self.fn, "lines",
            "spatialite")
        assert (self.linesLayer.isValid())
        self.pointsLayer2 = QgsVectorLayer(
            "dbname='%s' table=\"node2\" (geom) sql=" % self.fn, "_points2",
            "spatialite")
        assert (self.pointsLayer2.isValid())
        self.pointsLayer.setDependencies(
            [QgsMapLayerDependency(self.linesLayer.id())])
        self.pointsLayer2.setDependencies(
            [QgsMapLayerDependency(self.pointsLayer.id())])
        # this should update connections between layers
        QgsProject.instance().addMapLayers([self.pointsLayer])
        QgsProject.instance().addMapLayers([self.linesLayer])
        QgsProject.instance().addMapLayers([self.pointsLayer2])

        ms = QgsMapSettings()
        ms.setOutputSize(QSize(100, 100))
        ms.setExtent(QgsRectangle(0, 0, 1, 1))
        self.assertTrue(ms.hasValidSettings())

        u = QgsSnappingUtils()
        u.setMapSettings(ms)
        cfg = u.config()
        cfg.setEnabled(True)
        cfg.setMode(QgsSnappingConfig.AdvancedConfiguration)
        cfg.setIndividualLayerSettings(
            self.pointsLayer,
            QgsSnappingConfig.IndividualLayerSettings(True,
                                                      QgsSnappingConfig.Vertex,
                                                      20, QgsTolerance.Pixels))
        cfg.setIndividualLayerSettings(
            self.pointsLayer2,
            QgsSnappingConfig.IndividualLayerSettings(True,
                                                      QgsSnappingConfig.Vertex,
                                                      20, QgsTolerance.Pixels))
        u.setConfig(cfg)
        # add another line
        f = QgsFeature(self.linesLayer.fields())
        f.setId(4)
        geom = QgsGeometry.fromWkt("LINESTRING(0.5 0.2,0.6 0)")
        f.setGeometry(geom)
        self.linesLayer.startEditing()
        self.linesLayer.addFeatures([f])
        self.linesLayer.commitChanges()
        # check the second snapped point is OK
        m = u.snapToMap(QPoint(75, 100 - 0))
        self.assertTrue(m.isValid())
        self.assertTrue(m.hasVertex())
        self.assertEqual(m.point(), QgsPointXY(0.8, 0.0))

        self.pointsLayer.setDependencies([])
        self.pointsLayer2.setDependencies([])
コード例 #2
0
 def test_cycleDetection(self):
     self.assertTrue(self.pointsLayer.setDependencies([QgsMapLayerDependency(self.linesLayer.id())]))
     self.assertFalse(self.linesLayer.setDependencies([QgsMapLayerDependency(self.pointsLayer.id())]))
     self.pointsLayer.setDependencies([])
     self.linesLayer.setDependencies([])
コード例 #3
0
    def test_resetSnappingIndex(self):
        self.pointsLayer.setDependencies([])
        self.linesLayer.setDependencies([])
        self.pointsLayer2.setDependencies([])

        ms = QgsMapSettings()
        ms.setOutputSize(QSize(100, 100))
        ms.setExtent(QgsRectangle(0, 0, 1, 1))
        self.assertTrue(ms.hasValidSettings())

        u = QgsSnappingUtils()
        u.setMapSettings(ms)
        cfg = u.config()
        cfg.setEnabled(True)
        cfg.setMode(QgsSnappingConfig.AdvancedConfiguration)
        cfg.setIndividualLayerSettings(
            self.pointsLayer,
            QgsSnappingConfig.IndividualLayerSettings(True,
                                                      QgsSnappingConfig.Vertex,
                                                      20, QgsTolerance.Pixels))
        u.setConfig(cfg)

        m = u.snapToMap(QPoint(95, 100))
        self.assertTrue(m.isValid())
        self.assertTrue(m.hasVertex())
        self.assertEqual(m.point(), QgsPointXY(1, 0))

        f = QgsFeature(self.linesLayer.fields())
        f.setId(1)
        geom = QgsGeometry.fromWkt("LINESTRING(0 0,1 1)")
        f.setGeometry(geom)
        self.linesLayer.startEditing()
        self.linesLayer.addFeatures([f])
        self.linesLayer.commitChanges()

        l1 = len([f for f in self.pointsLayer.getFeatures()])
        self.assertEqual(l1, 4)
        m = u.snapToMap(QPoint(95, 0))
        # snapping not updated
        self.pointsLayer.setDependencies([])
        self.assertEqual(m.isValid(), False)

        # set layer dependencies
        self.pointsLayer.setDependencies(
            [QgsMapLayerDependency(self.linesLayer.id())])
        # add another line
        f = QgsFeature(self.linesLayer.fields())
        f.setId(2)
        geom = QgsGeometry.fromWkt("LINESTRING(0 0,0.5 0.5)")
        f.setGeometry(geom)
        self.linesLayer.startEditing()
        self.linesLayer.addFeatures([f])
        self.linesLayer.commitChanges()
        # check the snapped point is OK
        m = u.snapToMap(QPoint(45, 50))
        self.assertTrue(m.isValid())
        self.assertTrue(m.hasVertex())
        self.assertEqual(m.point(), QgsPointXY(0.5, 0.5))
        self.pointsLayer.setDependencies([])

        # test chained layer dependencies A -> B -> C
        cfg.setIndividualLayerSettings(
            self.pointsLayer2,
            QgsSnappingConfig.IndividualLayerSettings(True,
                                                      QgsSnappingConfig.Vertex,
                                                      20, QgsTolerance.Pixels))
        u.setConfig(cfg)
        self.pointsLayer.setDependencies(
            [QgsMapLayerDependency(self.linesLayer.id())])
        self.pointsLayer2.setDependencies(
            [QgsMapLayerDependency(self.pointsLayer.id())])
        # add another line
        f = QgsFeature(self.linesLayer.fields())
        f.setId(3)
        geom = QgsGeometry.fromWkt("LINESTRING(0 0.2,0.5 0.8)")
        f.setGeometry(geom)
        self.linesLayer.startEditing()
        self.linesLayer.addFeatures([f])
        self.linesLayer.commitChanges()
        # check the second snapped point is OK
        m = u.snapToMap(QPoint(75, 100 - 80))
        self.assertTrue(m.isValid())
        self.assertTrue(m.hasVertex())
        self.assertEqual(m.point(), QgsPointXY(0.7, 0.8))
        self.pointsLayer.setDependencies([])
        self.pointsLayer2.setDependencies([])
コード例 #4
0
    def postProcessAlgorithm(self, context, feedback):
        feedback.pushInfo("postProcessAlgorithm")
        msg = ''

        # Get vector layers
        vector_layers = {}
        for table_name, l_id in self.available_layers.items():
            vector_layers[table_name] = context.project().mapLayer(l_id)

        # Discover relations
        feedback.pushInfo("")
        feedback.pushInfo("## DECOUVERTE DES RELATIONS ##")
        manager = context.project().relationManager()
        manager.setRelations(manager.discoverRelations([], list(vector_layers.values())))

        # Add relations for views
        feedback.pushInfo("")
        feedback.pushInfo("## AJOUT DES RELATIONS AVEC LES VUES ##")
        vportion = vector_layers.get('v_portion')
        vitineraire = vector_layers.get('v_itineraire')
        segment = vector_layers.get('segment')
        etape = vector_layers.get('etape')
        element = vector_layers.get('element')

        if vportion and etape:
            self.createRelation(
                manager, vportion, etape, "id_portion", "id_portion",
                "vportion_etape", "etape_7d2f_id_portion_v_portion__id_portion", feedback)
        if vportion and element:
            self.createRelation(
                manager, vportion, element, "id_portion", "id_portion",
                "vportion_element", "element_87_id_portion_v_portion__id_portion", feedback)
        if vitineraire and etape:
            self.createRelation(
                manager, vitineraire, etape, "id_itineraire", "id_itineraire",
                "vitineraire_etape", "etape_7d2f_id_itineraire_v_itinerai_id_itineraire", feedback)
        if segment and element:
            self.createRelation(
                manager, segment, element, "id_segment", "id_segment",
                "segment_element", "element_34_id_segment_segment__id_segment", feedback)

        # Add Dependencies
        feedback.pushInfo("")
        feedback.pushInfo("## AJOUT DES DEPENDANCES ##")
        if vportion and segment:
            vportion.setDependencies([QgsMapLayerDependency(segment.id())])
        if vitineraire and segment:
            vitineraire.setDependencies([QgsMapLayerDependency(segment.id())])

        # Load layer styles
        feedback.pushInfo("")
        feedback.pushInfo("## CHARGEMENT DES STYLES ##")
        msg = ''
        for table_name, layer in vector_layers.items():
            feedback.pushInfo("Recherche du style pour {} ({})".format(layer.name(), table_name))
            style_path = resources_path("qml", table_name + ".qml")
            if os.path.exists(style_path):
                layer.loadNamedStyle(style_path)
                feedback.pushInfo("Chargement du style pour {} ({})".format(layer.name(), table_name))
                msg += " // Style de {} ({}) chargé".format(layer.name(), table_name)
                layer.triggerRepaint()
        # Apply to OpenStreetMap
        osm_name = 'OpenStreetMap'
        osm_layers = context.project().mapLayersByName(osm_name)
        if osm_layers:
            for layer in osm_layers:
                feedback.pushInfo("Recherche du style pour {} ({})".format(layer.name(), osm_name))
                style_path = resources_path("qml", osm_name + ".qml")
                if os.path.exists(style_path):
                    layer.loadNamedStyle(style_path)
                    feedback.pushInfo("Chargement du style pour {} ({})".format(layer.name(), osm_name))
                    msg += " // Style de {} ({}) chargé".format(layer.name(), osm_name)
                    layer.triggerRepaint()

        feedback.pushInfo("## MISE A JOUR DE L'ARBRE DES COUCHES ##")
        self.organize_legend(context, self.available_layers)

        return {self.OUTPUT_MSG: msg, self.OUTPUT: list(self.available_layers.values())}