Message posté par : myh89
----------------------------------------
Bonjour,
J'avais déjà mis un sujet récent intitulé QGIS/Python: Besoin d'aide pour un
script pour sortir des cartes, mais n'ai pas eu de retour
J'ai réussi à faire un script qui fonctionne à l'intérieur de la console Qgis, je
vais le joindre en bas de ce message.
Par contre lorsque je j'essaie de le lancer hors de Qgis ça ne fonctionne pas, je ne
comprends pas bien ce qu'il faut appeler pour que ça fonctionne.
J'ai essayé en ouvrant un projet vierge dans Qgis et en relançant le code depuis la
console Python, là j'avais un premier blocage car il ne me trouvait pas un algorithme,
mais ça fonctionne (dans Qgis) maintenant en réinitialisant Processing (cf lignes 84 et
suivantes du code), mais par contre ça ne fonctionne toujours pas hors de Qgis.
J'ai placé ce script Python dans le répertoire bin de Qgis, est-ce à un autre endroit
qu'il faut le mettre, je ne comprends pas bien ?
Merci d'avance pour votre aide.
Cordialement,
M. Huant
Le code est ici :
-----------------
Code :
# Appel des librairies nécessaires
from qgis import processing
from qgis.core import QgsApplication, QgsProject, QgsLayerTreeGroup, QgsLayerTreeLayer,
QgsExpression, QgsExpressionContext, QgsExpressionContextUtils
from qgis.utils import iface
from PyQt5.QtCore import QVariant
from datetime import datetime
from qgis.core import *
import qgis.utils
# Variables d'environnement, noms des répertoires, projets, etc
chemin_projet_source = r'C:/UsersxxxxxxL/'
nom_projet_source = r'xxxxxxxxx.qgz'
ensemble_projet_chemin = chemin_projet_source + nom_projet_source
chemin_projet_impressions_PDF = r'C:/Users/xxxxxxxxxxS/'
# NOM DES VARIABLES
#uri
#couche_source
#couche_resultat
# chemin_projet_impressions_PDF
# Initialise l'application QGIS
QgsApplication.setPrefixPath('C:/Program Files/QGIS 3.26.1', True)
app = QgsApplication([], True)
app.initQgis()
# Ouvre le bon projet Qgis
projet_source = QgsProject.instance()
projet_source.read(ensemble_projet_chemin)
# Informations de connection à la base en MySQL
uri = 'MySQL:sig,host=xxxxxxx,user=xxxxxxxt,password=xxxxxxx|layername=vxxxxxxxs'
nom_couche_source = ('xxxxxxx')
layer = QgsProject.instance().mapLayersByName('xxxxxxx')[0]
iface.setActiveLayer(layer)
couche_source = iface.activeLayer()
datajour = str(datetime.now())
datajourH = datajour[:13]
minutes = datajour[14:16]
couche_resultat = 'POQ du ' + datajourH + 'h' + minutes + '.shp'
chemin_shapefile = chemin_projet_source + couche_resultat
writer = QgsVectorFileWriter.writeAsVectorFormat(couche_source, chemin_shapefile,
"UTF-8", couche_source.crs(), "ESRI Shapefile")
vlayer = QgsVectorLayer(chemin_shapefile, couche_resultat[:23], "ogr")
QgsProject.instance().addMapLayer(vlayer)
# A ce niveau la nouvelle couche POQ avec date et heure est ajoutée dans la liste des
couches et devient la nouvelle active layer
nom_champ_somme = 'DISPO'
colonnes_somme = ['nb_dispo', 'nb_dispo5',
'nb_dispo_s','nb_dispo_1' ]
expression_somme = '+'.join(colonnes_somme)
contexte_expression = QgsExpressionContext()
POQ = iface.activeLayer()
contexte_expression.setFeature(POQ.getFeature(0))
expression = QgsExpression(expression_somme)
expression.prepare(contexte_expression)
POQ.dataProvider().addAttributes([QgsField(nom_champ_somme, QVariant.Int)])
POQ.updateFields()
# a cet endroit là ça a bien créé le champ DISPO
index_champ_somme = POQ.fields().indexFromName(nom_champ_somme)
POQ.startEditing()
# ca ouvre la couche en édition
for entite in POQ.getFeatures():
contexte_expression.setFeature(entite)
valeur_somme = expression.evaluate(contexte_expression)
POQ.changeAttributeValue(entite.id(), index_champ_somme, valeur_somme)
# Là il faut faire un entrée pour que que ça fasse les calculs puis ensuite
POQ.commitChanges()
# ca enregistre les changements et ferme le mode edition
# Attribuer le style qui va bien et est déjà enregistré en qml
style_existant = r'C:/Users/xxxxxxxxxx.qml'
POQ.loadNamedStyle(style_existant)
POQ.triggerRepaint()
project = QgsProject.instance()
projectLayoutManager = project.layoutManager()
layout = projectLayoutManager.layoutByName("POQ_disponibilités")
sortie = chemin_projet_impressions_PDF + couche_resultat[:23]+ '.pdf'
# ca bloque à cet endroit, ne trouvait pas l'algorithme printlayouttopdf besoin de
reinitialiser les processings vu sur GIS STAck Exchange questions num 321569 et avec les
mots clés qgsapplication-processingregistry-loads-providers-however-is-empty-when-called
from processing.core.Processing import Processing
proc = Processing()
proc.initialize()
processing.run("native:printlayouttopdf",{'LAYOUT':'POQ_disponibilités',
'OUTPUT': sortie})
#Ferme le projet et l'application QGIS
projet_source.clear()
#ferme bien le projet mais pas Qgis
app.exitQgis()
-----------------
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=361911#p361911
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