From 63997bb9543eaeea60552cae9fd55964f4ed7682 Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Tue, 8 Mar 2016 11:15:05 +0100 Subject: gemeinsamer Vorfahr von tKontur und tWerte --- epost.lpr | 4 +- epost.lps | 118 ++++++++++++++++++++++---------------------- epostunit.pas | 154 +++++++++++++++++++++++++++++++--------------------------- 3 files changed, 143 insertions(+), 133 deletions(-) diff --git a/epost.lpr b/epost.lpr index 987ed21..98cd281 100644 --- a/epost.lpr +++ b/epost.lpr @@ -443,7 +443,7 @@ begin end; if startetMit('lösche Kontur ',s) then begin while s<>'' do begin - j:=findeKontur(erstesArgument(s),nil,@Konturen,false); + j:=findeKontur(erstesArgument(s),nil,@Wertes,@Konturen,false); if j<0 then begin aufraeumen; halt(1); @@ -461,7 +461,7 @@ begin halt(1); end; if startetMit('Kontur',s) then begin - i:=findeKontur(s,inf,@Konturen,true); + i:=findeKontur(s,inf,@Wertes,@Konturen,true); if (i>=0) and Konturen[i].Init(syntaxtest,inf,@wertes,maxthreads) then continue; aufraeumen; halt(1); diff --git a/epost.lps b/epost.lps index 1ece3d3..1b4359b 100644 --- a/epost.lps +++ b/epost.lps @@ -7,8 +7,8 @@ - - + + @@ -25,9 +25,9 @@ - - - + + + @@ -41,17 +41,16 @@ - + - - + @@ -63,7 +62,7 @@ - + @@ -71,41 +70,42 @@ - + - + - + - - - - + + + + - + - - - - - + + + + + + @@ -119,149 +119,149 @@ - + - + - + - + - + - + - - + + - - + + - - + + - - + + - + - + - + - + - + - - + - + - + - + - + - + - + - + + - + - + - + - + - + - + - + - + - + diff --git a/epostunit.pas b/epostunit.pas index e52f7cc..cf34038 100644 --- a/epostunit.pas +++ b/epostunit.pas @@ -42,7 +42,19 @@ type pTLiKo = ^tLiKo; pTWerteArray = ^tWerteArray; tWerteArray = array of tWerte; - tKontur = class(tObject) + tKontur = class; + tKonturenArray = array of tKontur; + pTKonturenArray = ^tKonturenArray; + + tDatenVorfahr = class(tObject) + bezeichner: string; + Konturen: pTKonturenArray; + wertes: pTWerteArray; + constructor create(Kont: pTKonturenArray; wert: pTWerteArray); + function callBackGetValue(s: string): extended; + end; + + tKontur = class(tDatenVorfahr) private function rxmin: extended; function rxmax: extended; @@ -50,10 +62,10 @@ type function rtmax: extended; function sortiere_nach_y(mt: longint): boolean; overload; function sortiere_nach_y(mt,von,bis: longint): boolean; overload; + function exprtofloat(st: boolean; s: string; kvs: tKnownValues): extended; public farbe: tRGB; orte: tExtPointArray; - bezeichner: string; function init(st: boolean; var f: tMyStringlist; w: pTWerteArray; mt: longint): boolean; function liesVonDatei(st: boolean; s: string; xmi,xma,tmi,tma: extended): boolean; function erzeugeAusWerten(st: boolean; s: string; w: pTWerteArray; mt: longint; _xmin,_xmax,_tmin,_tmax: string): boolean; @@ -61,13 +73,11 @@ type property xmax: extended read rxmax; property tmin: extended read rtmin; property tmax: extended read rtmax; - constructor create; + constructor create(Kont: pTKonturenArray; wert: pTWerteArray); destructor destroy; override; end; - tKonturenArray = array of tKontur; - pTKonturenArray = ^tKonturenArray; tLeseThread = class; - tWerte = class(tObject) + tWerte = class(tDatenVorfahr) { Diese Klasse ist die benutzerseitige Variante von tLLWerte und benutzt letztere. Sie übernimmt auch die Parallelisierung. @@ -100,7 +110,6 @@ type procedure wMinw(miw: extended); function rMaxw: extended; procedure wMaxw(maw: extended); - function callBackGetValue(s: string): extended; function xscale: extended; function tscale: extended; function dichtenParameterErkannt(st: boolean; s: string; threads,xmin,xmax,tmin,tmax: longint): boolean; @@ -114,9 +123,6 @@ type dWerte: tLLWerteDouble; sWerte: tLLWerteSingle; Genauigkeit: tGenauigkeit; - bezeichner: string; - Konturen: pTKonturenArray; - wertes: pTWerteArray; constructor create(Kont: pTKonturenArray; wert: pTWerteArray); overload; constructor create(original: tWerte; xmin,xmax: longint); overload; destructor destroy; override; @@ -343,7 +349,7 @@ function findePalette(out Palette: pTPalette; name: string): boolean; function erzeugeLegende(st: boolean; var f: tMyStringlist; datei: string; Qu: tWerte; minDichte,maxDichte: extended; nb: tTransformation; pal: pTPalette): boolean; function strToFftDo(out fftDo: tFFTDatenordnung; s: string): boolean; function findeWerte(s: String; f: tMyStringlist; pws: pTWerteArray; Kont: pTKonturenArray; darfErstellen: boolean): integer; -function findeKontur(s: String; f: tMyStringlist; pks: pTKonturenArray; darfErstellen: boolean): integer; +function findeKontur(s: String; f: tMyStringlist; pws: pTWerteArray; pks: pTKonturenArray; darfErstellen: boolean): integer; function externerBefehl(st: boolean; s: string): boolean; procedure warte_auf_externeBefehle; procedure beendeExterneBefehleWennFertig; @@ -357,22 +363,71 @@ implementation uses math, systemunit; +// tDatenVorfahr *************************************************************** + +constructor tDatenVorfahr.create(Kont: pTKonturenArray; wert: pTWerteArray); +begin + inherited create; + Konturen:=Kont; + wertes:=wert; + bezeichner:=''; +end; + +function tDatenVorfahr.callBackGetValue(s: string): extended; +var + i: longint; +begin + result:=nan; + if startetMit('Kontur[',s) or startetMit('Konturen[',s) then begin + if pos('].',s)=0 then + fehler('Syntaxfehler, '']'' fehlt!'); + i:=findeKontur(erstesArgument(s,'].'),nil,Wertes,Konturen,false); + if i<0 then + fehler('Finde Kontur nicht!'); + if s='xmin' then result:=Konturen^[i].xmin + else if s='xmax' then result:=Konturen^[i].xmax + else if s='tmin' then result:=Konturen^[i].tmin + else if s='tmax' then result:=Konturen^[i].tmax + else if s='Breite' then result:=Konturen^[i].xmax-Konturen^[i].xmin + else if s='Hoehe' then result:=Konturen^[i].tmax-Konturen^[i].tmin + else fehler('Kenne Bezeichner '''+s+''' nicht als Eigenschaft einer Kontur!'); + exit; + end; + if startetMit('Wert[',s) or startetMit('Werte[',s) or startetMit('Wertes[',s) then begin + if pos('].',s)=0 then + fehler('Syntaxfehler, '']'' fehlt!'); + i:=findeWerte(erstesArgument(s,'].'),nil,wertes,Konturen,false); + if i<0 then + fehler('Finde Werte nicht!'); + if (s='xmin') or (s='xstart') then result:=wertes^[i].Transformationen.xstart + else if (s='xmax') or (s='xstop') then result:=wertes^[i].Transformationen.xstop + else if (s='tmin') or (s='tstart') then result:=wertes^[i].Transformationen.tstart + else if (s='tmax') or (s='tstop') then result:=wertes^[i].Transformationen.tstop + else if (s='wmin') or (s='minw') then result:=wertes^[i]._minw + else if (s='wmax') or (s='maxw') then result:=wertes^[i]._maxw + else if s='np' then result:=wertes^[i]._np + else if (s='beta') or (s='β') then result:=wertes^[i]._beta + else if s='Breite' then result:=wertes^[i].Transformationen.xstart-wertes^[i].Transformationen.xstop + else if s='Hoehe' then result:=wertes^[i].Transformationen.tstart-wertes^[i].Transformationen.tstop + else fehler('Kenne Bezeichner '''+s+''' nicht als Eigenschaft von Werten!'); + exit; + end; + fehler('Ich kenne den Bezeichner '''+s+''' nicht!'); +end; + // tWerte ********************************************************************** constructor tWerte.create(Kont: pTKonturenArray; wert: pTWerteArray); var ps: tExtrainfos; begin - inherited create; + inherited create(Kont,wert); ps:=tExtrainfos.create; Genauigkeit:=gSingle; leseThread:=nil; sWerte:=tLLWerteSingle.create(ps); dWerte:=tLLWerteDouble.create(ps); eWerte:=tLLWerteExtended.create(ps); - Konturen:=Kont; - wertes:=wert; - bezeichner:=''; end; constructor tWerte.create(original: tWerte; xmin,xmax: longint); @@ -382,12 +437,11 @@ var pDo: pTLLWerteDouble; pEx: pTLLWerteExtended; begin - inherited create; + inherited create(original.Konturen,original.wertes); original.warteAufBeendigungDesLeseThreads; ps:=tExtrainfos.create; leseThread:=nil; Genauigkeit:=original.Genauigkeit; - Konturen:=original.Konturen; case Genauigkeit of gSingle: begin pSi:=@(original.sWerte); @@ -411,7 +465,6 @@ begin if original.bezeichner='' then bezeichner:='' else bezeichner:=original.bezeichner+''''; Transformationen:=original.Transformationen; - wertes:=original.wertes; end; destructor tWerte.destroy; @@ -3334,7 +3387,7 @@ begin if startetMit('Kontur:',s) then begin while length(s)>0 do begin setlength(verwKonturen,length(verwKonturen)+1); - verwKonturen[length(verwKonturen)-1]:=findeKontur(erstesArgument(s),nil,Konturen,false); + verwKonturen[length(verwKonturen)-1]:=findeKontur(erstesArgument(s),nil,Wertes,Konturen,false); if (verwKonturen[length(verwKonturen)-1]<0) or (verwKonturen[length(verwKonturen)-1]>=length(Konturen^)) then begin gibAus('Die Kontur gibt es nicht!',3); aufraeumen; @@ -3866,54 +3919,6 @@ begin // bearbeitet nur den Hauptteil (außer erster und mittlerer Zeile/Spalte) gibAus('Alle FFT2dNBThreads fertig!',1); end; -function tWerte.callBackGetValue(s: string): extended; -var - i: longint; -begin - result:=nan; - if startetMit('Kontur[',s) or startetMit('Konturen[',s) then begin - if pos('].',s)=0 then begin - gibAus('Syntaxfehler, '']'' fehlt!',3); - exit; - end; - i:=findeKontur(erstesArgument(s,'].'),nil,Konturen,false); - if i<0 then begin - gibAus('Finde Kontur nicht!',3); - exit; - end; - if s='xmin' then result:=Konturen^[i].xmin - else if s='xmax' then result:=Konturen^[i].xmax - else if s='tmin' then result:=Konturen^[i].tmin - else if s='tmax' then result:=Konturen^[i].tmax - else if s='Breite' then result:=Konturen^[i].xmax-Konturen^[i].xmin - else if s='Hoehe' then result:=Konturen^[i].tmax-Konturen^[i].tmin - else gibAus('Kenne Bezeichner '''+s+''' nicht als Eigenschaft einer Kontur!',3); - exit; - end; - if startetMit('Wert[',s) or startetMit('Werte[',s) or startetMit('Wertes[',s) then begin - if pos('].',s)=0 then begin - gibAus('Syntaxfehler, '']'' fehlt!',3); - exit; - end; - i:=findeWerte(erstesArgument(s,'].'),nil,wertes,Konturen,false); - if i<0 then begin - gibAus('Finde Werte nicht!',3); - exit; - end; - if s='xmin' then result:=wertes^[i].Transformationen.xstart - else if s='xmax' then result:=wertes^[i].Transformationen.xstop - else if s='tmin' then result:=wertes^[i].Transformationen.tstart - else if s='tmax' then result:=wertes^[i].Transformationen.xstop - else if (s='wmin') or (s='minw') then result:=wertes^[i]._minw - else if (s='wmax') or (s='maxw') then result:=wertes^[i]._maxw - else if s='Breite' then result:=wertes^[i].Transformationen.xstart-wertes^[i].Transformationen.xstop - else if s='Hoehe' then result:=wertes^[i].Transformationen.tstart-wertes^[i].Transformationen.tstop - else gibAus('Kenne Bezeichner '''+s+''' nicht als Eigenschaft von Werten!',3); - exit; - end; - gibAus('Ich kenne den Bezeichner '''+s+''' nicht!',3); -end; - function tWerte.exprtofloat(st: boolean; s: string): extended; begin case genauigkeit of @@ -4908,9 +4913,9 @@ end; // tKontur ********************************************************************* -constructor tKontur.create; +constructor tKontur.create(Kont: pTKonturenArray; wert: pTWerteArray); begin - inherited create; + inherited create(Kont,wert); farbe.rgbRed:=$00; farbe.rgbGreen:=$00; farbe.rgbBlue:=$00; @@ -4976,6 +4981,11 @@ begin result:=max(result,orte[i]['y']); end; +function tKontur.exprtofloat(st: boolean; s: string; kvs: tKnownValues): extended; +begin + result:=matheunit.exprtofloat(st,s,kvs,@callBackGetValue); +end; + function tKontur.init(st: boolean; var f: tMyStringlist; w: pTWerteArray; mt: longint): boolean; var s,xmi,xma,tmi,tma: string; @@ -5014,7 +5024,7 @@ begin gibAus('Diese Kontur hat schon Werte!',3); exit; end; - if not liesVonDatei(st,s,strtofloat(xmi),strtofloat(xma),strtofloat(tmi),strtofloat(tma)) then exit; + if not liesVonDatei(st,s,exprtofloat(st,xmi,nil),exprtofloat(st,xma,nil),exprtofloat(st,tmi,nil),exprtofloat(st,tma,nil)) then exit; continue; end; if startetMit('Werte:',s) then begin @@ -5990,7 +6000,7 @@ begin result:=length(pws^)-1; end; -function findeKontur(s: String; f: tMyStringlist; pks: pTKonturenArray; darfErstellen: boolean): integer; +function findeKontur(s: String; f: tMyStringlist; pws: pTWerteArray; pks: pTKonturenArray; darfErstellen: boolean): integer; var i: integer; istZahl: boolean; @@ -6021,7 +6031,7 @@ begin end; setlength(pks^,length(pks^)+1); - pks^[length(pks^)-1]:=tKontur.create; + pks^[length(pks^)-1]:=tKontur.create(pks,pws); pks^[length(pks^)-1].bezeichner:=s; i:=f.count-1; -- cgit v1.2.3-70-g09d2