summaryrefslogtreecommitdiff
path: root/pegelunit.pas
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2015-11-16 06:37:30 +0100
committerErich Eckner <git@eckner.net>2015-11-16 06:37:30 +0100
commite99f3fec7e287b879ceeb0f0d95185cf2ab0791e (patch)
tree2f108f17c53ee6993ae73a91426dcae3ab4efac4 /pegelunit.pas
parent18b2f6120d3320d0557b04e9c04ead225e88447b (diff)
downloadFH-Wetter-e99f3fec7e287b879ceeb0f0d95185cf2ab0791e.tar.xz
Tagesendstand, pegelunit begonnen
Diffstat (limited to 'pegelunit.pas')
-rw-r--r--pegelunit.pas235
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.
+