Petri Eskelinen, Lasse Laukkanen, Kaisa Kokko ja Mikko Ketola
EXODUS
		              Sovellussuunnitelma
Tietotekniikan cum laude -työprojekti
30.10.2001

Tekijä: Exodus-projeki (Petri Eskelinen, Lasse Laukkanen, Kaisa Kokko ja Mikko Ketola
Yhteystiedot: Agc233.3, http://kotka.it.jyu.fi/exodus, puh: 014-2604966
Työn nimi: Exodus-sovellussuunnitelma
Title in English: Exodus project design and requirements
Työ: Exodus-cum laude –työprojektin sovellussuunnitelma
Sivumäärä: 1
Teettäjä: Numerola Oy
Avainsanat: Blokki, kontrollipiste, tahko, särmä, luokkakaavio, käyttötapaus, attribuutit, metodit, käyttöliittymä
Tiivistelmä: Tässä dokumentissa määritellään sovelluksen rakenne, nimeämiskäytäntö, käyttöliittymä sekä projektin tavoitteet ja vaatimukset. Sovelluksen rakenne koostuu pääosin luokkajaosta ja luokkakaaviosta, jotka on määritetty käyttötapausten avulla. Tavoitteet jaetaan ensisijaisiin.ja toissijaisiin toiminnallisiin tavoitteisiin sekä ei-toiminnallisiin tavoitteisiin. Käyttöliittymän rakennetta havainnollistetaan kuvilla.

Termiluettelo
Alla lueteltu projektin aikana ilmenneitä uusia termejä:

TCL/Tk	Tool Command Language/Toolkit. Ohjelmistopaketit Tcl ja Tk yhdessä tarjoavat ohjelmointiympäristön graafisten sovelluksien kehittämiseen käyttämiseen. TCL on tulkattava komentorivipohjainen kieli.[3]		
GLUT	OpenGL Utility Toolkit. Itsenäinen laajennuskirjasto OpenGL-ohjelmien kirjoittamiseen. GLUT käsittää yksinkertaisen ohjelmointirajapinnan OpenGL:lle. GLUTia on mahdollista käyttää sekä Windows että X-Windows järjestelmissä. 
OpenGL	Grafiikkakirjasto 3D-gafiikkaan ja mallinnukseen. [4]
Blokki	Kuutio, pyramidi, tetraedri tai prisma: tahot muodostuvat splineistä.
Bezier-pinta	CAD- ja piirrosohjelmissa käytetty pintatyyppi. Sen avulla pinnat saadaan taipumaan eri muotoihin ohjauspisteitä siirtämällä.

Sisältö
1	Johdanto
2	Projektin taustat ja tavoitteet
2.1	Projektin taustat
2.2	Projektin tavoitteet
2.2.1	ensisijaiset toiminnalliset vaatimukset
2.2.2	Toissijaiset toiminnalliset vaatimukset
2.2.3	Ei-toiminnalliset vaatimukset
3	Kommentointi- ja nimeämiskäytäntö
4	Sovelluksen rakenne
5	Luokkajako
5.1	cManager
5.1.1	Attribuutit
5.1.2	Julkiset metodit
5.2	caGraphicalElement3d
5.2.1	Attribuutit
5.2.2	Julkiset metodit
5.3	caBlock
5.3.1	Attribuutit
5.3.2	Julkiset metodit
5.4	cHexaedron
5.4.1	Attribuutit
5.4.2	Julkiset metodit
5.5	cTetraedron
5.5.1	Attribuutit
5.5.2	Julkiset metodit
5.6	cPyramid
5.6.1	Attribuutit
5.6.2	Julkiset metodit
5.7	cPrism
5.7.1	Attribuutit
5.7.2	Julkiset metodit
5.8	caSurface
5.8.1	Attribuutit
5.8.2	Julkiset metodit
5.9	caTriangleSurface
5.9.1	Attribuutit
5.9.2	Julkiset metodit
5.10	caSquareSurface
5.10.1	Attribuutit
5.10.2	Julkiset metodit
5.11	cEdge
5.11.1	Attribuutit
5.11.2	Julkiset metodit
5.12	cControlPoint
5.12.1	Attribuutit
5.12.2	Julkiset metodit
6	Yleisimmät operaatiot piirtoavaruuden objekteille
7	Muita aliohjelmia
7.1	OpenGL ja Glut
7.2	TCL/C++ -muunnos
8	Käyttöliittymän kuvaus
9	Lähteet
10	Liitteet
Liite 1: Käyttötapaus - Blokin luominen
Liite 2 Käyttötapaus - Ohjelman sulkeminen
Liite 3 Käyttötapaus - Pinnanmuotojen näyttäminen
Liite 4 Käyttötapaus - Tahojen visualisointiverkkojen näyttäminen
Liite 5: Käyttötapaus -  Attribuuttien muokkaaminen
Liite 6: Käyttötapaus -  Uuden piirtoavaruuden luominen
Liite 7: Käyttötapaus - Tallennetun piirtoavaruuden avaaminen näytölle
Liite 8: Käyttötapaus -  Piirtoavaruuden tallentaminen
Liite 9: Käyttötapaus  -   Valitseminen
Liite 10: Käyttötapaus  -   Siirtäminen
Liite 11: Käyttötapaus - Blokin pyörittäminen valitun rotaatiopisteen ympäri.
Liite 12: Käyttötapaus - Katselupisteen muuttaminen
Liite 13: Käyttötapaus - Poistaminen
Liite 14: Käyttötapaus - Yhdistäminen
Liite 15: Käyttötapaus - Erottaminen
Liite 16: Käyttötapaus - Leikepöydälle kopiointi ja leikepöydältä liittäminen
Liite 17: Käyttötapaus - Toiminnon kumoaminen ja tekeminen uudelleen

1	Johdanto

Exodus-nimisessä tietotekniikan cum laude -työprojektissa toteutetaan 3D-geometrian piirtämiseen ja havainnollistamiseen tarkoitettu sovellus, jolla kootaan laskenta-alueita yksinkertaisista kappaleista eli blokeista. Kyseisiä alueita käytetään muissa sovelluksissa fysikaalisten ilmiöiden mallintamiseen.
Toisessa luvussa kerrotaan projektin taustasta sovelluksen annetuista tavoitteista, jotka on jaettu ensisijaisiin ja toissijaisiin sekä ei-toiminnallisiin. Kolmannessa luvussa kuvataan projektin nimeämiskäytäntö ohjelmakoodia kirjoitettaessa. Neljännessä luvussa kerrotaan ohjelman rakenteesta ja viidennessä luvussa on luokkajaot metodeineen ja attribuutteineen. Muita mahdollisia luokkia on kuudennessa luvussa. Käyttöliittymää on kuvattu seitsemännessä luvussa  ja kahdeksannessa luvussa ovat käytetyt lähteet. Lopussa liitteinä käyttötapaukset.
2	Projektin taustat ja tavoitteet
Tässä luvussa kerrotaan projektin taustoista sekä Exodus -projektin tavoitteista.
2.1	Projektin taustat

Numerola Oy on jyväskyläläinen, vuonna 1998 perustettu yritys, joka kehittää ohjelmistoja teollisuusprosessien laskennalliseen simulointiin. Simuloinneissa sovelletaan pääosin niin sanottua äärellisten elementtien menetelmää (FEM). Simulointiohjelmistoon kuuluu FEM-ratkaisijan lisäksi syöttötietoa ja laskennallisia tuloksia käsitteleviä ohjelmia. [1]  Näissä ohjelmistoissa kappaleitten geometria kuvataan elementtiverkolla ja sen  avulla lasketaan esimerkiksi lämpötilajakaumaa.
Exodus-projekti liittyy Numerola Oy:n laajempaan Numerrin-tuotekehityshankkeeseen, jonka tavoitteena on monipuolinen ohjelmistopaketti laskennalliseen simulointiin ja optimointiin. Aikaisemmin keväällä 2001 on ko. yritykselle toteutettu työprojektin puitteissa Exoduksen 2D-versio Genesis. [2]
2.2	Projektin tavoitteet
Exodus-projektin tavoitteena on suunnitella ja toteuttaa Linux-käyttöjärjestelmässä toimiva graafinen työkalu rakenteellisten verkkoelementtien luontiin. Tavoitteet on jaettu ensisijaisiin ja toissijaisiin tavoitteisiin.

2.2.1	ensisijaiset toiminnalliset vaatimukset
•	Ohjelmalla tulee pystyä kuvaamaan erillistä verkkogeneraattoriohjelmaa varten kolmiulotteisia alueita. Sovelluksella tulee pystyä luomaan neljän tyyppisiä perusblokkeja: heksaedri, tetraedri, pyramidi ja prisma, kappaleiden pinnat ovat joko neliökulmion- tai kolmionmuotoisia. Kappaleiden pintoja voidaan tarpeen mukaan muokata pinnoilla sijaitsevien kontrollipisteiden  (nelikulmio 16 ja kolmio 10 kappaletta ) avulla. Kontrollipisteiden määrittämää pintaa interpoloidaan Bezier-pinnalla. Kaikki koordinaatit on ilmoitettu fysikaalisissa koordinaateissa.
•	Blokeille voidaan suorittaa seuraavia operaatiota: lisääminen (create), poistaminen (delete), muokkaaminen (edit), lisäksi luotua blokkia tai yhteen liitettyjä blokkeja voidaan siirtää (move) ja pyörittää (rotate) erikseen määrättävän pisteen (rotation point) ympäri. 
•	Blokkeja voi myös liittää (combine) toisiinsa tai liitetyt blokit voidaan eroittaa (separate), kuitenkin niin, että vain kolmion muotoisen pinnan voi liittää kolmioon ja nelikulmion muotoisen nelikulmioon.
•	Sovelluksessa on piirtoalue omana erillisenä ikkunanaan, jossa visualisoidaan suunniteltu kappale. Piirtoalueella  (OpenGL+GLUT) olevien kappaleiden valinta ja niiden ominaisuuksien muokkaus tapahtuu pääsääntöisesti erillisiltä lomakkeilta (Tcl/Tk), mutta piirtoalueen kameran paikkaa voidaan liikuttaa näppäinten avulla. Luotuja kappaleita voidaan haluttaessa edelleen visualisoida joko rautalankamallina (wireframe) tai kiinteäpintaisina (solid). 
•	Valon lisääminen.
2.2.2	Toissijaiset toiminnalliset vaatimukset
•	Piirtoikkunassa tapahtuvien blokeille suoritettavien hiiritoimintojen lisääminen esimerkiksi valinta tai pyöritys.
•	Apuruudukon (grid) ja siihen liittyvän ”snap-toiminnon” lisääminen piirtoikkunaan. Snap-toiminto pakottaa toimintojen kohteet apuruudukon solmukohtiin.
•	Luotujen blokkien tai niiden pintojen visualisointi erikseen määritettävällä tekstuurilla , joka määräytyy esim. blokin materiaaliparametrin mukaan.
•	Tietorakenteen tallentaminen tiedostoon OpenDWG-formaatissa.
2.2.3	Ei-toiminnalliset vaatimukset
•	Ohjelman tulee toimia Linux-käyttöjärjestelmässä. Työkalujen tulee mahdollistaa ohjelman siirto jatkossa myös Windows-ympäristöön.
•	Tietorakenteen sisältö voidaan tallentaa tiedostoon, josta se voidaan jälleen lukea. Tiedostoon tallennetaan blokkikohtaisten tietojen lisäksi blokkien liitossuhteet ja kamerakulma tallennushetkellä.

3	Kommentointi- ja nimeämiskäytäntö

Sovellusta ohjelmoitaessa noudatetaan tässä luvussa esitettäviä nimeämis- ja kommentointikäytäntöjä.
Kaikki nimeämiset ja kommentoinnit tehdään englanniksi. Ohjelmalistauksen alussa on tekijän nimi, käyttötarkoitus ja lyhyt kuvaus sen toiminnasta. Kaikki ei-triviaalit muuttujat ja tietorakenteet kommentoidaan niiden esittelyn yhteydessä. Kaikkien aliohjelmien implementaationosan alkuun on laitettu kommenttirivi, jolla kuvataan ko. aliohjelman toimintaa sekä sille välitettävien parametrien sekä mahdollisten paluuarvojen merkitystä. Ohjelman käyttöohje kirjoitetaan englanniksi ja muu dokumentaatio suomeksi.
Muutamia esimerkkejä nimeämiskäytännöstä:
tietue (struct)	sTyypinNimi
luokka (class)	cLuokanNimi
aliohjelma	aliohjelmanNimi
muuttuja 	muuttujannimi

Kaikki tiedostot nimetään niiden sisällön mukaan. Esim. C++-kielen luokan cLuokka-luokan implementaation sisältävät tiedostot nimettäisiin luokka.cpp ja luokka.hpp. Vastaavasti Tcl/Tk -tiedostot nimetään samalla tavoin kuvaamaan sisältöä.

4	Sovelluksen rakenne

Sovellukseen haluttiin selkeä rajapinta käyttöliittymän ja toiminnallisen osuuden (”engine”) välille, mikä selkeyttää suunnittelua. Uudelleenkäytettävyyden parantamiseksi kyseisellä rajapinnalla tapahtuva tiedonsiirto päätettiin rajoittaa C++-kielelle, jolloin käyttöliittymän mahdollinen vaihto ei rajoitu Tcl-kieleen. 
Käyttöliittymän Tcl/Tk-osio huolehtii käyttöliittymän piirtämisestä ja käyttäjän antamien komentojen välittämisestä eteenpäin käyttöliittymän C++-osiolle. Käyttöliittymän C++-osio ensisijaisesti muuntaa Tcl-kieliset komennot C++-kielelle ja välittää ne rajapinnan yli toiminnalliselle osuudelle ja päin vastoin.
Toiminnallisen osuuden C++-osio kontrolloi tiedonsiirtoa tietorakenteen, piirtokomponentin ja käyttöliittymän välillä. Tietorakenteet sisältävät piirtoavaruuden elementtien tilatiedot. OpenGL/GLUT-osio vastaa näytön piirtoalueella näkyvän osan piirtämisestä.

5	Luokkajako		

Alla kuva Exoduksen tietorakenteen luokkajaosta:

5.1	cManager
Vastaa tietorakenteen ylläpidosta ja sen operaatioista sekä ohjelman osioiden välisestä kommunikoinnista.
5.1.1	Attribuutit
list <caBlock> *blocks	piirtoavaruuden kaikki blokit
list <cControlPoint> *controlpoints	piirtoavaruuden kaikki kontrollipisteet
list <cEdge> *edges	piirtoavaruuden kaikki särmät
list <cSurface> *surfaces	piirtoavaruuden kaikki pinnat
list <cGraphicElement3d> *selected	piirtoavaruuden valitut kohteet
list <caBlock> *combined	kaikki valittuihin blokkeihin yhdistetyt blokit
5.1.2	Julkiset metodit
cManager()	luokan muodostin
~cManager()	luokan hajotin
getBlocks()	saantimetodi blokeille
getControlpoints()	saantimetodi kontrollipisteille
getEdges()	saantimetodi särmille
getSurfaces()	saantimetodi tahkoille
getSelected()	saantimetodi valituille piirtoavaruuden elementeille
getCombined()	saantimetodi valittuihin blokkeihin yhdistetyistä blokeista
getChildren(id)	etsii kohteelle id kuuluvat elementit ja palauttaa ne
move(x,y,z)	siirtää valittuja kohteita sekä valittuihin blokkeihin yhdistettyjä blokkeja vektorin x,y,z verran
rotate(x,y,z, anglexy, angleyz, anglexz)	kiertää valittuja kohteita rotaatiopisteen x,y,z ympäri kulmien anglexy, angleyz, anglexz verran
save(file)	tallentaa piirtoavaruuden kohteet sekä kameran tiedot tiedostoon file
open(file)	avaa tiedoston file sisältämän piirtoavaruuden
undo()	peruu viimeisimmän toimenpiteen
redo()	tekee uudelleen viimeisimmän toimenpiteen
cut()	leikkaa valitut objektit Leikepöydälle
copy()	kopioi valitut blokit Leikepöydälle
paste()	liittää Leikepöydällä olevat objektit piirtoavaruuteen
updateBlock(id, optional, material, name)	päivittää id:n mukaisen blokin tiedot
updateSurface(id, surfacemeshvisible, name)	päivittää id:n mukaisen tahkon tiedot
updateEdge(id, refinetype, refine, gridcount, name)	päivittää id:n mukaisen särmän tiedot
updateControlPoint(id,x,y,z,name)	päivittää id:n mukaisen kontrollipisteen tiedot

select(id)	valitsee kohteen id:n mukaan
deselect(id)	poistaa valinnat kohteesta id:n mukaan
isSelected(element[])	Tarkistaa onko valittuna graafiset elementit, jota valittu komento edellyttää.
createBlock([kulmapisteiden koordinaatit], material, optional, [tihennystiedot], combine, type)	luo uuden heksaedrin pisteiden koordinaattien mukaan, määrittää sen materiaaliparametrin sekä valinnaisen parametrin sekä täydentää sen tihennystiedot. Jos combine arvo on asetettu, niin luotu blokki yhdistetään ennalta valittuun tahkoon. Type määrää blokin tyypin.
delete()	poistaa valitut blokit
combineWithMove(surface, point1, point2)	siirtää ja yhdistää ennalta valitun tahkon ja siihen liittyvän blokin tahkoon surface pisteiden point1 ja point2 mukaisesti
combineWithStretch(surface, point1, point2)	venyttää ja yhdistää ennalta valitun tahkon tahkoon surface pisteiden point1 ja point2 mukaisesti
separate()	erottaa ennalta valitun yhteisen tahkon blokit toisistaan
showSurfaceMesh()	näyttää tai piilottaa ennalta valittujen kohteiden visualisointiverkon
close()	sulkee ohjelman
viewMode()	muuttaa ennalta valittujen kohteiden esitysmuodon joko rautalankamalliksi tai kiinteäksi
viewPoint([kameran tiedot])	muuttaa kameran sijaintia
refreshTree()	ilmoittaa käyttöliittymän puurakenteelle päivityksen tarpeesta

5.2	caGraphicalElement3d
Abstrakti pääluokka kaikille piirtoavaruuden elementeille
5.2.1	Attribuutit
int id	elementin tunnus
bool processed	käsitelty-lippu
bool activation	aktivointi-lippu
string name	elementin nimi

5.2.2	Julkiset metodit
getProcessed()	saantimetodi processed-lipulle
getActivation()	saantimetodi activation-lipulle
getId()	saantimetodi Id:lle
getChildren()	palauttaa omat lapset 
setProcessed()	asettaa kohteen käsitellyksi
resetProcessed()	poistaa kohteen käsitelty-merkinnän
setActivation()	asettaa kohteen aktivoinnin
resetActivation()	poistaa kohteen aktivoinnin

5.3	caBlock
Abstrakti luokka kaikille blokeille, peritään cGraphicElement3d:stä
5.3.1	Attribuutit
int material	blokin materiaaliparametri
int optional	blokin valinnainen parametri
5.3.2	Julkiset metodit
findCombined(*combined)	Lisää combined-listaan tähän blokkiin yhdistetyt blokit
setMaterial()	asettaa blokin materiaaliparametrin
setOptional()	asettaa blokin valinnaisen parametrin
getMaterial()	saantimetodi materiaaliparametrille
getOptional()	saantimetodi valinnaiselle parametrille
5.4	cHexaedron
Vastaa heksaedrista, peritään cBlockista.
5.4.1	Attribuutit
list <cSquareSurface> *surfaces 	blokin tahkot
5.4.2	Julkiset metodit
cHexaedron()	luokan muodostin
~cHexaedron()	luokan hajotin

5.5	cTetraedron
Vastaa tetraedrista, peritään cBlockista.
5.5.1	Attribuutit
list <cTriangleSurface> *surfaces	blokin tahkot
5.5.2	Julkiset metodit
cTetraedron()	luokan muodostin
~cTetraedron()	luokan hajotin

5.6	cPyramid
Vastaa pyramidista, peritään cBlockista.
5.6.1	Attribuutit
list <cSurface> *surfaces 	blokin tahkot
5.6.2	Julkiset metodit
cPyramid()	luokan muodostin
~cPyramid()	luokan hajotin

5.7	cPrism
Vastaa prismasta, peritään cBlockista.
5.7.1	Attribuutit
list <cSurface> *surfaces 	blokin tahkot
5.7.2	Julkiset metodit
cPrism()	luokan muodostin
~Prism()	luokan hajotin

5.8	caSurface
Vastaa blokin tahkosta, peritään cGraphicElement3d:stä
5.8.1	Attribuutit
list <cBlock> *block	blokit, joihin tahko kuuluu
bool surfacemeshvisible	kontrolloi visualisointiverkon näkyvyyttä
cBezier *bezier	käytetään hyväksi pinnan pisteiden laskennassa
5.8.2	Julkiset metodit
cSurface()	luokan muodostin
~cSurface()	luokan hajotin
5.9	caTriangleSurface
Vastaa kolmion muotoisesta blokin tahkosta, peritään caSurface:sta.
5.9.1	Attribuutit
list <cEdge> *edges	tahkon särmät
list <cControlPoint> *controlpoints	tahkon kontrollipisteet

5.9.2	Julkiset metodit
cTriangleSurface()	luokan muodostin
~cTriangleSurface()	luokan hajotin
getSurfaceMeshVisible()	saantimetodi vis.verkon näkyvyydelle
setSurfaceMeshvisible()	vaihtaa visualisointiverkon näkyvyyden tilaa
getBezier(u,v)	laskee parametrien avulla pinnan pisteen ja palauttaa sen

5.10	caSquareSurface
Vastaa neliön muotoisesta blokin tahkosta, peritään caSurface:sta.
5.10.1	Attribuutit
list <cEdge> *edges	tahkon särmät
list <cControlPoint> *controlpoints	tahkon kontrollipisteet
5.10.2	Julkiset metodit
cSquareSurface()	luokan muodostin
~cSquareSurface()	luokan hajotin
5.11	cEdge
Vastaa blokin särmästä, peritään cGraphicElement3d:stä
5.11.1	Attribuutit
list <cControlPoint> *controlpoints	osoittimet särmän kontrollipisteisiin
int gridCount	tihennyspisteiden määrä
double refine	tihennysparametri
int refineType	tihennyksen tyyppi

5.11.2	Julkiset metodit
cEdge()	luokan muodostin
~cEdge()	luokan hajotin

setGridCount()	asettaa tihennyspisteiden määrän
setRefine()	asettaa tihennysparametrin
setRefineType()	asettaa tihennyksen tyypin
getGridCount()	saantimetodi tihennyspisteiden määrälle
getRefine()	saantimetodi tihennysparametrille
getRefineType()	saantimetodi tihennyksen tyypille
5.12	cControlPoint
Vastaa kontrollipisteestä, peritään cGraphicElement3d:stä
5.12.1	Attribuutit
int x, y, z	pisteen koordinaatit globaalissa koordinaatistossa
5.12.2	Julkiset metodit
cControlPoint()	luokan muodostin
~cControlPoint()	luokan hajotin
getX()	saantimetodi x-koordinaatille
getY()	saantimetodi y koordinaatille
getZ()	saantimetodi z-koordinaatille
move(x,y,z)	siirtää pistettä vektorin x,y,z verran
rotate(x,y,z, anglexy, angleyz, anglexz)	kiertää pistettä rotaatiopisteen x,y,z ympäri kulmien anglexy, angleyz, anglexz verran
setCoordinates(x,y,z)	asettaa pisteen koordinaateiksi x,y ja z
6	Yleisimmät operaatiot piirtoavaruuden objekteille

	 Siirtäminen ja pyörittäminen

Siirtäminen ja pyörittäminen suoritetaan Selected-listassa oleville kohteille, jotka voivat olla blokkeja, tahkoja, särmiä tai kontrollipisteitä. Combined-lista, jossa on valittuihin blokkeihin yhdistetyt blokit, täytyy myös käydä läpi, jotta toimenpide suoritettaisiin myös niille blokeille, jotka ovat yhdistettynä valittuun blokkiin.

	 Poistaminen

Piirtoalueelta voidaan poistaa vain blokkeja. Ensin kaikki cGraphicalElement3d-luokan oliot merkitään poistettaviksi. Sen jälkeen merkitään säilytettäviksi ne blokit, joita ei ole valittu. Lopuksi käydään listat kolmannen kerran läpi ja poistetaan poistettaviksi merkityt.

7	Muita aliohjelmia
Seuraavat ohjelma-osiot ovat selvityksen alla toteutetaanko ne luokkina vai aliohjelmakirjastoina.
7.1	OpenGL ja Glut
Vastaa avaruuden piirtotoimenpiteistä näyttöön
7.2	TCL/C++ -muunnos
Vastaa TCL-komentojen muuntamisesta C++-kielelle ja päin vastoin, jotta käyttöliittymän ja toiminnallisen osan rajapinta säilyy puhtaasti C++-kielisenä -> parantaa uudelleenkäyttöä.
C++ -aliohjelmia (kutsutaan Tcl –puolelta aliohjelmanNimi parametrit):

getChildren(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv)
Hakee ParentId-numeron perusteella solmun lapset. Lapset tulevat Tcl–puolelle listana.
 
createHexaedron(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv)
Parametreina Tcl-puolelta tulee listana [lenght,height,depth], material, optional, [gridCount,refine,refineType], combine

createTetraedron(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv)
Parametreina Tcl-puolelta tulee [sideLenght], material, optional, [gridCount,refine,refineType], combine

createPrism(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv)
Parametreina Tcl-puolelta tulee [length,sideLenght], material, optional, [gridCount,refine,refineType], combine

createPyramid(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv)
Parametreina Tcl-puolelta tulee [length,height], material, optional, [gridCount,refine,refineType], combine

getValues(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv)
Parametrina muokattavan kohteen id-numero. Palautetaan listana kohteen arvot. 

updateBlock(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv) 
Parametreina muokatun kohteen id-numero , optional, material, name.

updateSurface(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv) 
Parametreina muokatun kohteen id-numero, surfacemeshvisible, name.

updateEdge(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv) 
Parametreina muokatun kohteen id-numero, refinetype, refine, gridcount, name.

updateCpoint(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv) 
Parametreina muokatun kohteen id-numero, refinetype, refine, gridcount, name.

move(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv) 
Parametreina siirtovektorin koordinaatit x,y,z

rotate(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv) 
Parametreina rotaatiopisteen koordinaatit  x,y,z ja kulmat anglexy, angleyz, anglexz	
save(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv)
Parametrina tiedostonnimi polkuineen filename

open(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv) 
Parametrina avattavan tiedoston nimi polkuineen filename

undo(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv)
ei parametreja. Peruu viimeisimmän toimenpiteen

redo(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv)
ei parametreja.Tekee uudelleen viimeisimmän toimenpiteen

select(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv) 
Parametrina valitun kohteen  id-numero	

deselect(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv) 
Parametrina kappaleen id-numero, jonka valinta poistetaan

isSelected(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv) 
Parametrina lista element[],	Tarkistaa onko valittuna graafiset elementit, jota valittu
komento edellyttää.

delete(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv)
Ei parametreja. Poistaa valitut blokit

combineWithMove(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv) 
Parametreina tahkon surface pisteet point1 ja point2

combineWithStretch(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv)
Parametreina tahkon surface pisteet point1 ja point2 

separate(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv)
Ei parametreja. Erottaa ennalta valitun yhteisen tahkon blokit toisistaan

showMesh(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv)
Parametrina  show näyttäminen (1) tai piilotus (0). Näyttää tai piilottaa ennalta valittujen
kohteiden visualisointiverkon

close(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv)
Ei parametreja. Sulkee ohjelman

viewMode(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv)
Parametrina type: wireframe (0) tai solid (1). Muuttaa ennalta valittujen kohteiden 
esitysmuodon joko rautalankamalliksi tai kiinteäksi

viewPoint(ClientData clientdata, Tcl_Interp *interp, int argc, char **argv )
Parametreina kameran tiedot: place(x,y,z), direction(x,y,z) ja cameraUp(suunta)  	

8	Käyttöliittymän kuvaus
Käyttöliittymä koostuu kahdesta pääikkunasta: käyttöliittymä ja piirtoalue. Alla olevassa kuvassa on näkyvillä Exoduksen pääikkuna, joka luodaan ohjelman käynnistyessä näytölle yhdessä piirtoikkunan kanssa. 

Ylimpänä käyttöliitymässä sijaitsee päävalikko-kehys, johon on sijoitettu kaikki toiminnot.
Alla lueteltu käyttöliittymän valikoiden sisällöt. Nimen perässä … tarkoittaa sitä, että kyseinen valinta avaa uuden ikkunan, jossa käyttäjältä kysytään tietoja. Nimen perässä () tarkoittaa, että valinnan kohdalta avautuu alivalikko, joka sisältää sulkujen sisällä olevat valinnat.
•	File: New, Open…, Save, Save As… ja Exit
•	Edit: Undo,  Cut,  Copy,  Paste, Colors
•	Block: Create(hexaedron, pyramid, tetrahedron, prism), Delete, Rotate…, Move…, Combine(with move, with strecth), Separate
•	View: Viewpoint(left, right, top, bottom, front, rear, free…), Zoom in, Zoom Out, Actual size, Surface(wireframe,solid)
•	Help: Help, About

Päävalikon alla sijaitsee Toolbar–kehys, jossa on pikakuvakkeet toimintoihin, joita eniten tullaan käyttämään. Ainakin luomistoiminnot neljälle perusblokille, tuhoaminen, erottaminen ja yhdistäminen  tulevat sijaitsemaan Toolbar:ssa. 
Käyttöliittymäikkunassa alimpana sijaitsee puurakenne, joka esittää piirtoavaruuden rakenteen puumallina. Solmuja klikkaamalla avautuu puurakenne blokeista aina sen kontrollipisteisiin saakka. Jokaista solmua voi editoida painamalla sen kohdalla hiiren oikeaa nappia. Painalluksen jälkeen avautuu dialogi, jossa solmun arvoja voi muuttaa.  

9	Lähteet
[1] Hakala Jussi, Laitinen Mika, Numerrin1.0-käsikirja Numerola Oy, Jyväskylä, 2001
[2] Genesis-kansio, kevät 2001, Tietotekniikan laitos
[3] John K. Ousterhout, Tcl and the Tk Toolkit, Addison-Wesley, 1994
[4] OpenGL-sivusto, www.opengl.org

10	Liitteet
Käyttötapaukset 18.10.2001

Liite 1: Käyttötapaus - Blokin luominen
Nimi:	Create block

Esiehdot:	-

Kuvaus:	1. Käyttäjä valitsee luontikomennon ja sen jälkeen haluamansa blokkityypin (Tetrahedron, Pyramid, Hexaedron tai Prism). Käyttäjä voi määrittää nopeasti blokin korkeus-, leveys- ja syvyysparametrien avulla. Muut blokkiin liittyvät tarkat arvot voidaan määrittää editoimalla blokkia nopean luonnin jälkeen. 2. Jos ennen luontikomennon suorittamista valittuna on tahko, yhdistetään luotava blokki suoraan ennalta valittuun tahkoon. Tässä tapauksessa käyttäjä antaa puuttuvat blokin tiedot, ja  yhdistämiseen liittyvät rajoitukset pätevät.

Poikkeukset: 	Jos käyttäjä antaa virheellisiä arvoja, näyttöön tulee virheilmoitus.

Jälkitilanne: 	Blokki on luotu.
Liite 2 Käyttötapaus - Ohjelman sulkeminen
Nimi:	Exit

Esiehdot:	-

Kuvaus:	Käyttäjä valitsee sulkemiskomennon. Jos käyttäjä on tehnyt jotain piirtotoimenpiteitä ja niitä ei ole tallennettu, niin ohjelma kysyy käyttäjältä halutaanko tehdyt muutokset tallentaa.

Poikkeukset: 	Kun ohjelma kysyy tallennetaanko tehdyt muutokset, voi käyttäjä peruuttaa sulkemisen, jolloin ohjelma palaa komentoa edeltävään tilaan.

Jälkitilanne: 	Ohjelma on  suljettu ja mahdolliset muutokset tallennettu tai tallentamatta valinnan mukaan. 
Liite 3 Käyttötapaus - Pinnanmuotojen näyttäminen 
Nimi: 	View wireframe/solid

Esiehdot:	-

Kuvaus:	Käyttäjä valitsee joko ennalta valittujen blokkien tai kaikkien blokkien esitysmuodoksi rautalankamalliesityksen tai kiinteän esityksen.

Poikkeukset: 	- 

Jälkitilanne: 	Valitut tai kaikki blokit näkyvät valinnan mukaan joko rautalankamallina tai kiinteänä. Rautalankamallissa näkyvissä ovat myös tahkojen visualisointiverkot.
Liite 4 Käyttötapaus - Tahojen visualisointiverkkojen näyttäminen 
Nimi:	Show/hide mesh

Esiehdot:	Tahkoja ja vain tahkoja on oltava valittuna ainakin yksi.

Kuvaus:	Käyttäjä asettaa ennalta valittujen tahkojen visualisointiverkot näkyviksi tai piilottaa ne.

Poikkeukset: 	-

Jälkitilanne: 	Tahkojen visualisointiverkot ovat näkyvissä tai piilotettu valinnan mukaan.

Liite 5: Käyttötapaus -  Attribuuttien muokkaaminen

Nimi:	Edit attributes

Esiehdot:	Ainakin yksi kohde on oltava valittuna.

Kuvaus:	Käyttäjä valitsee muokkaustoiminnon ja muuttaa attribuuttien arvoa. 

Poikkeukset: 	Jos syöte ei ole sallittu, hylätään käyttäjän syöttämä arvo ja säilytetään kentässä entinen arvo.

Jälkitilanne: 	Kohteen attribuutti on muuttunut.
Liite 6: Käyttötapaus -  Uuden piirtoavaruuden luominen 
Nimi:	New

Esiehdot:	-

Kuvaus:	Käyttäjä luo uuden piirtoavaruuden. Jos nykyinen piirtoavaruus ei ole tyhjä, ohjelma kysyy tallennetaanko nykyinen tilanne.

Poikkeukset: 	Kun ohjelma kysyy tallennetaanko tehdyt muutokset, voi käyttäjä peruuttaa uuden piirtoavaruuden luomisen, jolloin ohjelma palaa komentoa edeltävään tilaan.

Jälkitilanne: 	Piirtoavaruus on tyhjä ja vanha tilanne tallennettu tai tallentamaton valinnan mukaan.
Liite 7: Käyttötapaus - Tallennetun piirtoavaruuden avaaminen näytölle

Nimi:	Open

Esiehdot:	Piirtoavaruus täytyy olla tallennettuna tiedostossa.

Kuvaus:	Käyttäjä antaa tiedostonavauskomennon ja ohjelma tuo näyttöön luettelon asianmukaisista tiedostoista. Käyttäjä valitsee haluamansa tiedoston ja tiedoston sisältämä piirtoavaruus avautuu näyttöön. Jos piirtoavaruus ei ole tyhjä ennen toiminnon aloitusta, ohjelma kysyy tallennetaanko nykyinen tilanne ennen toisen avaamista.

Poikkeukset:	Avaaminen ei onnistu, jos ohjelma ei osaa lukea tiedostoa tai sitä ei löydy, jolloin ohjelma palaa komentoa edeltävään tilaan. Kun ohjelma kysyy tallennetaanko tehdyt muutokset, voi käyttäjä peruuttaa toisen piirtoavaruuden avaamisen, jolloin ohjelma palaa komentoa edeltävään tilaan.

Jälkitilanne:	Näyttöön on avattu piirtoavaruus blokkeineen valitusta tiedostosta ja mahdollinen komentoa edeltävä piirtoavaruus tallennettu tai tallentamaton valinnan mukaan.
Liite 8: Käyttötapaus -  Piirtoavaruuden tallentaminen

Nimi:	Save tai Save as

Esiehdot:	-

Kuvaus:	Käyttäjä antaa tallennuskomennon ja järjestelmä kysyy minkä nimiseksi tiedostoksi piirtoavaruus tallennetaan. Käyttäjä määrittää tiedostonimen ja hyväksyy sen. Jos piirtoavaruus on tallennettu jo aiemmin, käyttäjä voi tallentaa piirtoavaruuden nopeasti samalla tiedostonimellä kuin ennenkin. Käyttäjä voi peruuttaa tallennuksen ennen tiedostonimen hyväksymistä, jolloin ohjelma palaa komentoa edeltävään tilaan.

Poikkeukset: 	Jos tiedostoon ei voi tallentaa näyttöön tulee virheilmoitus.

Jälkitilanne:	Piirtoavaruus on tallennettu määritettyyn tiedostoon. Myös katselupiste on tallennettuna.
Liite 9: Käyttötapaus  -   Valitseminen
Nimi:	Select

Esiehdot: 	Vähintään yksi blokki tulee olla luotuna.

Kuvaus: 	Käyttäjä valitsee haluamansa kohteet (piste, särmä, tahko  tai blokki).

Poikkeukset: 	-

Jälkitilannne: 	Valittujen kohteiden ulkoasu muuttuu kertoen siitä, että kyseiset kohteet ovat tulleet valituksi.
Liite 10: Käyttötapaus  -   Siirtäminen
Nimi:		Move

Esiehdot:	Siirrettävä kohde (piste, särmä, tahko tai blokki) on valittu.

Kuvaus:	Käyttäjä siirtää valitun kohteen paikasta toiseen määrittämällä sille uuden paikan globaalissa koordinaatistossa siirtovektorin avulla. 

Poikkeukset:	-

Jälkitilanne:	Kohde on siirtynyt uuteen paikkaan.
Liite 11: Käyttötapaus - Blokin pyörittäminen valitun rotaatiopisteen ympäri.
Nimi:		Rotate block

Esiehdot:	Pyöritettävä blokki on oltava valittuna.

Kuvaus:	Käyttäjä määrittää valitulle blokille uuden paikan rotaatiopisteen suhteen. Rotaatio määritetään kahden tai kolmen asteluvun avulla.

Poikkeukset:	-

Jälkitilanne:	Blokki on uudessa asennossa.
Liite 12: Käyttötapaus - Katselupisteen muuttaminen
Nimi:		Rotate ja Zoom

Esiehdot:	-

Kuvaus: 	Käyttäjä pyörittää katselupistettä annetun pisteen ympäri tai muuttaa katselupisteen etäisyyttä annetusta pisteestä.

Poikkeukset:	-

Jälkitilanne: 	Katselupisteen sijainti on muuttunut.
Liite 13: Käyttötapaus - Poistaminen
Nimi:	Delete

Esiehdot:	On oltava yksi tai useampi blokki valittuna.

Kuvaus:	Käyttäjä poistaa valitut kohteet.

Poikkeukset: 	Jos valittuna on kontrollipiste, särmä tai tahko toiminto peruutetaan ja palataan sitä edeltävään tilaan.

Jälkitilanne: 	Ennalta valitut blokit on poistettu.
Liite 14: Käyttötapaus - Yhdistäminen
Nimi:	Combine

Esiehdot:	On oltava valittuna blokin tahko sekä kaksi siihen kuuluvaa kulmapistettä. 

Kuvaus:	a) Käyttäjä valitsee ensin yhdistämisen siirron kanssa ja sitten kohdeblokin tahkon sekä kaksi siihen kuuluvaa kulmapistettä. Tämän jälkeen ennalta valittu blokki siirtyy ensin kohdeblokkiin kiinni ja ennalta valittu tahko mukautuu sitten kohdeblokin tahkoon. b) Käyttäjä valitsee yhdistämisen ilman siirtoa, jolloin ennalta valittu tahko venyy kiinni kohdeblokin tahkoon

