Automatisieren des Druckens von QGIS-Projektkomponisten?


9

Ich habe ein großes Projekt, das aus ungefähr 10x QGIS-Projektdateien besteht. Jedes Projekt enthält einen Druckkomponisten mit einem Atlas, mit dem bis zu 10 Karten erstellt werden können.

Was ist der einfachste Weg, um das Öffnen jedes Projekts und das Erstellen eines PDF mit dem Composer-Atlas zu automatisieren?

(So ​​etwas wäre ideal - nicht sicher, ob es möglich ist)

C: \ OSGeo4W \ bin \ qgis.bat - Projekt MyProject1.qgs - Code SaveAtlasAsPdf.py C: \ OSGeo4W \ bin \ qgis.bat - Projekt MyProject2.qgs - Code SaveAtlasAsPdf.py

Antworten:


9

Das Speichern in einer Python-Datei und die Verwendung im --code-Argument sollten das tun, was Sie benötigen:

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

Dadurch werden alle Komponisten wiederholt und gedruckt, wenn für sie jeweils ein Atlas in einer einzigen PDF-Datei aktiviert ist.

HINWEIS Sie können eine Projektdatei in einer QGIS-Sitzung mit öffnen iface.addProject. Sie können dies tun, um zu vermeiden, dass viele QGIS-Sitzungen geöffnet werden.

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

Relevanter Beitrag und tolle Antwort!
CARTOS

Ich werde davon ausgehen, dass es funktioniert hat? Sie können sys.exit()QGIS verwenden, wenn Sie fertig sind.
Nathan W

Ja, es funktioniert perfekt. Ich war tatsächlich versucht , einen Weg zu Ausgang zu finden. Ich habe versucht, iface.actionExit (). Trigger () und sys.exit (), aber aus irgendeinem Grund funktionieren sie nicht.
Damien

Versuchen SieQgsApplication.exit()
Nathan W

iface.actionExit()wird einen Dialog anzeigen, wenn sich das Projekt geändert hat, und den Exit blockieren, gegen QgsApplication.exit()den der Prozess nur nuklear wird.
Nathan W
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.