[Gfoss] Creazione plugin problema

NicoPez nico.pezzotta a gmail.com
Lun 23 Giu 2014 14:51:22 CEST


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.


Maggiori informazioni sulla lista Gfoss