7 votos

¿Crear un nuevo compositor de impresión programáticamente?

Me gustaría crear un compositor de impresión (por ejemplo, A3 paisaje) con unas pocas líneas de código.

¿Alguien sabe como hacer esto?

12voto

Geoffrey Puntos 228

Tu pregunta es muy vaga, por lo que (al menos en este momento) sólo puedo publicar una respuesta muy general.


Solución para QGIS 2.x

Suponiendo que usted desea crear una nueva composición en la que hay un mapa que contiene todas las capas activada en el Panel Capas, se puede ejecutar el código siguiente desde la Consola de Python:

from PyQt4.QtCore import *
from PyQt4.QtGui import *
# the following two libraries are needed only if you execute the code outside the Python Console (for example, from the Processing Toolbox)
from qgis.core import *
from qgis.utils import iface

map_settings = iface.mapCanvas().mapSettings()
c = QgsComposition(map_settings)

view = iface.createNewComposer()
view.setComposition(c)

composerMap = QgsComposerMap(c, 0 ,0, 420, 297)
# where the second and third parameters are customizable offsets (in mm) for positioning the composition (setting both 0 as values means that the rendering will start from the upper left corner of the composition)
# and the fourth and fifth parameters are the width and the height (in mm) for the A3 format
composerMap.setBackgroundEnabled(True)

rect = QgsRectangle(map_settings.fullExtent())
composerMap.setNewExtent(rect)
composerMap.updateItem()
c.addComposerMap(composerMap)

# all credits to Francisco Raga's answer (https://gis.stackexchange.com/a/206463/87487) for the next code snippet:

# find items and items prop widget
win = view.composerWindow()
items_widget = win.findChildren(QDockWidget, 'ItemsDock')[0]

items_widget_prop = win.findChildren(QDockWidget, 'ItemDock')[0]
items_widget_prop.show()

# set items model
items_list_widget = items_widget.findChildren(QTreeView,'')[0]
items_model = c.itemsModel()
items_list_widget.setModel(items_model)

QObject.connect( items_list_widget.selectionModel(), SIGNAL("currentChanged( QModelIndex, QModelIndex)"), c.itemsModel(),SLOT("setSelected( QModelIndex )"))

y se imprimirá el resultado deseado.


Solución para QGIS 3.x

De acuerdo a las necesidades del usuario, traté de encontrar una solución de trabajo para QGIS 3.x y trabajó para mí (el mismo resultado parece también más fáciles de obtener):

from PyQt5.QtCore import *
from PyQt5.QtGui import *
# the following two libraries are needed only if you execute the code outside the Python Console (for example, from the Processing Toolbox)
from qgis.core import *
from qgis.utils import iface

map_settings = iface.mapCanvas().mapSettings()
c = QgsComposition(QgsProject.instance())
c.setPaperSize(420, 297) #width and height (in mm) for the A3 format

view = iface.openComposer(c)

composerMap = QgsComposerMap(c, 0 ,0, 420, 297)
# where the second and third parameters are customizable offsets (in mm) for positioning the composition (setting both 0 as values means that the rendering will start from the upper left corner of the composition)
# and the fourth and fifth parameters are the width and the height (in mm) for the A3 format
composerMap.setBackgroundEnabled(True)

rect = QgsRectangle(map_settings.fullExtent())
composerMap.setNewExtent(rect)
composerMap.updateItem()
c.addComposerMap(composerMap)

Por favor, tenga en cuenta que mi respuesta le da una solución para su pregunta ya ha sido pedido, es decir, la creación de un nuevo compositor de impresión mediante programación para A3 formato de página. Si quieres una solución específica (por ejemplo la adición de archivos desde el exterior, leyendas, etiquetas, barras de escala y así sucesivamente), sugiero pedir una nueva pregunta por separado para cada problema por el bien de la claridad.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X