pyqgis: layer.getFeatures()

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

pyqgis: layer.getFeatures()

Giuliano Curti
ciao a tutti,


provo a porre quì un quesito che riguarda (py)qgis;

volevo prevedere in un plugin, durante il trattamento di layer di
dimensione importante, la stampa di un contatore per dare all'utente il
senso dell'esecuzione in corso, a mò di progress bar; mi scontro però
con un comportamento, per me inatteso, del comando in oggetto;

mi aspettavo dall'esecuzione dei comandi (verificabile anche da console
python):
        i = 0
        for f in layer.getFeatures():
                i +=1
                print i
una visualizzazione progressiva (ho controllato di non aver posto una
virgola in fondo al comando print); invece sembra che il ciclo FOR
catturi il sistema e solo alla fine vi è la stampa quasi immediata di
tutta la sequenza;

sto sbagliando qualcosa senza accorgermene ?

grazie, ciao,
giuliano
 
_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
666 iscritti al 22.7.2013
Reply | Threaded
Open this post in threaded view
|

Re: pyqgis: layer.getFeatures()

Matteo De Stefano
Ciao,

azzardo una risposta:

credo che sia semplicemente per il fatto che layer.getfFeatures() restituisce un oggetto di tipo "iterator". Gli oggetti iterator si comportano in modo particolare, e all'interno di un ciclo for tutti gli elementi vengono elaborati in modo automatico. Credo che sia questo il motivo del comportamento che hai osservato.

Ti aggiungo un link che descrive gli iterator:

http://stackoverflow.com/questions/9884132/understanding-pythons-iterator-iterable-and-iteration-protocols-what-exact

Matteo


Da: giulianc51 <[hidden email]>
A: lista Gfoss <[hidden email]>
Inviato: Venerdì 18 Aprile 2014 19:23
Oggetto: [Gfoss] pyqgis: layer.getFeatures()

ciao a tutti,


provo a porre quì un quesito che riguarda (py)qgis;

volevo prevedere in un plugin, durante il trattamento di layer di
dimensione importante, la stampa di un contatore per dare all'utente il
senso dell'esecuzione in corso, a mò di progress bar; mi scontro però
con un comportamento, per me inatteso, del comando in oggetto;

mi aspettavo dall'esecuzione dei comandi (verificabile anche da console
python):
    i = 0
    for f in layer.getFeatures():
        i +=1
        print i
una visualizzazione progressiva (ho controllato di non aver posto una
virgola in fondo al comando print); invece sembra che il ciclo FOR
catturi il sistema e solo alla fine vi è la stampa quasi immediata di
tutta la sequenza;

sto sbagliando qualcosa senza accorgermene ?

grazie, ciao,
giuliano

_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
666 iscritti al 22.7.2013


_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
666 iscritti al 22.7.2013
Reply | Threaded
Open this post in threaded view
|

Re: pyqgis: layer.getFeatures()

Salvatore Larosa
In reply to this post by Giuliano Curti
Ciao Giuliano,

2014-04-18 19:23 GMT+02:00 giulianc51 <[hidden email]>:
ciao a tutti,


provo a porre quì un quesito che riguarda (py)qgis;

volevo prevedere in un plugin, durante il trattamento di layer di
dimensione importante, la stampa di un contatore per dare all'utente il
senso dell'esecuzione in corso, a mò di progress bar; mi scontro però
con un comportamento, per me inatteso, del comando in oggetto;

mi aspettavo dall'esecuzione dei comandi (verificabile anche da console
python):
        i = 0
        for f in layer.getFeatures():
                i +=1
                print i
una visualizzazione progressiva (ho controllato di non aver posto una
virgola in fondo al comando print); invece sembra che il ciclo FOR
catturi il sistema e solo alla fine vi è la stampa quasi immediata di
tutta la sequenza;


eseguendo il codice nella console python di QGIS, tu dovresti vedere ogni singolo
elemento del layer, in modo continuo, senza aspettare la fine del ciclo.
 

sto sbagliando qualcosa senza accorgermene ?


No :-), basta sostituire il "print" con "emit()". Puoi definire un metodo che aggiorni la tua barra progressiva poi nel ciclo richiami il segnale connesso al metodo. Dovrebbe funzionare!


Buona Pasqua!
 

grazie, ciao,
giuliano

_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
666 iscritti al 22.7.2013



--
Salvatore Larosa
linkedIn: http://linkedin.com/in/larosasalvatore
twitter: @lrssvt
skype: s.larosa
IRC: lrssvt on freenode

_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
666 iscritti al 22.7.2013
Reply | Threaded
Open this post in threaded view
|

Re: pyqgis: layer.getFeatures()

Giuliano Curti
ciao Matteo e Salvatore,

rspondo quì ad entrambi perchè spero si capisca lo stesso senza
duplicare traffico (e senza infrangere qualche regola di buona
educazione, spero) :-)


