def nodeOrder(self, group): nodeorder = [] layerTree = QgsLayerTree() for node in group: if QgsLayerTree.isGroup(node): groupname = node.name() nodeorder.append(groupname) for child in self.nodeOrder(node.children()): nodeorder.append(groupname + '-' + child) elif QgsLayerTree.isLayer(node): nodeorder.append(node.layer().name()) return nodeorder
def set_legend_compositions(self, print_layout): non_ident = QgsProject.instance().nonIdentifiableLayers() self.legend_tree_root = QgsLayerTree() layer_nodes = [] for lyr in self.iface.mapCanvas().layers(): if lyr.id() not in non_ident: layer_nodes.append(QgsLayerTreeLayer(lyr)) self.legend_tree_root.insertChildNodes(-1, layer_nodes) # update the model for item in print_layout.items(): if not isinstance(item, QgsLayoutItemLegend): continue legend_model = item.model() legend_model.setRootGroup(self.legend_tree_root)
def testCustomLayerOrderChanged(self): layer = QgsVectorLayer("Point?field=fldtxt:string", "layer1", "memory") layer2 = QgsVectorLayer("Point?field=fldtxt:string", "layer2", "memory") layer_tree = QgsLayerTree() layer_order_changed_spy = QSignalSpy( layer_tree.customLayerOrderChanged) layer1_node = QgsLayerTreeLayer(layer) layer_tree.addChildNode(layer1_node) self.assertEqual(len(layer_order_changed_spy), 1) layer2_node = QgsLayerTreeLayer(layer2) layer_tree.addChildNode(layer2_node) self.assertEqual(len(layer_order_changed_spy), 2) # simulate a layer move in the tree layer3_node = QgsLayerTreeLayer(layer) layer_tree.addChildNode(layer3_node) self.assertEqual(len(layer_order_changed_spy), 3) layer_tree.removeChildNode(layer1_node) self.assertEqual(len(layer_order_changed_spy), 4)
def with_legend_btn_run(self): project = QgsProject.instance() self.checked_layers = [] root = project.layerTreeRoot() for child in root.children(): if child.isVisible() and isinstance(child, QgsLayerTreeLayer): self.checked_layers.append(child.name()) if child.isVisible() and isinstance(child, QgsLayerTreeGroup): self.get_group_layers(child) layersToAdd = [ layer for layer in project.mapLayers().values() if layer.name() in sorted(self.checked_layers, reverse=False) ] layers_names_length = [ len(layer.name()) for layer in project.mapLayers().values() if layer.name() in sorted(self.checked_layers, reverse=False) ] maxlen = max(layers_names_length) root = QgsLayerTree() for layer in layersToAdd: root.addLayer(layer) model = QgsLayerTreeModel(root) lenlen = model.rowCount() view = QgsLayerTreeView() view.setModel(model) view.setFixedHeight(lenlen * 20) view.setFixedWidth(maxlen * 10) legendIm = QImage(QWidget.grab(view)) legendpath = self.plugin_dir + "\\legend.png" legendIm.save(legendpath) legendIm = Image.open(legendpath) #legendIm = legendIm.imageData() legendWidth, legendHeight = legendIm.size main_image = QImage(QWidget.grab(self.iface.mapCanvas())) mainpath = self.plugin_dir + "\\main.png" main_image.save(mainpath) main_image = Image.open(mainpath).convert("RGBA") width, height = main_image.size d = ImageDraw.Draw(main_image) font = ImageFont.truetype("arial.ttf", 16) d.text(((width / 2.5) + len(project.title()), 10), project.title(), fill='black', font=font) if abs(height - width) < 150: sq_fit_size = legendWidth height = legendHeight else: sq_fit_size = width if width > sq_fit_size and height > sq_fit_size: if width > height: height = int((sq_fit_size / width) * height) width = sq_fit_size else: width = int((sq_fit_size / height) * width) height = sq_fit_size main_image = main_image.resize((width, height)) main_image.paste(legendIm, (max(width - legendWidth, 0), height - legendHeight)) finalpath = self.plugin_dir + "\\main.png" main_image.save(finalpath) QApplication.clipboard().setImage(QImage(finalpath)) self.iface.messageBar().pushMessage( 'QCopycanvas', 'Copied map canvas to clipboard with legend', level=Qgis.Success, duration=2)