Suite

Mise à jour d'une table attributaire ouverte

Mise à jour d'une table attributaire ouverte


La fenêtre de dialogue d'un plugin de travail en cours contient un rolodex qui permet à l'utilisateur de parcourir une série chronologique de données ; mettre à jour les géométries relatives des couches de mémoire à chaque nouvelle sélection de temps.

Le script ci-dessous est appelé lors du passage à une nouvelle sélection de temps. Même si elle met à jour la géométrie de la couche sans problème, la table attributaire de la couche (si elle est ouverte) est mise à jour avec 'ERREUR' pour toutes les valeurs de champ rechargées. Si la table est fermée et rouverte après chaque modification successive de la série temporelle, les mises à jour des valeurs de champ réussissent.

Existe-t-il un moyen de mettre à jour automatiquement une couche de mémoire constamment ouvert table attributaire basée sur l'interaction de l'utilisateur ?

updates = [] trackLayer.startEditing() pour groupIdx, group in enumerate(newPathGroups): pour pathIdx,path in enumerate(group): feature = QgsFeature() feature.setGeometry(QgsGeometry.fromPolyline(path)) feature.setAttributes([ self.groupNames[groupIdx][0],str(groupIdx+1), trackingRange, feature.geometry().length()]) trackProvider.addFeatures([feature]) trackLayer.commitChanges() trackLayer.reload() trackLayer .updateFields()

METTRE À JOUR:

Existe-t-il éventuellement un inverse de la fonction suivante, permettant à une somme de contrôle de voir si la table existante est ouverte, et si oui - supprimer et recharger ?

Bien que je préfère de loin accéder à un modèle de table attributaire ouvert existant et actualiser la source de données si possible…


Une sorte de porte dérobée - mais le code suivant accède (de manière sale) à l'instance de table attributaire existante, vérifie les valeurs d'en-tête par rapport à l'en-tête connu pour la couche en question, puis lors de l'authentification - supprime la table attributaire et rouvre après la mise à jour du contenu géométrique des couches mémoire.

Est-ce raisonnable ?

trackLayer = ftools_utils.getMapLayerByName(unicode('Particle_Tracks')) if trackLayer: # vérifier la table attributaire ouverte relative au tracklayer dockWindows = self.iface.mainWindow().findChildren(QtGui.QTableView) pour la fenêtre dans dockWindows: if window.objectName ()=='mTableView': tableModel = window.model().sourceModel() trackingTable = False headerCheck = ['GroupName','GroupNum','TimeRange','TrackLength'] pour headIdx,header in enumerate(headerCheck) : if tableModel.headerData(0,Qt.Horizontal,Qt.DisplayRole): trackingTable = True else: trackingTable = False # supprime le parent de la table, éliminant effectivement l'objet table si trackingTable: window.parent().parent().parent() .setParent(None) #supprimer les pistes existantes trackLayer.selectAll() trackProvider = trackLayer.dataProvider() trackProvider.deleteFeatures(trackLayer.selectedFeaturesIds()) trackLayer.removeSelection() # créer de nouvelles pistes trackingRange = self.TimeCombo.currentText(). replace("
"," ") trackLayer.startEditing() pour groupIdx, groupe en e numerate(newPathGroups): pour pathIdx,path in enumerate(group): feature = QgsFeature() feature.setGeometry(QgsGeometry.fromPolyline(path)) feature.setAttributes([self.groupNames[groupIdx][0],str(groupIdx+) 1), trackingRange, feature.geometry().length()]) trackProvider.addFeatures([feature]) trackLayer.commitChanges() trackLayer.reload() trackLayer.updateFields() essayez : # si la table attributaire de suivi était ouverte, rouvrir avec des données actualisées si trackingTable : self.iface.showAttributeTable(trackLayer) sauf : pass