[Gfoss] Creazione plugin problema

Buon pomeriggio a tutti. Mi sto cimentando per la prima volta con la
creazione di plugin e finora sono riuscito sempre a risolvere i problemi
"grazie" agli errori segnalati da QGIS al momento dell'avvio o quando vado a
far girare il plugin. Ora invece non mi da nessun errore, ma non il plugin
non elabora. Se vi incollo il codice, potreste aiutarmi e capire dove è il
problema? Fino alla "def search()" sembrava andare tutto come doveva. P.S.:
c'è un modo per fare il debug del codice fino ad un certo punto, oppure
eseguire il codice passo passo (come in VBA)? Grazie in anticipo!

from PyQt4 import QtCore, QtGui
from qgis.core import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.gui import *

from ui_searchparcels2 import Ui_SearchParcels2
# create the dialog for zoom to point

class SearchParcels2Dialog(QtGui.QDialog, Ui_SearchParcels2):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        self.setupUi(self)
        
        QObject.connect(self.uptadeButton, SIGNAL("clicked()"),
self.chooseLayer)
        QObject.connect(self.comboBox,
SIGNAL("currentIndexChanged(QString)"), self.chooseField)
        QObject.connect(self.comboBox,
SIGNAL("currentIndexChanged(QString)"), self.chooseField2)
        QObject.connect(self.selectBox, SIGNAL("stateChanged(int)"),
self.OnSelectBoxClicked)
        QObject.connect(self.cancelButton, SIGNAL("clicked()"),
self.cancelSearch)
        QObject.connect(self.goButton, SIGNAL("clicked()"), self.search)
        
        self.chooseLayer()

    # in first comboBox show the list of layers (list of names)
    def chooseLayer(self):
        layerList = # crea una lista vuota
        self.comboBox.clear() # svuota la lista del combo box
        layerList = self.getLayerNames() # a layerList assegna il
risultato della procedura getLayerNames()
        self.comboBox.addItems(layerList)
        self.FoglioLine.clear()
        self.ParticelLine.clear()
        self.OnSelectBoxClicked()
        return

    # Get the list of layers (list of names) in QgsMapLayerRegistry
    def getLayerNames(self):
        layermap = QgsMapLayerRegistry.instance().mapLayers() # assegna a
layermap l'insieme dei layers caricati
        layerLst =
        for i, layer in layermap.iteritems():
            if layer.type() == QgsMapLayer.VectorLayer: # considera solo
i layers vettoriali
                layerLst.append( unicode( layer.name() ) ) # prende il
nome di ogni layer a lo aggiunge alla lista layerLst
        return layerLst

    # in second comboBox show the list fields (list of names)
    def chooseField(self):
        fieldList =
        self.campo1.clear()
        fieldList = self.getFieldNames()
        self.campo1.addItems( fieldList )
        return

    # Get the list fields (list of names) for the selected layer
    def getFieldNames(self):
        layermap = QgsMapLayerRegistry.instance().mapLayers()
        fieldLst =
        for i, layer in layermap.iteritems():
            if layer.type() == QgsMapLayer.VectorLayer and layer.name() ==
self.comboBox.currentText():
                if layer.isValid():
                    fields = layer.dataProvider().fields()
                    for i in range(fields.count()):
                        field = fields[i]
                        fieldLst.append(field.name())
        return fieldLst

    # in third comboBox show the list fields (list of names)
    def chooseField2(self):
        fieldList =
        self.campo2.clear()
        fieldList = self.getFieldNames()
        self.campo2.addItems( fieldList )
        return

    def OnSelectBoxClicked(self):
        layermap = QgsMapLayerRegistry.instance().mapLayers()
        for i, layer in layermap.iteritems():
            if layer.type() == QgsMapLayer.VectorLayer and layer.name() ==
