% .tex-tiedosto projektin dokumenttien latomiseksi.

% Kirjoitelmaluokka, tässä käytetään projektien projdoc-luokkaa.
%\documentclass[twoside]{projdoc}
\documentclass[report]{projdoc}

\usepackage{paralist} % siistimmät lista-alkiot
\usepackage{makecell} % taulukkoon monta riviä
\usepackage{enumitem}
\setlist[itemize]{noitemsep, topsep=0pt}
\setlist[enumerate]{topsep=0pt, noitemsep}
\renewcommand\cellalign{ll}
\renewcommand{\labelitemii}{$\circ$}
\usepackage{multirow} % monen rivin lista-alkiot
\graphicspath{ {./kuvat/sovellusraportti}}
\usepackage{float} %kuvien sijoittelu

% Projektin nimi
\def \pname {Groundhog} % käytä \pname projektin nimenä
\newcommand{\lpname}{\MakeLowercase{\pname}} % projektin nimi pienellä
\project{\pname}

% Luottamuksellisuus: käytä termiä 'Luottamuksellinen' tai 'Julkinen'
\publicity{Julkinen}

% Versionumero: numerointikäytäntö on projektikohtainen
\version{1.0.0}

% Päivämäärä: ylikirjoittaa automaattisen päiväyksen
\date{27.10.2021}

% Dokumentin nimi
\title{Sovellusraportti}

\def \jobname {sovellusraportti} % tämän tiedoston nimi ilman .tex

% Tekijät: huomaa aakkosjärjestys sukunimen mukaan
\author{Iiro Iivanainen}{Harri Linna}{Jere Pakkanen}{Riikka Vilavaara}
% Puhelinnumerot: tekijöitä vastaava järjestys!
\authorphones{}{}{}{}
% Sähköpostiosoitteet: tekijöitä vastaava järestys!
\authoremails{iiro.h.iivanainen@student.jyu.fi}{harri.s.linna@student.jyu.fi}{jejopakk@student.jyu.fi}{riikka.k.vilavaara@student.jyu.fi}
% Etu- ja sukunimen alkukirjaimet: tekijöitä vastaava järjestys!
\authorinitials{II}{HL}{JP}{RV}

% Tiivistelmä dokumentista: tämä ei siis ole tiivistelmä projektista,
% vaan tämän ko. dokumentin tarkoituksesta. 
\docabstract{{\pname}-projektissa toteutetulla ohjelmistolla voidaan yhdistää, hallita ja visualisoida erityyppisiä geologian näytteiden tutkimusdatoja. Sovellusraportissa kuvataan sovelluksen taustoja, käyttöliittymää, rakennetta ja toteutusratkaisuja. Lisäksi sovellusraportissa kuvataan myös projektissa noudatettuja ohjelmointi- ja testauskäytänteitä, testaustuloksia ja vaatimusten täyttämistä. Raportissa on myös kuvailtu ideoita jatkokehitystä varten.}

% Tiivistelmä projektista
\projectabstract{{\pname}-projekti suunnitteli ja toteutti Geologian tutkimuskeskukselle (GTK) multimodaalisen tutkimusdatan hallintaohjelmiston kevätlukukaudella 2021.}

