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 |
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 _______________________________________________ [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 |
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 |
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 _______________________________________________ [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 |
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 |
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 _______________________________________________ [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 |
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. |
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 |
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! |
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 _______________________________________________ [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 |
Free forum by Nabble | Edit this page |