On Fri, 14 Jun 2019 at 09:54, Ivan Ivanov <[email protected]> wrote: > > Okay, thanks, all clear now. > > Maybe documenting that setDataSource is useless in case of memory layers > would prevent future questions like this. > Thanks again!
Sure -- pull requests with code documentation notes like this will always be very welcome! (Send them in *whenever* you hit anything you think "that should have been mentioned in the API docs") Nyall > > On Fri, 14 Jun 2019 at 01:49, Nyall Dawson <[email protected]> wrote: >> >> On Fri, 14 Jun 2019 at 09:41, Ivan Ivanov <[email protected]> wrote: >> > >> > Hi, Nyall, >> > >> > I'm developing a plugin with a lot of internal layers, that are being >> > (re)created on user interaction. >> > >> > There are multiple event listeners attached to a layer, as well as passed >> > around to different functions and might have custom styles. At some point, >> > I want to replace the layer entirely with another one (result from an >> > algorithm). >> > >> > To solve this, I came up with three solutions, maybe there are more: >> > One option to achieve this is to copy all the features from the new layer >> > and put them in the first one, but the layers might be very big and I'm >> > afraid it would be a problem. >> > The second option that I'm currently using is to recreate all the event >> > listeners on the new layer and replace it from the layer tree. This is >> > okayish and it works. >> > The third option is to set a new data source, as I thought it's the most >> > optimal one, however, when the layer has two uids it's practically broken. >> >> Well, this approach will work perfectly fine for everything BUT memory >> layers. The features from memory layers can't be shared between two >> layers, so resetting the data source here really doesn't have any >> meaning. There's just no way to duplicate a memory layer except for >> copy all the features and adding to a new layer. >> >> Nyall >> >> > >> > I got some inspiration from here: >> > https://github.com/enricofer/changeDataSource/blob/master/setdatasource.py#L175-L206 >> > directly editing the XML but the result is the same - double ids. I >> > checked this plugin because I'm sure it used to work in 3.2 (currently >> > having 3.6.3 on Ubuntu). >> > >> > Best, >> > Ivan >> > >> > >> > >> > On Fri, 14 Jun 2019 at 01:21, Nyall Dawson <[email protected]> wrote: >> >> >> >> On Wed, 12 Jun 2019 at 10:09, Ivan Ivanov <[email protected]> wrote: >> >> > >> >> > I fixed it. Sorry for the inconvenience: >> >> > >> >> > layer1 = QgsVectorLayer('Polygon?crs=epsg:32612', 'layer2', 'memory') >> >> > layer2 = QgsVectorLayer('Polygon?crs=epsg:32612', 'layer1', 'memory') >> >> > >> >> > print(layer1.source()) >> >> > print(layer2.source()) >> >> > layer1.setDataSource(layer2.source(), layer2.name(), >> >> > layer2.dataProvider().name()) >> >> > print(layer1.source()) >> >> >> >> I agree that the results of this output look odd - but what exactly >> >> are you trying to achieve here? >> >> >> >> Nyall >> >> >> >> > >> >> > On Wed, 12 Jun 2019 at 00:28, Nyall Dawson <[email protected]> >> >> > wrote: >> >> >> >> >> >> On Tue, 11 Jun 2019 at 15:06, Ivan Ivanov <[email protected]> wrote: >> >> >> > >> >> >> > Hello, >> >> >> > >> >> >> > >> >> >> > Can you give me some idea why I'm getting two uids in the layer's >> >> >> > source? And also how I can fix this because now the layer just >> >> >> > disappears from the map canvas. (all layers are isValid() = True) >> >> >> > >> >> >> > oldLayer.source() >> >> >> > # >> >> >> > MultiLineString?crs=EPSG:32737&field=fid:integer(0,0)&uid={6cd1f176-9c05-4d2a-961a-3143a8fa422b} >> >> >> > >> >> >> > newLayer = processing.run('save:selectedfeatures', { >> >> >> > 'INPUT': oldLayer, >> >> >> > 'OUTPUT': 'memory:newLayer' >> >> >> > ) >> >> >> > >> >> >> > oldLayer.setDataSource(newLayer.source(), oldLayer.name(), >> >> >> > newLayer.dataProvider().name()) >> >> >> > >> >> >> > newLayer.source() >> >> >> > # >> >> >> > MultiLineString?crs=EPSG:32737&field=fid:integer(0,0)&uid={d36aff88-4248-4ffb-be2f-2ac1891ac26d} >> >> >> > oldLayer.source() >> >> >> > >> >> >> > # WRONG, I would expect the same as above. Also, the uid is >> >> >> > completely new. >> >> >> > # >> >> >> > MultiLineString?crs=EPSG:32737&field=fid:integer(0,0)&uid={d36aff88-4248-4ffb-be2f-2ac1891ac26d}&uid={3422de07-cf38-4249-af55-23c7d9779daf} >> >> >> >> >> >> Hi Ivan, >> >> >> >> >> >> Your code seems incomplete and has some syntax errors -- maybe it >> >> >> wasn't copied correctly? Can you repost please? >> >> >> >> >> >> Nyall _______________________________________________ QGIS-Developer mailing list [email protected] List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer
