mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-24 00:47:57 -05:00
This allows nice and simple, elegant construction of checks for Python. To use, Python based checks should use the decorator syntax: from qgis.core import check @check.register(type=QgsAbstractValidityCheck.TypeLayoutCheck) def my_layout_check(context, feedback): results = ... return results Or, a more complete example. This one throws a warning when attempting to export a layout with a map item set to the Web Mercator projection: @check.register(type=QgsAbstractValidityCheck.TypeLayoutCheck) def layout_map_crs_choice_check(context, feedback): layout = context.layout results = [] for i in layout.items(): if isinstance(i, QgsLayoutItemMap) and i.crs().authid() == 'EPSG:3857': res = QgsValidityCheckResult() res.type = QgsValidityCheckResult.Warning res.title='Map projection is misleading' res.detailedDescription='The projection for the map item {} is set to <i>Web Mercator (EPSG:3857)</i> which misrepresents areas and shapes. Consider using an appropriate local projection instead.'.format(i.displayName()) results.append(res) return results
96 lines
3.0 KiB
Python
96 lines
3.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
***************************************************************************
|
|
validitycheck.py
|
|
---------------------
|
|
Date : January 2019
|
|
Copyright : (C) 2019 by Nyall Dawson
|
|
Email : nyall dot dawson at gmail dot com
|
|
***************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************
|
|
"""
|
|
from qgis._core import (
|
|
QgsAbstractValidityCheck,
|
|
QgsApplication)
|
|
|
|
|
|
class CheckFactory:
|
|
"""
|
|
Constructs QgsAbstractValidityChecks using a decorator.
|
|
|
|
To use, Python based checks should use the decorator syntax:
|
|
|
|
.. highlight:: python
|
|
.. code-block:: python
|
|
@check.register(type=QgsAbstractValidityCheck.TypeLayoutCheck)
|
|
def my_layout_check(context, feedback):
|
|
results = ...
|
|
return results
|
|
|
|
"""
|
|
|
|
def __init__(self):
|
|
# unfortunately /Transfer/ annotation isn't working correct on validityCheckRegistry().addCheck(),
|
|
# so we manually need to store a reference to all checks we register
|
|
self.checks = []
|
|
|
|
def register(self, type, *args, **kwargs):
|
|
"""
|
|
Implements a decorator for registering Python based checks.
|
|
|
|
:param type: check type, e.g. QgsAbstractValidityCheck.TypeLayoutCheck
|
|
"""
|
|
|
|
def dec(f):
|
|
check = CheckWrapper(check_type=type, check_func=f)
|
|
self.checks.append(check)
|
|
QgsApplication.validityCheckRegistry().addCheck(check)
|
|
|
|
return dec
|
|
|
|
|
|
class CheckWrapper(QgsAbstractValidityCheck):
|
|
"""
|
|
Wrapper object used to create new validity checks from @check.
|
|
"""
|
|
|
|
def __init__(self, check_type, check_func):
|
|
"""
|
|
Initializer for CheckWrapper.
|
|
|
|
:param check_type: check type, e.g. QgsAbstractValidityCheck.TypeLayoutCheck
|
|
:param check_func: test function, should return a list of QgsValidityCheckResult results
|
|
"""
|
|
super().__init__()
|
|
self._check_type = check_type
|
|
self._results = []
|
|
self._check_func = check_func
|
|
|
|
def create(self):
|
|
return CheckWrapper(check_type=self._check_type, check_func=self._check_func)
|
|
|
|
def id(self):
|
|
return self._check_func.__name__
|
|
|
|
def checkType(self):
|
|
return self._check_type
|
|
|
|
def prepareCheck(self, context, feedback):
|
|
self._results = self._check_func(context, feedback)
|
|
if self._results is None:
|
|
self._results = []
|
|
return True
|
|
|
|
def runCheck(self, context, feedback):
|
|
return self._results
|
|
|
|
|
|
check = CheckFactory()
|