18.28. خطافات السكربتات قبل التنفيذ وبعده

ملاحظة

يبيّن هذا الدرس كيفية استخدام خطافات ما قبل التنفيذ وما بعده، التي تتيح إجراء عمليات إضافية قبل المعالجة الفعلية وبعدها.

خطافات ما قبل التنفيذ وما بعده هي سكربتات معالجة تعمل قبل إجراء معالجة البيانات الفعلية وبعدها. ويمكن استخدامها لأتمتة المهام التي يجب تنفيذها كلما شُغّلت خوارزمية.

صياغة الخطافات مطابقة لصياغة سكربتات المعالجة، راجع الفصل المقابل في دليل مستخدم QGIS لمزيد من التفاصيل.

إضافة إلى جميع ميزات السكربتات، يمكنك في الخطافات استخدام متغير عام خاص اسمه alg، يمثّل الخوارزمية التي نُفّذت للتو (أو التي على وشك التنفيذ).

إليك مثالًا على سكربت ما بعد التنفيذ. افتراضيًا، تخزّن المعالجة نتائج التحليل في ملفات مؤقتة. سينسخ هذا السكربت المخرجات إلى مجلد محدد، كي لا تُحذف بعد إغلاق QGIS.

import os
import shutil
from processing.core.outputs import OutputVector, OutputRaster, OutputFile

MY_DIRECTORY = '/home/alex/outputs'

for output in alg.outputs:
    if isinstance(output, (OutputVector, OutputRaster, OutputFile)):
        dirname = os.path.split(output.value)[0]
        shutil.copytree(dirname, MY_DIRECTORY)

في السطرين الأولين نستورد حزم Python المطلوبة: os --- لمعالجة المسارات، مثل استخراج اسم الملف، و shutil --- لعمليات نظام الملفات المختلفة مثل نسخ الملفات. وفي السطر الثالث نستورد مخرجات المعالجة. سيُشرح هذا بمزيد من التفصيل لاحقًا في هذا الدرس.

ثم نعرّف ثابتًا اسمه MY_DIRECTORY، وهو مسار المجلد الذي نريد نسخ نتائج التحليل إليه.

في نهاية السكربت لدينا الشيفرة الرئيسية للخطاف. في الحلقة نمرّ بالتكرار على جميع مخرجات الخوارزمية ونتحقق مما إذا كان المُخرج قائمًا على ملف ويمكن نسخه. فإن كان كذلك، نحدد المجلد الأعلى الذي توجد فيه ملفات المخرجات ثم ننسخ جميع الملفات إلى مجلدنا.

لتفعيل هذا الخطاف، علينا فتح خيارات المعالجة، والعثور على المدخل المسمى Post-execution script file في مجموعة General، وتحديد اسم ملف سكربت الخطاف هناك. سيُنفَّذ الخطاف المحدد بعد كل خوارزمية معالجة.

وبطريقة مماثلة، يمكننا تنفيذ خطافات ما قبل التنفيذ. على سبيل المثال، لننشئ خطافًا يفحص الطبقات المتجهية المُدخلة بحثًا عن أخطاء في الشكل الهندسي.

from qgis.core import QgsGeometry, QgsFeatureRequest
from processing.core.parameters import ParameterVector

for param in alg.parameters:
    if isinstance(param, ParameterVector):
        layer = processing.getObject(param.value)
        for f in layer.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([])):
            errors = f.geometry().validateGeometry()
            if len(errors) > 0:
                progress.setInfo('One of the input vectors contains invalid geometries!')

كما في المثال السابق، نستورد أولًا حزم QGIS والمعالجة المطلوبة.

ثم نمرّ بالتكرار على جميع معاملات الخوارزمية، وإذا وُجد معامل من نوع ParameterVector، نحصل منه على كائن الطبقة المتجهية المقابل. ونمرّ على جميع معالم الطبقة ونفحصها بحثًا عن أخطاء في الشكل الهندسي. إذا احتوى معلم واحد على الأقل على شكل هندسي غير صالح، نطبع رسالة تحذير.

لتفعيل هذا الخطاف، علينا إدخال اسم ملفه في الخيار Pre-execution script file في نافذة حوار إعدادات المعالجة. سيُنفَّذ الخطاف قبل تشغيل أي خوارزمية معالجة.