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

Reply via email to