forked from AG_QGIS/Plugin_SN_Basis
171 lines
6.3 KiB
Python
171 lines
6.3 KiB
Python
|
|
"""
|
|||
|
|
sn_basis/modules/layerpruefer.py – Prüfung von QGIS-Layern.
|
|||
|
|
Verwendet ausschließlich qgisqt_wrapper und gibt pruef_ergebnis zurück.
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
from sn_basis.functions.qgisqt_wrapper import (
|
|||
|
|
layer_exists,
|
|||
|
|
get_layer_geometry_type,
|
|||
|
|
get_layer_feature_count,
|
|||
|
|
is_layer_visible,
|
|||
|
|
get_layer_type,
|
|||
|
|
get_layer_crs,
|
|||
|
|
get_layer_fields,
|
|||
|
|
get_layer_source,
|
|||
|
|
is_layer_editable,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
from sn_basis.modules.pruef_ergebnis import pruef_ergebnis
|
|||
|
|
|
|||
|
|
|
|||
|
|
class Layerpruefer:
|
|||
|
|
"""
|
|||
|
|
Prüft Layer auf Existenz, Sichtbarkeit, Geometrietyp, Objektanzahl,
|
|||
|
|
Layertyp, CRS, Felder, Datenquelle und Editierbarkeit.
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
def __init__(
|
|||
|
|
self,
|
|||
|
|
layer,
|
|||
|
|
erwarteter_geotyp: str | None = None,
|
|||
|
|
muss_sichtbar_sein: bool = False,
|
|||
|
|
erwarteter_layertyp: str | None = None,
|
|||
|
|
erwartetes_crs: str | None = None,
|
|||
|
|
erforderliche_felder: list[str] | None = None,
|
|||
|
|
erlaubte_datenquellen: list[str] | None = None,
|
|||
|
|
muss_editierbar_sein: bool = False,
|
|||
|
|
):
|
|||
|
|
self.layer = layer
|
|||
|
|
self.erwarteter_geotyp = erwarteter_geotyp
|
|||
|
|
self.muss_sichtbar_sein = muss_sichtbar_sein
|
|||
|
|
self.erwarteter_layertyp = erwarteter_layertyp
|
|||
|
|
self.erwartetes_crs = erwartetes_crs
|
|||
|
|
self.erforderliche_felder = erforderliche_felder or []
|
|||
|
|
self.erlaubte_datenquellen = erlaubte_datenquellen or []
|
|||
|
|
self.muss_editierbar_sein = muss_editierbar_sein
|
|||
|
|
|
|||
|
|
# ---------------------------------------------------------
|
|||
|
|
# Hauptfunktion
|
|||
|
|
# ---------------------------------------------------------
|
|||
|
|
|
|||
|
|
def pruefe(self) -> pruef_ergebnis:
|
|||
|
|
|
|||
|
|
# -----------------------------------------------------
|
|||
|
|
# 1. Existenz
|
|||
|
|
# -----------------------------------------------------
|
|||
|
|
if not layer_exists(self.layer):
|
|||
|
|
return pruef_ergebnis(
|
|||
|
|
ok=False,
|
|||
|
|
meldung="Der Layer existiert nicht oder wurde nicht geladen.",
|
|||
|
|
aktion="layer_nicht_gefunden", # type: ignore
|
|||
|
|
pfad=None,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# -----------------------------------------------------
|
|||
|
|
# 2. Sichtbarkeit
|
|||
|
|
# -----------------------------------------------------
|
|||
|
|
sichtbar = is_layer_visible(self.layer)
|
|||
|
|
if self.muss_sichtbar_sein and not sichtbar:
|
|||
|
|
return pruef_ergebnis(
|
|||
|
|
ok=False,
|
|||
|
|
meldung="Der Layer ist unsichtbar. Soll er eingeblendet werden?",
|
|||
|
|
aktion="layer_unsichtbar", # type: ignore
|
|||
|
|
pfad=self.layer, # Layerobjekt wird übergeben
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# -----------------------------------------------------
|
|||
|
|
# 3. Layertyp
|
|||
|
|
# -----------------------------------------------------
|
|||
|
|
layertyp = get_layer_type(self.layer)
|
|||
|
|
if self.erwarteter_layertyp and layertyp != self.erwarteter_layertyp:
|
|||
|
|
return pruef_ergebnis(
|
|||
|
|
ok=False,
|
|||
|
|
meldung=f"Der Layer hat den Typ '{layertyp}', erwartet wurde '{self.erwarteter_layertyp}'.",
|
|||
|
|
aktion="falscher_layertyp",
|
|||
|
|
pfad=None,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# -----------------------------------------------------
|
|||
|
|
# 4. Geometrietyp
|
|||
|
|
# -----------------------------------------------------
|
|||
|
|
geotyp = get_layer_geometry_type(self.layer)
|
|||
|
|
if self.erwarteter_geotyp and geotyp != self.erwarteter_geotyp:
|
|||
|
|
return pruef_ergebnis(
|
|||
|
|
ok=False,
|
|||
|
|
meldung=f"Der Layer hat den Geometrietyp '{geotyp}', erwartet wurde '{self.erwarteter_geotyp}'.",
|
|||
|
|
aktion="falscher_geotyp",
|
|||
|
|
pfad=None,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# -----------------------------------------------------
|
|||
|
|
# 5. Featureanzahl
|
|||
|
|
# -----------------------------------------------------
|
|||
|
|
anzahl = get_layer_feature_count(self.layer)
|
|||
|
|
if anzahl == 0:
|
|||
|
|
return pruef_ergebnis(
|
|||
|
|
ok=False,
|
|||
|
|
meldung="Der Layer enthält keine Objekte.",
|
|||
|
|
aktion="layer_leer",
|
|||
|
|
pfad=None,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# -----------------------------------------------------
|
|||
|
|
# 6. CRS
|
|||
|
|
# -----------------------------------------------------
|
|||
|
|
crs = get_layer_crs(self.layer)
|
|||
|
|
if self.erwartetes_crs and crs != self.erwartetes_crs:
|
|||
|
|
return pruef_ergebnis(
|
|||
|
|
ok=False,
|
|||
|
|
meldung=f"Der Layer hat das CRS '{crs}', erwartet wurde '{self.erwartetes_crs}'.",
|
|||
|
|
aktion="falsches_crs",
|
|||
|
|
pfad=None,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# -----------------------------------------------------
|
|||
|
|
# 7. Felder
|
|||
|
|
# -----------------------------------------------------
|
|||
|
|
felder = get_layer_fields(self.layer)
|
|||
|
|
fehlende = [f for f in self.erforderliche_felder if f not in felder]
|
|||
|
|
|
|||
|
|
if fehlende:
|
|||
|
|
return pruef_ergebnis(
|
|||
|
|
ok=False,
|
|||
|
|
meldung=f"Der Layer enthält nicht alle erforderlichen Felder: {', '.join(fehlende)}",
|
|||
|
|
aktion="felder_fehlen",
|
|||
|
|
pfad=None,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# -----------------------------------------------------
|
|||
|
|
# 8. Datenquelle
|
|||
|
|
# -----------------------------------------------------
|
|||
|
|
quelle = get_layer_source(self.layer)
|
|||
|
|
if self.erlaubte_datenquellen and quelle not in self.erlaubte_datenquellen:
|
|||
|
|
return pruef_ergebnis(
|
|||
|
|
ok=False,
|
|||
|
|
meldung=f"Die Datenquelle '{quelle}' ist nicht erlaubt.",
|
|||
|
|
aktion="datenquelle_unerwartet",
|
|||
|
|
pfad=None,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# -----------------------------------------------------
|
|||
|
|
# 9. Editierbarkeit
|
|||
|
|
# -----------------------------------------------------
|
|||
|
|
editable = is_layer_editable(self.layer)
|
|||
|
|
if self.muss_editierbar_sein and not editable:
|
|||
|
|
return pruef_ergebnis(
|
|||
|
|
ok=False,
|
|||
|
|
meldung="Der Layer ist nicht editierbar.",
|
|||
|
|
aktion="layer_nicht_editierbar",
|
|||
|
|
pfad=None,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# -----------------------------------------------------
|
|||
|
|
# 10. Alles OK
|
|||
|
|
# -----------------------------------------------------
|
|||
|
|
return pruef_ergebnis(
|
|||
|
|
ok=True,
|
|||
|
|
meldung="Layerprüfung erfolgreich.",
|
|||
|
|
aktion="ok",
|
|||
|
|
pfad=None,
|
|||
|
|
)
|