% Avainsanat: dokumentin sisältöön liittyviä olennaisia asiasanoja: aakkosjärjestys, ensimmäinen sana isolla alkukirjaimella ja piste loppuun.
\keywords{C\#, jatkokehitys, käyttöliittymä, ohjelmointikäytänteet, tietorakenne.}

% juoksevan numeroinnin asetukset
\newcounter{vaatimuslaskuri}
\setcounter{vaatimuslaskuri}{0}
\newcommand{\laskuri}{\arabic{vaatimuslaskuri}.\stepcounter{vaatimuslaskuri}}

% Varsinainen tulosteessa näkyvä ladonta alkaa
\begin{document}

% Tämä latoo versiohistorialle ympäristön, sen alapuolelle ladotaan
% versiohistoriataulukko. Esimerkin vuoksi tehty. 
\versionhistory

%\begin{tabular}{|c|r|p{7cm}|p{3.5cm}|}
\begin{tabular}{|c|r|p{10.5cm}|c|}
\hline
\textbf{Versio} & \textbf{Päivämäärä} & \textbf{Muutokset} & \textbf{Tekijät}\\
\hline
0.0.1 & 10.6.2021 & Sovellusraportin pohja luotiin. Kirjoitettiin alustavasti sovelluksen ohjelmointikäytänteistä.  & RV \\
\hline
0.0.2 & 11.6.2021 & Kirjoitettiin johdanto ja tiivistelmä sekä jatkettiin ohjelmointikäytänteiden kirjoittamista.  & RV \\
\hline
0.0.3 & 15.6.2021 & Kirjoitettiin käyttöliittymäkuvausta. & RV \\
\hline
0.0.4 & 17.6.2021 & Jatkettiin käyttöliittymäkuvauksen kirjoittamista. & RV \\
\hline
0.0.5 & 20.6.2021 & Kirjoitettiin käyttöliittymäkuvaus ja ohjelmointikäytänteet loppuun. Kirjoitettiin taustoista ja tarpeista. & RV \\
\hline
0.0.6 & 21.6.2021 & Kirjoitettiin sovelluksen rakenteesta ja toteutusratkaisuista. & RV \\
\hline
0.0.7 & 22.6.2021 & Kirjoitettiin sovelluksen toimintalogiikasta. & RV \\
\hline
0.1.0 & 23.6.2021 & Julkistettiin ensimmäinen väliversio. & RV \\
\hline
0.1.1 & 28.6.2021 & Tehtiin korjauksia ohjaajalta saadun palautteen mukaisesti. & RV \\
\hline
0.1.2 & 1.7.2021 & Kirjoitettiin järjestelmätestauksen testauskertojen tuloksista. & RV \\
\hline
0.1.3 & 3.7.2021 & Kirjoitettiin toteutusratkaisujen kehittymisestä. & HL\\
\hline
0.1.4 & 5.7.2021 & Kirjoitettiin yksikkötestauksesta. & RV \\ 
\hline
0.1.5 & 6.7.2021 & Asemoitiin kansilehti uudelleen. & HL\\
\hline
0.1.6 & 7.7.2021 & Siirrettiin tietoa projektista dokumenttiluokkaan ja päivitettiin termilistaa. & HL\\
\hline
0.1.7 & 13.7.2021 & Kirjoitettiin vaatimusten toteutumisesta. & RV \\
\hline
0.1.8 & 16.8.2021 & Kirjoitettiin sovelluksen epätyydyttävistä toteutusratkaisuista. & RV \\
\hline
0.1.9 & 17.8.2021 & Kirjoitettiin jatkokehitysideoista. & RV \\
\hline
0.1.10 & 21.8.2021 & Kirjoitettiin lähdekoodin jatkokehitysideoista. & RV \\
\hline
0.1.11 & 23.8.2021 & Kirjoitettiin yhteenvetolukua. & RV \\
\hline
0.2.0 & 26.8.2021 & Julkistettiin väliversio palautetta varten. & RV \\
\hline
0.2.1 & 23.10.2021 & Kirjoitettiin toteutusratkaisujen kehittymisestä. & HL\\
\hline
0.2.2 & 24.10.2021 & Kirjoitettiin ideoita jatkokehitykseen. & HL\\
\hline
0.2.3 & 24.10.2021 & Kirjoitettiin toteutusratkaisuista ja jatkokehitysideoista. & JP\\
\hline
0.3.0 & 25.10.2021 & Kirjoitettiin yhteenvetoa. Tehtiin palautteessa annetut korjaukset. & JP\\
\hline
0.4.0 & 26.10.2021 & Tehtiin palautteessa annetut korjaukset. & HL ja JP\\
\hline
1.0.0 & 27.10.2021 & Hyväksytty versio julkistettiin. & JP\\
\hline
\end{tabular}


% \projectinfo latoo ympäristön projektin tiivistelmälle, joka on 
% projektikohtainen.
% Projektin tiivistelmä ja tekijöiden tiedot ladotaan automaattisesti sivun
% alkuun. Eli lisättävä projektiorganisaation tiedot muiden kuin tekijäiden
% osalta sekä tarvittavat yhteystiedot. Alla tämä on tehty esimerkin vuoksi.
\projectinfo

%----------------------------------------------------------------------------
% \mainmatter latoo automaattisesti sisällysluettelon ym. alkusivut, ja 
%% sen jälkeen alkaa dokumentin sisällysluettelossa näkyvät luvut.
\mainmatterextrapage
% \chapter{Pääluvun nimi} aloittaa pääluvun, \section{Alaluvun nimi} alaluvun,
% ja \subsection{Ala-alaluvun nimi} ala-alaluvun.
\chapter{Johdanto}

{\pname}-projekti\footnote{Groundhog Daytä vietetään Kanadassa vuosittain 2. helmikuuta.} suunnitteli ja kehitti Geologian tutkimuskeskukselle multimodaalisen tutkimusdatan hallintaohjelmiston kevätlukukaudella 2021. Ohjelmiston avulla käyttäjä pystyy tarkastelemaan kolmiulotteisia harmaasävykuvia (kuten tomografiakuvia) ja liittämään tiettyihin kohtiin kuvassa muita tiedostoja. Nämä tiedostot voivat sisältää esimerkiksi mittaustuloksia tai huomioita. Projektin jäsenet kehittivät ohjelmiston osana Jyväskylän yliopiston informaatioteknologian tiedekunnan \textit{Sovellusprojekti}-nimistä projektiopintojaksoa.

Sovellusraportissa kuvataan kehitetyn sovelluksen käyttöliittymää, toimintaa, rakennetta ja ohjelmointikäytänteitä, tavoitteita ja niiden toteutumista sekä jatkokehitysideoita. Lisäksi raportissa kuvataan lyhyesti sovelluksen taustaa, testauskäytänteitä ja -tuloksia. Projektiraportissa \cite{projektiraportti} kuvataan projektin läpivientiä ja vaatimusmäärittelyssä \cite{vaatimusmaarittely} kuvataan sovelluksen vaatimuksia. Järjestelmätestaussuunnitelma \cite{testaussuunnitelma} sisältää vaatimuspohjaisen toiminnallisen testauksen testiskenaariot sekä testauskerran suorituksen ja raportoinnin ohjeet. Järjestelmätestauskertojen raportit \cite{testausraportti1} ja \cite{testausraportti2} sisältävät testauskertojen yksityiskohtaiset tulokset. Lisäksi sovelluksesta on kirjoitettu erilliset lyhyet käyttöohjeet \cite{kayttoohjeet}. Sovellusraportin laatimisessa on hyödynnetty sovellusprojektien ohjeen \cite{projohje} ohella Peltihamsteri- ja Kodavi-projektien sovellusraportteja \cite{peltihamsteri} ja \cite{kodavi}.

Sovellusraportti on jaettu 10 lukuun. Raportin luvussa \ref{ch:termit} kuvataan dokumentissa esiintyviä termejä. Projektin tavoitteista kerrotaan luvussa \ref{ch:taustaa}. Luvussa \ref{ch:GUI} esitellään ohjelman käyttöliittymää. Sovelluksen toimintaa ja rakennetta kuvataan luvussa \ref{ch:rakenne}. Ohjelmointikäytänteitä kuvataan luvussa \ref{ch:kaytanteet}. Luvussa \ref{ch:testaus} esitellään testauskäytänteitä ja -tuloksia. Tavoitteiden toteutumista ja sovelluksen puutteita kuvataan luvussa \ref{ch:vaatimukset}. Jatkokehitysideoita esitellään luvussa \ref{ch:jatkokehitys}.

\chapter{Termit} \label{ch:termit}

\termit %komento projdoc-luokassa

\chapter{Taustaa ja tavoitteita} \label{ch:taustaa}

% Tiivistetty esitys, ei yksityiskohtia. Sivu tai korkeintaan kaksi.

Geologian tutkimuskeskuksella (GTK) on menetelmäkehityksen ja uudehkon tomografialaboratorion myötä noussut tarve ohjelmistolle, jolla voidaan helposti hallita usean mittalaitteen tutkimusdataa yhtäaikaisesti näiden keskinäiset suhteet hahmottaen. Ohjelmiston kehitystyön toteutti Jyväskylän yliopiston informaatioteknologian tiedekunnan opiskelijaprojekti opintojaksona \textit{TIES405 Sovellusprojekti}.

Röntgentomografia on kolmiulotteista matriisimuotoista harmaasävykuvaa, jonka kuvakoot tyypillisesti vaih\-te\-le\-vat sadoista megatavuista kymmeniin gigatavuihin. PerGeos-oh\-jel\-man vaatiman las\-ken\-ta\-te\-hon ja lisenssien rajallisen määrän seurauksena nykyiset prosessit asettavat rajoitteita pe\-rus\-tie\-to\-ko\-nei\-den käyttämiselle tutkimustyössä. Käyttäjien tarpeista johdettuja kehitettävän sovelluksen tavoitteita kuvataan tarkemmin vaatimusmäärittelyssä \cite{vaatimusmaarittely}.

Kehitettävän sovelluksen osalta tavoitteena ja ohjelman uutuusarvona oli liittää näytteeseen kolmiulotteisen tomografiakuvan ohella muun tyyppistä tutkimusdataa sekä kyetä visualisoimaan näiden välisiä yhteyksiä samanaikaisesti. Liitettävä tutkimusdata voi olla esimerkiksi tekstimuistiinpano, mikroskooppikuva tai diffraktiospektri. Tutkimusdataa olisi tarve lisätä pisteeseen, tasoon tai viivaan. Pääasiassa ohjelmaa kuitenkin hyödynnetään piste- ja tasoanalyysissä, joten nämä ovat myös olennaisimmat liitoksen tyypit.

Tomograﬁakuvan näyttämistä varten sovelluksella tulisi pystyä mm. muuttamaan harmaasävyskaalaa, kirkautta ja kuvakulmaa manuaalisesti. Numeerisia arvoja (kuten kirkkaus tai näytettävän tason kulma) tulisi pystyä muokkaamaan liukusäätimen lisäksi täsmällisillä numeerisilla arvoilla. Alkuperäistä kuvaa ei saa muokata. Tomografiakuvaa tulisi pystyä katsomaan vähintään pääakselikoordinaattien vastaisesti. Vapaan kuvakulman valinta oli tärkeä, mutta ei kriittinen toiminnallisuus.


\chapter{Käyttöliittymäkuvaus} \label{ch:GUI}


Sovelluksen käyttöliittymää ja toimintoja kuvataan erillisissä käyttöohjeissa \cite{kayttoohjeet}, joka tulee sovelluksen mukana. Käyttöohjeet ovat tiiviit, joten käyttöliittymää esitellään luvussa yksityiskohtaisemmin.

\section{Pääikkunan rakenne} \label{sec:paaikkunanrakenne}

Sovelluksen pääikkunan päänäkymä on jaettu neljään osaan kuvan \ref{fig:paaikkuna} osoittamalla tavalla. Valikko löytyy pääikkunan yläosasta ja ikkunan alaosassa on tilapalkki. Käyttäjä voi muuttaa päänäkymän ikkunoiden kokoa pääikkunan sisällä haluamallaan tavalla raahaamalla niiden reunaa hiirellä. Ikkunoiden paikkaa voi pääikkunan sisällä vaihtaa raahaamalla hiirellä ikkunan otsikkoriviltä. Ikkunan voi myös halutessaan jättää muiden pääikkunan elementtien päälle ikään kuin erilliseksi ikkunaksi, jonka kokoa ja sijaintia voi vapaasti muokata.

Pääikkunan alaosassa olevassa tilapalkissa näkyy tieto senhetkisestä käyttäjän nimestä ja mahdollisista käynnissä olevista kuvapinojen luomisoperaatioista. Kuvassa \ref{fig:paaikkuna} jaoteltuja pääikkunan päänäkymän ikkunoita ovat \textit{Map}, \textit{Controller}, \textit{Attached Data} ja \textit{Connectors}. Ikkunoita kuvataan tarkemmin luvuissa \ref{subsec:map}, \ref{subsec:controller}, \ref{subsec:attacheddata} ja \ref{subsec:connectors}.

\begin{figure}[H]
    \centering
    \includegraphics[width=\textwidth]{kuvat/sovellusraportti/paaikkuna.png}
    \vspace*{-5mm}
    \caption{Pääikkunan näkymät 1. \textit{Map}, 2. \textit{Controller}, 3. \textit{Attached Data} ja 4. \textit{Connectors}.}
    \label{fig:paaikkuna}
\end{figure}

Kuvassa \ref{fig:ikkunan_raahaaminen} esitetään \textit{Connectors}-ikkunan siirtämistä \textit{Map}-ikkunan viereen. Kun ikkunaa raahataan toisen osion päälle, käyttöliittymässä näytetään viisikohtainen elementti, joista käyttäjä voi valita, halutaanko raahattavan ikkunan menevän alla olevan osion ylä-, ala-, vasemmalle vai oikealle puolelle tai alla olevan ikkunan kanssa samaan kohtaan omaksi välilehdekseen.

\begin{figure}[H]
    \centering
    \includegraphics[scale=0.5]{kuvat/sovellusraportti/ikkunan_raahaaminen.png}
    \caption{\textit{Connectors}-ikkunan siirtäminen \textit{Map}-ikkunan viereen.}
    \label{fig:ikkunan_raahaaminen}
\end{figure}


\section{Map-ikkuna} \label{subsec:map}

Karttanäkymä \textit{Map} (kuvassa \ref{fig:paaikkuna} merkitty numerolla 1) sisältää näytteeseen lisätyn karttakuvan siivuja kolmesta eri kuvakulmasta. Kerrallaan näytettävät kuvakulmat voi käyttäjä valita yksitellen \textit{Controller}-ikkunasta (katso luku \ref{subsec:controller} ja kuva \ref{fig:paaikkuna}). Karttanäkymä on jaettu osiin sen mukaan, kuinka monta kuvakulmaa kulloinkin on valittuna. Tällöin esimerkiksi yhden valitun kuvakulman tapauksessa kuvasiivun sisältävä elementti vie koko karttanäkymälle varatun tilan.

Oletuksena karttanäkymässä näkyvät kuvasiivujen lisäksi myös liitoskohdat, mikäli niiden sijainti on tarkasteltavaksi valitulla kuvasiivulla. Kun liitoskohtaa klikataan hiirellä, siihen liittyvä tiedosto aukeaa \textit{Attached Data} -näkymään omana välilehtenään (katso luku \ref{subsec:attacheddata}). Liitoskohdat saa pois näkyviltä poistamalla valinnan valikon \textit{View} asetuksesta \textit{Attached Data Points}.

\textit{Map}-karttanäkymässä voi jokaista kuvasiivua tarkentaa tai loitontaa erikseen kuvasiivun alapuolella olevalla liukusäätimellä tai kirjoittamalla haluttu skaala prosentteina manuaalisesti tekstikenttään. Kuvasiivuihin saa myös valikosta näkyville värikoodatut koordinaattiakselit, joiden avulla käyttäjä näkee, mihin kohtaan muiden kuvakulmien tarkasteltavaksi valitut kuvasiivut sijoittuvat. Koordinaattiakselit saa näkyville valitsemalla valikosta \textit{View} asetus \textit{Axis Color Coding}.

\section{Controller-ikkuna} \label{subsec:controller}

Kuvasiivujen hallintanäkymän \textit{Controller} (kuvassa \ref{fig:paaikkuna} merkitty numerolla 2) avulla voidaan hallita karttanäkymässä (katso luku \ref{subsec:map}) näkyviä kuvasiivuja ja kuvien harmaasävyaluetta. Ylimpänä olevilla valintaruuduilla voidaan valita, mitkä kolmesta kuvakulmasta näytetään kerrallaan. Mikäli karttakuvaa ei ole, tai muiden kuvakulmien kuvapinoja ei ole luotuna tai tallennettuina, puuttuvien kuvapinojen osalta valintaruutuja ei voi valita.

Valintaruutujen alapuolella on kolme värikoodattua liukusäädintä, joiden avulla voidaan valita, mitä kuvasiivua halutaan kustakin kuvakulmasta tarkastella. Liukusäätimet eivät ole käytössä, jos niihin liittyvää tasoa ei ole valittu karttanäkymään näkyville. Liukusäädinten yläpuolella olevat numerot kuvaavat näytteeseen liitettyjen liitoskohtien määrää ja sijaintia kyseisellä akselilla. Eniten liitospisteitä sisältävät siivut ovat väritykseltään tummempia. Numeroita klikkaamalla käyttäjä voi tarkastella kyseistä siivua karttanäkymässä, mikäli kyseinen akseli on valittu karttanäkymään näkyville. Liukusäädinten vieressä oleviin tekstilaatikoihin voi kirjoittaa manuaalisesti halutun siivun numeron ja tekstilaatikon vieressä näkyy kyseisen akselin siivujen määrä.

Alimpana kuvasiivujen hallintanäkymässä on harmaasävyalueen määrittämiseen liittyvät toiminnot. Harmaasävyaluetta voi muuttaa manuaalisesti numeerisen arvon kirjoittamalla tai liukusäädintä raahaamalla. \textit{Reset}-painikkeesta harmaasävyalue palautuu takaisin oletusarvoihin. 8- ja 16-bittisten karttakuvien tapauksessa numeroarvot ovat ei-negatiivisia kokonaislukuarvoja ja 32-bittisten karttakuvien tapauksessa arvot ovat floating point -tyyppisiä liukulukuja.

Kuvasiivujen hallintanäkymän voi halutessaan piilottaa ohjelman sivuun painamalla oikeassa ylänurkassa olevaa nastan kuvaa, jolloin sen saa näkyville viemällä hiiren ikkunan oikeaan reunaan ilmestyneen \textit{Controller}-sanan päälle. Näkymän saa takaisin ns. kiinteäksi elementiksi painamalla nastan kuvaa uudestaan.
\newpage
\section{Attached Data -ikkuna} \label{subsec:attacheddata}

Liitosdatanäkymässä \textit{Attached Data} (kuvassa \ref{fig:paaikkuna} merkitty numerolla 3) näytetään käyttäjän avaama liitostiedosto (katso luku \ref{subsec:connectors}). Kuvassa \ref{fig:attacheddata} on esimerkki näkymästä. Kun ohjelmassa avataan useampi liitostiedosto samanaikaisesti nähtäville, liitostiedostonäkymät avautuvat oletuksena omiksi välilehdikseen. Halutessaan käyttäjä voi niitä siirtää luvussa \ref{sec:paaikkunanrakenne} kuvatulla tavalla. Kun kaikki liitostiedostot suljetaan, liitosdatanäkymä poistuu näkyvistä ja muut ikkunat saavat käyttöönsä enemmän tilaa.

\begin{figure}[H]
    \centering
    \includegraphics[scale=0.75]{kuvat/sovellusraportti/attacheddata.png}
    \caption{\textit{Attached Data} -ikkunassa ovat avattuina CSV-tiedosto ja sen asetukset.}
    \label{fig:attacheddata}
\end{figure}

Liitosdatanäkymässä pystytään näyttämään kaksiulotteisia kuvia (yleisimmät tie\-dos\-to\-tyy\-pit), CSV-tiedostoja (\texttt{csv}), Microsoft Excel -tiedostoja (\texttt{xlsx}, \texttt{xlsb} ja \texttt{xls}) ja tekstitiedostoja. Kaikki em. poikkeavat tiedostotyypit avataan tekstitiedostoina. Tiedostoja ei voi muokata sovelluksessa, mutta käyttäjä voi halutessaan muokata tiedostoja sovelluksen ulkopuolella.

Liitosdatanäkymässä vasemmalla alhaalla olevasta \textit{Options}-kohdasta käyttäjä voi määrittää tiedostotyyppikohtaisia asetuksia avatulle liitostiedostolle. Kuvassa \ref{fig:attacheddata} näytetään CSV-tiedosto ja siihen liittyvät asetukset, kuten erottimen syöttäminen tai ensimmäisen rivin näyttäminen sarakkeiden otsikkoina. Kaikissa liitostiedostotyypeissä on myös liitostiedoston tiedostopolku ja \textit{Reload File} -painike, josta tiedoston voi ladata sovellukseen uudestaan. Mikäli käyttäjä muokkaa tiedostoa ohjelman aikana jollain muulla ohjelmalla, muutokset saa sovellukseen näkyville kyseisestä painikkeesta.

\section{Connectors-ikkuna} \label{subsec:connectors}

Liitoskohtanäkymä \textit{Connectors} (kuvassa \ref{fig:paaikkuna} merkitty numerolla 4) listaa näytteeseen lisätyt liitostiedostot. Listaa voi suodattaa lisätyn liitostiedoston nimen perusteella tai järjestää eri sarakkeiden mukaiseen tai käänteiseen aakkosjärjestykseen klikkaamalla sarakkeen otsikkoa.

Listan riviä tuplaklikkaamalla valitun rivin mukainen liitostiedosto avataan liitosdatan näkymään (katso luku \ref{subsec:attacheddata}). Klikkaamalla hiiren oikealla painikkeella listan riviä aukeaa valikko, josta voi suorittaa kyseiselle liitosdatalle seuraavat toimenpiteet:

\begin{itemize}[noitemsep,topsep=0pt]
    \item \textit{Go To} siirtää karttanäkymän (katso luku \ref{subsec:map}) niihin kuvasiivuihin, joilla liitoskohta sijaitsee.
    \item \textit{Display} avaa liitostiedoston.
    \item \textit{Open File} avaa liitostiedoston oletusohjelmalla, joka on määritelty tiedostotyypille käyttöjärjestelmässä.
    \item \textit{Open Folder} avaa hakemiston, jossa liitostiedosto sijaitsee.
    \item \textit{Delete Selected} poistaa kyseisen liitoskohdan näytteestä.
    \item \textit{Metadata} näyttää liitoskohdan metatiedot (katso luku \ref{sec:metadata}).
\end{itemize}

\section{Komentovalikoiden komennot}

Sovelluksen komentovalikot ja niiden komennot ovat seuraavat:

\renewcommand{\labelitemi}{}
\renewcommand{\labelitemii}{$\rightarrow$}
\begin{itemize}[noitemsep,topsep=0pt]
    \item \textit{File}
    \begin{itemize}
        \item \textit{New} luo uuden näytteen.
        \item \textit{Open} avaa aiemmin tallennetun näytteen.
        \item \textit{Save} tallentaa nykyisen näytteen aiemmin määritettyyn tiedostoon.
        \item \textit{Save As...} tallentaa nykyisen näytteen uuteen tiedostoon.
    \end{itemize}
    \item \textit{Edit}
    \begin{itemize}
        \item \textit{Add/Change Map} lisää karttakuvan näytteeseen, jos karttakuvaa ei vielä ole lisättynä. Jos karttakuva on olemassa, komento vaihtaa näytteen karttakuvan uuteen (katso luku \ref{sec:addmap}).
        \item \textit{Add Connector} lisää uuden liitoskohdan näytteeseen (katso luku \ref{sec:addconnector}).
        \item \textit{Configure} avaa konfiguraatioikkunan, jossa käyttäjä voi muuttaa sovelluksen asetuksia (katso luku \ref{sec:konfiguraatioikkuna}).
    \end{itemize}
    \item \textit{View}
    \begin{itemize}
        \item \textit{Axis Color Coding} näyttää karttanäkymässä värikoodatut koordinaattiakselit.
        \item \textit{Attached Data Points} näyttää karttanäkymän kuvasiivuilla liitoskohdat.
        \item \textit{Sample Metadata} näyttää nykyisen näytteen yleiset metatiedot. Liitoskohtien omat metatiedot löytyvät \textit{Connectors}-listan avulla.
    \end{itemize}
    \item \textit{Tools}
    \begin{itemize}
        \item \textit{Edit Connectors} asettaa sovelluksen \textit{Edit Connectors} -tilaan (katso luku \ref{subsec:editconnectors}).
        \item \textit{Create ZY stack} luo karttakuvasta X-koordinaattiakselin suuntaiset ZY-tasot kuvina.
        \item \textit{Create XZ stack} luo karttakuvasta Y-koordinaattiakselin suuntaiset XZ-tasot kuvina.
    \end{itemize}
    \item \textit{Help}
    \begin{itemize}
        \item \textit{View Help} avaa sovelluksen käyttöohjeet.
        \item \textit{About} näyttää tietoja sovelluksesta.
    \end{itemize}
\end{itemize}
\renewcommand{\labelitemi}{$\bullet$}
\renewcommand{\labelitemii}{$\circ$}

\section{Liitoskohdan lisääminen} \label{sec:addconnector}

Näytteen liitoskohtia voi lisätä joko valitsemalla valikosta \textit{Edit} komento \textit{Add Connector} tai klikkaamalla hiiren vasemmalla painikkeella karttakuvaa halutusta kohdasta, jos sovellus on liitoskohtien lisäämisen tilassa (katso luku \ref{subsec:editconnectors}). Sovellus avaa liitoskohtaa lisätessä kuvan \ref{fig:addconnector} mukaisen dialogi-ikkunan.

\begin{figure}[H]
    \centering
    \includegraphics[scale=1.0]{kuvat/sovellusraportti/addconnector.png}
    \caption{Liitoskohdan lisäysikkuna.}
    \label{fig:addconnector}
\end{figure}

Tähdellä merkityt kentät ovat pakollisia. \textit{Description}-kenttään voi halutessaan syöttää kuvauksen lisättävästä liitostiedostosta, ja se lisätään automaattisesti liitoskohdan yhdeksi metatiedoksi. Lisäksi metatietoihin tallentuu liitoskohdan lisäyksen päivämäärä ja kellonaika sekä käyttäjän nimi. Käyttäjän nimeä voi muokata erillisestä konfiguraatiodialogista (katso luku \ref{sec:konfiguraatioikkuna}).

Liitoskohdan koordinaatit (\textit{Connector coordinates}) tulevat dialogiin automaattisesti, mutta käyttäjä voi myös halutessaan muokata niitä manuaalisesti. Jos liitoskohta on lisätty valikon kautta, koordinaateiksi tulee sillä hetkellä tarkasteltavana olevien siivujen numerot. Niiden akselien tapauksessa, joiden kuvapinoa ei ole generoitu, kyseisen akselin arvoksi tulee 1. Jos liitoskohta taas on lisätty hiiren klikkauksella karttanäkymästä, tulee dialogiin koordinaateiksi hiiren klikkauspiste klikatun siivun perusteella.

Liitoskohdan koordinaatit voi merkitä näytteen karttakuvan ulkopuolelle, mutta tällöin se ei näy karttakuvassa tai kuvasiivujen hallintanäkymässä \textit{Controller} olevassa liukusäätimessä. Liitoskohta kuitenkin näkyy edelleen \textit{Connectors}-ikkunan (katso kuva \ref{fig:paaikkuna}) listauksessa.

\section{Edit Connectors -tila} \label{subsec:editconnectors}

Kun \textit{Edit Connectors} -tila on päällä (valikosta \textit{Tools} komento \textit{Edit Connectors}), se näkyy käyttäjälle keltataustaisena tilapalkkina karttanäkymän yläosassa karttakuvasta muodostettujen kuvasiivujen yläpuolella kuten kuva \ref{fig:editconnectors} esittää. Kun tila on päällä, käyttäjä voi lisätä \textit{Map}-ikkunassa (katso luku \ref{subsec:map}) liitoskohtia kartalle hiiren klikkauksella. Klikkauksesta avautuu liitoskohdan lisäämisen dialogi (katso luku \ref{sec:addconnector}), jonne klikkauksen koordinaatit menevät automaattisesti liitoskohdan sijainniksi.

\begin{figure}[H]
    \centering
    \includegraphics[scale=1.0]{kuvat/sovellusraportti/addconnector2.png}
    \caption{Liitoskohtien lisäämisen mahdollistava tila näkyy keltaisella tilapalkilla.}
    \label{fig:editconnectors}
\end{figure}

\textit{Edit Connectors} -tilan ollessa päällä kartalle merkityistä liitoskohdista (valikosta \textit{View} asetus \textit{Attached Data Points} on päällä) hiirellä klikatessa liitoskohtaan liitetty liitostiedosto ei avaudu näkyville. Jatkokehityksessä \textit{Edit Connectors} -tilaan on mahdollista lisätä muitakin ominaisuuksia, kuten liitoskohdan siirtäminen (katso luku \ref{ch:jatkokehitys}).

\section{Karttakuvan lisääminen tai vaihtaminen} \label{sec:addmap}

Karttakuvan lisäämisdialogin avulla käyttäjä voi lisätä tai vaihtaa näytteeseen liitettyä karttakuvatiedostoa. Dialogissa valitaan haluttu karttakuvatyyppi (vaihtoehtoina Image \linebreak  Se\-quence eli kuvasarja, Multiframe TIFF tai Raw) ja valinnan perusteella dialogin asetukset karttakuvalle muuttuvat. Karttakuvan lisäämisdialogi esitetään kuvassa \ref{fig:openmapdialog}.

\begin{figure}[H]
    \centering
    \includegraphics[scale=1.0]{kuvat/sovellusraportti/openmapdialog.png}
    \caption{Karttakuvan lisäämisdialogi Raw-tyyppinen karttakuva valittuna.}
    \label{fig:openmapdialog}
\end{figure}

Kuvasarjaa valitessa käyttäjä voi valita minkä tahansa kuvasarjan kuvista. Tuettuja kuvasarjan tiedostotyyppejä ovat \texttt{TIFF} (\texttt{tif} ja \texttt{tiff}) ja \texttt{PNG} (\texttt{png}). Kun tiedosto on valittu, tiedostopolun sisältävän tekstikentän alapuolella olevaan \textit{Template}-kenttään tulee alkuarvaus kuvasarjan nimen kaavalle (kuva \ref{fig:openmapseq}), eli jokaisen kuvasarjan kuvan tiedostonnimessä esiintyvälle merkkijonolle. Käyttäjä voi halutessaan muuttaa kaavaa, jos esimerkiksi samassa kansiossa on useampi kuvasarja ja alkuarvaus on väärä.

\begin{figure}[H]
    \centering
    \includegraphics[scale=1.0]{kuvat/sovellusraportti/openmapseq.png}
    \caption{Karttakuvan lisäämisdialogi Image Sequence -tiedostoille.}
    \label{fig:openmapseq}
\end{figure}

Multiframe TIFF eli kolmiulotteiset TIFF-tiedostot vaativat asetuksista vain tiedostopolun. Sovelluksessa tuettavien multiframe TIFFien kokorajoitus on 4 GB.

Raw-tiedostojen avaamisessa olevat asetukset näkyvät kuvassa \ref{fig:openmapdialog}. Tiedostopolun lisäksi käyttäjän tulee antaa tiedot kuvan bittisyvyydestä sekä leveys, korkeus ja kuvapinon syvyys. Kuvapinon syvyyttä käytetään tällä hetkellä vain tiedoston odotetun koon laskemiseen, jotta käyttäjä voi kuvaa lisätessä tarkistaa, syöttikö hän kuvan dimensiot oikein. Laskennallinen tiedoston koko näkyy dimensio-tekstilaatikoiden alapuolella, jonka ohella näkyy myös tiedoston todellinen koko vertailua varten. Lisäksi käyttäjän tulee valita Raw-tiedoston tavujärjestystä varten valintaruudulla, onko avattava kuva little-endian vai big-endian.

\section{Metatietojen tarkastelu} \label{sec:metadata}

Metatietojen esittämisen ja muokkaamisen ikkunassa metatiedot näkyvät taulukkona. Yksittäinen metatieto vastaa yhtä taulukon riviä ja jokaisella metatiedolla on sekä metatiedon nimi että tarkempi kuvaus. Automaattisesti muodostettavassa tiedoston tai näytteen li\-säys\-a\-jas\-sa näkyy päivämäärä, kellonaika ja käyttäjän UTC-aikavyöhyke. Esimerkiksi kuvassa \ref{fig:metadata} auki olevassa liitostiedoston metatietoikkunassa aikavyöhyke on \texttt{UTC +03:00}.

\begin{figure}[H]
    \centering
    \includegraphics[scale=1.0]{kuvat/sovellusraportti/metadata.png}
    \caption{Metatietojen hallintaikkuna avattuna \texttt{Test CSV} -nimiselle liitoskohdalle.}
    \label{fig:metadata}
\end{figure}

Metatietojen taulukon rivien tekstejä voi muokata taulukossa suoraan. Tämän lisäksi kuvassa \ref{fig:metadata} nähtävien painikkeilla voidaan suorittaa seuraavat toimenpiteet:
\begin{itemize}
    \item \textit{Create Row} lisää uuden rivin taulukkoon.
    \item \textit{Delete Row} poistaa valitun metatiedon eli taulukon rivin.
    \item \textit{Reset Changes} palauttaa metatiedot takaisin siihen tilaan, jossa ne olivat ennen ikkunan avaamista.
    \item \textit{Save Changes} tallentaa metatietoihin tehdyt muutokset.
    \item Ikkunan sulkeminen ruksista kumoaa kaikki tallentamattomat muutokset.
\end{itemize}

Yksittäisen liitoskohdan metatietoja voi tarkastella \textit{Connectors}-listan avulla (katso luku \ref{subsec:connectors}). Koko näytetiedoston yleiset metatiedot löytyvät valitsemalla valikosta \textit{View} komento \textit{Sample Metadata}.

\section{Konfiguraatiodialogi} \label{sec:konfiguraatioikkuna}

Kuvan \ref{fig:konfiguraatioikkuna} esittämässä konfiguraatioikkunassa käyttäjä voi muuttaa metatietoihin lisättävää käyttäjänimeä tai värien asetuksia. Muutettavia värejä ovat värikoodatut koordinaattiakselit sekä kartalle merkittävien liitoskohtien värit. Liitoskohtien värien tapauksessa voidaan muuttaa sekä liitoskohtien perusväri että korostusväri, joka näkyy vietäessä hiiri liitoskohdan päälle kartalla.

\begin{figure}[H]
    \centering
    \includegraphics[scale=1.0]{kuvat/sovellusraportti/configure.png}
    \caption{Sovelluksen asetusten konfiguraatiodialogi.}
    \label{fig:konfiguraatioikkuna}
\end{figure}

Oletuksena käyttäjänimenä on se Windows-käyttäjätili, jolla sovellus avattiin. Asetukset eivät tällä hetkellä tallennu seuraavaa ohjelman käyttökertaa varten.


\chapter{Sovelluksen rakenne ja toteutusratkaisut} \label{ch:rakenne}

Luvussa esitellään kehitetyn sovelluksen yleistä rakennetta ja toteutusratkaisuja.

\section{Ohjelmiston yleisrakenne} \label{sec:yleisrakenne}

Sovelluksen yleisrakenne noudattaa kuvan \ref{fig:mvvm} mukaista Model-View-ViewModel-ark\-ki\-teh\-tuu\-ri\-a (MVVM-arkkitehtuuri). Näistä View ja ViewModel ovat käyttöliittymään liittyvää toiminnallisuutta ja Model on taustalla toimiva tietorakenne, jonka toiminnallisuutta käyttöliittymä näyttää. Arkkitehtuurin tarkoituksena oli erottaa käyttöliittymä ja taustalla oleva toiminnallisuus toisistaan omiksi kokonaisuuksikseen.

\begin{figure}[H]
    \centering
    \includegraphics[scale=0.75]{kuvat/sovellusraportti/mvvm.png}
    \caption{Sovelluksessa käytetty Model-View-ViewModel-arkkitehtuuri.}
    \label{fig:mvvm}
\end{figure}

MVVM-arkkitehtuurin osista View hoitaa pääasiassa käyttäjälle käyttöliittymässä näkyvien osioiden näyttämiseen liittyvän toiminnallisuuden. Tähän kuuluvat muun muassa itse käyttöliittymään kehitetyt omat \texttt{UserControl}-e\-le\-men\-tit ja dialogi-ikkunat. 

ViewModelin tehtävänä on yhdistää taustalla oleva tietorakenne käyttöliittymän toiminnallisuuksiin. Tämä hoidetaan pääasiassa ns. bindauksen eli sitomisen avulla, missä Viewin elementtien arvoja on sidottu ViewModelin attribuutteihin. Itse käyttöliittymäelementtejä ViewModelin puolella ei ole. Toteutuneessa sovelluksessa ViewModel-luokkia on vain \texttt{MainWindowViewModel}, joka hoitaa pääikkunan ja Modelin välistä kommunikointia.

Model muodostaa ohjelman taustalla toimivan tietorakenteen ja sen toiminnallisuuden. Sen tehtäviin kuuluu muun muassa liitoskohtien tietojen hallinta ja karttakuvien sijainnin ja lukemisen hallinta. Model on toteutettu pääasiassa kerrosarkkitehtuurin mukaisesti, eli kutsuhierarkiat menevät ylhäältä alaspäin kuten kuvasta \ref{fig:model} voidaan havaita. Luvussa \ref{sec:tietorakenne} kuvaillaan Modelin rakennetta tarkemmin.

\begin{figure}[H]
    \centering
    \includegraphics[scale=0.75]{kuvat/sovellusraportti/model.png}
    \caption{Sovelluksen toimintalogiikka toteutettuna kerrosarkkitehtuurin mukaisesti.}
    \label{fig:model}
\end{figure}

\section{Taustalla toimiva tietorakenne} \label{sec:tietorakenne}

Taustalle toteutettu tietorakenne eli kuvan \ref{fig:mvvm} Model toteutettiin kerrosarkkitehtuurin mukaisesti. Hierarkiassa ylimpänä olevalla luokalla on pääsy kaikkiin sitä hierarkiassa alempana oleviin kerroksiin, mutta kutsut eivät voi mennä hierarkiassa alhaalta ylöspäin. Kuvasta \ref{fig:model} nähdään Modelin sisältämät luokat ja niiden välinen hierarkia tarkemmin.

Ylimpänä hierarkiassa oleva \texttt{Sample}-luokka kuvaa reaalimaailman näytettä, joka käsittää sekä karttakuvan että siihen liittyvät mittaustulokset ja muut huomiot. \texttt{Sample}lla on tiedossaan sekä itse karttakuva (\texttt{Map-luokka}) että liitetyt tiedostot (\texttt{Attachments}-luokka). Lisäksi \texttt{Sample}lla on oma \texttt{Metas}-olionsa, johon on tallennettu näytteeseen liittyvät yleiset metatiedot.

\texttt{Map}-luokka pitää sisällään karttakuvaan liittyviä tietoja sekä kolme \texttt{Slice}-tyyppistä attribuuttia, joissa on tallessa sillä hetkellä näkyvillä olevat kuvapinot. \texttt{Slice}-luokka puolestaan hoitaa yksittäiseen kuvasiivuun liittyvät tehtävät ja tiedot, kuten harmaasävyskaalan muutokset tai kuvan muuttamisen tavutaulukoksi käyttöliittymään viemistä varten.

\texttt{Attachments}-luokka pitää sisällään näytteeseen liitetyt dataliitoskohdat, joita kuvataan\break \texttt{AttachedData}-olioilla. \texttt{Attachments}-luokan tehtävänä on koota kaikki liitoskohdat yhteen ja hoitaa niiden käsittelyyn liittyviä tehtäviä, kuten etsiminen. \texttt{AttachedData}-luokka puolestaan sisältää yhteen liitoskohtaan liittyvät tiedot, kuten liitoskohdan sijainti karttakuvalla ja liitetyn tiedoston polku. Kullakin \texttt{AttachedData}-oliolla on oma \texttt{Metas}-olionsa, joka sisältää kyseiseen yksittäiseen liitoskohtaan liittyvät metatiedot.

\texttt{Metas}-luokan tarkoituksena on koota joko näytteeseen tai liitoskohtaan liittyvät metatiedot yhteen. \texttt{Metas}-luokan alla on \texttt{Meta}-luokan olioita, jotka sisältävät metatiedon tunnisteen sekä kuvauksen. Esimerkiksi tiedoston käyttäjän nimen tapauksessa metatiedon tunnisteena olisi \texttt{Username} eli käyttäjänimi ja tietona käyttäjän nimi (kuten \texttt{Matti Meikäläinen}).

Tietorakenteen tallennus on toteutettu .NET mukana tulevalla JSON kirjastolla, jolla pystytään serialisoimaan ja deserialisoimaan olioita JSON-tiedostoksi. Serialisointi on toteutettu synkronoidusti, koska asyncronoidun tallentamisen/lataamisen yhteydessä ilmeni ongelmia tulosten synkronoinnin kanssa. Tämä ei ole tuottanut kumminkaan suuria ongelmia käytettävyyden suhteen, koska serialisoitu dataa on yleensä vähän.

\section{Ohjelmiston toimintalogiikka}

Kuvassa \ref{fig:logiikkasekvenssi} on kuvattu sovelluksen toimintalogiikkaa yksinkertaistetun sekvenssikaavion avulla. Kaavio kuvaa tapausta, jossa käyttäjä vaihtaa käyttöliittymän kautta katseltavaa XY-tason kuvapinon kuvasiivua toiseen ja sitä, miten kutsuhierarkia toteutetussa ohjelmistossa toteutuu.

\begin{figure}[H]
    \centering
    \includegraphics[scale=0.64]{kuvat/sovellusraportti/logiikkasekvenssi.png}
    \vspace*{-5mm}
    \caption{Yksinkertaistettu sekvenssikaavio XY-kuvasiivun vaihtamisesta.}
    \label{fig:logiikkasekvenssi}
\end{figure}

Kuvan \ref{fig:logiikkasekvenssi} mukaisesti käyttöliittymästä lähtee pyyntö \texttt{Sample}-luokalle päivittää tallessa oleva kuvasiivu uuteen valitun syvyyden perusteella. Lopulta ViewModel pyytää \texttt{Sample}-luokalta uutta siivua tavutaulukkona, jonka jälkeen se muutetaan Bitmap-kuvaksi ja näytetään käyttäjälle.


\section{Kuvien lukemisen toteutusratkaisut}

%TODO: Lyhyt kuvaus kuvien lukemisesta (koko kuvaa ei ladata kerralla muistiin jne.).

Kuvien lukeminen on toteutettu sovellukseen niin, että sovellus lataa kiintolevyllä olevasta karttatiedostosta yhden kuvasiivun muistiin jokaista näytettävää pääakselia kohden. Kun sovellukseen lisätään uusi karttatiedosto, sovellus olettaa tämän olevan XY-pääakselin suuntainen. XZ- ja ZY-pääakselien suuntaiset näkymät on toteutettu niin, että XY-karttatiedoston avulla luodaan kyseiset karttapinot kiintolevylle asynkronoidusti. 

Koska karttatiedoston sisältämät kuvasiivut ovat jonkin pääakselin suuntaisesti syvyysjärjestyksessä, sovellus voi lukea pääakselien suuntaisia kuvasiivuja vapaavalintaisesta syvyydestä ilman, että kuvasiivuja joudutaan muodostamaan dynaamisesti sovelluksen ajon aikana. Tämä mahdollistaa haluttujen kuvasiivujen näyttämisen käyttäjälle suhteellisen pienellä vasteajalla ilman, että karttatiedostoa joudutaan lataamaan kokonaisuudessaan välimuistiin. Toteutuksen heikkoutena on se, että kuvapinojen luominen vie huomattavasti aikaa ja että ylimääräiset karttatiedostot vievät tilaa kiintolevyltä. 


\chapter{Ohjelmointikäytänteet} \label{ch:kaytanteet}

Kehitetyn sovelluksen lähdekoodissa on pyritty noudattamaan C\#-ohjelmointikielen käytänteitä \cite{nimeamiskaytanteet}. Tekninen ohjaaja on tarkastanut käytänteiden noudattamista lähdekoodin katselmoinneissa. Katselmointien palautteet \cite{katselmointi1} ja \cite{katselmointi2} liittyivät pääasiassa muotoiluun tai kommentointiin, mutta joitakin huomioita projektiryhmä sai myös C\#:n muiden koodauskäytänteiden noudattamisesta. Projektiryhmä otti katselmoinneissa saamansa palautteen huomioon ja korjasi puutteet lähdekoodiin. Pääasiassa projektiryhmä oli kuitenkin noudattanut koodauskäytänteitä projektin aikana.

\section{Muotoilu-, nimeämis- ja kommentointikäytänteet}

Lähdekoodi ja kommentit on kirjoitettu englanniksi Microsoftin nimeämiskäytänteitä \cite{nimeamiskaytanteet} noudattaen. Nimiavaruudet, luokat, tyypit, rajapinnat, aliohjelmat, tapahtumat, vakiot ja julkiset attribuutit on nimetty \textit{PascalCase}-tyylillä. Aliohjelmien parametrit ja lokaalit muuttujat on nimetty \textit{camelCase}-tyylillä. Luokkien yksityisten attribuuttien nimen edessä on alaviiva. Rajapinnat alkavat I-etu\-liit\-teel\-lä. Nimissä on vältetty sanojen välisiä alaviivoja, mistä ainoana poikkeuksena on tapahtumankäsittelijät, joissa WPF-elementin nimi on erotettu tapahtuman nimestä alaviivan avulla.

Jokaisen kooditiedoston alkuun on lisätty lisenssiteksti (The MIT License). Poikkeuksena ovat Visual Studion automaattisesti muodostamat tiedostot ja graafisen käyttöliittymän esittämiseen käytetyt XAML-tiedostot. Kooditiedostojen (\texttt{cs}-loppuiset tiedostot) rivit on pyritty pitämään 80--90 merkkiä pitkinä, mutta siitä on osin poikettu koodin luettavuuden vuoksi. Esimerkiksi pitkien funktiokutsujen osalta pilkkomista ei voinut tehdä, sillä ohjelmakoodi ei enää toimisi. XAML-tiedostoissa rivit ovat pidempiä, sillä niiden luettavuus olisi ollut liiallisen rivien pilkkomisen seurauksena huonompaa.

\section{Lähdekoodin ryhmittelykäytänteet}

Projektisuunnitelmassa \cite{projektisuunnitelma} ei erikseen määritetty lähdekoodin ryhmittelykäytänteitä. Ohjelmisto on kuitenkin jaettu eri projekteihin erottamaan taustalla oleva tietorakenne ja ohjelman käyttöliittymä toisistaan. Lisäksi projektien sisältämiä lähdekooditiedostoja on tarpeen mukaan ryhmitelty eri hakemistoihin, esimerkiksi WPF:ään liittyvät erityyppisten ikkunoiden ym. tiedostot ovat omissa hakemistoissaan selkeyden vuoksi.
\newpage
Lähdekoodi on jaettu seuraaviin projekteihin ja kansioihin:
\renewcommand{\labelitemi}{$\bullet$}
\renewcommand{\labelitemii}{$\circ$}
\begin{itemize}
    \item \texttt{CoreLibrary}-projekti sisältää sovelluksen pääasiallisen toimintalogiikan, jonka tietorakenteet ja tiedostojen lukemiseen käytetyt luokat ovat seuraavat:
    \begin{itemize}
        \item \texttt{FileReaders}-hakemiston luokat avustavat tiedostojen lukemiseen liittyvissä tehtävissä.
        \item \texttt{Model}-hakemiston luokat toteuttavat ohjelman taustalla olevan tietorakenteen.
    \end{itemize}
    \item \texttt{GroundhogApp}-projekti sisältää käyttöliittymän toimintaan liittyvän toiminnallisuuden, sekä käyttöliittymän ulkonäön määrittelyn. Juurihakemistossa on pääikkunan lisäksi pääikkunan ViewModel sekä sovelluksen käyttöliittymän seuraavat yleiset tiedostot:
    \begin{itemize}
        \item \texttt{Dialogs}-hakemistoon on laitettu itse toteutetut dialogi-ikkunat.
        \item \texttt{Styles}-hakemistosta löytyvät sovelluksen käyttöliittymälle määritellyt elementtien tyylit.
        \item \texttt{UserControls}-hakemistossa on itse toteutetut UserControl-elementit.
        \item \texttt{ValueConverters}-hakemistossa on \verb|IValueConverter|-rajapinnan toteuttavat arvojen muuntamisen hoitavat luokat.
    \end{itemize}
\end{itemize}

\section{Kehitysympäristö}

Sovelluksen lähdekoodin kirjoittamiseen on käytetty Visual Studio 2019 -ohjelmaa ja Visual Studio Code -ohjelmaa. Ohjelmistokehyksenä on .NET Frameworkin versio 5.0 ja käyttöliittymän toteuttamiseen käytettiin WPF-kirjastoa. Sovelluksessa käytetyt muut kirjastot ovat Magick.NETiä ja CsvHelperiä lukuunottamatta .NET Frameworkin alaisia.

Kehitystä varten projektiryhmällä on ollut käytössään kaksi Windows 10 -työkonetta, yksi Windows 8.1 -työkone sekä Linux-työkone. Ohjelmointi on pääasiallisesti tehty Windows-työkoneilla, sillä WPF-ympäristö vaatii toimiakseen Windows-työkoneen. Vaatimusmäärittelyn \cite{vaatimusmaarittely} mukaisesti sovelluksen toiminta on rajattu Windows 10 -käyttöjärjestelmään, joten muita työkoneita ei kehityksen aikana tarvittu. Työkoneet olivat projektiryhmän omia laitteita, sillä projektin aikana vallinneiden koronarajoitusten takia jäsenillä ei ollut pääsyä projektin työhuoneisiin.

Versiohallintaan käytettiin Git-ohjelmaa ja Jyväskylän yliopiston GitLab-palvelua. Ohjelman lähdekoodin merkistökoodaus on UTF-8.

\chapter{Testauskäytänteet ja tulokset} \label{ch:testaus}

Luvussa kuvataan lyhyesti yksikkötestaukseen liittyviä testauskäytänteitä sekä järjestelmätestauksen testauskertojen tuloksia. Järjestelmätestauksen testauskäytänteitä on käsitelty järjestelmätestauksen testauskerran suunnitelmassa \cite{testaussuunnitelma}. Lisäksi testauskäytänteitä ja -tuloksia on käsitelty projektiraportissa \cite{projektiraportti}.

\section{Yksikkötestaus}

Lähdekoodin yksikkötestaukseen käytettiin Microsoftin MSTest-kirjastoa. Projektin aikana yksikkötestattiin joitakin omia \texttt{CoreLibrary}-projektin funktioita, mutta yksikkötestattuja funktioita ei päätynyt lopulliseen lähdekoodiin yhtäkään. Tästä johtuen yksikkötestien projekti päädyttiin poistamaan sovelluksen GitLab-varastosta (\textit{commit: c499d628}).

Yksikkötestejä kirjoitettiin esimerkiksi tiedostojen tallentamiseen liittyviin asynkronisoituihin  funktioihin, mutta tulosten synkronoinnista aiheutuneiden ongelmien vuoksi näistä funktioista luovuttiin. Yksikkötestejä kirjoitettiin myös omille luokille, jotka lopulta eivät päätyneet käyttöön esimerkiksi sen vuoksi, että näiden sijaan päätettiin käyttää valmiita kirjastoja.

\section{Järjestelmätestauskertojen tulokset}

Sovellukselle suoritettiin kaksi erillistä järjestelmätestauskertaa. Ensimmäinen järjestelmätestauksen testauskerta pidettiin 21.6.2021 -- 24.6.2021 ja toinen testauskerta 29.6.2021. Testauskertojen välissä testiskenaarioihin tehtiin muutoksia, mistä johtuen huomioiden kokonaislukumäärät testauskerroilla poikkesivat toisistaan.

Järjestelmätestauksen testauskäytänteet ja siinä käytetyt testiskenaariot löytyvät Järjestelmätestauksen testauskerran suunnitelmasta \cite{testaussuunnitelma}. Taulukkoon \ref{tbl:jarjestelmatestaus} on koottu testauskertojen huomioiden määrät. Yksityiskohtaisemmat tulokset huomioineen löytyvät järjestelmätestauksen testauskertojen raporteista \cite{testausraportti1} ja \cite{testausraportti2}.


\begin{table}[H]
\centering
\begin{tabular}{|l|r|r|r|r|r|}
\hline
 & \multicolumn{5}{c|}{\textbf{Huomion tyyppi}} \\\cline{2-6}
\textbf{Järjestelmätestauksen testauskerta}  & \textbf{OK} & \textbf{Huomautus} & \textbf{Virhe} & \textbf{Ohitettu} & \textbf{Yhteensä} \\
\hline
1. Testauskerta    & 56 & 13 & 8 & 5 & 82 \\
2. Testauskerta    & 64 & 2 & 6 & 0 & 72 \\
\hline 
\end{tabular}
\caption{Järjestelmätestauksen testauskertojen havaintojen määrät.} \label{tbl:jarjestelmatestaus}
\end{table}

Ensimmäisellä järjestelmätestauksen testauskerralla poikettiin testauskerran suunnitelmasta siten, että käytetty käyttöjärjestelmänä oli muu kuin Windows 10 ja käytetty testidata poikkesi testaussuunnitelmasta. Lisäksi joitakin testejä jouduttiin ohittamaan, sillä testausympäristöstä puuttui xlsx-tiedostojen tallentamista varten oleva ohjelma. Tästä johtuen päätettiin järjestää myös toinen testauskerta. Lisäksi testiskenaariot tarvitsivat vielä muokkausta, sillä joitakin testiskenaarioita pystyi suorittamaan useammalla eri tavalla. Ensimmäisellä testauskerralla löydetyt virheet korjattiin sovelluksesta.

Toisella testauskerralla testauskerran suunnitelmasta jouduttiin poikkeamaan siten, että testiskenaarioihin merkattiin huomautus tai virhe jälkeenpäin. Tämä johtui siitä, että ongelmat vaativat useamman askeleen ilmentyäkseen ja tulivat esille vasta myöhemmin. Toisen testauskerran löydetyt virheet ja huomautukset jaettiin vakavuusluokiltaan vakaviin, helposti korjattaviin ja pieniin huomiohin. Vakavat ja helposti korjattavat huomiot korjattiin sovelluksesta. Havaittujen käytettävyysongelmien korjaus sovittiin jatkokehitykseen, ja yksi virheistä esimerkiksi johtui virheellisestä testiskenaariosta. Kolmatta testauskertaa ei järjestetty, koska korjatut virheet olivat helppo todeta korjatuiksi (esim. kirjoitusvirheet) tai virheiden vaikutus oli rajattu. Kyseisten osioiden toiminnan tarkastaminen onnistui ilman erillisen testauskerran järjestämistä.

\chapter{Tavoitteiden toteutuminen} \label{ch:vaatimukset}

Luvussa kuvataan sovellukselle asetettujen tavoitteiden ja vaatimusmäärittelyssä esitettyjen vaatimusten toteutumista. Tämän lisäksi luvussa käsitellään myös epätyydyttäviä toteutusratkaisuja, jotka vaatisivat parannuksia.

% VANHA VERSIO: sisältää jatkokehitysideoita
% MVVM Light Toolkit kaltaiset kirjastot edellyttävät usein jonkin projekti-templaten käyttöä, jolloin sitoudutaan vahvasti tiettyyn sovelluskehykseen. Jatkokehityksessä voisi harkita MVVM-kirjaston, sillä se pakottaisi noudattamaan tiettyä arkkitehtuuria.
% AvalonDock selvittämisen yhteydessä löytyi valmiita komponentteja tarjoava WpfExToolkit-kirjasto, joka osoittautui hyödylliseksi toteutusvaiheen loppupuolella sovelluksen konfiguraatiodialogin värivalitsimissa. Molemmat AvalonDock ja WpfExToolkit ovat vapaan lisenssin forkkeja Xceedin omistamasta Extended WPF Toolkit -kirjastosta.
% Groundhog-projektissa päätettiin käyttää teknisen ohjaajan ehdottamaa Magick.NET kirjastoa. Muita vaihtoehtoja, kuten OpenCvSharp-kirjastoa, ei enää selvitetty sopivan kirjaston löydyttyä.
% Yksikkötestaus ei toteutunut suunnitellusti. Testauksen vastuuhenkilön suosituksista huolimatta päädyttiin käyttämään MSTest, koska se sisältyi valmiiksi .NET-kehitysympäristöön. xUnit.net kannattaa kuitenkin valita uudempana teknologiana jatkokehitykseen. Toteutusvaiheen alussa kirjoitettiin yksikkötestejä senhetkisille CoreLibrary-projektin metodeille. Sovelluksessa ei tarvittu juurikaan vaativaa laskentaa, joten yksikkötestien kirjoittamista ei jatkettu ensimmäisen katselmoinnin jälkeen. Toteutusvaiheen lopulla CoreLibraryTest-projekti osoittautui tarpeettomaksi, joten se päätettiin poistaa.
% Liitettävien tiedostojen osalta tilaajan edustajat toivoivat sovellusta, joka avaa liitettävät tiedostot ohjelmaan. Tekstitiedostot suunniteltiin avattavan ohjelman sisäisellä tekstieditorilla AvalonEdit, mikä rajattiin jatkokehitykseen. Taulukoiden käsittely puolestaan aloitettiin kirjoittamalla spesifikaation rfc4180 mukaista koodia. Myöhemmin siirryttiin CsvHelper-kirjastoon ja siitä edelleen ExcelDataReader-kirjastoon, joka tukee myös Microsoft Excelin tuottamia xlsx-tiedostoja.
% Väliesittelyiden jälkeen kehitetty WPFOpenGL-projektin sisältämä SharpGL-komponentti siirrettiin jatkokehitykseen. Microsoftin XNA:sta kehitetty MonoGame-pelimoottori saattaisi myös soveltua käyttötarkoitukseen.

\section{Vaatimusten täyttyminen} \label{sec:vaatimusten täyttö}

Toteutusvaiheessa projektin aikaresurssit loppuivat kesken, ja osa vaatimuksista sovittiin tilaajan kanssa jatkokehitykseen. Lisäksi 3D-TIFF -karttatiedostojen tuki sekä 32-bittisten kuvien osalta harmaasävyskaalaus toteutuivat puutteellisesti. Tilaajan edustajien kanssa sovittiin vaatimusten rajaus siten, että projektin puitteissa pystyttiin toimittamaan toimiva prototyyppi. Toteutumattomia ja puutteellisia vaatimuksia on kuvattu tarkemmin vaatimusmäärittelyssä \cite{vaatimusmaarittely}.

\section{Sovelluksen epätyydyttävät ratkaisut} \label{sec:epätyydyttävät}

Sovelluksen toteutusratkaisuista epätyydyttävänä voidaan pitää muista kuvakulmista muodostettujen kuvapinojen luomisen hitautta. Verrattuna muihin samankaltaisiin ohjelmiin (kuten esimerkiksi ImageJ-ohjelmistoon) kuvapinojen luonti on erittäin hidasta. Ongelma johtunee pääasiassa siitä, että kehitetyssä sovelluksessa koko näytekuvaa ei ladata kerrallaan muistiin. Sen sijaan tarkasteltavia leikkauskuvia vaihdettaessa uusi siivu luetaan kovalevyltä ja muiden kuvapinojen luonti on toteutettu samalla periaatteella. Projektin puitteissa ei ehditty toteuttaa kuvan lukemista kokonaan muistiin kerrallaan, mutta sen toteuttaminen ja kuvapinojen luonnin muokkaaminen sitä tukevaksi saattaisi nopeuttaa kuvapinojen luontia huomattavasti.

Harmaasävyskaalauksen toimivuus 32-bittisten näytekuvien kohdalla kaipaa myös kehittämistä. 32-bittisillä liukuluvuilla minimi- ja maksimiarvojen alkuarvaukset ovat liian suuria tai pieniä, sillä oletuksiksi
valittiin pienin ja suurin mahdollinen 32-bittinen liukuluku. Tämä on kuitenkin käyttäjälle hankalaa, sillä monesti kuvien kirkkausarvot eivät ole koko 32-bittisen liukuluvun arvoväliltä, vaan oikea arvoväli on huomattavasti pienempi. Kunnollisia minimi- ja maksimiarvoja varten kuvan tulisi olla kokonaan muistissa, jotta suurin ja pienin mahdollinen arvo voidaan laskea koko näytekuvasta. Vaihtoehtoisesti minimi- ja maksimiarvot pitäisi laskea uudestaan aina tarkasteltavaa siivua vaihdettaessa ja laskea kaikista nähtävillä olevista siivuista. Kumpaakaan ei ehditty toteuttaa projektin puitteissa.

3D-TIFF tiedostojen lukemisessa jouduttiin rajoittamaan tiedostojen koko 4GB. Tämä johtuu siitä, että käytettyä kuvakirjastoa Magick.NET ei saatu lukemaan yli 4GB kokoisia TIFF-tiedostoja. Yli 4GB TIFF-tiedostot käyttävät normaalista TIFF-tiedostosta poikkeavaa Big\-TIFF-formaattia, jota kuvakirjasto ei suostunut lukemaan. 

\section{Toteutusratkaisujen valinta ja kehittyminen}

Tilaajan edustajat antoivat ryhmälle täyden vapauden valita toteutusalustan sekä suunnitella graafisen käyttöliittymän sovelluksen muutamia reunaehtoja noudattaen. Sovelluksen tulee toimia millä tahansa perustason tietokoneella lataamatta suuria kolmiulotteisia kuvatiedostoja kerralla muistiin. Kuvatiedostojen kokorajoitukset päädyttiin ratkaisemaan vastaavalla tavalla kuin ImageJ-ohjelman \textit{virtual stack} -toiminnossa.

Kehitettävän sovelluksen malliksi otettiin aihekuvauksen ja palavereissa käytyjen keskustelujen perusteella ImageJ/Fiji- ja PerGeos-ohjelmat. Fijistä mallia otettiin käyttöliittymään ohjelman menuvalikon laajennoksiin perustuvasta modulaarisesta rakenteesta. PerGeos-oh\-jel\-mas\-ta käyttöliittymään otettiin mallia ohjelman hallitsevasta, mutta vapaasti asemoitavasta pääikkunasta. Toisaalta komentovalikosta avattavat modaaliset ikkunat hieman rikkovat pääikkunaan pohjautuvaa käyttöliittymä arkkitehtuuria.

Ikkunoinnin jälkeen suunniteltiin ohjelman ulkoiset rajapinnat valitsemalla käyttöliittymälle AvalonDock-kirjasto. Sovelluksen käyttöliittymän suunnittelun yhteydessä kokeiltiin \linebreak myös AvaloniaUI:n ja sen Dockin yhdistelmää. AvaloniaDockista luovuttiin nopeasti, mutta se tarjosi kiinnostavan vaihtoehdon Windows-koneisiin rajoittuvalle WPF-teknologialle. Käyttöliittymän MVVM-arkkitehtuuri toteutui suunnitellusti ilman ulkoisia kirjastoja.

Kuvankäsittelyyn valittiin Magick.NET-kirjasto, jonka valinnalla saavutettiin laaja kuvaformaattien tuki sekä valmiit työkalut kuvien jatkokäsittelyyn, esimerkiksi harmaasävyskaalan muuttamiseen. Kuvankäsittelyyn harkittiin aluksi kirjastoja Emgu CV ja pi2, mutta kumpaakaan ei voitu suoraan hyödyntää tarttuvan GPL-lisenssin takia. Tilaajan edustajista Miettinen on yksi pi2-kirjaston kehittäjistä ja hän olisi tarvittaessa voinut lisensoida uudelleen osan kirjoittamistaan ohjelmaosioista.

Liitoskohtien kolmiulotteiseen visualisointiin kartoitettiin OpenGL-kirjastoja, joista Sharp\-GL-kirjasto vaikutti alkuun lupaavimmalta. Käyttöönotossa kesti suunniteltua kauemmin, joten kolmiulotteisen tilakartan korvaajaksi kehitettiin liitoskohtia ryhmittelevä liukusäädin. Sovelluksen päämääränä olikin juuri liitoskohtien merkitseminen ja hallinta, minkä perusteella muodostettiin sovelluksen luokkarakenne.

\chapter{Ideoita jatkokehitykseen} \label{ch:jatkokehitys}

Luvussa kuvataan sekä jatkokehitykseen sovittuja ominaisuuksia että ideoita siitä, mihin suuntaan sovellusta voisi lähteä kehittämään jatkossa. Näiden lisäksi myös luvun \ref{sec:epätyydyttävät} epätyydyttävät ratkaisut ovat olennaisia jatkokehityksen kohteita. Luvusta löytyy myös jatkokehitysympäristön pystytysohjeet. 

\section{Jatkokehitysympäristön pystytysohjeet}

Projektin lähdekoodi sijaitsee Jyväskylän yliopiston GitLab-palvelussa yksityisenä repositoriona osoitteessa  \texttt{gitlab.jyu.fi}. GitLabin avulla projektitiedostot voidaan ladata pakattuina tiedostoina ja sitä voidaan käyttää erilaisten Git-pohjaisten versiohallintasovellusten kanssa. Projektin päättyessä sovelluksen versiosta on yksi päähaara.

.NETin version 5.0 ohjelmistokehykseen perustuva sovelluksen GroundhogApp-WPF-pro\-jek\-ti vaatii vähintään Community-ilmaisversion Visual Studio 2019 -kehitysympäristöstä. Lähdekoodit sisältävä Visual Studio -projekti avataan \textit{Open Project/Solution} -toiminnolla valitsemalla \texttt{source}-kansiosta \texttt{Groundhog.sln}-tiedosto. Toimiakseen Visual Studioon on asennettava paketti \texttt{.NET desktop development -workload}. Mikäli tätä ei ole valmiiksi asennettuna, Visual Studio ehdottaa pakettia asennettavaksi Visual Studio Installer -palvelun kautta.

Testausympäristön pystytyksen jälkeen ohjelmakoodi on käännettävissä Visual Studiolla. Ohjelman käynnistysolion pitäisi olla oletuksena asetettuna \texttt{GroundhogApp.App}.

\section{Kaksiulotteisen karttakuvakomponentin jatkokehitysideat}

Kaksiulotteiseen karttakuvakomponenttiin (katso luku \ref{subsec:map}) voisi lisätä seuraavia ominaisuuksia:

\begin{itemize}
\item Karttakuvien tarkentamista, keskittämistä, liikuttamista ja selaamista voisi parantaa pikanäppäimillä ja käsittelemällä laajemmin käyttäjän syötteitä. Karttakuvien koordinaatisto kannattaa ehkä ensin päivittää käsittelemään liukulukuja.
\item Liitoskohtia voisi pystyä liikuttamaan hiirellä. Pisteen siirtämisen sijaan voisi suunnitella tarkemmin liitoskohtien muodon, sijainnin ja asennon määrittämisen.
\item Käyttöliittymän tulisi tarjota mahdollisuudet karttakuvien uudelleen asetelluun ja irroittamiseen, kuten liitostiedostojen kohdalla. Näytettävät kuvakulmat varaavat käyttöliittymästä tilaa dynaamisesti sitä mukaan kun eri pääakselien suuntaisia karttapinoja luodaan.
\item Karttakuvia tulisi voida määrittää mistä tahansa kuvakulmasta.
\item Karttakuvia tulisi pystyä määrittämään 3D-avaruuden kohtaan ja sen tietoja pystyy jälkeenpäin muuttamaan asetusnäkymän kautta. 
\item Asetusnäkymiä käytetään monessa kohtaa ohjelmaa, joten käyttöliittymän komponenteilla voisi olla yksilölliset asetusnäkymät.
\end{itemize}

% VANHA ->
%\begin{itemize}
%    \item Kuvia voisi tarkentaa painamalla näppäimistöstä CTRL ja pyörittämällä samalla hiiren rullaa.
%    \item Kuvia voisi liikuttaa hiiren raahauksella esimerkiksi hiiren keskinapin avulla.
%    \item Lisättyjen liitoskohtien paikkaa voisi vaihtaa raahaamalla niitä hiirellä.
%    \item Kuva ei sumene zoomattaessa.
%\end{itemize}
% <- VANHA

\section{Kolmiulotteinen karttakuvakomponentti}

Prototyyppi sijoitettiin erillisenä projektina versiohallintaan (\textit{commit: 72c9693e}). 
Komponentti tarkoitettiin palaverissa esiteltäväksi prototyypiksi, jota voidaan vielä parantaa ennen käyttöönottoa. Tärkeimpänä ominaisuutena on liitoskohtien muodon, sijainnin ja asennon määrittäminen laajennettavasti sekä niiden leikkauspisteiden laskeminen.

Komponentti esittää kuvatiedostot tasoihin liitettävinä tekstuureina, joka on toteutustavaltaan yhteensopiva kaksiulotteisen karttakuvakomponentin kanssa. Komponenttia voisi laajentaa esittämään kuvapisteiden väriarvot suoraan alkuperäisestä volyymidatasta.

\section{Muut sovelluksen toiminnallisuuteen liittyvät jatkokehitysideat}

Sovellussuunnitelmien näkökulmasta keskeisiä parannusehdotuksia ovat seuraavat:

\begin{itemize}
\item Käyttöliittymäsuunnitelmassa esitetyn dataliitoksia sisältävän listanäkymän yhteyteen voisi lisätä painikkeet kontekstivalikon toiminnoille. Painikkeet kohdistuisivat valittuna olevaan dataliitokseen.
\item Käyttöliittymäsuunnitelmassa esitetyn uuteen ikkunaan aukeavat näkymät voisivat avautua pääikkunaan, kuten muutkin näkymät. Vaihtoehtoisesti uudet asetusnäkymät voisivat avautua käyttöliittymän kyseisten komponenttien tilalle.
\item Käyttöliittymäsuunnitelman kuvassa liitoskohtia osoittavat liukusäätimet voisi sijoittaa niitä vastaaviin kaksiulotteisiin karttakuvakomponentteihin. Karttakuvia voisi hallita silloin kokonaan erillään toisistaan.

%\item Arkkitehtuurisuunnitelmassa karttakuvia edustavat siivut voisi sijoittaa dataliitosten tapaan tietorakenteeseen. Silloin käyttöliittymän kautta voidaan lisätä dynaamisesti useampia karttakuvia eri kuvakulmista.

%\item Arkkitehtuurisuunnitelmassa dataliitosten metatiedot voisi sijoittaa samaan säiliöluokkaan kuin näytteen metatiedot. Liitosdata saadaan erotettua metatiedoista, jolloin metatiedot olisivat yhdessä paikassa ja luokkien välillä vähemmän riippuvuuksia.

%\item Luokkasuunnitelmassa karttakuvat ja liitosdatat voisivat huolehtia omasta tiedoston käsittelystään staattisten apufunktioiden sijaan. Vaihtoehtoisesti staattiset apufunktiot uudelleen sijoitettaisiin niitä käyttäviin luokkiin.

\end{itemize}
\newpage
\section{Sovelluksen lähdekoodin jatkokehitysideat}

Karttakuvia edustavat siivut voisi sijoittaa dataliitosten tapaan tietorakenteeseen. Silloin käyttöliittymän kautta voidaan lisätä dynaamisesti useampia karttakuvia eri kuvakulmista.

Dataliitosten metatiedot voisi sijoittaa samaan säiliöluokkaan kuin näytteen metatiedot. Liitosdata saadaan erotettua metatiedoista, jolloin metatiedot olisivat yhdessä paikassa ja luokkien välillä olisi vähemmän riippuvuuksia.

Karttakuvat ja liitosdatat voisivat huolehtia omasta tiedoston käsittelystään staattisten apufunktioiden sijaan. Vaihtoehtoisesti staattiset apufunktiot voisi sijoittaa niitä käyttäviin luokkiin.

Lähdekoodia voisi parannella refaktoroimalla esimerkiksi kuvien lukemiseen liittyviä aliohjelmia \texttt{MapReader}-luokassa. Tällä hetkellä jokaiselle eri tiedostotyypille on oma aliohjelmansa, mutta tämä voitaisiin muuttaa yhdeksi aliohjelmaksi ja välttää toistoa. Aliohjelmissa on tosin tehty eri tiedostomuotojen lukemisen optimointia, mikä tulee refaktorointia tehdessä huomioida.

Lähdekoodin poikkeuksenkäsittelyä tulee myös parantaa jatkokehityksessä. Poikkeusviestien näyttämistä varten on globaali käsittelijä, jonka avulla käyttäjälle näytetään virheviestin sisältävä ponnahdusikkuna. Tämän voisi muuttaa siten, että globaalissa poikkeuksenkäsittelijässä käsiteltäisiin vain itse ohjelmoidut poikkeusluokat ja yleisten ohjelmointikielen poikkeusten virheilmoitusten näyttäminen hoidettaisiin alkuperäisessä tapahtumankäsittelijässä. Tällöin ohjelmoijan ei tarvitsisi muistaa, mitkä C\#-ohjelmointikielen poikkeukset saattavat vaatia erillistä käsittelyä. Tässä täytyy kuitenkin huomioida se, että käyttöliittymän ominaisuuksia (kuten ponnahdusikkunoita) on mahdollista luoda vain käyttöliittymään liittyvissä luokissa luvussa \ref{sec:yleisrakenne} kuvatulla tavalla. Lisäksi joissain tapauksissa esimerkiksi funktioiden argumenttien tarkastaminen ennen funktiokutsuja if-lauseilla voisi olla järkevämpää kuin poikkeuksen heittäminen.

%TODO: Liitoskohtien sijainnin refaktoroinnista.
Lähdekoodissa liitoskohtien sijaintia käsitellään kolmiulotteisena pisteenä. Sovelluksen \linebreak suunnittelussa puhuttiin myös liitoskohdista viivoina ja tasoina, joita ei toteutettu projektissa. Nykyinen toteutustapa ei mahdollista uusien liitoskohdan muotojen lisäämistä helposti. Siksi olisi hyvä jos \texttt{AttachedData}-luokassa liitoskohdan sijainti esitettäisiin kolmiulotteisen avaruuden pisteen sijaan rajapintaluokkana. Tällöin uusien liitoskohtien muotojen lisääminen jatkokehityksessä olisi helpompaa.


\chapter{Yhteenveto} \label{ch:yhteenveto}

%Yhteenvedossa kannattaa esittää
%    dokumentin olennaisimmat asiat tiivistetysti. Ainakin
%    kannattaa mainita, miltä osin tavoitteet toteutuivat ja
%    miltä osin eivät. Kannattaisiko mainita myös olennaisimmat
%    kehitystä kaipaavat toteutusratkaisut?
    
Groundhog-projekti kehitti kevään 2021 Sovellusprojekti-kurssilla Geologian tutkimuskeskukselle multimodaalisen tutkimusdatan hallintaohjelmiston tukemaan tomografialaboratorion näytteiden analyysiä. Prototyyppi helpottaa erityyppisten tutkimusdatojen yhdistämistä, hallintaa ja visualisointia, mutta sovellusta tulee vielä kehittää ennen kuin se voidaan ottaa laajempaan tuotantokäyttöön.

%Ohjelman toimintojen ja rakenteen kuvaus, hyväksyminen, jatkokehitys
Projektiryhmän kehitettämällä prototyyppillä voi tarkastella isokokoisia kolmiulotteisia karttakuvia perustietokoneella. Projektissa kehitetylle sovellukselle toteutettiin käyttöliittymä, joka tarjoaa käyttäjälle pääsyn kaikkiin ohjelman toimintoihin. Toiminnoista olennaisimmat ovat karttatiedostojen selaaminen, liitostiedostojen lisääminen ja liitostiedostojen näyttäminen. Sovelluksen toteutuksessa on käytetty MVVM-arkkitehtuuria, jonka avulla käyttöliittymä on erotettu toimintalogiikasta vastaavasta tietorakenteesta. Tämä mahdollistaa käyttöliittymän ja tietorakenteiden muokkaamisen erillisinä kokonaisuuksinaan jatkokehityksessä.

Tärkeimmät sovellukselle asetetut tavoitteet toteutuivat projektissa. Kaikkia vaatimusmäärittelyssä asetettuja ominaisuuksia ei ehditty projektissa toteuttamaan. Projektiryhmä suoritti kahdesti suunnittelemansa järjestelmätestauskerran. Tämän lisäksi projektin tekninen ohjaaja katselmoi lähdekoodin kahdesti. Sovellus hyväksyttiin niin tilaajan kuin teknisen ohjaajankin toimesta. 

Olennaisimmat jatkokehityksen kohteet ovat luvun \ref{sec:vaatimusten täyttö} kuvailema 3D-TIFF -karttatiedos\-tojen tuen lisääminen ja luvun \ref{sec:epätyydyttävät} epätyydyttävien ratkaisujen parantelu. Luvussa \ref{ch:jatkokehitys} on kuvattu muita jatkokehityksen kohteita.



%TODO
%Lähdekoodin jatkokehitysideat
%Tiivistelmä
%Toteutusratkaisujen kehittyminen
%Olennaisimmat termit

%LÄHTEET
\begin{thebibliography}{11}
\makeatletter
\addtocounter{\@listctr}{0}
\makeatother

% TODO: Katso kirjoitusohjeen luku 2.3 ja 2.4.

\bibitem{kodavi} Lauri Antila, Outi Hilola, Antti Kauppi ja Anne Vaarala. Kodavi-projekti, Sovellusraportti. Jyväskylän yliopisto, informaatioteknologian tiedekunta, 2020.

\bibitem{nimeamiskaytanteet} Krzysztof Cwalina et al. Naming Guidelines. \url{https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/naming-guidelines}. Microsoft, 2008.

\bibitem{peltihamsteri} Mari Kasanen, Leevi Liimatainen, Marina Mustonen, Juhani Sundell ja Arttu Ylä-Sahra. Peltihamsteri-projekti, Sovellusraportti. Jyväskylän yliopisto, informaatioteknologian tiedekunta, 2019.

\bibitem{projektiraportti} Iiro Iivanainen, Harri Linna, Jere Pakkanen ja Riikka Vilavaara. {\pname}-projekti, Projektiraportti. Jyväskylän yliopisto, informaatioteknologian tiedekunta, 2021.

\bibitem{projektisuunnitelma} Iiro Iivanainen, Harri Linna, Jere Pakkanen ja Riikka Vilavaara. {\pname}-projekti, Projektisuunnitelma. Jyväskylän yliopisto, informaatioteknologian tiedekunta, 2021.

\bibitem{testausraportti1} Iiro Iivanainen, Harri Linna, Jere Pakkanen ja Riikka Vilavaara. {\pname}-projekti, Järjestelmätestauksen ensimmäisen testauskerran raportti. Jyväskylän yliopisto, informaatioteknologian tiedekunta, 2021.

\bibitem{testausraportti2} Iiro Iivanainen, Harri Linna, Jere Pakkanen ja Riikka Vilavaara. {\pname}-projekti, Järjestelmätestauksen toisen testauskerran raportti. Jyväskylän yliopisto, informaatioteknologian tiedekunta, 2021.

\bibitem{testaussuunnitelma} Iiro Iivanainen, Harri Linna, Jere Pakkanen ja Riikka Vilavaara. {\pname}-projekti, Järjestelmätestauksen testauskerran suunnitelma. Jyväskylän yliopisto, informaatioteknologian tiedekunta, 2021.

\bibitem{vaatimusmaarittely} Iiro Iivanainen, Harri Linna, Jere Pakkanen ja Riikka Vilavaara. {\pname}-projekti, Vaatimusmäärittely. Jyväskylän yliopisto, informaatioteknologian tiedekunta, 2021.

\bibitem{kayttoohjeet} Iiro Iivanainen. {\pname}-projekti, Sovelluksen käyttöohjeet. Jyväskylän yliopisto, informaatioteknologian tiedekunta, 2021.

\bibitem{projohje} Jukka-Pekka Santanen. Tietotekniikan Sovellusprojektien ohje. \url{http://www.mit.jyu.fi/palvelut/sovellusprojektit/projohje.pdf}. Jyväskylän yliopisto, informaatioteknologian tiedekunta, 2017.

\bibitem{katselmointi1} Juuso Tuononen. Groundhog-projektin 1. koodikatselmuksen
kirjalliset huomiot. Jyväskylän yliopisto, informaatioteknologian tiedekunta, 2021.

\bibitem{katselmointi2} Juuso Tuononen. Groundhog-projektin 2. koodikatselmuksen
kirjalliset huomiot. Jyväskylän yliopisto, informaatioteknologian tiedekunta, 2021.

\end{thebibliography}

%LIITTEET
%\begin{appendix}

%\chapter{Ensimmäinen liite}

%Tänne tarvittaessa liitteitä.

%\end{appendix}

% Dokumentin  lopetus
\end{document}
