2. تحميل المشاريع¶
تلميح
تحتاج مقتطفات الشيفرة في هذه الصفحة إلى عمليات الاستيراد التالية إذا كنت خارج وحدة تحكم pyqgis:
1from qgis.core import (
2 Qgis,
3 QgsProject,
4 QgsPathResolver
5)
6
7from qgis.gui import (
8 QgsLayerTreeMapCanvasBridge,
9)
تحتاج أحيانًا إلى تحميل مشروع موجود من إضافة أو (في الغالب) عند تطوير تطبيق QGIS مستقل بلغة Python (انظر: تطبيقات Python).
لتحميل مشروع في تطبيق QGIS الحالي، تحتاج إلى نسخة من الصنف QgsProject. وهو صنف أحادي النسخة (singleton)، لذا يجب استخدام دالته instance() لذلك. ويمكنك استدعاء دالته read() مع تمرير مسار المشروع المراد تحميله:
1# If you are not inside a QGIS console you first need to import
2# qgis and PyQt classes you will use in this script as shown below:
3from qgis.core import QgsProject
4# Get the project instance
5project = QgsProject.instance()
6# Print the current project file name (might be empty in case no projects have been loaded)
7# print(project.fileName())
8
9# Load another project
10project.read('testdata/01_project.qgs')
11print(project.fileName())
testdata/01_project.qgs
إذا احتجت إلى إجراء تعديلات على المشروع (مثل إضافة بعض الطبقات أو إزالتها) وحفظ تغييراتك، فاستدعِ الدالة write() لنسخة مشروعك. وتقبل الدالة write() أيضًا مسارًا اختياريًا لحفظ المشروع في موقع جديد:
# Save the project to the same
project.write()
# ... or to a new file
project.write('testdata/my_new_qgis_project.qgs')
تُرجع كلتا الدالتين read() و write() قيمة منطقية يمكنك استخدامها للتحقق من نجاح العملية.
ملاحظة
إذا كنت تكتب تطبيق QGIS مستقلًا، فلمزامنة المشروع المحمّل مع لوحة الخريطة تحتاج إلى إنشاء نسخة من QgsLayerTreeMapCanvasBridge كما في المثال أدناه:
bridge = QgsLayerTreeMapCanvasBridge( \
QgsProject.instance().layerTreeRoot(), canvas)
# Now you can safely load your project and see it in the canvas
project.read('testdata/my_new_qgis_project.qgs')
2.1. معالجة المسارات المعطوبة¶
قد يحدث أن تُنقل الطبقات المحمّلة في المشروع إلى موقع آخر، فعند تحميل المشروع مجددًا تكون جميع مسارات الطبقات معطوبة. يساعدك الصنف QgsPathResolver على إعادة كتابة مسارات الطبقات داخل المشروع.
تتيح دالته setPathPreprocessor() تعيين دالة معالجة مسبقة مخصّصة للمسارات، لتعديل المسارات ومصادر البيانات قبل تحويلها إلى مراجع ملفات أو مصادر طبقات.
يجب أن تقبل دالة المعالجة وسيطًا نصيًا واحدًا (يمثّل مسار الملف الأصلي أو مصدر البيانات) وأن تُرجع نسخة معالَجة من هذا المسار. تُستدعى دالة المعالجة المسبقة للمسارات قبل أي معالِج للطبقات المعطوبة. وإذا عُيّنت عدة دوال معالجة مسبقة، فستُستدعى بالتتابع وفق ترتيب تعيينها الأصلي.
بعض حالات الاستخدام:
استبدال مسار قديم:
def my_processor(path): return path.replace('c:/Users/ClintBarton/Documents/Projects', 'x:/Projects/') QgsPathResolver.setPathPreprocessor(my_processor)
استبدال عنوان مضيف قاعدة البيانات بعنوان جديد:
def my_processor(path): return path.replace('host=10.1.1.115', 'host=10.1.1.116') QgsPathResolver.setPathPreprocessor(my_processor)
استبدال بيانات اعتماد قاعدة البيانات المخزّنة ببيانات جديدة:
1def my_processor(path): 2 path= path.replace("user='gis_team'", "user='team_awesome'") 3 path = path.replace("password='cats'", "password='g7as!m*'") 4 return path 5 6QgsPathResolver.setPathPreprocessor(my_processor)
وبالمثل، تتوفر الدالة setPathWriter() لتعيين دالة كتابة المسارات.
مثال على استبدال المسار بمتغير:
def my_processor(path):
return path.replace('c:/Users/ClintBarton/Documents/Projects', '$projectdir$')
QgsPathResolver.setPathWriter(my_processor)
تُرجع كلتا الدالتين id يمكن استخدامه لإزالة دالة المعالجة المسبقة أو دالة الكتابة التي أضافتها. راجع removePathPreprocessor() و removePathWriter().
2.2. استخدام الرايات لتسريع العمل¶
في بعض الحالات قد لا تحتاج إلى مشروع يعمل بكامل وظائفه، بل تريد الوصول إليه لغرض محدد فقط، وهنا قد تفيد الرايات (flags). تتوفر قائمة كاملة بالرايات في ProjectReadFlag. ويمكن الجمع بين عدة رايات.
على سبيل المثال، إذا لم تكن الطبقات والبيانات الفعلية تهمّنا وأردنا ببساطة الوصول إلى المشروع (مثلًا لإعدادات التخطيط أو العرض ثلاثي الأبعاد)، فيمكننا استخدام الراية DontResolveLayers لتجاوز خطوة التحقق من البيانات ومنع ظهور نافذة حوار الطبقات المعطوبة. ويمكن القيام بما يلي:
readflags = Qgis.ProjectReadFlags()
readflags |= Qgis.ProjectReadFlag.DontResolveLayers
project = QgsProject.instance()
project.read('C:/Users/ClintBarton/Documents/Projects/mysweetproject.qgs', readflags)
لإضافة مزيد من الرايات يجب استخدام عامل OR الثنائي (Bitwise OR) في Python (|).