diff options
author | Erich Eckner <git@eckner.net> | 2015-11-16 06:37:30 +0100 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2015-11-16 06:37:30 +0100 |
commit | e99f3fec7e287b879ceeb0f0d95185cf2ab0791e (patch) | |
tree | 2f108f17c53ee6993ae73a91426dcae3ab4efac4 /pegelunit.pas | |
parent | 18b2f6120d3320d0557b04e9c04ead225e88447b (diff) | |
download | FH-Wetter-e99f3fec7e287b879ceeb0f0d95185cf2ab0791e.tar.xz |
Tagesendstand, pegelunit begonnen
Diffstat (limited to 'pegelunit.pas')
-rw-r--r-- | pegelunit.pas | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/pegelunit.pas b/pegelunit.pas new file mode 100644 index 0000000..7cda392 --- /dev/null +++ b/pegelunit.pas @@ -0,0 +1,235 @@ +unit pegelunit; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, Graphics; + +type + tPegelZeitGroesze = (pzgJahr,pzgMonat,pzgTag,pzgStunde,pzgMin15); + tPegelZeit = array[tPegelZeitgroesze] of integer; + tPegelStation = (psBlankenstein,psKaulsdorf,psSaalfeld,psRudolstadt, + psRothenstein,psCamburg,psMoeschlitz,psProbstzella,psKaulsdorfEichicht, + psKatzhuette,psSchwarzburg,psFreienorla); + tPegel = record + zeit: tPegelZeit; + hoehe: longint; + end; + pTPegel = ^tPegel; + + tPegelStaende = class + werte: array[tPegelStation] of tList; + constructor create; + destructor destroy; override; +// procedure einlesen(was: string); + procedure laden(von: string); + procedure speichern(nach: string); + end; + +implementation + +uses systemunit; + +const + pegelStationsNamen: array[tPegelstation] of array[0..1] of string = + (('Blankenstein','Blankenstein-Ros.'), + ('Kaulsdorf',''), + ('Saalfeld-Remschütz',''), + ('Rudolstadt',''), + ('Rothenstein',''), + ('Camburg-Stöben',''), + ('Möschlitz',''), + ('Probstzella',''), + ('Kaulsdorf-Eichicht',''), + ('Katzhütte',''), + ('Schwarzburg',''), + ('Freienorla','')); + pegelStationsNummern: array[tPegelstation] of extended = + (57021,57025,57026,57027,57028,57033,57170,57200,57201,57211,57211.5,57240); + pegelGrenzen: array[tPegelstation,0..3] of longint = + ((210,230,270,310),(195,210,225,240),(200,230,260,290),(150,180,210,240), + (250,290,330,370),(280,330,380,430),(180,200,220,240),(0,0,0,0), + (130,170,210,230),(200,230,260,290),(130,150,170,190),(0,0,0,0)); + pFarben: array[tPegelstation] of tColor = + ($000000,$000000,$000000,$FF0000,$7F0000,$000000,$000000,$000000,$000000,$000000,$000000,$000000); + +// tPegelStaende *************************************************************** + +constructor tPegelStaende.create; +var + ps: tPegelStation; +begin + inherited create; + for ps:=low(tPegelStation) to high(tPegelStation) do + werte[ps]:=tList.create; +end; + +destructor tPegelStaende.destroy; +var + ps: tPegelStation; +begin + for ps:=low(tPegelStation) to high(tPegelStation) do + werte[ps].free; + inherited destroy; +end; + +procedure tPegelStaende.laden(von: string); +var + f: textfile; + s: string; + ps: tPegelstation; + pzg: tPegelzeitgroesze; + psda,gefunden: boolean; + np: pTPegel; + i: longint; +begin + if not fileexists(von) then exit; + assignfile(f,von); + reset(f); + psda:=false; + ps:=low(TPegelstation); + while not eof(f) do begin + readln(f,s); + if pos('Station: ',s)=1 then begin + delete(s,1,pos(' ',s)); + ps:=low(TPegelstation); + gefunden:=false; + while ps<=high(TPegelstation) do begin + for i:=0 to length(Pegelstationsnamen[psBlankenstein])-1 do + gefunden:=gefunden or ((Pegelstationsnamen[ps,i]<>'') and (Pegelstationsnamen[ps,i]=s)); + if gefunden then break; + inc(ps); + end; + if not gefunden then begin + closefile(f); + raise exception.create('Pegelstation '''+s+''' nicht gefunden!'); + end; + psda:=true; + continue; + end; + if not psda then + raise exception.create('Es wurde noch keine Pegelstation erwähnt!'); + getmem(np,sizeof(TPegel)); + werte[ps].Add(np); + for pzg:=low(tPegelZeitGroesze) to high(tPegelZeitGroesze) do begin + np^.Zeit[pzg]:=strtoint(copy(s,1,pos(' ',s)-1)); + delete(s,1,pos(' ',s)); + end; + np^.Hoehe:=strtoint(s); + end; + closefile(f); +end; + +procedure tPegelStaende.speichern(nach: string); +var + dateischonda: boolean; + f: textfile; + ps: tPegelStation; + pzg: tPegelZeitGroesze; + i: longint; + s: string; +begin + dateischonda:=fileexists(nach); + if dateischonda then + assignfile(f,mkTemp(nach+'.XXXXXX')) + else + assignfile(f,nach); + rewrite(f); + for ps:=low(tPegelStation) to high(tPegelStation) do begin + writeln(f,'Station: '+Pegelstationsnamen[ps,0]); + for i:=0 to werte[ps].Count-1 do begin + s:=''; + for pzg:=low(tPegelZeitGroesze) to high(tPegelZeitGroesze) do + s:=s+inttostr(pTPegel(werte[ps][i])^.zeit[pzg])+' '; + writeln(f,s+inttostr(pTPegel(werte[ps][i])^.hoehe)); + end; + end; + closefile(f); + if dateischonda then begin + deletefile(nach); + rename(f,nach); + end; +end; + +(* +procedure tPegelStaende.einlesen(von: string); +var t: string; + PS: TPegelstation; + psda,wsda,gefunden: boolean; + PZ: TPegelZeit; + posi: extended; + nps: PTPegel; + PZG: TPegelZeitGroesze; + i: longint; +begin + s:=s+#10; + result:=false; + psda:=false; + wsda:=false; + PS:=low(TPegelstation); + while pos(#13,s)>0 do begin + t:=copy(s,1,pos(#10,s)-1); + delete(s,1,pos(#10,s)); + while pos(#13,t)>0 do + delete(t,pos(#13,t),1); + if length(t)=0 then continue; + if pos('Pegelname: ',t)=1 then begin + delete(t,1,pos(' ',t)); + PS:=low(TPegelstation); + gefunden:=false; + while PS<=high(TPegelstation) do begin + for i:=0 to length(Pegelstationsnamen[psBlankenstein])-1 do + gefunden:=gefunden or ((Pegelstationsnamen[PS,i]<>'') and (Pegelstationsnamen[PS,i]=t)); + if gefunden then break; + inc(PS); + end; + if not gefunden then begin + Messagedlg('Unbekannter Pegelname: '''+t+'''!',mterror,[mbOk],0); + exit; + end; + psda:=true; + continue; + end; + if t='Durchfluss [m3/s]' then begin + wsda:=false; + continue; + end; + if t='Wasserstand [cm]' then begin + wsda:=true; + continue; + end; + if not (wsda and psda) then continue; + if pos('Fluss: ',t)=1 then continue; + if pos('Flusseinzugsgebiet: ',t)=1 then continue; + if pos('Stationsnummer: ',t)=1 then begin + delete(t,1,pos(' ',t)); + while pos(' ',t)=1 do delete(t,1,1); + while pos('.',t)>0 do t[pos('.',t)]:=','; + if round(10*strtofloat(t))<>round(10*Pegelstationsnummern[PS]) then begin + Messagedlg('erwartete Pegelstationsnummer ('+floattostr(Pegelstationsnummern[PS])+ + ') für '+Pegelstationsnamen[PS,0]+' ist verschieden von der angegebenen Nummer ('+t+')!',mtError,[mbOk],0); + exit; + end; + continue; + end; + if pos('Hinweise: ',t)=1 then continue; + if pos('keine Werte',t)>0 then continue; + PZ:=strToPegelZeit(t); + posi:=findePegelZeit(Pegelstaende[PS],PZ); + if odd(round(2*posi)) then begin + result:=true; + getmem(nps,sizeof(TPegel)); + for PZG:=low(TPegelZeitGroesse) to high(TPegelZeitGroesse) do + nps^.Zeit[PZG]:=PZ[PZG]; + delete(t,1,pos(',',t)+1); + nps^.Hoehe:=strtoint(t); + Pegelstaende[PS].Insert(round(posi+0.5),nps); + end; + end; + Zeichnen; +end; +*) +end. + |