Poikkeukset: 	1. Jos käyttäjä valitsee yhdistämistoiminnossa kaksi erimuotoista tahkoa ts. kolmion ja suorakaiteen, näyttöön tulee virheilmoitus ja palataan yhdistämistä edeltävään tilaan. 
2. Ns. itsensä yhdistäminen estettävä, eli käyttäjä ei voi valita kahta saman blokin tahkoa.
3. Jos valitaan yhdistäminen joka vaatii kappaleen kiertoa, yhdistäminen ei onnistu.

Jälkitilanne: 	Yhdistämiskomennon jälkeen valittu tahko on venynyt/siirtynyt kiinni ennalta valittuun tahkoon.
Liite 15: Käyttötapaus - Erottaminen
Nimi: 	Separate

Esiehdot:	Kaksi blokkia on oltava yhdistettynä ja niiden yhteinen tahko valittuna.

Kuvaus:	Käyttäjä valitsee erottamiskomennon, jonka jälkeen blokit eivät ole enää yhdistettyinä.

Poikkeukset: 	-
Jälkitilanne: 	Yhdistetyt blokit on erotettu.
Liite 16: Käyttötapaus - Leikepöydälle kopiointi ja leikepöydältä liittäminen
Nimi:	Copy ja Paste

Esiehdot:	On oltava vähinään yksi blokki valittuna.

Kuvaus:	Käyttäjä valitsee ensin kopiointikomennon ja sitten liittämiskomennon.

Poikkeukset: 	Jos valittuna on tahko, kontrollipiste tai särmä, näyttöön tulee virheilmoitus ja palataan komentoa edeltävään tilaan.

Jälkitilanne: 	Ennalta valitut blokit ovat monistuneet.

Liite 17: Käyttötapaus - Toiminnon kumoaminen ja tekeminen uudelleen
Nimi:	Undo ja Redo

Esiehdot:	On oltava suoritettuna toiminto, joka on muuttanut piirtoavaruuden rakennetta.

Kuvaus:	Kun käyttäjä valitsee kumoamistoiminnon ja piirtoavaruus palaa toiminnon suoritusta edeltävään tilaan. Kun käyttäjä valitsee uudelleensuoritustoiminnon suoritetaan edellinen kumottu toiminto uudelleen.

Poikkeukset: 	-

Jälkitilanne: 	Ennalta suoritettu toiminto on kumottu ja/tai kumottu toiminto on tehty uudelleen.