[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

Ciao Giuliano,

···

2014-04-18 19:23 GMT+02:00 giulianc51 <giulianc51@gmail.com>:

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


Gfoss@lists.gfoss.it
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

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) :slight_smile:

Il giorno Sat, 19 Apr 2014 08:19:06 +0100 (BST)
Matteo De Stefano <matteo_destefano@yahoo.it> 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 <lrssvtml@gmail.com> 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 :slight_smile:

Buona Pasqua!

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

Il giorno Sat, 19 Apr 2014 10:18:41 +0200
Salvatore Larosa <lrssvtml@gmail.com> 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 :frowning:

grazie mille, ciao,
giuliano

Ciao Giuliano,

···

2014-04-22 15:27 GMT+02:00 giulianc51 <giulianc51@gmail.com>:

Il giorno Sat, 19 Apr 2014 10:18:41 +0200
Salvatore Larosa <lrssvtml@gmail.com> 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

[0] - http://codepad.org/S1xL9HLd

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

grazie mille, ciao,

giuliano


Gfoss@lists.gfoss.it
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