I am using QGis 2.8.1.
I have got a series of layers to be printed (grouped by pair). I am using QgsComposerMap. I iterate over the groups to just show the layers of the current group, zoom to its extent et print it. However, I can' refresh the mapCanvas until the Python script is finished. So, it doesn't work.
My question is the following : is it possible to refresh the mapCanvas within a Python scrip ? Alternatively, is there a better way to achieve my goal ?
Here is my a piece of code : # Iterate over groups of pair of layers for g in range(0,nbGroups-1):
# Display layers of the current group layer = layers[2*g] rectTrajet = layer.extent() legend.setLayerVisible(layer, True) layer = layers[2*g+1] rectPtsArr = layer.extent() legend.setLayerVisible(layer, True) # extent area rectGlb = QgsRectangle xMin = min(rectTrajet.xMinimum(), rectPtsArr.xMinimum()) xMax = max(rectTrajet.xMaximum(), rectPtsArr.xMaximum()) yMin = min(rectTrajet.yMinimum(), rectPtsArr.yMinimum()) yMax = max(rectTrajet.yMaximum(), rectPtsArr.yMaximum()) rectGlb = QgsRectangle(xMin, yMin, xMax, yMax) self.iface.mapCanvas().setExtent(rectGlb) self.iface.mapCanvas().zoomToSelected() self.iface.mapCanvas().updateScale() self.iface.mapCanvas().zoomByFactor(1.5) # Nothing works here !! self.iface.mapCanvas().updateOverview() self.iface.mapCanvas().refresh() layers[2*g].triggerRepaint() layers[2*g+1].triggerRepaint() # Map composer composerMap = QgsComposerMap(c,x,y,w,h) composerMap.setPreviewMode(QgsComposerMap.Render) composerMap.updateBoundingRect() composerMap.renderModeUpdateCachedImage() composerMap.setFrameEnabled(True) c.addItem(composerMap) # Launch printing printer = QtGui.QPrinter() printer.setOutputFormat(QtGui.QPrinter.PdfFormat) printer.setOutputFileName(nomFichier) printer.setPaperSize(QSizeF(c.paperWidth(), c.paperHeight()), QtGui.QPrinter.Millimeter) printer.setFullPage(True) printer.setColorMode(QtGui.QPrinter.Color) printer.setResolution(c.printResolution()) pdfPainter = QPainter(printer) paperRectMM = printer.pageRect(QtGui.QPrinter.Millimeter) paperRectPixel = printer.pageRect(QtGui.QPrinter.DevicePixel) c.render(pdfPainter, paperRectPixel, paperRectMM) pdfPainter.end() # Remove map composer c.removeItem(composerMap) # Hide layers of the current group legend.setLayerVisible(layers[2*g], False) legend.setLayerVisible(layers[2*g+1], False) Any help would be appreciated.
أكثر...
I have got a series of layers to be printed (grouped by pair). I am using QgsComposerMap. I iterate over the groups to just show the layers of the current group, zoom to its extent et print it. However, I can' refresh the mapCanvas until the Python script is finished. So, it doesn't work.
My question is the following : is it possible to refresh the mapCanvas within a Python scrip ? Alternatively, is there a better way to achieve my goal ?
Here is my a piece of code : # Iterate over groups of pair of layers for g in range(0,nbGroups-1):
# Display layers of the current group layer = layers[2*g] rectTrajet = layer.extent() legend.setLayerVisible(layer, True) layer = layers[2*g+1] rectPtsArr = layer.extent() legend.setLayerVisible(layer, True) # extent area rectGlb = QgsRectangle xMin = min(rectTrajet.xMinimum(), rectPtsArr.xMinimum()) xMax = max(rectTrajet.xMaximum(), rectPtsArr.xMaximum()) yMin = min(rectTrajet.yMinimum(), rectPtsArr.yMinimum()) yMax = max(rectTrajet.yMaximum(), rectPtsArr.yMaximum()) rectGlb = QgsRectangle(xMin, yMin, xMax, yMax) self.iface.mapCanvas().setExtent(rectGlb) self.iface.mapCanvas().zoomToSelected() self.iface.mapCanvas().updateScale() self.iface.mapCanvas().zoomByFactor(1.5) # Nothing works here !! self.iface.mapCanvas().updateOverview() self.iface.mapCanvas().refresh() layers[2*g].triggerRepaint() layers[2*g+1].triggerRepaint() # Map composer composerMap = QgsComposerMap(c,x,y,w,h) composerMap.setPreviewMode(QgsComposerMap.Render) composerMap.updateBoundingRect() composerMap.renderModeUpdateCachedImage() composerMap.setFrameEnabled(True) c.addItem(composerMap) # Launch printing printer = QtGui.QPrinter() printer.setOutputFormat(QtGui.QPrinter.PdfFormat) printer.setOutputFileName(nomFichier) printer.setPaperSize(QSizeF(c.paperWidth(), c.paperHeight()), QtGui.QPrinter.Millimeter) printer.setFullPage(True) printer.setColorMode(QtGui.QPrinter.Color) printer.setResolution(c.printResolution()) pdfPainter = QPainter(printer) paperRectMM = printer.pageRect(QtGui.QPrinter.Millimeter) paperRectPixel = printer.pageRect(QtGui.QPrinter.DevicePixel) c.render(pdfPainter, paperRectPixel, paperRectMM) pdfPainter.end() # Remove map composer c.removeItem(composerMap) # Hide layers of the current group legend.setLayerVisible(layers[2*g], False) legend.setLayerVisible(layers[2*g+1], False) Any help would be appreciated.
أكثر...