def deduplicate_legend_entries(iface, raster_layer, criteria, unique_class_row_indexes=None, expand=None): """Remove duplicate entries from layer legend. :param iface: QGIS interface :type iface: QgisInterface :param raster_layer: raster layer :type raster_layer: QgsRasterLayer :param criteria: classification criteria: label for the legend band :type criteria: str :param unique_class_row_indexes: list of 1-indexed unique entries, defaults to None :type unique_class_row_indexes: list, optional :param expand: whether to expand the legend, defaults to None :type expand: any, optional """ assert iface is not None model = iface.layerTreeView().layerTreeModel() root = QgsProject.instance().layerTreeRoot() node = root.findLayer(raster_layer.id()) if unique_class_row_indexes is None: unique_class_row_indexes = [0] renderer = raster_layer.renderer() unique_labels = [] idx = 1 # Get classes from renderer if isinstance(raster_layer.renderer(), QgsPalettedRasterRenderer): classes = renderer.classes() elif isinstance(raster_layer.renderer(), QgsSingleBandPseudoColorRenderer): shader = raster_layer.renderer().shader() if shader: colorRampShaderFcn = shader.rasterShaderFunction() if colorRampShaderFcn: classes = colorRampShaderFcn.colorRampItemList() else: rat_log('Unsupported renderer for layer %s' % raster_layer, Qgis.Critical) return for klass in classes: if klass.label not in unique_labels: unique_labels.append(klass.label) unique_class_row_indexes.append(idx) idx += 1 rat_log( f'Deduplicating legend entries for layer {raster_layer.name()}: {unique_class_row_indexes}' ) QgsMapLayerLegendUtils.setLegendNodeOrder(node, unique_class_row_indexes) QgsMapLayerLegendUtils.setLegendNodeUserLabel(node, 0, criteria) model.refreshLayerLegend(node) if expand is not None: node.setExpanded(True)
def set_legend(layout: QgsPrintLayout, tree: QgsLayerTree, layer: QgsLayer, item_id: str): '''Sets the Legend items''' logging.info(f'setting legend: {item_id}') item = layout.itemById(item_id) # set layer as root for legend tree.addLayer(layer) model = item.model() model.setRootGroup(tree) root = model.rootGroup().findLayer(layer) # hide the node title QgsLegendRenderer.setNodeLegendStyle(root, QgsLegendStyle.Hidden) # hide the node with label: Band 1 (Gray) if isinstance(layer, QgsRasterLayer): nodes = model.layerLegendNodes(root) if nodes[0].data(0) == 'Band 1 (Gray)': indexes = list(range(1, len(nodes))) QgsMapLayerLegendUtils.setLegendNodeOrder(root, indexes) model.refreshLayerLegend(root)