Automatiser l'impression du composeur de projet QGIS?

9

J'ai un grand projet qui se compose d'environ 10x fichiers de projet QGIS. Chaque projet contient un compositeur d'impression avec un atlas configuré pour générer jusqu'à 10 cartes.

Quelle est la manière la plus simple d'automatiser l'ouverture de chaque projet et de créer un PDF à l'aide de l'atlas du compositeur?

(Quelque chose comme ça serait idéal - je ne sais pas si c'est possible)

C: \ OSGeo4W \ bin \ qgis.bat --project MyProject1.qgs --code SaveAtlasAsPdf.py C: \ OSGeo4W \ bin \ qgis.bat --project MyProject2.qgs --code SaveAtlasAsPdf.py

Damien
la source

Réponses:

9

L'enregistrer dans un fichier Python et l'utiliser dans l'argument --code devrait faire ce dont vous avez besoin:

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import os

from qgis.core import *
from qgis.gui import *
from qgis.utils import iface

for comp in iface.activeComposers():
    print comp
    folder = r"C:\temp"
    title = "testing"
    printer = QPrinter()
    painter = QPainter()
    comp.composition().setUseAdvancedEffects(False)
    myAtlas = comp.composition().atlasComposition()

    if myAtlas.enabled():
        myAtlas.beginRender()
        comp.composition().setAtlasMode(QgsComposition.ExportAtlas)
        myAtlas.setFilenamePattern(u"'{}_'||$feature".format(title))
        for i in range(0, myAtlas.numFeatures()):
            myAtlas.prepareForFeature(i)
            filename = os.path.join(folder, title + '.pdf')
            print filename
            comp.composition().beginPrintAsPDF(printer, filename)
            comp.composition().beginPrint(printer)
            printReady = painter.begin(printer)
            if i > 0:
                printer.newPage()
            comp.composition().doPrint(printer, painter)
        myAtlas.endRender()
        painter.end()

Cela mettra en boucle tous les compositeurs et les imprimera s'ils ont activé l'atlas dans un seul PDF pour chacun.

REMARQUE Vous pouvez ouvrir un fichier de projet dans une session QGIS à l'aide de iface.addProject. Vous pouvez donc le faire pour éviter d'ouvrir de nombreuses sessions QGIS.

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import os

from qgis.core import *
from qgis.gui import *
from qgis.utils import iface

def print_it():
    for comp in iface.activeComposers():
        print comp
        folder = r"C:\temp"
        title = "testing"
        printer = QPrinter()
        painter = QPainter()
        comp.composition().setUseAdvancedEffects(False)
        myAtlas = comp.composition().atlasComposition()

        if myAtlas.enabled():
            myAtlas.beginRender()
            comp.composition().setAtlasMode(QgsComposition.ExportAtlas)
            myAtlas.setFilenamePattern(u"'{}_'||$feature".format(title))
            for i in range(0, myAtlas.numFeatures()):
                myAtlas.prepareForFeature(i)
                filename = os.path.join(folder, title + '.pdf')
                print filename
                comp.composition().beginPrintAsPDF(printer, filename)
                comp.composition().beginPrint(printer)
                printReady = painter.begin(printer)
                if i > 0:
                    printer.newPage()
                comp.composition().doPrint(printer, painter)
            myAtlas.endRender()
            painter.end()

for project in projectlist:
    iface.addProject(project)
    print_it()
Nathan W
la source
Post pertinent et excellente réponse!
CARTOS
Je suppose que cela a fonctionné? Vous pouvez utiliser sys.exit()pour fermer QGIS lorsque vous avez terminé.
Nathan W
Oui, cela fonctionne parfaitement. Je suis en train d' essayer de trouver un moyen de sortie. J'ai essayé iface.actionExit (). Trigger () et sys.exit () mais pour une raison quelconque, ils ne fonctionnent pas.
Damien
EssayezQgsApplication.exit()
Nathan W
iface.actionExit()va afficher une boîte de dialogue si le projet a changé et bloquer la sortie, vs QgsApplication.exit()qui ne fera que neutraliser le processus.
Nathan W