---------------------------------
- Profiler Logboek
- Werksessie 28-9-2001
- D.D. de Kerf
- PC12
---------------------------------
De schaling van afzonderlijke curves binnen analoge kolommen heb ik op zich al vrij ver geïmplementeerd op het moment. Hieronder nog even kort de punten die ik heb moeten implementeren en de manier waarop dit is gebeurd.
1) Achterhalen van de eenheid van een bepaalde reeks
Omdat ze bij het NITG de verschillende curven graag absoluut konden schalen (d.w.z. in de vorm van '1 mm = 0.01 MPA'), moesten we nog wel zien te achterhalen wat dan precies de eenheid van de bewuste reeks was (bijv. MPA). Het eerste idee om deze eenheden hard te programmeren in de DINOSondering eenleescomponent kon al gauw vervangen worden door een betere oplossing. De eenheden zijn namelijk terug te vinden in een tabel in DINO (
rp_object_attr). Nu bleef alleen nog de vraag over waar we deze eenheid precies neer konden zetten in het Profiler model.
Logisch gezien hoort een eenheid bij een curve, alleen is een curve geen apart object binnen het model. Wel is er een aparte klasse voor de weergave van een losse curve (btaClass_AnalogeReeksWeergave), maar alle reeks weergaven binnen 1 component maken gebruik van hetzelfde kolomdata object. Dat kolomdata object bevat dan in plaats van lagen, dataelementen per diepte waarop gemeten is. 1 Data Element bevat dan de verschillende meetwaarden die moeten worden weergegeven in de verschillende curves. Er is dus maar 1 plaats voor kopgegevens, en dat is in de kop van kolomdata en helaas niet in de kop van een reeks of curve.Het probleem bij het opslaan van de eenheden in de kop van een kolomdata object is dat je eigenlijk in 1 entiteit de eenheden van alle mogelijke soorten curven moet opslaan. Dit heb ik dan ook gedaan. De string met kopgegevens van het kolomdata object bevat nu een name-value pair met de naam
UNITS en met als waarde een ;-delimetered string met name-value pairs (gescheiden door een :) waarbij de name de naam van de curve en de value de eenheid is. Dit zou er als volgt uit kunnen zien:
UNITS="CONUS:MPA;PLKL:MPA;TEMP:graden celsius"
Elke curve haalt uit de kopgegevens van de kolomdata op deze manier zijn bijbehorende eenheid op. Verder was er nog het idee dat dit volledig mis zou gaan bij import sonderingen, omdat deze in de database de kolomnamen VALUE_01, VALUE_02 enz. hadden en je dus nooit wist met wat voor soort curve je van doen had. Dit bleek echter geen probleem te zijn, omdat ze door het DINOSondering component al gekoppeld werden met een bestaande curve soort m.b.v. een andere DINO tabel.
2) De breedte van de analoge kolom component
De vraag was nog of we bij het schalen de curve af moesten breken als deze buiten de kolom dreigde te vallen of niet. Na overleg met Bram bleek het soms wenselijk te zijn om de curve ook buiten de kolom door te laten tekenen. Je kunt dan namelijk snel zien of je goed zit met je schaling en eventuele extreme waarden verder kunt bekijken. Verder wist Bram ook nog niet helemaal zeker of het in de toekomst wel verstandig is om extremen af te gaan kappen. Je zult in de toekomst namelijk ook in moeten kunnen stellen wat eventuele NULL-waarden zijn en er dan ook over na moeten denken hoe je deze zou willen weer gaan geven. Hoe dan ook, dit is allemaal nog toekomstmuziek. Ik heb om bovenstaande redenen een optie ingebouwd waarmee je desgewenst per curve het doortekenen buiten de kolom aan of uit kunt zetten.
Standaard staat deze optie (het buiten de kolom tekenen) uit, maar je kunt het ook standaard aan te zetten door dit in te stellen in het component-specifieke gedeelte (Analoge Kolom) van je template. Inhoudelijk is het afkappen zeer eenvoudig geïmplementeerd. Er wordt simpelweg gekeken of de waarde buiten de kolom zou vallen. Zo ja, dan wordt deze geprojecteert naar het dichtstbijzijnde uiteinde van de kolom. Een extreem negatieve waarde wordt bijvoorbeeld als 0 getekent en een extreem hoge waarde als de maximum waarde binnen de kolom.
3) De plaats van de instelling
De meest wenselijke plaats van de instelling is om te beginnen in de template (een instelling van de schaling per curve), eventueel ook in het profiel per analoge kolom om uitzonderingscurven goed te kunnen presenteren (maar dit is de minst belangrijke) en in het profiel, maar dan voor alle analoge kolommen tegelijk, per curve.
De technisch eenvoudigste instellingsmogelijkheid was de middelste, namelijk de instelling opnemen in het contextmenu van de analoge kolom component. Dit heb ik dan ook als eerste gedaan om te kijken of het meeschalen zelf ook goed werkte. Dit bleek uiteindelijk allemaal in orde te zijn. De instellingen stonden op dat moment alleen nog maar binnen btaClass_AnalogeReeksWeergave.
Vervolgens ben ik naar boven gaan werken. Om in de template de instellingen ook te kunnen maken, moest namelijk de overkoepelende klasse, btaClass_AnalogeKolomWeergave, de instellingen bezitten en door kunnen geven aan de verschillende reeks weergave instanties die het bezit. Daarom heb ik een stringlist aan de kolomweergave toegevoegd, waarin de settingsstrings staan: de curvenaam en de absolute schaling, gescheiden door een tab. Verder heb ik de mogelijkheid nog ingebouwd om te kunnen wisselen tussen de nieuwe, absolute schaling en de bestaande, relatieve schaling (in percentages van de breedte van de kolom). Nu de kolomweergave de mogelijkheid had om de instellingen op te slaan en door te geven, moest het deze instellingen nog kunnen binnenkrijgen vanuit het template en dat was vervelend.
Vooralsnog waren de enige datatypen die ondersteund werden door het component-specifieke gedeelte van de template een eenvoudige STRING, een LONG en een BOOLEAN. Wat ik hier echter wou was een instellinge PER CURVE doorgeven en dat kun je niet gebruiksvriendelijk binnen 1 string instellen (technisch natuurlijk wel). Daarom heb ik een nieuw type toegevoegd, namelijk LIST. Bij dit type kun je een lijst overhevelen met een variabel aantal rijen en kolommen. Een soort spreadsheet eigenlijk. Een definitie van zo'n lijst binnen de component ziet er als volgt uit:
"2007\tLIST\rSTRING\rLONG\t"
"CONUS\r1\f"
"CORCON\r1\f"
"HELLING2\r1\t"
"Absolute schaling per curve\rCurve\r1 mm = ...\t"
"Instellen...\n"
Hierbij is 2007 het nummer waaronder de instelling bij het component bekend staat (binnen de SetObj functie). Het volgende element in de string (de elementen worden gescheiden door tabs) is 'LIST\rSTRING\rLONG'. Dit wil zeggen dat het hier om een lijst gaat van entiteiten die bestaan uit een testveld en een numeriek veld. Het volgende element geeft de standaard waarden aan: 'CONUS\r1\fCORCON\r1\fHELLING2\r1'. Standaard zitten er in de lijst dus al 3 entiteiten, namelijk de curve CONUS met een schaling van 1, de curve CORCON met een schaling van 1 en de curve HELLING met een schaling van 1. \r en \f zijn eigenlijk niets anders dan varianten van \t en \n om een lijst binnen een lijst te kunnen mappen in een string. Verder is nog de naam van de instelling verwerkt in de string: 'Absolute schaling per curve\rCurve\r1 mm = ...'. Dit betekent dat de instelling zichtbaar zal zijn onder de naam 'Absolute schaling per curve' en dat de kolommen van de entiteiten 'Curve' en '1 mm = ...' heten. Tenslotte is nog een uitgebreidere omschrijving van de instelling gegeven die hier eenvoudigweg 'Instellen...' is genoemd.
Na deze definitie weet het component specifieke gedeelte van het template mechanisme precies wat het met deze instelling moet doen en verschijnt er een scherm waarin het spreadsheet naar hartenlust te bewerken is.
Op deze manier is een mooie oplossing gevonden voor het instellen van de schaling per curve in de template. Natuurlijk is het type LIST ook voor ontelbare andere doelen te gebruiken, zolang het maar te maken heeft met het overbrengen van instellingen vanuit de template naar een kolomweergave component.
Het enige wat nu dus nog moet gebeuren is het bouwen van een scherm waarin je in 1 keer voor het hele profiel de instellingen per kolomweergave kunt doen. Net zoiets eigenlijk als het component specifieke gedeelte van de templates, alleen dan run-time (dus, als het profiel al gebouwd is).
posted by Davy at 08:00 [edit]
Mail van Davy aan Bram, 27-9-2001
Naar aanleiding van mijn voorstel over de schaling van verschillende curves binnen een analoge kolom, de volgende mail:
Hoi Bram,
zoals we gisteren aan de telefoon bespraken,dachten we dat het eigenlijk
uiteindelijk beter zou zijn als je de instellingen voor de sondering
component niet per ActiveX component in zou kunnen stellen (waardoor het
dus geld voor elke instantie van de Analoge Kolom Component), maar per
INSTANTIE van het ActiveX component (dus in dit geval voor de Analoge
Kolom: Sondering).
Nu hebben we het er ook over gehad dat dit nogal een flinke klus zal
zijn om deze extra diepte erin aan te brengen. Dit is absoluut waar.
MAAR (altijd een maar) nu zag ik dat het voor de analoge kolom misschien
toch niet eens zo noodzakelijk is om deze extra diepte erin te leggen.
Je stelt de schaling namelijk in per CURVESOORT en niet in 1 keer voor
alle mogelijke curves. Dit betekent dat je dus de CONUS kan instellen
voor sonderingen, maar bijvoorbeeld ook de ZANDMEDIAAN curve voor een
andere instantie van de analoge kolom die de zandmediaan weergeeft.
Wat dat betreft hebben we straks misschien toch meteen het gewenste
effect bereikt zonder dat extra level diepte in de template te leggen.
Ik ben namelijk een beetje huiverig geworden voor extra levels diept,
omdat dit de complexiteit van zowel de code als de user interface
meestal exponentieel laat toenemen.
Groeten,
Davy de Kerf
Software Engineer
posted by Davy at 07:12 [edit]