self.comboBox.currentText():
                if layer.isValid():
                    if not self.selectBox.isChecked():
                        self.panBox.setEnabled(False)
                        self.scaleBox.setEnabled(False)
                    else:
                        self.panBox.setEnabled(layer.hasGeometryType())
                        self.scaleBox.setEnabled(layer.hasGeometryType())
        return

    def cancelSearch(self):
        self.continueSearch = False
        return

    def search(self):
        i = self.comboBox.currentIndex()
        if i < 0:
            return None
        layerId = self.comboBox.itemData(i)
        layer = QgsMapLayerRegistry.instance().mapLayer(layerId)
        if layer is None:
            return
        toFind = self.FoglioLine.text()
        toFind2 = self.ParticelLine.text()
        f = QgsFeature()
        results =
        fieldIndex = self.campo1.currentIndex()
        fieldName = self.campo1.itemData(fieldIndex)
        fieldIndex2 = self.campo2.currentIndex()
        fieldName2 = self.campo2.itemData(fieldIndex2)
        if fieldName == "" or fieldName2 == "":
            QMessageBox
            msgBox.setText("Search Parcels 2: Seleziona un campo.")
            msgBox.exec_()
            return
        try:
            float(toFind)
        except ValueError:
            QMessageBox
            msgBox.setText("Search Parcels 2: Inserisci un valore
numerico.")
            msgBox.exec_()
            return
        try:
            float(toFind2)
        except ValueError:
            QMessageBox
            msgBox.setText("Search Parcels 2: Inserisci un valore
numerico.")
            msgBox.exec_()
            return
         show progress bar
        self.progressBar.setMinimum(0)
        self.progressBar.setMaximum(layer.featureCount())
        self.progressBar.setValue(0)
        self.widget_2.show()
        # disable rest of UI
        self.layerWidgetGroup.setEnabled(False)
        self.SearchWidgetGroup.setEnabled(False)
        self.CheckWidgetGroup.setEnabled(False)
        # create feature request
        featReq = QgsFeatureRequest()
        featReq.setFlags(QgsFeatureRequest.NoGeometry)
        Req = featReq.setSubsetOfAttributes([fieldIndex])
        Re2 = featReq.setSubsetOfAttributes([fieldIndex2])
        iter = layer.getFeatures(featReq)
        # process
        k = 0
        n = 0
        self.continueSearch = True
        while iter.nextFeature(f) and self.continueSearch:
            k += 1
            if self.evaluate(f[fieldName], toFind):
                results.append(f.id())
        f2 = QgisFeature(f.id())
        while iter.nextFeature(f2) and self.continueSearh:
            n += 1
            if self.evaluate(f[fieldName2], toFind2):
                results2.append(f2.id())
            self.progressBar.setValue(n)
            QCoreApplication.processEvents()
        # reset UI
        self.widget_2.hide()
        self.layerWidgetGroup.setEnabled(True)
        self.SearchWidgetGroup.setEnabled(True)
        self.CheckWidgetGroup.setEnabled(True)
        # process results
        if self.continueSearch:
            QMessageBox
            msgBox.setText("Search Parcels 2: %u particelle trovate.")
            msgBox.exec_()
            self.processResults(results2)
        return

    def evaluate(self, v1, v2):
        return float(v1) == float(v2)

    def processResults(self, results2):
        if layer is None:
            return
        if self.selectBox.isChecked():
            layer.setSelectedFeatures(results2)
            if len(results2) == 0:
                return

            if self.panBox.isEnabled() and self.panBox.isChecked():
                canvas = self.iface.mapCanvas()
                rect = canvas.mapRenderer().layerExtentToOutputExtent(layer,
layer.boundingBoxOfSelected())
                if rect is not None:
                    if self.scaleBox.isEnabled() and
self.scaleBox.isChecked():
                        rect.scale(1.5)
                        canvas.setExtent(rect)
                    else:
                        canvas.setExtent(QgsRectangle(rect.center(),
rect.center()))
                canvas.refresh()
        if self.formBox.isChecked():
            f = QgsFeature()
            for id in results2:
                if
layer.getFeatures(QgsFeatureRequest().setFilterFid(id)).nextFeature(f):
                    self.IdentifyResult(layer, f)
        return

--
View this message in context: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/Creazione-plugin-problema-tp7588499.html
Sent from the Gfoss -- Geographic Free and Open Source Software - Italian mailing list mailing list archive at Nabble.com.

per esempio c’e’

https://github.com/sourcepole/qgis-remote-debug

non lo trovi nel repo dei plugin e non saprei dire perche’… morale clonati il repo nella directory dei plugin e segui le istruzioni del readme

ciao Luigi Pirelli

···

On 23 June 2014 14:51, NicoPez <nico.pezzotta@gmail.com> wrote:

Buon pomeriggio a tutti. Mi sto cimentando per la prima volta con la
creazione di plugin e finora sono riuscito sempre a risolvere i problemi
“grazie” agli errori segnalati da QGIS al momento dell’avvio o quando vado a
far girare il plugin. Ora invece non mi da nessun errore, ma non il plugin
non elabora. Se vi incollo il codice, potreste aiutarmi e capire dove è il
problema? Fino alla “def search()” sembrava andare tutto come doveva. P.S.:
c’è un modo per fare il debug del codice fino ad un certo punto, oppure
eseguire il codice passo passo (come in VBA)? Grazie in anticipo!

from PyQt4 import QtCore, QtGui
from qgis.core import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.gui import *

from ui_searchparcels2 import Ui_SearchParcels2

create the dialog for zoom to point

class SearchParcels2Dialog(QtGui.QDialog, Ui_SearchParcels2):
def init(self):
QtGui.QDialog.init(self)
self.setupUi(self)

QObject.connect(self.uptadeButton, SIGNAL(“clicked()”),
self.chooseLayer)
QObject.connect(self.comboBox,
SIGNAL(“currentIndexChanged(QString)”), self.chooseField)
QObject.connect(self.comboBox,
SIGNAL(“currentIndexChanged(QString)”), self.chooseField2)
QObject.connect(self.selectBox, SIGNAL(“stateChanged(int)”),
self.OnSelectBoxClicked)
QObject.connect(self.cancelButton, SIGNAL(“clicked()”),
self.cancelSearch)
QObject.connect(self.goButton, SIGNAL(“clicked()”), self.search)

self.chooseLayer()

in first comboBox show the list of layers (list of names)

def chooseLayer(self):
layerList = # crea una lista vuota
self.comboBox.clear() # svuota la lista del combo box
layerList = self.getLayerNames() # a layerList assegna il
risultato della procedura getLayerNames()
self.comboBox.addItems(layerList)
self.FoglioLine.clear()
self.ParticelLine.clear()
self.OnSelectBoxClicked()
return

Get the list of layers (list of names) in QgsMapLayerRegistry

def getLayerNames(self):
layermap = QgsMapLayerRegistry.instance().mapLayers() # assegna a
layermap l’insieme dei layers caricati
layerLst =
for i, layer in layermap.iteritems():
if layer.type() == QgsMapLayer.VectorLayer: # considera solo
i layers vettoriali
layerLst.append( unicode( layer.name() ) ) # prende il
nome di ogni layer a lo aggiunge alla lista layerLst
return layerLst

in second comboBox show the list fields (list of names)

def chooseField(self):
fieldList =
self.campo1.clear()
fieldList = self.getFieldNames()
self.campo1.addItems( fieldList )
return

Get the list fields (list of names) for the selected layer

def getFieldNames(self):
layermap = QgsMapLayerRegistry.instance().mapLayers()
fieldLst =
for i, layer in layermap.iteritems():
if layer.type() == QgsMapLayer.VectorLayer and layer.name() ==
self.comboBox.currentText():
if layer.isValid():
fields = layer.dataProvider().fields()
for i in range(fields.count()):
field = fields[i]
fieldLst.append(field.name())
return fieldLst

in third comboBox show the list fields (list of names)

def chooseField2(self):
fieldList =
self.campo2.clear()
fieldList = self.getFieldNames()
self.campo2.addItems( fieldList )
return

def OnSelectBoxClicked(self):
layermap = QgsMapLayerRegistry.instance().mapLayers()
for i, layer in layermap.iteritems():
if layer.type() == QgsMapLayer.VectorLayer and layer.name() ==
self.comboBox.currentText():
if layer.isValid():
if not self.selectBox.isChecked():
self.panBox.setEnabled(False)
self.scaleBox.setEnabled(False)
else:
self.panBox.setEnabled(layer.hasGeometryType())
self.scaleBox.setEnabled(layer.hasGeometryType())
return

def cancelSearch(self):
self.continueSearch = False
return

def search(self):
i = self.comboBox.currentIndex()
if i < 0:
return None
layerId = self.comboBox.itemData(i)
layer = QgsMapLayerRegistry.instance().mapLayer(layerId)
if layer is None:
return
toFind = self.FoglioLine.text()
toFind2 = self.ParticelLine.text()
f = QgsFeature()
results =
fieldIndex = self.campo1.currentIndex()
fieldName = self.campo1.itemData(fieldIndex)
fieldIndex2 = self.campo2.currentIndex()
fieldName2 = self.campo2.itemData(fieldIndex2)
if fieldName == “” or fieldName2 == “”:
QMessageBox
msgBox.setText(“Search Parcels 2: Seleziona un campo.”)
msgBox.exec_()
return
try:
float(toFind)
except ValueError:
QMessageBox
msgBox.setText(“Search Parcels 2: Inserisci un valore
numerico.”)
msgBox.exec_()
return
try:
float(toFind2)
except ValueError:
QMessageBox
msgBox.setText(“Search Parcels 2: Inserisci un valore
numerico.”)
msgBox.exec_()
return
show progress bar
self.progressBar.setMinimum(0)
self.progressBar.setMaximum(layer.featureCount())
self.progressBar.setValue(0)
self.widget_2.show()

disable rest of UI

self.layerWidgetGroup.setEnabled(False)
self.SearchWidgetGroup.setEnabled(False)
self.CheckWidgetGroup.setEnabled(False)

create feature request

featReq = QgsFeatureRequest()
featReq.setFlags(QgsFeatureRequest.NoGeometry)
Req = featReq.setSubsetOfAttributes([fieldIndex])
Re2 = featReq.setSubsetOfAttributes([fieldIndex2])
iter = layer.getFeatures(featReq)

process

k = 0
n = 0
self.continueSearch = True
while iter.nextFeature(f) and self.continueSearch:
k += 1
if self.evaluate(f[fieldName], toFind):
results.append(f.id())
f2 = QgisFeature(f.id())
while iter.nextFeature(f2) and self.continueSearh:
n += 1
if self.evaluate(f[fieldName2], toFind2):
results2.append(f2.id())
self.progressBar.setValue(n)
QCoreApplication.processEvents()

reset UI

self.widget_2.hide()
self.layerWidgetGroup.setEnabled(True)
self.SearchWidgetGroup.setEnabled(True)
self.CheckWidgetGroup.setEnabled(True)

process results

if self.continueSearch:
QMessageBox
msgBox.setText(“Search Parcels 2: %u particelle trovate.”)
msgBox.exec_()
self.processResults(results2)
return

def evaluate(self, v1, v2):
return float(v1) == float(v2)

def processResults(self, results2):
if layer is None:
return
if self.selectBox.isChecked():
layer.setSelectedFeatures(results2)
if len(results2) == 0:
return

if self.panBox.isEnabled() and self.panBox.isChecked():
canvas = self.iface.mapCanvas()
rect = canvas.mapRenderer().layerExtentToOutputExtent(layer,
layer.boundingBoxOfSelected())
if rect is not None:
if self.scaleBox.isEnabled() and
self.scaleBox.isChecked():
rect.scale(1.5)
canvas.setExtent(rect)
else:
canvas.setExtent(QgsRectangle(rect.center(),
rect.center()))
canvas.refresh()
if self.formBox.isChecked():
f = QgsFeature()
for id in results2:
if
layer.getFeatures(QgsFeatureRequest().setFilterFid(id)).nextFeature(f):
self.IdentifyResult(layer, f)
return


View this message in context: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/Creazione-plugin-problema-tp7588499.html
Sent from the Gfoss – Geographic Free and Open Source Software - Italian mailing list mailing list archive at Nabble.com.


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+40 iscritti al 5.6.2014

Ciao Luigi.. scusami se rispondo solo ora, ma ho avuto altri impegni e poi mi
sono rimesso sopra a questo plugin, ma proprio non ne vengo fuori. Credo di
aver avuto problemi con l'installazione del qgis-remote-debug. Anzi, penso
di averlo installato correttamente, ma non riesco a farlo interagire con il
plugin.. non trovo proprio la soluzione.

Se lo hai già utilizzato con ottimi risultati, non è che potresti aiutarmi
passo passo nella procedura di debug? Scusa se ti chiedo così tanto.. :slight_smile:

grazie mille

--
View this message in context: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/Creazione-plugin-problema-tp7588499p7588960.html
Sent from the Gfoss -- Geographic Free and Open Source Software - Italian mailing list mailing list archive at Nabble.com.

Ciao NicoPez, se metti su github il plugin, magari lo posso clonare e dare un occhio a dove si pianta.

Fammi sapere!
Ciao
Luca

···

Il giorno 23 luglio 2014 11:40, NicoPez <nico.pezzotta@gmail.com> ha scritto:

Ciao Luigi… scusami se rispondo solo ora, ma ho avuto altri impegni e poi mi
sono rimesso sopra a questo plugin, ma proprio non ne vengo fuori. Credo di
aver avuto problemi con l’installazione del qgis-remote-debug. Anzi, penso
di averlo installato correttamente, ma non riesco a farlo interagire con il
plugin… non trovo proprio la soluzione.

Se lo hai già utilizzato con ottimi risultati, non è che potresti aiutarmi
passo passo nella procedura di debug? Scusa se ti chiedo così tanto… :slight_smile:

grazie mille


View this message in context: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/Creazione-plugin-problema-tp7588499p7588960.html

Sent from the Gfoss – Geographic Free and Open Source Software - Italian mailing list mailing list archive at Nabble.com.


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+40 iscritti al 5.6.2014

Ciao Luca. Non so se ho fatto le cose in modo corretto, visto che non
conoscevo quel sito che mi avevi detto.. ma il link al codice dovrebbe
essere questo:

https://github.com/NicoPez/SearchParcelsDialog2

--
View this message in context: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/Creazione-plugin-problema-tp7588499p7588963.html
Sent from the Gfoss -- Geographic Free and Open Source Software - Italian mailing list mailing list archive at Nabble.com.

Primo domandone: hai provato ad usare il query builder di Qgis per realizzare il plugin in modo da avere subito una struttura corretta?

···

Il giorno 23 luglio 2014 12:07, NicoPez <nico.pezzotta@gmail.com> ha scritto:

Ciao Luca. Non so se ho fatto le cose in modo corretto, visto che non
conoscevo quel sito che mi avevi detto… ma il link al codice dovrebbe
essere questo:

https://github.com/NicoPez/SearchParcelsDialog2


View this message in context: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/Creazione-plugin-problema-tp7588499p7588963.html

Sent from the Gfoss – Geographic Free and Open Source Software - Italian mailing list mailing list archive at Nabble.com.


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+40 iscritti al 5.6.2014

Per rifarmi alla struttura corretta, visto che è il primo plugin che faccio,
mi sono basato sui codici di due plugin:
Quick Finder e Value Classifier (che non funziona su questa versione di QGIS
ma era solo per capire come venivano impostati i richiami visto che Quick
Finder era molto più complesso nella sua costruzione).

Diciamo che il codice (e quindi la gui) mi funziona fino al momento del
Go_Button. Quando vado a fare quell'operazione nella Gui non mi si attiva
l'elaborazione.. sicuramente sbaglio qualcosa.. non so.

--
View this message in context: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/Creazione-plugin-problema-tp7588499p7588978.html
Sent from the Gfoss -- Geographic Free and Open Source Software - Italian mailing list mailing list archive at Nabble.com.

Non mi carica il plugin perchè dice progettato per la versione 1.x di Qgis,
credo perchè manchino i metadata.txt. Installa il plugin builder, ricrea il
tutto e poi ricaricalo su github, così posso fare i test.

Fa sapere
Ciaoo!
Luca

Ciao, l'avevo fatto proprio con Plugin Builder. Scusami ma non avevo messo
tutto nella cartella... hai ragione e chiedo perdono! :smiley:

https://github.com/NicoPez/SearchParcelsDialog2

ora ci dovrebbe essere tutto il necessario..
fammi sapere e grazie mille!

--
View this message in context: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/Creazione-plugin-problema-tp7588499p7588981.html
Sent from the Gfoss -- Geographic Free and Open Source Software - Italian mailing list mailing list archive at Nabble.com.

Per non tediare la lista e per chi vuol seguire la cosa, direi di passare su github con i suoi strumenti. https://github.com/NicoPez/SearchParcelsDialog2/issues/1

···

Il giorno 24 luglio 2014 11:24, NicoPez <nico.pezzotta@gmail.com> ha scritto:

Ciao, l’avevo fatto proprio con Plugin Builder. Scusami ma non avevo messo
tutto nella cartella… hai ragione e chiedo perdono! :smiley:

https://github.com/NicoPez/SearchParcelsDialog2

ora ci dovrebbe essere tutto il necessario…
fammi sapere e grazie mille!


View this message in context: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/Creazione-plugin-problema-tp7588499p7588981.html

Sent from the Gfoss – Geographic Free and Open Source Software - Italian mailing list mailing list archive at Nabble.com.


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+40 iscritti al 5.6.2014