Message posté par : Francois Hebrard
----------------------------------------
Bonjour,
J'ai commencé par développer une extension en python sur QGIS. Je suis parti de la
base de "Plug-in Builder" à laquelle j'ai ajouté des fonctions créé par le
modèle builder (exporter le code python à partir du modeleur). le programme python est un
peu gros, du coup, je ne vais pas le copier ici, mais j'ai un petit souci qui vient
sûrement de la fonction run de la fonction principale.
-----------------
Code :
def display_point(self, point):
# report map coordinates from a canvas click
coords = "{}, {}".format(point.x(), point.y())
self.dlg.lineEditXYEcole.setText(str(coords))
def montrerFenetre(self):
self.dlg.show()
def boutonPointer(self):
# a reference to our map canvas
canvas = self.iface.mapCanvas()
# this QGIS tool emits as QgsPoint after each click on the map canvas
self.pointTool = QgsMapToolEmitPoint(canvas)
# cacher la fenêtre
self.dlg.hide()
#cliquer le point et afficher les coordonnées
self.pointTool.canvasClicked.connect(self.display_point)
canvas.setMapTool(self.pointTool)
#remettre la fenêtre
self.pointTool.canvasClicked.connect(self.montrerFenetre)
def run(self):
"""Run method that performs all the real work"""
# Create the dialog with elements (after translation) and keep reference
# Only create GUI ONCE in callback, so that it will only load when the plugin is
started
if self.first_start == True:
self.first_start = False
self.dlg = CheminementEcoleDialog()
# les fonctions liés aux boutons
self.dlg.parcourirSortieCheminement.clicked.connect(self.sortieCheminements)
self.dlg.parcourirSortieFinale.clicked.connect(self.sortieFinale)
self.dlg.parcourirCouche.clicked.connect(self.aj_fichier_combo_box)
self.dlg.parcourirReseauRoutier.clicked.connect(self.aj_fichier_combo_box)
self.dlg.pointerXYEcole.clicked.connect(self.boutonPointer)
# Fetch the currently loaded layers
layers = QgsProject.instance().layerTreeRoot().children()
# Clear the contents of the comboBox from previous runs
self.dlg.selectCouche.clear()
self.dlg.ReseauRoutierComboBox.clear()
# Populate the comboBox with names of all the loaded layers
self.dlg.selectCouche.addItems([layer.name() for layer in layers])
self.dlg.ReseauRoutierComboBox.addItems([layer.name() for layer in layers])
# show the dialog
self.dlg.show()
# Run the dialog event loop
result = self.dlg.exec_()
# See if OK was pressed
if result:
# traitement traité grâce aux fonctions crées par le modeleur graphique
#coordonnées de l'école pointer
coordonnees = self.dlg.lineEditXYEcole.text()
xy = coordonnees.split(', ')
pointXYEcole = QgsPointXY(float(xy[0]),float(xy[1]))
#Reseau routier pour calculer les chemins les plus courts
reseauRoutier = self.dlg.ReseauRoutierComboBox.currentText()
#adresses des élèves
adresseEleves = self.dlg.selectCouche.currentText()
#sortie cheminement
filename_sortie_cheminement = self.dlg.lineEditSortieCheminements.text()
#sortie finale du fichier
filename_sortie_finale = self.dlg.lineEditSortieFinale.text()
parameters = {
'coordonnescole': pointXYEcole, #point de départ
'Rseauroutier': reseauRoutier, #réseau routier
'AdressesEleves': adresseEleves, #adresses élèves
'sortieCheminement' : filename_sortie_cheminement, # Chemins vers
l'école
'sortieFinale': filename_sortie_finale #sortie finale
}
## traitement
fx._nb_eleves_par_tronon.processAlgorithm(parameters=parameters)
## sortie de la couche cheminement
with open(filename_sortie_cheminement, 'w') as output_file:
selectedLayerIndex = self.dlg.selectCouche.currentIndex()
selectedLayer = layers[selectedLayerIndex].layer()
fieldnames = [field.name() for field in selectedLayer.fields()]
# write header
line = ','.join(name for name in fieldnames) + '\n'
output_file.write(line)
# write feature attributes
for f in selectedLayer.getFeatures():
line = ','.join(str(f[name]) for name in fieldnames) +
'\n'
output_file.write(line)
## sortie de la couche finale
with open(filename_sortie_finale, 'w') as output_file:
selectedLayerIndex = self.dlg.selectCouche.currentIndex()
selectedLayer = layers[selectedLayerIndex].layer()
fieldnames = [field.name() for field in selectedLayer.fields()]
# write header
line = ','.join(name for name in fieldnames) + '\n'
output_file.write(line)
# write feature attributes
for f in selectedLayer.getFeatures():
line = ','.join(str(f[name]) for name in fieldnames) +
'\n'
output_file.write(line)
## message de succès du programme
self.iface.messageBar().pushMessage(
"Success", "Cheminements calculés " +
filename_sortie_finale,
level=Qgis.Success, duration=5)
-----------------
J'ai créé un bouton "pointer" qui permet de remplir un "lineEdit"
avec les coordonnées pointés. et quand je clique sur bouton pointer, tout marche très
bien, mais quand je clique sur Ok pour finir le programme, il a la même réaction
qu'avec le bouton "pointer" : càd qu'il attend que je pointe un point,
si je le fais, il me réouvre la fenêtre de l'extension. Auriez-vous une idée pour
m'aider à trouver d'où vient le problème.
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=357213#p357213
Pour y répondre : qgis_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net