Creazione plugin problema

classic Classic list List threaded Threaded
10 messages Options
Reply | Threaded
Open this post in threaded view
|

Creazione plugin problema

NicoPez
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
Reply | Threaded
Open this post in threaded view
|

Re: Creazione plugin problema

Luigi Pirelli-2
per esempio c'e'


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 <[hidden email]> 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.
_______________________________________________
[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+40 iscritti al 5.6.2014


_______________________________________________
[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+40 iscritti al 5.6.2014
Reply | Threaded
Open this post in threaded view
|

Re: Creazione plugin problema

NicoPez
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.. :)

grazie mille
Reply | Threaded
Open this post in threaded view
|

Re: Creazione plugin problema

mando
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 <[hidden email]> 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.. :)

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


_______________________________________________
[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+40 iscritti al 5.6.2014
Reply | Threaded
Open this post in threaded view
|

Re: Creazione plugin problema

NicoPez
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
Reply | Threaded
Open this post in threaded view
|

Re: Creazione plugin problema

mando
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 <[hidden email]> 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.
_______________________________________________
[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+40 iscritti al 5.6.2014


_______________________________________________
[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+40 iscritti al 5.6.2014
Reply | Threaded
Open this post in threaded view
|

Re: Creazione plugin problema

NicoPez
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.
Reply | Threaded
Open this post in threaded view
|

Re: Creazione plugin problema

mando
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

_______________________________________________
[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+40 iscritti al 5.6.2014
Reply | Threaded
Open this post in threaded view
|

Re: Creazione plugin problema

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

https://github.com/NicoPez/SearchParcelsDialog2

ora ci dovrebbe essere tutto il necessario..
fammi sapere e grazie mille!
Reply | Threaded
Open this post in threaded view
|

Re: Creazione plugin problema

mando
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 <[hidden email]> ha scritto:
Ciao, l'avevo fatto proprio con Plugin Builder. Scusami ma non avevo messo
tutto nella cartella... hai ragione e chiedo perdono! :D

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


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