Eu tenho algumas camadas com símbolos definidos por dados muito complexos. Se eu usar uma legenda no compositor de impressão, esses símbolos não serão desenhados corretamente.
Existe uma maneira de alterar os símbolos de legenda com pyqgis, para que eu possa usar imagens PNG ou SVG personalizadas em vez do símbolo de legenda padrão para essas camadas?
Sei como adicionar um botão ao compositor de impressão e como conectá-lo a uma função. Desejo adicionar um botão às Configurações da legenda para permitir a substituição do ícone da legenda gerada automaticamente por uma imagem personalizada. Então, o que eu ainda preciso são as informações de como posso acessar os símbolos de legenda com pyqgis / pyqt e como substituí-los por uma QImage em um QLabel ou algo assim?
Maquete muito básica do botão usado para alterar o símbolo:
Legenda gerada automaticamente:
Legenda com o símbolo de legenda personalizada:
Já descobri como acessar os itens da legenda no compositor de impressão, mas ainda não como acessar o próprio símbolo:
import qgis
from PyQt4.QtCore import *
from PyQt4.QtGui import *
activeComposer = iface.activeComposers()
for item in activeComposer:
if item.composerWindow().windowTitle()=='test':
for i in item.items():
if isinstance(i,QgsComposerLegend):
#print i
#print i.model()
legend = i
for i in xrange(legend.modelV2().rowCount()):
posteleg=legend.modelV2().index(i, 0)
print posteleg.data()
Editar 1:
Eu também descobri como acessar objetos QIcon da árvore de legendas, mas ainda não posso trocá-los:
def run(self):
activeComposer = self.iface.activeComposers()
#print(self.resolve('icon.png'))
for item in activeComposer:
if item.composerWindow().windowTitle()=='test':
for i in item.items():
if isinstance(i,QgsComposerLegend):
legend = i
layerIcon = QIcon(os.path.join(os.path.dirname(__file__), "icon.png"))
for i in xrange(legend.modelV2().rowCount()):
posteleg=legend.modelV2().index(i, 0)
posteleg.model().iconGroup().swap(layerIcon)
print posteleg.data()
Aqui está um exemplo da vida real em que você pode ver uma simbologia combinada de várias camadas de símbolos: Isso terminará na legenda assim:
Como preciso do símbolo apropriado na legenda, gostaria de fazer uma captura de tela do meu símbolo, recortá-lo e usá-lo como uma imagem na legenda.
Sei que poderia sobrepor uma imagem separada em cima da minha legenda, que cubra o símbolo gerado automaticamente, mas gostaria de ter uma solução "mais limpa" que me permita substituir os símbolos na legenda por imagens personalizadas.
Edição 2:
Enquanto isso, eu encontrei outra maneira de obter acesso às entradas da legenda:
from qgis.core import QgsLegendRenderer, QgsComposerLegendStyle
compDict = {}
for comp in iface.activeComposers():
# workaround to get name: read it from window title
compDict[comp.composerWindow().windowTitle()] = comp.composition()
if "mycomposername" in compDict:
itemLlegend = compDict["mycomposername"].getComposerItemById("mylegend_id")
if itemLlegend:
print itemLlegend
tree_layer_layer = itemLlegend.modelV2().rootGroup().children()
for item in tree_layer_layer:
if item.layerName()=="MyLayername":
print "match"
QgsLegendRenderer.setNodeLegendStyle(item, QgsComposerLegendStyle.Group)
Isso me permite acessar os objetos QgsLayerTreeLayer e posso alternar a legenda Estilo (Grupo, Subgrupo, Oculto). Mas ainda não tenho ideia de como acessar o símbolo da legenda. Alguma ideia?