summaryrefslogtreecommitdiff
path: root/src/FYBA/FYLH.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/FYBA/FYLH.cpp')
-rw-r--r--src/FYBA/FYLH.cpp1035
1 files changed, 1035 insertions, 0 deletions
diff --git a/src/FYBA/FYLH.cpp b/src/FYBA/FYLH.cpp
new file mode 100644
index 0000000..93fafd5
--- /dev/null
+++ b/src/FYBA/FYLH.cpp
@@ -0,0 +1,1035 @@
+/*
+CH FYLH AR-900503 BIBLIOTEK
+CD =================================================================
+CD
+CD Eier.......: STATENS KARTVERK / FYSAK-prosjektet
+CD Ansvarlig..: Georg Langerak / Andreas Røstad
+CD
+CD Rutiner for å handtere hodet på SOSI-filer når dette ligger
+CD som ginfo i RB.
+CD ==============================================================
+*/
+
+#include "stdafx.h"
+
+#include <math.h>
+#include <time.h>
+#include <ctype.h>
+#include <fcntl.h>
+
+/* Globale variabler */
+extern LC_SYSTEMADM Sys;
+
+
+
+/*
+AR:2000-10-07
+CH LC_PutTransEx Legger inn ..TRANSPAR i hodet
+CD ==========================================================================
+CD Formål:
+CD Legger inn innholdet under ..TRANSPAR i ginfo i aktuell gruppe.
+CD OBS! Forutsetter at aktuell gruppe er et SOSI-filhode versjon 3.x.
+CD
+CD Må velge mellom KOORDSYS, TRANSSYS eller GEOSYS.
+CD Kun en av disse kan benyttes i filhodet.
+CD KOORDSYS er den mest vanlige måte å definere referansesystem.
+CD
+CD GEOKOORD skal benyttes for GEOSYS og for TRANSSYS
+CD
+CD Må velge mellom VERT-DATUM eller VERT-INT.
+CD VERT-DATUM er den mest vanlige beskrivelsesmåten.
+CD
+CD Følgende kompaktifisering brukes:
+CD ..TRANSPAR
+CD ...KOORDSYS <SYSKODE> <DATUM> <PROJEK>
+CD ...TRANSSYS <TILSYS> <KONSTA1> <KONSTB1> <KONSTA2> <KONSTB2> <KONSTC1> <KONSTC2>
+CD ...GEOSYS <GEO-DATUM> <GEO-PROJ> <GEO-SONE>
+CD ...GEOKOORD <GEOKOORD>
+CD ...ORIGO-NØ <ORIGO-N> <ORIGO-Ø>
+CD ...ENHET <ENHET>
+CD ...ENHET-H <ENHET-H>
+CD ...ENHET-D <ENHET-D>
+CD ...VERT-DATUM <HØYDE-REF> <DYBDE-REF> <FRISEIL-REF> <HØYDE-TYPE>
+CD ...VERT-INT <H-REF-INT> <D-REF-INT> <F-REF-INT>
+CD ...VERT-DELTA <V-DELTA-MIN> <V-DELTA-MAX>
+CD
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD unsigned short usMaske i Maske som styrer hvilke deler av TRANSPAR som brukt
+CD Følgende konstanter er definert:
+CD LC_TR_KOORDSYS - Koordsys
+CD LC_TR_TRANSSYS - Transsys
+CD LC_TR_GEOSYS - Geosys
+CD LC_TR_GEOKOORD - Geokoord
+CD LC_TR_ORIGO - Origo-nø
+CD LC_TR_ENHET - Enhet
+CD LC_TR_ENHETH - Enhet-h
+CD LC_TR_ENHETD - Enhet-d
+CD LC_TR_VERTDATUM - Vert-datum
+CD LC_TR_VERTINT - Vert-int
+CD LC_TR_VERTDELTA - Vert-delta
+CD
+CD LC_TRANSPAR * pTrans i Peker til struktur med ..TRANSPAR informasjonen.
+CD short ngi r Antall GINFO-linjer etter oppdateringen.
+CD
+CD Bruk:
+CD LC_TRANSPAR Trans;
+CD unsigned short usMaske = LC_TR_KOORDSYS | LC_TR_ORIGO | LC_TR_ENHET;
+CD Trans.sKoordsys = 32;
+CD Trans.dOrigoAust = 0.0;
+CD Trans.dOrigoNord = 0.0;
+CD Trans.dEnhet = 1.0;
+CD ngi = LC_PutTransEx(usMaske,&Trans);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_PutTransEx(unsigned short usMaske, LC_TRANSPAR * pTrans)
+{
+ short i,lin,ngi;
+ long nko;
+ unsigned short info;
+ char *cp = NULL;
+ char szGiLin[LC_MAX_SOSI_LINJE_LEN];
+
+
+ /* Ingen aktuell gruppe */
+ if (Sys.GrId.lNr == INGEN_GRUPPE) {
+ LC_Error(49,"(LC_PutTrans)","");
+ return Sys.pGrInfo->ngi;
+ }
+
+ /* Aktuell gruppe er ikke .HODE */
+ if (Sys.pGrInfo->gnavn != L_HODE) {
+ LC_Error(94,"(LC_PutTrans)","");
+ return Sys.pGrInfo->ngi;
+ }
+
+
+ /* ----- Fjerner gammel transpar ----- */
+ LC_GetGrPara(&ngi,&nko,&info);
+ lin=2;
+ if (LC_GetGP("..TRANSPAR",&lin,ngi) != NULL) {
+ i = lin;
+ do {
+ i++;
+ if (i <= ngi) cp = LC_GetGi(i);
+ } while ( i <= ngi && cp[2] == '.' );
+ /* i peker nå til første linje etter hele ..TRANSPAR med undernivåer */
+
+ LC_DelGiL(lin,(short)(i-lin));
+ }
+
+ /* ----- Legger inn ny transpar ----- */
+ LC_PutGi(LC_AppGiL(),"..TRANSPAR");
+
+ /* Koordsys */
+ if ((usMaske & LC_TR_KOORDSYS) != 0) {
+ UT_SNPRINTF(szGiLin, LC_MAX_SOSI_LINJE_LEN, "...KOORDSYS %hd %s %s",pTrans->sKoordsys,pTrans->szKoordsysDatum,pTrans->szKoordsysProjek);
+ LC_PutGi(LC_AppGiL(),szGiLin);
+ }
+
+ /* Transsys */
+ if ((usMaske & LC_TR_TRANSSYS) != 0) {
+ UT_SNPRINTF(szGiLin, LC_MAX_SOSI_LINJE_LEN, "...TRANSSYS %hd %f %f %f %f %f %f", pTrans->sTranssysTilsys,
+ pTrans->dTranssysKonstA1, pTrans->dTranssysKonstB1,
+ pTrans->dTranssysKonstA2, pTrans->dTranssysKonstB2,
+ pTrans->dTranssysKonstC1, pTrans->dTranssysKonstC2);
+ LC_PutGi(LC_AppGiL(),szGiLin);
+ }
+
+ /* Geosys */
+ if ((usMaske & LC_TR_GEOSYS) != 0) {
+ if (pTrans->sGeosysProj != LC_TR_GEOSYS_INGEN_VERDI)
+ {
+ UT_SNPRINTF(szGiLin, LC_MAX_SOSI_LINJE_LEN, "...GEOSYS %hd %hd %hd", pTrans->sGeosysDatum,
+ pTrans->sGeosysProj, pTrans->sGeosysSone);
+ }
+ else
+ {
+ UT_SNPRINTF(szGiLin, LC_MAX_SOSI_LINJE_LEN, "...GEOSYS %hd", pTrans->sGeosysDatum);
+ }
+
+ LC_PutGi(LC_AppGiL(),szGiLin);
+ }
+
+ /* Geokoord */
+ if ((usMaske & LC_TR_GEOKOORD) != 0) {
+ UT_SNPRINTF(szGiLin, LC_MAX_SOSI_LINJE_LEN, "...GEOKOORD %hd", pTrans->sGeoKoord);
+ LC_PutGi(LC_AppGiL(),szGiLin);
+ }
+
+ /* Origo */
+ if ((usMaske & LC_TR_ORIGO) != 0) {
+ UT_SNPRINTF(szGiLin, LC_MAX_SOSI_LINJE_LEN, "...ORIGO-NØ %.0f %.0f", pTrans->Origo.dNord, pTrans->Origo.dAust);
+ LC_PutGi(LC_AppGiL(),szGiLin);
+ }
+
+ /* Enhet */
+ if ((usMaske & LC_TR_ENHET) != 0) {
+ LC_PutGi(LC_AppGiL(),LB_FormaterEnhet(szGiLin,LC_MAX_SOSI_LINJE_LEN, "...ENHET", pTrans->dEnhet));
+ }
+
+ /* Enhet-h */
+ if ((usMaske & LC_TR_ENHETH) != 0) {
+ /*
+ * Hvis enhet og enhet_h er like
+ * skal det ikke legges inn ENHET-H
+ */
+ if (fabs(pTrans->dEnhet-pTrans->dEnhet_h) > 0.0000001) {
+ LC_PutGi(LC_AppGiL(),LB_FormaterEnhet(szGiLin,LC_MAX_SOSI_LINJE_LEN,"...ENHET-H",pTrans->dEnhet_h));
+ }
+ }
+
+ /* Enhet-d */
+ if ((usMaske & LC_TR_ENHETD) != 0) {
+ /*
+ * Hvis enhet og enhet_d er like
+ * skal det ikke legges inn ENHET-D
+ */
+ if (fabs(pTrans->dEnhet-pTrans->dEnhet_d) > 0.0000001) {
+ LC_PutGi(LC_AppGiL(),LB_FormaterEnhet(szGiLin,LC_MAX_SOSI_LINJE_LEN,"...ENHET-D",pTrans->dEnhet_d));
+ }
+ }
+
+ /* Vert-datum */
+ if ((usMaske & LC_TR_VERTDATUM) != 0) {
+ UT_SNPRINTF(szGiLin, LC_MAX_SOSI_LINJE_LEN, "...VERT-DATUM %s %s %s %s", pTrans->szVertdatHref,
+ pTrans->szVertdatDref, pTrans->szVertdatFref, pTrans->szVertdatHtyp);
+ LC_PutGi(LC_AppGiL(),szGiLin);
+ }
+
+ /* Vert-int */
+ if ((usMaske & LC_TR_VERTINT) != 0) {
+ UT_SNPRINTF(szGiLin, LC_MAX_SOSI_LINJE_LEN, "...VERT-INT %hd %hd %hd", pTrans->sVertintHref,
+ pTrans->sVertintDref, pTrans->sVertintFref);
+ LC_PutGi(LC_AppGiL(),szGiLin);
+ }
+
+ /* Vert-delta */
+ if ((usMaske & LC_TR_VERTDELTA) != 0) {
+ UT_SNPRINTF(szGiLin, LC_MAX_SOSI_LINJE_LEN, "...VERT-DELTA %hd %hd", pTrans->sVdeltaMin, pTrans->sVdeltaMax);
+ LC_PutGi(LC_AppGiL(),szGiLin);
+ }
+
+ return Sys.pGrInfo->ngi;
+}
+
+
+/*
+AR-910920
+CH LC_PutTrans Legger inn ..TRANSPAR i hodet
+CD ==========================================================================
+CD Formål:
+CD Legger inn transformasjonsparametrene i ginfo i aktuell gruppe.
+CD Forutsetter at aktuell gruppe er et SOSI-filhode versjon 3.x.
+CD
+CD OBS! Denne rutinen opprettholdes bare for bakoverkompatibilitet.
+CD For nye programmer bør LC_PutTransEx benyttes. LC_PutTransEx er
+CD kompatibel med nye versjoner av SOSI.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short koosys i Koordinatsystem
+CD double origo_a i Origo øst
+CD double origo_n i Origo nord
+CD double enhet i Enhet
+CD double enhet_h i Enhet-H
+CD double enhet_d i Enhet-D
+CD short ngi r Antall GINFO-linjer etter oppdateringen.
+CD
+CD Bruk:
+CD ngi = LC_PutTrans(koosys,origo_a,origo_n,enhet,enhet_h,enhet_d);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_PutTrans(short koosys,double origo_a,double origo_n,
+ double enhet,double enhet_h,double enhet_d)
+{
+ short i,ngi,linje_enhet;
+ char c[80];
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (Sys.pGrInfo->gnavn == L_HODE) { /* Aktuell gruppe .HODE */
+ UT_SNPRINTF(c,80,"%d",koosys);
+ ngi = LC_PutGP("...KOORDSYS",c,&i);
+ UT_SNPRINTF(c,80," %.0f %.0f",origo_n,origo_a);
+ ngi = LC_PutGP("...ORIGO-NØ",c,&i);
+ linje_enhet = 2;
+ LC_GetGP("...ENHET",&linje_enhet,ngi);
+ LC_PutGi(linje_enhet,LB_FormaterEnhet(c,80,"...ENHET",enhet));
+
+ /*
+ * Hvis enhet og enhet_h er like
+ * skal det ikke legges inn ENHET-H,
+ * eventuell gammel linje fjernes.
+ */
+
+ if (fabs(enhet-enhet_h) < 0.0000001) {
+ i = 2;
+ if (LC_GetGP("...ENHET-H",&i,ngi) != NULL) {
+ LC_DelGiL(i,1);
+ }
+
+ } else {
+
+ i = 2;
+ if (LC_GetGP("...ENHET-H",&i,ngi) == NULL) {
+ i = linje_enhet + 1;
+ ngi = LC_InsGiL(i,1); /* Ikke funnet, tildel ny linje */
+ }
+ LC_PutGi(i,LB_FormaterEnhet(c,80,"...ENHET-H",enhet_h));
+ }
+
+ /*
+ * Hvis enhet og enhet_d er like
+ * skal det ikke legges inn ENHET-D,
+ * eventuell gammel linje fjernes.
+ */
+ if (fabs(enhet-enhet_d) < 0.000001) {
+ i = 2;
+ if (LC_GetGP("...ENHET-D",&i,ngi) != NULL) {
+ LC_DelGiL(i,1);
+ }
+
+ } else {
+ i = 2;
+ if (LC_GetGP("...ENHET-D",&i,ngi) == NULL) {
+ i = linje_enhet + 1;
+ ngi = LC_InsGiL(i,1); /* Ikke funnet, tildel ny linje */
+ }
+ LC_PutGi(i,LB_FormaterEnhet(c,80,"...ENHET-D",enhet_d));
+
+ }
+
+ } else{ /* Gruppen er ikke filhode */
+ LC_Error(94,"(LC_PutTrans)","");
+ }
+
+ } else{ /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_PutTrans)","");
+ }
+
+ return Sys.pGrInfo->ngi;
+}
+
+
+/*
+AR:2000-10-07
+CH LC_GetTransEx Henter ..TRANSPAR fra hodet
+CD ==========================================================================
+CD Formål:
+CD Henter ut innholdet under ..TRANSPAR fra ginfo i aktuell gruppe.
+CD OBS! Forutsetter at aktuell gruppe er et SOSI-filhode.
+CD
+CD Må velge mellom KOORDSYS, TRANSSYS eller GEOSYS. Kun en av disse kan benyttes i filhodet.
+CD KOORDSYS er den mest vanlige måte å definere referansesystem.
+CD
+CD GEOKOORD skal benyttes for GEOSYS og for TRANSSYS
+CD
+CD Må velge mellom VERT-DATUM eller VERT-INT.
+CD VERT-DATUM er den mest vanlige beskrivelsesmåten.
+CD
+
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD unsigned short *pusMaske iu [Inn] Styrer hvilke deler av TRANSPAR som skal hentes
+CD [Ut] Viser hvilke deler av TRANSPAR som er funnet/hentet.
+CD Følgende konstanter er definert:
+CD LC_TR_ALLT - Alle deler av ..TRANSPAR hentes
+CD LC_TR_KOORDSYS - Koordsys
+CD LC_TR_TRANSSYS - Transsys
+CD LC_TR_GEOSYS - Geosys
+CD LC_TR_GEOKOORD - Geokoord
+CD LC_TR_ORIGO - Origo-nø
+CD LC_TR_ENHET - Enhet
+CD LC_TR_ENHETH - Enhet-h
+CD LC_TR_ENHETD - Enhet-d
+CD LC_TR_VERTDATUM - Vert-datum
+CD LC_TR_VERTINT - Vert-int
+CD LC_TR_VERTDELTA - Vert-delta
+CD
+CD LC_TRANSPAR * pTrans iu Peker til struktur som skal motta ..TRANSPAR informasjonen.
+CD short sStatus r Status: UT_TRUE=OK, UT_FALSE=feil (ikke funnet).
+CD
+CD Bruk:
+CD unsigned short usMaske = LC_TR_ALLT;
+CD LC_TRANSPAR Trans;
+CD ist = LC_GetTransEx(&usMaske,&Trans);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetTransEx(unsigned short *pusMaske, LC_TRANSPAR * pTrans)
+{
+ short lin,ngi,itxi;
+ long nko;
+ unsigned short us;
+ char *cp;
+ short ist = UT_TRUE;
+ unsigned short usMaskeInn = *pusMaske;
+
+
+ /* Nullstiller pTrans */
+ memset(pTrans,0,sizeof(LC_TRANSPAR));
+
+ /* Nullstiller masken */
+ *pusMaske = 0;
+
+ LC_GetGrPara(&ngi,&nko,&us);
+
+
+ /* ----- Div. kontroller ----- */
+
+ /* Ingen aktuell gruppe */
+ if (Sys.GrId.lNr == INGEN_GRUPPE) {
+ LC_Error(49,"(LC_GetTransEx)","");
+ return UT_FALSE;
+ }
+ /* Gruppen er ikke filhode */
+ if (Sys.pGrInfo->gnavn != L_HODE) {
+ LC_Error(94,"(LC_GetTransEx)","");
+ return UT_FALSE;
+ }
+ /* Transpar */
+ lin=2;
+ if (LC_GetGP("..TRANSPAR",&lin,ngi) == NULL) {
+ LC_Error(14,"(LC_GetTransEx)","");
+ return UT_FALSE;
+ }
+
+
+ /* ----- Henter verdier ----- */
+
+ /* Koordsys */
+ if ((usMaskeInn & LC_TR_KOORDSYS) != 0) {
+ lin = 2;
+ cp = LC_GetGP("...KOORDSYS",&lin,ngi);
+ if (cp == NULL) {
+ lin=2;
+ cp = LC_GetGP("..KOORDSYS",&lin,ngi);
+ }
+ if (cp != NULL) {
+ *pusMaske |= LC_TR_KOORDSYS;
+ UT_StrShort(cp,0,&itxi,&pTrans->sKoordsys);
+ UT_StrToken(cp,itxi,&itxi,36,pTrans->szKoordsysDatum);
+ UT_StrToken(cp,itxi,&itxi,36,pTrans->szKoordsysProjek);
+ }
+ }
+
+ /* Transsys */
+ if ((usMaskeInn & LC_TR_TRANSSYS) != 0) {
+ lin = 2;
+ if ((cp = LC_GetGP("...TRANSSYS",&lin,ngi)) != NULL) {
+ *pusMaske |= LC_TR_TRANSSYS;
+ UT_StrShort(cp,0,&itxi,&pTrans->sTranssysTilsys);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->dTranssysKonstA1);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->dTranssysKonstB1);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->dTranssysKonstA2);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->dTranssysKonstB2);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->dTranssysKonstC1);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->dTranssysKonstC2);
+ }
+ }
+
+ /* Geosys */
+ if ((usMaskeInn & LC_TR_GEOSYS) != 0) {
+ lin = 2;
+ if ((cp = LC_GetGP("...GEOSYS",&lin,ngi)) != NULL) {
+ *pusMaske |= LC_TR_GEOSYS;
+ UT_StrShort(cp,0,&itxi,&pTrans->sGeosysDatum);
+ UT_StrShort(cp,itxi,&itxi,&pTrans->sGeosysProj);
+ UT_StrShort(cp,itxi,&itxi,&pTrans->sGeosysSone);
+ }
+ }
+
+ /* Geokoord */
+ if ((usMaskeInn & LC_TR_GEOKOORD) != 0) {
+ lin = 2;
+ if ((cp = LC_GetGP("...GEOKOORD",&lin,ngi)) != NULL) {
+ *pusMaske |= LC_TR_GEOKOORD;
+ UT_StrShort(cp,0,&itxi,&pTrans->sGeoKoord);
+ }
+ }
+
+ /* Origo */
+ if ((usMaskeInn & LC_TR_ORIGO) != 0) {
+ //pTrans->dOrigoAust = 0.0;
+ //pTrans->dOrigoNord = 0.0;
+ lin = 2;
+ if ((cp = LC_GetGP("...ORIGO-NØ",&lin,ngi)) != NULL) {
+ *pusMaske |= LC_TR_ORIGO;
+ UT_StrDbl(cp,0,&itxi,'.',&pTrans->Origo.dNord);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->Origo.dAust);
+ }
+ }
+
+ /* Enhet */
+ if ((usMaskeInn & LC_TR_ENHET) != 0) {
+ lin = 2;
+ if ((cp = LC_GetGP("...ENHET",&lin,ngi)) != NULL) {
+ *pusMaske |= LC_TR_ENHET;
+ pTrans->dEnhet = strtod(cp,&cp);
+ }
+ }
+
+ /* Enhet-h */
+ if ((usMaskeInn & LC_TR_ENHETH) != 0) {
+ lin=2;
+ if ((cp = LC_GetGP("...ENHET-H",&lin,ngi)) == NULL) {
+ pTrans->dEnhet_h = pTrans->dEnhet;
+ } else {
+ *pusMaske |= LC_TR_ENHETH;
+ pTrans->dEnhet_h = strtod(cp,&cp);
+ }
+ }
+
+ /* Enhet-d */
+ if ((usMaskeInn & LC_TR_ENHETD) != 0) {
+ lin=2;
+ if ((cp = LC_GetGP("...ENHET-D",&lin,ngi)) == NULL) {
+ pTrans->dEnhet_d = pTrans->dEnhet;
+ } else {
+ *pusMaske |= LC_TR_ENHETD;
+ pTrans->dEnhet_d = strtod(cp,&cp);
+ }
+ }
+
+ /* Vert-datum */
+ if ((usMaskeInn & LC_TR_VERTDATUM) != 0) {
+ lin = 2;
+ if ((cp = LC_GetGP("...VERT-DATUM",&lin,ngi)) != NULL) {
+ *pusMaske |= LC_TR_VERTDATUM;
+ UT_StrToken(cp,0,&itxi,7,pTrans->szVertdatHref);
+ UT_StrToken(cp,itxi,&itxi,6,pTrans->szVertdatDref);
+ UT_StrToken(cp,itxi,&itxi,6,pTrans->szVertdatFref);
+ UT_StrToken(cp,itxi,&itxi,2,pTrans->szVertdatHtyp);
+ }
+ }
+
+ /* Vert-int */
+ if ((usMaskeInn & LC_TR_VERTINT) != 0) {
+ lin = 2;
+ if ((cp = LC_GetGP("...VERT-INT",&lin,ngi)) != NULL) {
+ *pusMaske |= LC_TR_VERTINT;
+ UT_StrShort(cp,0,&itxi,&pTrans->sVertintHref);
+ UT_StrShort(cp,itxi,&itxi,&pTrans->sVertintDref);
+ UT_StrShort(cp,itxi,&itxi,&pTrans->sVertintFref);
+ }
+ }
+
+ /* Vert-delta */
+ if ((usMaskeInn & LC_TR_VERTDELTA) != 0) {
+ lin = 2;
+ if ((cp = LC_GetGP("...VERT-DELTA",&lin,ngi)) != NULL) {
+ *pusMaske |= LC_TR_VERTDELTA;
+ UT_StrShort(cp,0,&itxi,&pTrans->sVdeltaMin);
+ UT_StrShort(cp,itxi,&itxi,&pTrans->sVdeltaMax);
+ }
+ }
+
+
+ /* ----- Div. sluttkontroll ----- */
+
+ /* Kontroller at det er funnet Koordsys, Transsys eller Geosys */
+ if ((usMaskeInn & LC_TR_KOORDSYS) != 0 ||
+ (usMaskeInn & LC_TR_TRANSSYS) != 0 ||
+ (usMaskeInn & LC_TR_GEOSYS) != 0 ) {
+ if ((*pusMaske & LC_TR_KOORDSYS) == 0 &&
+ (*pusMaske & LC_TR_TRANSSYS) == 0 &&
+ (*pusMaske & LC_TR_GEOSYS) == 0 ) {
+ /* Ikke noe koordinatsystem funnet */
+ LC_Error(15,"(LC_GetTransEx)","");
+ ist = UT_FALSE;
+ }
+ }
+
+ /* Kontroller at det er funnet Origo */
+ if ((usMaskeInn & LC_TR_ORIGO) != 0 &&
+ (*pusMaske & LC_TR_ORIGO) == 0 ) {
+ /* Origo mangler */
+ LC_Error(16,"(LC_GetTransEx)","");
+ ist = UT_FALSE;
+ }
+
+ /* Kontroller at det er funnet Enhet */
+ if ((usMaskeInn & LC_TR_ENHET) != 0 &&
+ (*pusMaske & LC_TR_ENHET) == 0 ) {
+ /* Enhet mangler */
+ LC_Error(17,"(LC_GetTransEx)","");
+ ist = UT_FALSE;
+ }
+
+ return ist;
+}
+
+
+/*
+GL-880427
+AR-910920
+CH LC_GetTrans Finner ..TRANSPAR i hodet
+CD ==========================================================================
+CD Formål:
+CD Henter ut transformasjonsparametrene fra ginfo i aktuell gruppe.
+CD Forutsetter at aktuell gruppe er et SOSI-filhode.
+CD
+CD OBS! Denne rutinen opprettholdes bare for bakoverkompatibilitet.
+CD For nye programmer bør LC_GetTransEx benyttes. LC_GetTransEx er
+CD kompatibel med nye versjoner av SOSI.
+CD
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short *koosys u Koordinatsystem
+CD double *origo_a u Origo øst
+CD double *origo_n u Origo nord
+CD double *enhet u Enhet
+CD double *enhet_h u ...ENHET-H
+CD double *enhet_d u ...ENHET-D
+CD short ist r status: UT_TRUE=OK, UT_FALSE=feil (navn er ikke funnet)
+CD
+CD Bruk:
+CD ist = LC_GetTrans(&koosys,&origo_a,&origo_n,&enhet,&enhet_h,&enhet_d);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetTrans(short *koosys,double *origo_a,double *origo_n,double *enhet,
+ double *enhet_h,double *enhet_d)
+{
+
+ short lin,ngi;
+ long nko;
+ unsigned short us;
+ char *cp;
+ short ist = UT_TRUE;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (Sys.pGrInfo->gnavn == L_HODE) { /* Aktuell gruppe .HODE */
+ LC_GetGrPara(&ngi,&nko,&us);
+
+ lin=2;
+ if (LC_GetGP("..TRANSPAR",&lin,ngi) == NULL) { /* Transpar */
+ LC_Error(14,"(LC_GetTrans)","");
+ ist = UT_FALSE;
+ } else{
+ *koosys=0; /* Koordsys */
+ lin=2;
+ cp = LC_GetGP("...KOORDSYS",&lin,ngi);
+ if (cp == NULL){
+ lin=2;
+ cp = LC_GetGP("..KOORDSYS",&lin,ngi);
+ }
+ if (cp == NULL){
+ LC_Error(15,"(LC_GetTrans)","");
+ ist = UT_FALSE;
+ } else{
+ *koosys = atoi(cp);
+ *origo_a = 0.0; /* Origo */
+ *origo_n = 0.0;
+ lin = 2;
+ cp = LC_GetGP("...ORIGO-NØ",&lin,ngi);
+ if (cp == NULL) {
+ LC_Error(16,"(LC_GetTrans)","");
+ ist = UT_FALSE;
+ } else{
+ *origo_n=strtod(cp,&cp);
+ *origo_a=strtod(cp,&cp);
+
+ *enhet = 1.0; /* Enhet */
+ lin = 2;
+ cp = LC_GetGP("...ENHET",&lin,ngi);
+ if (cp == NULL){
+ LC_Error(17,"(LC_GetTrans)","");
+ ist = UT_FALSE;
+ } else{
+ *enhet = strtod(cp,&cp);
+ }
+ lin=2;
+ cp = LC_GetGP("...ENHET-H",&lin,ngi);
+ if (cp == NULL){
+ *enhet_h = *enhet;
+ } else {
+ *enhet_h = strtod(cp,&cp);
+ }
+ lin=2;
+ cp = LC_GetGP("...ENHET-D",&lin,ngi);
+ if (cp == NULL){
+ *enhet_d = *enhet;
+ } else{
+ *enhet_d = strtod(cp,&cp);
+ }
+ }
+ }
+ }
+
+ } else{ /* Gruppen er ikke filhode */
+ LC_Error(94,"(LC_GetTrans)","");
+ ist = UT_FALSE;
+ }
+
+ } else{ /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_GetTrans)","");
+ ist = UT_FALSE;
+ }
+
+ return ist;
+}
+
+/*
+AR-920401
+CH LC_GetTegnsett Finner tegnsett
+CD ==========================================================================
+CD Formål:
+CD Finne tegnsett i ginfo i aktuell gruppe.
+CD OBS! Forutsetter at aktuell gruppe er et SOSI-filhode.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short *psTegnsett u Tegnsett, konstanter definert:
+CD TS_DOSN8 = DOS norsk 8-bits(standardverdi)
+CD TS_ND7 = Norsk Data 7-bits
+CD TS_ISO8859 = ISO8859-10 norsk/samisk
+CD TS_DECM8 = DEC multinasjonal 8-bits
+CD TS_DECN7 = DEC norsk 7-bits
+CD short sStatus r Status: UT_TRUE = Funnet
+CD UT_FALSE = Ikke funnet
+CD
+CD Bruk:
+CD sStatus = LC_GetTegnsett(&sTegnsett);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetTegnsett(short *psTegnsett)
+{
+ short lin,ngi;
+ long nko;
+ unsigned short us;
+ char *cp;
+ short ist = UT_FALSE;
+
+ *psTegnsett = TS_DOSN8;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (Sys.pGrInfo->gnavn == L_HODE) { /* Aktuell gruppe .HODE */
+ LC_GetGrPara(&ngi,&nko,&us);
+ lin=2;
+ if ((cp = LC_GetGP("..TEGNSETT",&lin,ngi)) != NULL) { /* Tegnsett */
+ ist = UT_TRUE;
+ UT_StrUpper(cp);
+ if (strcmp(cp,"ISO8859-10") == 0) {
+ *psTegnsett = TS_ISO8859;
+
+ } else if (strcmp(cp,"ISO8859-1") == 0) {
+ *psTegnsett = TS_ISO8859;
+
+ } else if (strcmp(cp,"ANSI") == 0) {
+ *psTegnsett = TS_ISO8859;
+
+ } else if (strcmp(cp,"ND7") == 0) {
+ *psTegnsett = TS_ND7;
+
+ } else if (strcmp(cp,"DECN7") == 0) {
+ *psTegnsett = TS_DECN7;
+
+ } else if (strcmp(cp,"DECM8") == 0) {
+ *psTegnsett = TS_DECM8;
+ }
+ }
+
+ } else { /* Gruppen er ikke filhode */
+ LC_Error(94,"(LC_GetTegnsett)","");
+ ist = UT_FALSE;
+ }
+
+ } else { /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_GetTegnsett)","");
+ ist = UT_FALSE;
+ }
+
+ return ist;
+}
+
+
+/*
+AR-920401
+CH LH_GetNgisLag Finner NGIS-LAG
+CD ==========================================================================
+CD Formål:
+CD Finne NGIS-LAG i ginfo i aktuell gruppe.
+CD OBS! Forutsetter at aktuell gruppe er et SOSI-filhode.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD char* pszNgisLag r NGIS-lag.
+CD Tom streng = ..NGIS-LAG er ikke funnet eller parameter mangler
+CD ..NGIS-LAG 0 = Bare leseaksess
+CD
+CD Bruk:
+CD pszNgisLag = LH_GetNgisLag();
+CD ==========================================================================
+*/
+char* LH_GetNgisLag(void)
+{
+ char *cp;
+ short lin = 2;
+
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (Sys.pGrInfo->gnavn == L_HODE) { /* Aktuell gruppe .HODE */
+ if ((cp = LC_GetGP("..NGIS-LAG",&lin,Sys.pGrInfo->ngi)) != NULL) {
+ return cp;
+ } else {
+ return "";
+ }
+
+ } else { /* Gruppen er ikke filhode */
+ LC_Error(94,"(LH_GetNgisLag)","");
+ }
+
+ } else { /* Ingen aktuell gruppe */
+ LC_Error(49,"(LH_GetNgisLag)","");
+ }
+
+ return "";
+}
+
+
+/*
+AR-910920
+CH LC_PutOmr Legger inn ..OMRÅDE i hodet
+CD ==========================================================================
+CD Formål:
+CD Legger inn område i ginfo i aktuell gruppe.
+CD Hvis område ikke har noen utstrekning justeres
+CD dette med 1 meter i hver retning.
+CD OBS! Forutsetter at aktuell gruppe er et SOSI-filhode av ny type.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double nv_a i Område
+CD double nv_n i
+CD double oh_a i
+CD double oh_n i
+CD short ist r status: UT_TRUE=OK, UT_FALSE=feil
+CD
+CD Bruk:
+CD ist = LC_PutOmr(nv_a,nv_n,oh_a,oh_n);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_PutOmr(double nv_a,double nv_n,double oh_a,double oh_n)
+{
+ short i;
+ char c[80];
+ short ist = UT_FALSE;
+ double dNV_N, dNV_A, dOH_A, dOH_N;
+
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (Sys.pGrInfo->gnavn == L_HODE) { /* Aktuell gruppe .HODE */
+
+ //UT_SNPRINTF(c,80," %ld %ld",UT_RoundDL(floor(nv_n)),UT_RoundDL(floor(nv_a)));
+ dNV_N = UT_RoundDD(floor(nv_n));
+ dNV_A = UT_RoundDD(floor(nv_a));
+
+ dOH_N = UT_RoundDD(ceil(oh_n));
+ dOH_A = UT_RoundDD(ceil(oh_a));
+
+ // Hvis nødvendig justeres område
+ if (fabs(dOH_N-dNV_N) < 0.00000001) {
+ dNV_N -= 1.0;
+ dOH_N += 1.0;
+ }
+ if (fabs(dOH_A-dOH_A) < 0.00000001) {
+ dNV_A -= 1.0;
+ dOH_A += 1.0;
+ }
+
+ UT_SNPRINTF( c,80, " %.0f %.0f", dNV_N, dNV_A );
+ if (LC_PutGP("...MIN-NØ",c,&i)) {
+
+ UT_SNPRINTF( c, 80, " %.0f %.0f", dOH_N, dOH_A );
+ if (LC_PutGP("...MAX-NØ",c,&i)){
+ ist = UT_TRUE;
+ }
+ }
+
+ } else{ /* Gruppen er ikke filhode */
+ LC_Error(94,"(LC_PutOmr)","");
+ }
+
+ } else{ /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_PutOmr)","");
+ }
+
+ return ist;
+}
+
+
+/*
+AR-910920
+CH LC_GetOmr Finner ..OMRÅDE i hodet
+CD ==========================================================================
+CD Formål:
+CD Henter ut område fra ginfo i aktuell gruppe.
+CD OBS! Forutsetter at aktuell gruppe er et SOSI-filhode.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double *nv_a u Område
+CD double *nv_n u
+CD double *oh_a u
+CD double *oh_n u
+CD short ist r status: UT_TRUE=OK, UT_FALSE=feil (navn er ikke funnet)
+CD
+CD Bruk:
+CD ist = LC_GetOmr(&nv_a,&nv_n,&oh_a,&oh_n);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetOmr(double *nv_a,double *nv_n,double *oh_a,double *oh_n)
+{
+ short lin,i,ngi;
+ long nko;
+ unsigned short info;
+ char *cp;
+ short ist = UT_TRUE;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (Sys.pGrInfo->gnavn == L_HODE) { /* Aktuell gruppe .HODE */
+ LC_GetGrPara(&ngi,&nko,&info);
+ lin=2;
+ if (LC_GetGP("..OMRÅDE",&lin,ngi) == NULL) {
+ LC_Error(7,"(LC_GetOmr)","");
+ *nv_n = -9999999.0;
+ *nv_a = -9999999.0;
+ *oh_n = 9999999.0;
+ *oh_a = 9999999.0;
+ ist = UT_FALSE;
+ } else {
+ /* Min-NØ */
+ i = lin;
+ cp = LC_GetGP("...MIN-NØ",&i,ngi);
+ if (cp == NULL){
+ LC_Error(8,"(LC_GetOmr)","");
+ ist = UT_FALSE;
+ *nv_n = -9999999.0;
+ *nv_a = -9999999.0;
+ } else{
+ *nv_n = strtod(cp,&cp);
+ *nv_a = strtod(cp,&cp);
+ /* Max-NØ */
+ i = lin;
+ cp = LC_GetGP("...MAX-NØ",&i,ngi);
+ if (cp == NULL){
+ LC_Error(9,"(LC_GetOmr)","");
+ ist = UT_FALSE;
+ *oh_n = 9999999.0;
+ *oh_a = 9999999.0;
+
+ } else{
+ *oh_n = strtod(cp,&cp);
+ *oh_a = strtod(cp,&cp);
+ }
+ }
+ }
+
+ } else{ /* Gruppen er ikke filhode */
+ LC_Error(94,"(LC_GetOmr)","");
+ ist = UT_FALSE;
+ }
+
+ } else{ /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_GetOmr)","");
+ ist = UT_FALSE;
+ }
+
+ return ist;
+}
+
+
+/*
+AR-910920
+CH LC_NyttHode Lager nytt hode
+CD ==========================================================================
+CD Formål:
+CD Legger inn et standard SOSI-filhode i ginfo i aktuell gruppe.
+CD
+CD Parametre:
+CD ingen
+CD
+CD Bruk:
+CD LC_NyttHode();
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_NyttHode(void)
+{
+ short ngi;
+ long nko;
+ unsigned short us;
+ char szTx[100];
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ /* Tildel plass */
+ LC_GetGrPara(&ngi,&nko,&us);
+ if (ngi < 10){
+ LC_InsGiL((short)(ngi+1),(short)(10-ngi));
+ } else if (ngi > 10){
+ LC_DelGiL(11,(short)(ngi-10));
+ }
+
+ Sys.pGrInfo->gnavn = L_HODE; /* Aktuell gruppe .HODE */
+
+ /* Generer nytt hode */
+ LC_PutGi(1,".HODE");
+ LC_PutGi(2,"..TEGNSETT ISO8859-10");
+ LC_PutGi(3,"..TRANSPAR");
+ LC_PutGi(4,"...KOORDSYS 0");
+ LC_PutGi(5,"...ORIGO-NØ 0 0");
+ LC_PutGi(6,"...ENHET 0.01");
+ LC_PutGi(7,"..OMRÅDE");
+ LC_PutGi(8,"...MIN-NØ -99999 -99999");
+ LC_PutGi(9,"...MAX-NØ 1999999 1999999");
+
+ //LC_PutGi(10,"..SOSI-VERSJON 3.0");
+ UT_SNPRINTF(szTx,100,"..SOSI-VERSJON %.2f",((double)FYBA_SOSI_VERSJON)/100.0);
+ LC_PutGi(10,szTx);
+
+ LC_PutSn(0L); /* Standard serienummer 0 for hodet*/
+ }
+}
+
+
+/*
+AR-910920
+CH LC_TestHode Tester SOSI-hodet
+CD ==========================================================================
+CD Formål:
+CD Sjekker at ginfo i aktuell gruppe er et lovlig SOSI-filhode.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short ist r status: UT_TRUE=OK, UT_FALSE=feil
+CD
+CD Bruk:
+CD ist = LC_TestHode();
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_TestHode(void)
+{
+ double d;
+ short ist;
+ unsigned short usMaske = LC_TR_ALLT;
+ LC_TRANSPAR Trans;
+
+
+ ist = LC_GetTransEx(&usMaske,&Trans);
+
+ if (ist == UT_TRUE) {
+ ist = LC_GetOmr(&d,&d,&d,&d);
+ }
+
+ return ist;
+}
+