Automatizzare la stampa del compositore di progetti QGIS?


9

Ho un grande progetto che consiste in circa 10 file di progetto QGIS. Ogni progetto contiene un compositore di stampa con un atlante impostato per generare fino a 10 mappe.

Qual è il modo più semplice per automatizzare l'apertura di ogni progetto e creare un PDF usando l'atlante del compositore?

(Qualcosa del genere sarebbe l'ideale - non sono sicuro che sia possibile)

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

Risposte:


9

Salvarlo in un file Python e usarlo in --code arg dovrebbe fare ciò di cui hai bisogno:

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()

Questo eseguirà il loop di tutti i compositori e li stamperà se hanno l'atlante abilitato in un singolo PDF per ognuno.

NOTA È possibile aprire un file di progetto in una sessione QGIS utilizzando iface.addProject. Quindi potresti farlo per evitare l'apertura di molte sessioni 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()

Post pertinente e ottima risposta!
CARTOS

Presumo che abbia funzionato? Al termine, è possibile utilizzare sys.exit()per chiudere QGIS.
Nathan W,

Sì, funziona perfettamente. In realtà stavo cercando di trovare un modo per uscire. Ho provato iface.actionExit (). Trigger () e sys.exit () ma per qualche ragione non funzionano.
Damien,

ProvaQgsApplication.exit()
Nathan W,

iface.actionExit()mostrerà una finestra di dialogo se il progetto è stato modificato e blocca l'uscita, rispetto al QgsApplication.exit()quale verrà semplicemente annullato il processo.
Nathan W,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.