def _change_data_source(self, layer, datasource, provider_key): """Due to the fact that a project r/w context is not available inside the map layers classes, the original style and subset string restore happens in app, this function replicates app behavior""" options = QgsDataProvider.ProviderOptions() subset_string = '' if not layer.isValid(): try: subset_string = layer.dataProvider().subsetString() except: pass layer.setDataSource(datasource, layer.name(), provider_key, options) if subset_string: layer.setSubsetString(subset_string) self.assertTrue(layer.originalXmlProperties(), layer.name()) context = QgsReadWriteContext() context.setPathResolver(QgsProject.instance().pathResolver()) errorMsg = '' doc = QDomDocument() self.assertTrue(doc.setContent(layer.originalXmlProperties())) layer_node = QDomNode(doc.firstChild()) self.assertTrue(layer.readSymbology(layer_node, errorMsg, context))
def testLoadWriteRenderingScaleVisibility(self): """Test write and load scale visibility, see GH #33840""" vl = QgsVectorLayer("LineString?crs=epsg:4326", "result", "memory") vl.setScaleBasedVisibility(True) vl.setMinimumScale(125.0) vl.setMaximumScale(1.25) style = QDomDocument() style.setContent( "<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'><qgis></qgis>" ) node = style.firstChild() self.assertTrue( vl.writeStyle(node, style, "Error writing style", QgsReadWriteContext(), QgsMapLayer.Rendering)) style_content = style.toString() del (vl) # Read vl2 = QgsVectorLayer("LineString?crs=epsg:4326", "result", "memory") self.assertFalse(vl2.hasScaleBasedVisibility()) style2 = QDomDocument() style2.setContent(style_content) self.assertTrue( vl2.readStyle(style.namedItem('qgis'), "Error reading style", QgsReadWriteContext(), QgsMapLayer.Rendering)) self.assertTrue(vl2.hasScaleBasedVisibility()) self.assertEqual(vl2.minimumScale(), 125.0) self.assertEqual(vl2.maximumScale(), 1.25)
def testLayerDataSourceReset(self): """When adding a layer with the same id to the store make sure the data source is also updated in case the layer validity has changed from False to True""" p = QgsProject() store = p.layerStore() vl1 = createLayer('valid') vl2 = QgsVectorLayer('/not_a_valid_path.shp', 'invalid', 'ogr') self.assertTrue(vl1.isValid()) self.assertFalse(vl2.isValid()) store.addMapLayers([vl1, vl2]) self.assertEqual(store.validCount(), 1) self.assertEqual(len(store.mapLayers()), 2) # Re-add the bad layer store.addMapLayers([vl2]) self.assertEqual(store.validCount(), 1) self.assertEqual(len(store.mapLayers()), 2) doc = QDomDocument() doc.setContent( '<maplayer><provider encoding="UTF-8">ogr</provider><layername>fixed</layername><id>%s</id></maplayer>' % vl2.id()) layer_node = QDomNode(doc.firstChild()) self.assertTrue(vl2.writeXml(layer_node, doc, QgsReadWriteContext())) datasource_node = doc.createElement("datasource") datasource_node.appendChild( doc.createTextNode(os.path.join(TEST_DATA_DIR, 'points.shp'))) layer_node.appendChild(datasource_node) p.readLayer(layer_node) self.assertEqual(store.validCount(), 2) self.assertEqual(len(store.mapLayers()), 2) self.assertEqual(store.mapLayers()[vl2.id()].name(), 'fixed')
def testLayerDataSourceReset(self): """When adding a layer with the same id to the store make sure the data source is also updated in case the layer validity has changed from False to True""" p = QgsProject() store = p.layerStore() vl1 = createLayer('valid') vl2 = QgsVectorLayer('/not_a_valid_path.shp', 'invalid', 'ogr') self.assertTrue(vl1.isValid()) self.assertFalse(vl2.isValid()) store.addMapLayers([vl1, vl2]) self.assertEqual(store.validCount(), 1) self.assertEqual(len(store.mapLayers()), 2) # Re-add the bad layer store.addMapLayers([vl2]) self.assertEqual(store.validCount(), 1) self.assertEqual(len(store.mapLayers()), 2) doc = QDomDocument() doc.setContent('<maplayer><provider encoding="UTF-8">ogr</provider><layername>fixed</layername><id>%s</id></maplayer>' % vl2.id()) layer_node = QDomNode(doc.firstChild()) self.assertTrue(vl2.writeXml(layer_node, doc, QgsReadWriteContext())) datasource_node = doc.createElement("datasource") datasource_node.appendChild(doc.createTextNode(os.path.join(TEST_DATA_DIR, 'points.shp'))) layer_node.appendChild(datasource_node) p.readLayer(layer_node) self.assertEqual(store.validCount(), 2) self.assertEqual(len(store.mapLayers()), 2) self.assertEqual(store.mapLayers()[vl2.id()].name(), 'fixed')
def processAlgorithm(self, progress): filename = self.getParameterValue(self.INPUT) layer = dataobjects.getObjectFromUri(filename) style = self.getParameterValue(self.STYLE) if layer is None: dataobjects.load(filename, os.path.basename(filename), style=style) self.getOutputFromName(self.OUTPUT).open = False else: with open(style) as f: xml = "".join(f.readlines()) d = QDomDocument() d.setContent(xml) n = d.firstChild() layer.readSymbology(n, '') self.setOutputValue(self.OUTPUT, filename) iface.mapCanvas().refresh()
def processAlgorithm(self, parameters, context, feedback): filename = self.getParameterValue(self.INPUT) layer = QgsProcessingUtils.mapLayerFromString(filename, context) style = self.getParameterValue(self.STYLE) if layer is None: dataobjects.load(filename, os.path.basename(filename), style=style) else: with open(style) as f: xml = "".join(f.readlines()) d = QDomDocument() d.setContent(xml) n = d.firstChild() layer.readSymbology(n, '') context.addLayerToLoadOnCompletion(self.getOutputFromName(self.OUTPUT).value) self.setOutputValue(self.OUTPUT, filename) layer.triggerRepaint()