Il giorno Sat, 19 Apr 2014 08:19:06 +0100 (BST)
Matteo De Stefano <[hidden email]> ha scritto:

> .....
> ma in effetti comunque il tuo ciclo dovrebbe comportarsi come un
> normale ciclo for,.....
> ...... La progress bar che avevi in mente servirebbe solo
> per contare il numero delle features, durante un'operazione di
> conteggio delle stesse? questo perchè layer.featureCount() quando
> provi a lanciarlo su un layer molto corposo è troppo lento? E la bar
> servirebbe a mostrare che il lavoro di conteggio procede? ....

mi serve a dare all'utente indicazione dello stato di svolgimento del
lavoro e uso anche featureCount(): vorrei fornire l'informazione
xxxxx(fatti)/yyyyy(totali); per evitare le complessità dell'uso di un
widget che conosco poco mi limitavo ad usare un print nella console;


Il giorno Sat, 19 Apr 2014 10:18:41 +0200
Salvatore Larosa <[hidden email]> ha scritto:

> .....
> > .....
>
>
> eseguendo il codice nella console python di QGIS, tu dovresti vedere
> ogni singolo
> elemento del layer, in modo continuo, senza aspettare la fine del
> ciclo.

ed invece no, almeno per le prove che ho fatto (spero senza sbagliare);

 
> ..... basta sostituire il "print" con "emit()". Puoi definire un
> metodo che aggiorni la tua barra progressiva poi nel ciclo richiami
> il segnale connesso al metodo. Dovrebbe funzionare!

non lo conoscevo, mi documenterò e proverò, grazie :-)


> Buona Pasqua!

per ricambiare credo sia un pò troppo tardi, comunque vi ringrazio
tantissimo per la cortesia che avete avuto, ciao,
giuliano


_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
666 iscritti al 22.7.2013
Reply | Threaded
Open this post in threaded view
|

Re: pyqgis: layer.getFeatures()

Giuliano Curti
In reply to this post by Salvatore Larosa
Il giorno Sat, 19 Apr 2014 10:18:41 +0200
Salvatore Larosa <[hidden email]> ha scritto:

> Ciao Giuliano,

ciao Salvatore,
e scusa se (ri)rompo, ma pensavo di aver capito e invece.....

 
> ...... basta sostituire il "print" con "emit()".

la semplice sostituzione di emit() al print mi dà:
        "NameError: name 'emit' is not defined";

ho guardato un pò meglio ed ho visto che il comando è collegato con
oggetti / segnali / slot, ma non riesco a individuare l'oggetto/segnale
da interrogare: la mia necessità è semplicemente quella di stampare una
variabile autoincrementante all'interno di un loop per documentarne lo
stato: qualche altro hint ?

(ho provato ad eseguire il loop sul dataProvider anzichè sul layer, ma
il comportamento sembra identico :-(


grazie mille, ciao,
giuliano
_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
666 iscritti al 22.7.2013
Reply | Threaded
Open this post in threaded view
|

Re: pyqgis: layer.getFeatures()

Salvatore Larosa
Ciao Giuliano,

2014-04-22 15:27 GMT+02:00 giulianc51 <[hidden email]>:
Il giorno Sat, 19 Apr 2014 10:18:41 +0200
Salvatore Larosa <[hidden email]> ha scritto:

> Ciao Giuliano,

ciao Salvatore,
e scusa se (ri)rompo, ma pensavo di aver capito e invece.....


> ...... basta sostituire il "print" con "emit()".

la semplice sostituzione di emit() al print mi dà:
        "NameError: name 'emit' is not defined";

si hai ragione, dovevo spendere qualche parola in più :-). emit() richiama un segnale che deve essere
deifnito in qualche parte nel codice.
 

ho guardato un pò meglio ed ho visto che il comando è collegato con
oggetti / segnali / slot, ma non riesco a individuare l'oggetto/segnale
da interrogare: la mia necessità è semplicemente quella di stampare una
variabile autoincrementante all'interno di un loop per documentarne lo
stato: qualche altro hint ?

in questo esempio [0] trovi in codice quello che volevo dire. Il metodo status() aggiorna la progressbar ed è connesso al segnale "mySignal".
Dovrebbe essere sufficicente e forse più chiaro :-). Puoi lanciarlo dalla console python QGIS.

Saluti,
-SL

(ho provato ad eseguire il loop sul dataProvider anzichè sul layer, ma
il comportamento sembra identico :-(


grazie mille, ciao,
giuliano
_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
666 iscritti al 22.7.2013



--
Salvatore Larosa
linkedIn: http://linkedin.com/in/larosasalvatore
twitter: @lrssvt
skype: s.larosa
IRC: lrssvt on freenode

_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
666 iscritti al 22.7.2013