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,
|
||
)
|