From d8d08232c4ca35ea76eb7e134e2da496817b4b78 Mon Sep 17 00:00:00 2001 From: BergWerkGIS Date: Tue, 25 Mar 2014 11:51:45 +0100 Subject: [PATCH] implement QgsPaintEngineHack.fixEngineFlags http://qgis.org/api/2.0/qgspaintenginehack_8cpp_source.html to get correct styles with PDF export. --- VoGISRaumplanungPlot/metadata.txt | 2 +- VoGISRaumplanungPlot/resources_rc.py | 2 +- .../ui_vogisraumplanungplot.py | 2 +- .../ui_vogisraumplanungplotsettings.py | 2 +- .../vrpcomposer/vrpprintcomposer.py | 13 ++++ dev-scripts/QgsCompositionTest.py | 67 ++++++++++++++++++ dev-scripts/QgsCompositionTest2.py | 63 ++++++++++++++++ dev-scripts/QgsCompositionTest3.py | 67 ++++++++++++++++++ dev-scripts/QgsFeatureRequest-TEST.py | 11 +++ dev-scripts/test-multithreading.py | 13 ++++ vogisraumplanungplot.zip | Bin 35769 -> 35900 bytes 11 files changed, 238 insertions(+), 4 deletions(-) create mode 100644 dev-scripts/QgsCompositionTest.py create mode 100644 dev-scripts/QgsCompositionTest2.py create mode 100644 dev-scripts/QgsCompositionTest3.py create mode 100755 dev-scripts/QgsFeatureRequest-TEST.py create mode 100755 dev-scripts/test-multithreading.py diff --git a/VoGISRaumplanungPlot/metadata.txt b/VoGISRaumplanungPlot/metadata.txt index 0b2f94e..4cc0eb9 100644 --- a/VoGISRaumplanungPlot/metadata.txt +++ b/VoGISRaumplanungPlot/metadata.txt @@ -11,7 +11,7 @@ [general] name=VoGIS Raumplanung description=Create Plots from VoGIS Data. -version=0.1.2 +version=0.1.3 qgisMinimumVersion=2.0 qgisMaximumVersion=2.99 author=BergWerk GIS diff --git a/VoGISRaumplanungPlot/resources_rc.py b/VoGISRaumplanungPlot/resources_rc.py index cf564f6..3ea9a8b 100644 --- a/VoGISRaumplanungPlot/resources_rc.py +++ b/VoGISRaumplanungPlot/resources_rc.py @@ -2,7 +2,7 @@ # Resource object code # -# Created: Di. Mär 11 11:12:25 2014 +# Created: Di. Mär 25 11:50:27 2014 # by: The Resource Compiler for PyQt (Qt v4.8.4) # # WARNING! All changes made in this file will be lost! diff --git a/VoGISRaumplanungPlot/ui_vogisraumplanungplot.py b/VoGISRaumplanungPlot/ui_vogisraumplanungplot.py index 85db083..1bb8fde 100644 --- a/VoGISRaumplanungPlot/ui_vogisraumplanungplot.py +++ b/VoGISRaumplanungPlot/ui_vogisraumplanungplot.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'ui_vogisraumplanungplot.ui' # -# Created: Tue Mar 11 11:12:25 2014 +# Created: Tue Mar 25 11:50:27 2014 # by: PyQt4 UI code generator 4.10.3 # # WARNING! All changes made in this file will be lost! diff --git a/VoGISRaumplanungPlot/ui_vogisraumplanungplotsettings.py b/VoGISRaumplanungPlot/ui_vogisraumplanungplotsettings.py index 19a81f6..cf081d5 100644 --- a/VoGISRaumplanungPlot/ui_vogisraumplanungplotsettings.py +++ b/VoGISRaumplanungPlot/ui_vogisraumplanungplotsettings.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'ui_vogisraumplanungplotsettings.ui' # -# Created: Tue Mar 11 11:12:25 2014 +# Created: Tue Mar 25 11:50:27 2014 # by: PyQt4 UI code generator 4.10.3 # # WARNING! All changes made in this file will be lost! diff --git a/VoGISRaumplanungPlot/vrpcomposer/vrpprintcomposer.py b/VoGISRaumplanungPlot/vrpcomposer/vrpprintcomposer.py index 103621b..beb1177 100644 --- a/VoGISRaumplanungPlot/vrpcomposer/vrpprintcomposer.py +++ b/VoGISRaumplanungPlot/vrpcomposer/vrpprintcomposer.py @@ -28,6 +28,7 @@ from qgis.core import QgsFeatureRequest from qgis.core import QgsMapLayerRegistry from qgis.core import QgsMessageLog +from qgis.core import QgsPaintEngineHack from qgis.core import QgsRasterLayer from qgis.core import QgsVectorLayer from qgis.gui import QgsMessageBar @@ -65,6 +66,7 @@ def __init__( self.ortho_lyr = None self.themen = themen self.composition = None + self.composermap = None self.comp_textinfo = None self.template_qpt = templateqpt self.pdf_map = pdfmap @@ -138,7 +140,13 @@ def export_all_features(self): return u'Kein Kartenfenster im Layout vorhanden!' compmap = compmaps[0] else: + if len(composition.composerMapItems()) < 1: + return u'Kein Kartenfenster im Layout vorhanden!' compmap = composition.composerMapItems()[0] + + self.composermap = compmap + #self.composermap.setPreviewMode(QgsComposerMap.Render) + #self.composermap.setPreviewMode(QgsComposerMap.Rectangle) #taken from QgsComposerMap::setNewAtlasFeatureExtent (not yet available in QGIS 2.0) #http://www.qgis.org/api/qgscomposermap_8cpp_source.html#l00610 old_ratio = compmap.rect().width() / compmap.rect().height() @@ -183,6 +191,7 @@ def export_all_features(self): pdf_painter = QPainter(printer) paper_rect_pixel = printer.pageRect(QPrinter.DevicePixel) paper_rect_mm = printer.pageRect(QPrinter.Millimeter) + QgsPaintEngineHack.fixEngineFlags(printer.paintEngine()) #DKM only if len(self.themen) < 1: composition.render(pdf_painter, paper_rect_pixel, paper_rect_mm) @@ -415,6 +424,10 @@ def __update_composer_items(self, oberthema, subthema=None, labels=None, gnrflae txt = txt.replace('[TODAY]', strftime("%d.%m.%Y")) txt = txt.replace('[DATE]', self.settings.dkm_stand()) lbl[0].setText(txt) + #self.composermap.updateItem() + #self.composermap.updateCachedImage() + self.composermap.mapRenderer().updateFullExtent () + def __get_items(self, typ, composition=None): if composition is None: diff --git a/dev-scripts/QgsCompositionTest.py b/dev-scripts/QgsCompositionTest.py new file mode 100644 index 0000000..d033cd4 --- /dev/null +++ b/dev-scripts/QgsCompositionTest.py @@ -0,0 +1,67 @@ +from PyQt4.QtCore import QFile +from PyQt4.QtXml import QDomDocument +from PyQt4.QtCore import QIODevice +from PyQt4.QtCore import QSizeF +from PyQt4.QtGui import QPrinter +from PyQt4.QtGui import QPainter +import os + +pdf_out = '/home/bergw/_TEMP/out.pdf' +if os.path.isfile(pdf_out): + os.remove(pdf_out) +mapRenderer = iface.mapCanvas().mapRenderer() +c = QgsComposition(mapRenderer) +c.setPlotStyle(QgsComposition.Print) +#print dir(c) +#c.setAtlasMode(QgsComposition.AtlasMode.ExportAtlas) + +xml_file = QFile('/home/bergw/VoGIS-Raumplanung-Daten/A4_hoch_template.qpt') +if xml_file.open(QIODevice.ReadOnly) is False: + throwError + +doc = QDomDocument('mydoc') +doc.setContent(xml_file) +if c.loadFromTemplate(doc) is False: + throwError + +cov_lyr = iface.activeLayer() +print 'cov_lyr', cov_lyr.name() +ac = c.atlasComposition() +ac.setEnabled(True) +ac.setSingleFile(True) +ac.setCoverageLayer(cov_lyr) +#ac.setFeatureFilter('length("GNR") > 7 AND left("GNR",3)=\'120\'') +ac.setFeatureFilter('"GNR" = \'905\'') +ac.setHideCoverage(False) + +print 'beginRender, feats:', ac.numFeatures() +ac.beginRender() +for i in range(0, ac.numFeatures()): + print 'prepareForFeature', i + ac.prepareForFeature(i) + img = c.printPageAsRaster(0) + tmp_file = '/home/bergw/_TEMP/' + str(i) + '.jpg' + if os.path.isfile(tmp_file): + os.remove(tmp_file) + img.save(tmp_file) +ac.endRender() +print 'render finished' + + +#printer = QPrinter() +#printer.setOutputFormat(QPrinter.PdfFormat) +#printer.setOutputFileName(pdf_out) +#printer.setPaperSize(QSizeF(c.paperWidth(), c.paperHeight()), QPrinter.Millimeter) +#printer.setFullPage(True) +#printer.setColorMode(QPrinter.Color) +#printer.setResolution(c.printResolution()) + +#pdfPainter = QPainter(printer) +#paperRectMM = printer.pageRect(QPrinter.Millimeter) +#paperRectPixel = printer.pageRect(QPrinter.DevicePixel) +#TODO: checken ob File vorhanden? +#LOESCHEN!!! +#c.render(pdfPainter, paperRectPixel, paperRectMM) +#pdfPainter.end() + +print 'FERTIG' \ No newline at end of file diff --git a/dev-scripts/QgsCompositionTest2.py b/dev-scripts/QgsCompositionTest2.py new file mode 100644 index 0000000..f9c5931 --- /dev/null +++ b/dev-scripts/QgsCompositionTest2.py @@ -0,0 +1,63 @@ +from PyQt4.QtCore import QFile +from PyQt4.QtXml import QDomDocument +from PyQt4.QtCore import QIODevice +from PyQt4.QtCore import QSizeF +from PyQt4.QtGui import QPrinter +from PyQt4.QtGui import QPainter +import os +import subprocess + +pdf_out = '/home/bergw/_TEMP/out.pdf' +if os.path.isfile(pdf_out): + os.remove(pdf_out) +mapRenderer = iface.mapCanvas().mapRenderer() +c = QgsComposition(mapRenderer) + +xml_file = QFile('/home/bergw/VoGIS-Raumplanung-Daten/A4_hoch_template.qpt') +if xml_file.open(QIODevice.ReadOnly) is False: + throwError + +doc = QDomDocument('mydoc') +doc.setContent(xml_file) +if c.loadFromTemplate(doc) is False: + throwError + +if QGis.QGIS_VERSION_INT > 20200: + #compmaps = self.__get_items(QgsComposerMap) + #compmap = compmaps[0] + pass +else: + compmap = c.composerMapItems()[0] + +c.setPlotStyle(QgsComposition.Print) +compmap.setPreviewMode(QgsComposerMap.Render) +#compmap.updateItem() +#emit compmap.itemChanged(); +#compmap.extentChanged(); +#compmap.toggleAtlasPreview() +#compmap.setNewScale(compmap.scale()+1) +#c.setPrintResolution(150) +#print c.printResolution() +c.setPrintAsRaster(False) + +printer = QPrinter() +printer.setOutputFormat(QPrinter.PdfFormat) +printer.setOutputFileName(pdf_out) +printer.setPaperSize(QSizeF(c.paperWidth(), c.paperHeight()), QPrinter.Millimeter) +printer.setFullPage(True) +printer.setColorMode(QPrinter.Color) +printer.setResolution(c.printResolution()) + +pdfPainter = QPainter(printer) +paperRectMM = printer.pageRect(QPrinter.Millimeter) +paperRectPixel = printer.pageRect(QPrinter.DevicePixel) + +QgsPaintEngineHack.fixEngineFlags(printer.paintEngine()) + +#c.renderPage(pdfPainter, 0) +c.doPrint(printer,pdfPainter) + +pdfPainter.end() +subprocess.call(('xdg-open', pdf_out)) + +print 'FERTIG' \ No newline at end of file diff --git a/dev-scripts/QgsCompositionTest3.py b/dev-scripts/QgsCompositionTest3.py new file mode 100644 index 0000000..d033cd4 --- /dev/null +++ b/dev-scripts/QgsCompositionTest3.py @@ -0,0 +1,67 @@ +from PyQt4.QtCore import QFile +from PyQt4.QtXml import QDomDocument +from PyQt4.QtCore import QIODevice +from PyQt4.QtCore import QSizeF +from PyQt4.QtGui import QPrinter +from PyQt4.QtGui import QPainter +import os + +pdf_out = '/home/bergw/_TEMP/out.pdf' +if os.path.isfile(pdf_out): + os.remove(pdf_out) +mapRenderer = iface.mapCanvas().mapRenderer() +c = QgsComposition(mapRenderer) +c.setPlotStyle(QgsComposition.Print) +#print dir(c) +#c.setAtlasMode(QgsComposition.AtlasMode.ExportAtlas) + +xml_file = QFile('/home/bergw/VoGIS-Raumplanung-Daten/A4_hoch_template.qpt') +if xml_file.open(QIODevice.ReadOnly) is False: + throwError + +doc = QDomDocument('mydoc') +doc.setContent(xml_file) +if c.loadFromTemplate(doc) is False: + throwError + +cov_lyr = iface.activeLayer() +print 'cov_lyr', cov_lyr.name() +ac = c.atlasComposition() +ac.setEnabled(True) +ac.setSingleFile(True) +ac.setCoverageLayer(cov_lyr) +#ac.setFeatureFilter('length("GNR") > 7 AND left("GNR",3)=\'120\'') +ac.setFeatureFilter('"GNR" = \'905\'') +ac.setHideCoverage(False) + +print 'beginRender, feats:', ac.numFeatures() +ac.beginRender() +for i in range(0, ac.numFeatures()): + print 'prepareForFeature', i + ac.prepareForFeature(i) + img = c.printPageAsRaster(0) + tmp_file = '/home/bergw/_TEMP/' + str(i) + '.jpg' + if os.path.isfile(tmp_file): + os.remove(tmp_file) + img.save(tmp_file) +ac.endRender() +print 'render finished' + + +#printer = QPrinter() +#printer.setOutputFormat(QPrinter.PdfFormat) +#printer.setOutputFileName(pdf_out) +#printer.setPaperSize(QSizeF(c.paperWidth(), c.paperHeight()), QPrinter.Millimeter) +#printer.setFullPage(True) +#printer.setColorMode(QPrinter.Color) +#printer.setResolution(c.printResolution()) + +#pdfPainter = QPainter(printer) +#paperRectMM = printer.pageRect(QPrinter.Millimeter) +#paperRectPixel = printer.pageRect(QPrinter.DevicePixel) +#TODO: checken ob File vorhanden? +#LOESCHEN!!! +#c.render(pdfPainter, paperRectPixel, paperRectMM) +#pdfPainter.end() + +print 'FERTIG' \ No newline at end of file diff --git a/dev-scripts/QgsFeatureRequest-TEST.py b/dev-scripts/QgsFeatureRequest-TEST.py new file mode 100755 index 0000000..2e5affb --- /dev/null +++ b/dev-scripts/QgsFeatureRequest-TEST.py @@ -0,0 +1,11 @@ +lyr = iface.activeLayer() +#r = QgsFeatureRequest() +#print dir(r) +#r.setFilterExpression(u'PGEM_NAME = \'Dornbirn\'') +gst = {} +for f in lyr.getFeatures(): + if f['PGEM_NAME'] == 'Dornbirn': + gnr = f['GNR'] + if not gnr in gst: + gst[gnr] = f +print len(gst), 'Grundstuecke' diff --git a/dev-scripts/test-multithreading.py b/dev-scripts/test-multithreading.py new file mode 100755 index 0000000..7339366 --- /dev/null +++ b/dev-scripts/test-multithreading.py @@ -0,0 +1,13 @@ +import multiprocessing as mp +import sys, os + +from multiprocessing import Process + +print("I'm in main module") +# OSGeo4W does not bundle python in exec_prefix for python +path = os.path.abspath(os.path.join(sys.exec_prefix, '../../bin/pythonw.exe')) +mp.set_executable(path) +print("Setting executable path to {:s}".format(path)) +sys.argv = [ None ] # '../tst.py' __file__ +mgr = mp.Manager() +print("I'm past Manager()") \ No newline at end of file diff --git a/vogisraumplanungplot.zip b/vogisraumplanungplot.zip index 5da52242e860d834560a0dfe85d5524590365b35..9b3398397f15632264f8289035b7c96bc16e6856 100644 GIT binary patch delta 16086 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 z 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 H;rsspT{=Zl