I wrote a python plugin whose purpose is to import a raster and put it in a group. My code works perfectly when I run it in the Python console of QGIS, but not when I run my plugin. The code is however identical...
Below the plugin code:
from qgis.PyQt.QtCore import QCoreApplication
from qgis.core import (QgsProcessing,
QgsFeatureSink,
QgsProcessingAlgorithm,
QgsProcessingParameterFeatureSource,
QgsProcessingParameterFeatureSink)
from qgis.core import (QgsProject,
QgsLayerTree,
QgsRasterLayer,
QgsLayerTreeGroup,
QgsLayerTreeLayer,
QgsLayerTreeNode)
class Algorithm(QgsProcessingAlgorithm):
OUTPUT = 'OUTPUT'
INPUT = 'INPUT'
def initAlgorithm(self, config):
self.addParameter(
QgsProcessingParameterFeatureSource(
self.INPUT,
self.tr('Input layer'),
[QgsProcessing.TypeVectorAnyGeometry]
)
)
self.addParameter(
QgsProcessingParameterFeatureSink(
self.OUTPUT,
self.tr('Output layer')
)
)
def processAlgorithm(self, parameters, context, feedback):
project = QgsProject.instance()
root = project.layerTreeRoot()
layer = QgsVectorLayer("Point?crs=EPSG:2154", "Layer", "memory")
project.addMapLayer(layer)
node_layer = root.findLayer(layer.id())
feedback.pushInfo(str(node_layer))
node_layer_clone = node_layer.clone()
node_group = root.insertGroup(0, 'Group')
node_group.insertChildNode(0, node_layer_clone)
parent = node_layer.parent()
parent.removeChildNode(node_layer)
def name(self):
return 'Algorithm'
def displayName(self):
return self.tr(self.name())
def group(self):
return self.tr(self.groupId())
def groupId(self):
return ''
def tr(self, string):
return QCoreApplication.translate('Processing', string)
def createInstance(self):
return Algorithm()
Below the plugin log output:
QGIS version: 3.22.12-Białowieża
QGIS code revision: b8534cb1
Qt version: 5.15.3
Python version: 3.9.5
GDAL version: 3.5.2
GEOS version: 3.10.3-CAPI-1.16.1
PROJ version: Rel. 9.1.0, September 1st, 2022
PDAL version: 2.4.3 (git-version: 434757)
Algorithm started at: 2023-02-03T16:46:19
Algorithm 'Algorithm' starting…
Input parameters:
{ 'INPUT' : 'memory://Point?crs=EPSG:2154&uid={86d92c21-b1db-47ac-b1fc-e20c1bdb8075}', 'OUTPUT' : 'TEMPORARY_OUTPUT' }
None
traceback.print_exception() failed
Execution failed after 0.07 seconds
Loading resulting layers
Algorithm 'Algorithm' finished
Below the code that I run in the QGIS Python console:
from qgis.core import (QgsProject, QgsRasterLayer)
project = QgsProject.instance()
root = project.layerTreeRoot()
layer = QgsVectorLayer("Point?crs=EPSG:2154", "Layer", "memory")
project.addMapLayer(layer)
node_layer = root.findLayer(layer.id())
feedback.pushInfo(str(node_layer))
node_layer_clone = node_layer.clone()
node_group = root.insertGroup(0, 'Group')
node_group.insertChildNode(0, node_layer_clone)
parent = node_layer.parent()
parent.removeChildNode(node_layer)
The plugin log output indicates that node_layer is None, while it takes the value <QgsLayerTreeLayer: Layer> when I run it in the Python console.
I wonder if my plugin contains all the necessary classes (but which ones to add?), or if there would conflicts between classes?
QgsVectorLayer
in your plugin imports, but I can seeQgsRasterLayer
. are you importing raster or vector ?