Pages: 1
- Sujet précédent - QGIS 2.18 & PyQgis: affichage couche et composeur d'impression - Sujet suivant
#1 Mon 25 September 2017 17:07
- MaudJ
- Juste Inscrit !
- Date d'inscription: 23 Jan 2017
- Messages: 6
QGIS 2.18 & PyQgis: affichage couche et composeur d'impression
Bonjour,
Afin d'enregistrer au format pdf ou png mes couches de vecteur nouvellement créées, je les charge dans qgis, puis initialise le composeur ensuite j'exporte le composeur, soit au format pdf, soit au format png.
Sauf que dans la réalité, mon fichier vecteur au format shp est bien créé, il est bien chargé puisque quand le traitement se termine, il est ouvert dans QGIS et corect, mais dans le fichier enregistré du composeur, il n'apparait pas, pas plus que sa légende. Est ce un problème de chargement du fichier avant impression? C'est à dire que l'impression serait plus rapide que le chargement?
Voici mon code: (j'ai laissé le remove du vecteur en commentaire pour vérifié que la couche se charge bien et je la vois bien chargée dans qgis en fin de traitement).
Merci pour votre aide.
Code:
def imprimer(self, form): # charge la couche dans QGIS layer = iface.addVectorLayer(self.pathShp, self.nomLegende, "ogr") QgsMapLayerRegistry.instance().addMapLayer(layer) # rend la couche visible iface.legendInterface().setLayerVisible(layer, True) iface.mapCanvas().refreshAllLayers() # initialise le composeur et ses différents items self.initComposeur() self.composeur.refreshItems() if form == ".pdf": self.composeur.exportAsPDF(self.pathCarte) else: image = self.composeur.printPageAsRaster(0) image.save(self.pathCarte) #QgsMapLayerRegistry.instance().removeMapLayer(layer) def initComposeur(self): canvas = iface.mapCanvas() for itemComp in self.composeur.items(): if itemComp.type() == QgsComposerItem.ComposerLabel: if itemComp.id() == '0': itemComp.setText(self.titre) else: itemComp.setText(self.commentaire) if itemComp.type() == QgsComposerItem.ComposerLegend: itemComp.setLegendFilterByMapEnabled(True) if itemComp.type() == QgsComposerItem.ComposerMap: itemComp.setMapCanvas(canvas)
Hors ligne
#2 Wed 11 October 2017 16:43
Re: QGIS 2.18 & PyQgis: affichage couche et composeur d'impression
Bonjour,
La génération de PDF n'est pas chose aisée. Dans un projet, il m'a fallu pas mal de temps afin d'en saisir les subtilités grâce, notamment, à des échanges sur georezo et forumsig (https://georezo.net/forum/viewtopic.php?pid=284842 et http://www.forumsig.org/showthread.php/ … n-pyqgis). Voici en tout cas un code qui fonctionne. A intégrer et adapter dans les méthodes de ton objet..
Code:
from PyQt4.QtCore import * from PyQt4.QtGui import * iface = qgis.utils.iface # permet de recuperer l'objet composeur d'apres nom def getCompositionByName(iface, name) : for composer_view in iface.activeComposers() : print composer_view.composerWindow().windowTitle() if composer_view.composerWindow().windowTitle()==name : myComposition = composer_view.composition() return(myComposition) def lancerImpression(nomComposeur, fichierSortie): myComposition = getCompositionByName(iface, nomComposeur) printer = QPrinter() painter = QPainter() myComposition.beginPrintAsPDF(printer, fichierSortie) printReady = painter.begin(printer) myComposition.doPrint(printer, painter) painter.end() lancerImpression('Composeur 1', 'C:/temp/print.pdf')
geodata au cerema et petits billets en géomatique
Hors ligne
#3 Thu 12 October 2017 21:34
- MaudJ
- Juste Inscrit !
- Date d'inscription: 23 Jan 2017
- Messages: 6
Re: QGIS 2.18 & PyQgis: affichage couche et composeur d'impression
Bonjour,
Déjà merci pour ta réponse.
En fait la création de pdf ou d'image ne posait pas problème en soit avec mon code. Le soucis venait en fait d'un problème de tâche non terminée par le processus.
J'ai finis par trouver!
Un petit:
Code:
QtCore.QCoreApplication.processEvents()
Et ça force le processus à terminer toutes les tâches en cours.
Je ne sais pas pourquoi la carte ne voulait pas s'afficher d'elle-même. J'ai fini par trouver d'où ça venait car j'arrivais à imprimer correctement lorsque j'envoyais une boite de dialog qui attendait que l'utilisateur clique sur le bouton juste après le refresh layer. Du coup, les tâches se terminaient pendant ce laps de temps. Ce que je ne comprend pas c'est pourquoi, alors que j'ai tenté le multi-threading, celui ci n'a pas fonctionné, et pourquoi tout simplement cette tâche là ne veut pas se terminer... Enfin maintenant j'ai trouvé une solution qui me convient. Je vais donc cesser de me casser la tête.
Hors ligne
#5 Fri 13 October 2017 12:07
- JD
- Moderateur
- Date d'inscription: 8 Aug 2013
- Messages: 726
Re: QGIS 2.18 & PyQgis: affichage couche et composeur d'impression
Salut Maudj,
tu vas peut-être me retirer une épine du pied.
J'ai un aussi un atlas qui ne se réalisait pas bien. Après étant donné que j'effectuais des graphiques à base de librairies javascript , je me suis dit que c'était peut-être lié.
Du coup :
Code:
QtCore.QCoreApplication.processEvents()
tu l'intègres à quel moment ?
EDIT : après test, avant l'export et ca fonctionne nickel !!!!!!
Tu viens de me sauver des heures et des heures de boulot, car quand tu dois exporter un atlas page par page c'est fastidieux !
Dernière modification par lejedi76 (Fri 13 October 2017 12:28)
Hors ligne
#6 Fri 13 October 2017 12:49
- MaudJ
- Juste Inscrit !
- Date d'inscription: 23 Jan 2017
- Messages: 6
Re: QGIS 2.18 & PyQgis: affichage couche et composeur d'impression
Oui je le fais juste avant d'exporter en pdf ou format image. Et contente que ça puisse te servir, vu le temps que j'y ai passé, autant que ça serve à d'autres!
Hors ligne
Pages: 1
- Sujet précédent - QGIS 2.18 & PyQgis: affichage couche et composeur d'impression - Sujet suivant