Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#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

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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

 

#4 Fri 13 October 2017 09:59

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

Re: QGIS 2.18 & PyQgis: affichage couche et composeur d'impression

Merci pour le retour !


geodata au cerema et petits billets en géomatique

Hors ligne

 

#5 Fri 13 October 2017 12:07

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 722

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

 

Pied de page des forums

Powered by FluxBB