18. استخدام طبقات الإضافات

تلميح

تحتاج مقتطفات الشيفرة في هذه الصفحة إلى عمليات الاستيراد التالية إذا كنت خارج وحدة تحكم pyqgis:

1from qgis.core import (
2    QgsPluginLayer,
3    QgsPluginLayerType,
4    QgsMapLayerRenderer,
5    QgsApplication,
6    QgsProject,
7)
8
9from qgis.PyQt.QtGui import QImage

إذا كانت إضافتك تستخدم طرقها الخاصة لرسم طبقة خريطة، فقد تكون كتابة نوع طبقة خاص بك مبني على QgsPluginLayer أفضل طريقة لتطبيق ذلك.

18.1. إنشاء صنف فرعي من QgsPluginLayer

فيما يلي مثال على تطبيق مبسّط لـ QgsPluginLayer، وهو مبني على الشيفرة الأصلية لـ إضافة المثال Watermark.

أداة الرسم المخصّصة هي الجزء من التطبيق الذي يحدد الرسم الفعلي على لوحة الخريطة.

 1class WatermarkLayerRenderer(QgsMapLayerRenderer):
 2
 3    def __init__(self, layerId, rendererContext):
 4        super().__init__(layerId, rendererContext)
 5
 6    def render(self):
 7        image = QImage("/usr/share/icons/hicolor/128x128/apps/qgis.png")
 8        painter = self.renderContext().painter()
 9        painter.save()
10        painter.drawImage(10, 10, image)
11        painter.restore()
12        return True
13
14class WatermarkPluginLayer(QgsPluginLayer):
15
16    LAYER_TYPE="watermark"
17
18    def __init__(self):
19        super().__init__(WatermarkPluginLayer.LAYER_TYPE, "Watermark plugin layer")
20        self.setValid(True)
21
22    def createMapRenderer(self, rendererContext):
23        return WatermarkLayerRenderer(self.id(), rendererContext)
24
25    def setTransformContext(self, ct):
26        pass
27
28    # Methods for reading and writing specific information to the project file can
29    # also be added:
30
31    def readXml(self, node, context):
32        pass
33
34    def writeXml(self, node, doc, context):
35        pass

يمكن إضافة طبقة الإضافة إلى المشروع وإلى لوحة الخريطة مثل أي طبقة خريطة أخرى:

plugin_layer = WatermarkPluginLayer()
QgsProject.instance().addMapLayer(plugin_layer)

عند تحميل مشروع يحتوي على طبقة كهذه، يلزم صنف مصنع (factory):

 1class WatermarkPluginLayerType(QgsPluginLayerType):
 2
 3    def __init__(self):
 4        super().__init__(WatermarkPluginLayer.LAYER_TYPE)
 5
 6    def createLayer(self):
 7        return WatermarkPluginLayer()
 8
 9    # You can also add GUI code for displaying custom information
10    # in the layer properties
11    def showLayerProperties(self, layer):
12        pass
13
14
15# Keep a reference to the instance in Python so it won't
16# be garbage collected
17plt =  WatermarkPluginLayerType()
18
19assert QgsApplication.pluginLayerRegistry().addPluginLayerType(plt)