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([])
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([])
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([])
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())}