Skip to content

Commit

Permalink
Merge pull request #775 from krebslw/niv-punktsamling
Browse files Browse the repository at this point in the history
Punktsamling 3: Tilføj nye niv-underkommandoer til håndtering af punktsamlinger og tidsserier
  • Loading branch information
krebslw authored Oct 2, 2024
2 parents ab0870f + 81021b0 commit 51c5614
Show file tree
Hide file tree
Showing 5 changed files with 1,556 additions and 13 deletions.
39 changes: 32 additions & 7 deletions fire/api/model/punkttyper.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ class Punkt(FikspunktregisterObjekt):
)
punktsamlinger = relationship(
"PunktSamling",
secondary = punktsamling_punkt,
secondary=punktsamling_punkt,
order_by="PunktSamling.objektid",
viewonly=True,
)
Expand Down Expand Up @@ -268,10 +268,7 @@ def tabtgået(self) -> bool:
def _hent_ident_af_type(self, identtype: str) -> str:
numre = []
for punktinfo in self.punktinformationer:
if (
punktinfo.infotype.name == identtype
and not punktinfo.registreringtil
):
if punktinfo.infotype.name == identtype and not punktinfo.registreringtil:
numre.append(punktinfo.tekst)

if numre:
Expand All @@ -294,7 +291,7 @@ def gnss_navn(self) -> str:

@property
def jessennummer(self) -> str:
return self._hent_ident_af_type("IDENT:jessen")
return self._hent_ident_af_type("IDENT:jessen")

def __lt__(self, other: Punkt) -> bool:
return self.landsnummer < other.landsnummer
Expand Down Expand Up @@ -342,7 +339,35 @@ def jessenkote(self) -> float:
jessenpunktet.
Punktsamlinger som ikke har et jessenkoordinat, antages at have jessenkoten 0.
"""
return (self.jessenkoordinat.z if self.jessenkoordinat is not None else 0)
return self.jessenkoordinat.z if self.jessenkoordinat is not None else 0

def tilføj_punkter(self, punkter: list[Punkt]) -> None:
"""
Føj punkter til punktsamlingen.
Ændrer punktsamlingens liste af punkter in-place. Hvis et eller flere punkter
findes i punktsamlingen i forvejen udsendes en ValueError.
"""
fællesmængde = set(punkter) & set(self.punkter)

if len(fællesmængde) != 0:
raise ValueError(
f"Kan ikke tilføje et eller flere af de angivne punkter til Punktsamling '{self.navn}' da de allerede er indeholdt!"
)
self.punkter.extend(punkter)

def fjern_punkter(self, punkter: list[Punkt]) -> None:
"""
Fjern punkter fra punktsamlingen.
Ændrer punktsamlingens liste af punkter in-place. Hvis et eller flere punkter ikke
findes i punktsamlingen i forvejen udsendes en ValueError.
"""
if self.jessenpunkt in punkter:
raise ValueError(f"Kan ikke fjerne en punktsamlings jessenpunkt!")

for p in punkter:
self.punkter.remove(p)


class PunktInformation(FikspunktregisterObjekt):
Expand Down
89 changes: 89 additions & 0 deletions fire/cli/niv/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -619,6 +619,88 @@ def er_projekt_okay(projektnavn: str) -> None:
return


def udled_jessenpunkt_fra_punktoversigt(
punktoversigt: pd.DataFrame,
) -> tuple[float, Punkt]:
"""
Udleder Jessenpunktet ud fra oplysningerne i Punktoversigten.
Returnerer oplysninger om det validerede jessenpunkt.
"""

# Tjek om der er anvendt Jessen-system
# Denne er et sanity-tjek -- Man skal ville det hvis man vil oprette punktsamlinger!
if len(set(punktoversigt["System"])) > 1:
fire.cli.print(
"FEJL: Flere forskellige højdereferencesystemer er angivet i Punktoversigt!",
fg="white",
bg="red",
bold=True,
)
raise SystemExit(1)

kotesystem = punktoversigt["System"].iloc[0]
if kotesystem != "Jessen":
fire.cli.print(
"FEJL: Kotesystem skal være 'Jessen'",
fg="white",
bg="red",
bold=True,
)
raise SystemExit(1)

# Tjek om der kun er ét fastholdt punkt, og gør brugeren opmærksom på hvis punktet
# ikke har et Jessennummer.
fastholdte_punkter = punktoversigt["Punkt"][punktoversigt["Fasthold"] == "x"]
fastholdte_koter = punktoversigt["Kote"][punktoversigt["Fasthold"] == "x"]

if len(fastholdte_punkter) != 1:
fire.cli.print(
"FEJL: Punktsamlinger kræver netop ét fastholdt Jessenpunkt.",
fg="white",
bg="red",
bold=True,
)
raise SystemExit(1)

if pd.isna(fastholdte_koter).any():
fire.cli.print(
"FEJL: Fastholdt punkt har ikke nogen fastholdt kote!",
fg="white",
bg="red",
bold=True,
)
raise SystemExit(1)

jessenpunkt_ident = fastholdte_punkter.iloc[0]
jessenpunkt_kote = fastholdte_koter.iloc[0]

try:
jessenpunkt = firedb.hent_punkt(jessenpunkt_ident)
except NoResultFound:
fire.cli.print(
f"FEJL: Kunne ikke finde Jessenpunktet {jessenpunkt_ident} i databasen!",
fg="white",
bg="red",
bold=True,
)
raise SystemExit(1)

return jessenpunkt_kote, jessenpunkt


def afbryd_hvis_ugyldigt_jessenpunkt(jessenpunkt: Punkt) -> None:
"""Smid fejl hvis valgt jessenpunkt ikke er et registreret jessenpunkt"""
if not jessenpunkt.jessennummer:
fire.cli.print(
f"FEJL: Jessenpunktet {jessenpunkt.ident} har intet Jessennummer. "
"Jessennummer kan oprettes igennem Punktrevision ved indsættelse af IDENT:jessen og NET:jessen.",
fg="black",
bg="yellow",
)
raise SystemExit(1)


"""
Modulnavne starter med `_` for at undgå konflikter,
der i visse tilfælde kan opstå.
Expand All @@ -645,3 +727,10 @@ def er_projekt_okay(projektnavn: str) -> None:
from ._regn import regn
from ._udtræk_observationer import udtræk_observationer
from ._udtræk_revision import udtræk_revision
from .punktsamling import (
opret_punktsamling,
udtræk_punktsamling,
ilæg_punktsamling,
ilæg_tidsserie,
fjern_punkt_fra_punktsamling,
)
Loading

0 comments on commit 51c5614

Please sign in to comment.