Petri Eskelinen, Lasse Laukkanen, Kaisa Kokko ja Mikko Ketola
EXODUS
		              Sovellussuunnitelma
Tietotekniikan cum laude -työprojekti
13.11.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ä: 66
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 vaatimusmäärittely
2.1	Projektin taustat
2.2	Vaatimusmäärittely
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	cHexahedron
5.4.1	Attribuutit
5.4.2	Julkiset metodit
5.5	cTetrahedron
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	cTriangleSurface
5.9.1	Attribuutit
5.9.2	Julkiset metodit
5.10	cSquareSurface
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 kohteille
6.1	Sekvenssikaavioita
7	Muita aliohjelmia
7.1	OpenGL ja Glut
7.2	TCL/C++ -muunnos
8	Tiedostoformaatit
8.1	Laskenta-alueen tallennus
8.2	.Kayttäjäkohtaiseten tietojen tallennus
9	Käyttöliittymän kuvaus
9.1	Valikkopalkki
9.2	Toolbar-kehys
9.3	Blokkien luonti (Create)
9.4	Puurakenne & Editointi (Edit)
9.5	Yhdistäminen & Erottaminen (Combine & Separate)
9.6	Pyörittäminen (Rotate)
9.7	Siirtäminen (Move)
10	Lähteet
11	Käyttötapaukset
Liite 1: Blokin luominen
Liite 2 Ohjelman sulkeminen
Liite 3 Pinnanmuotojen näyttäminen
Liite 4 Tahojen visualisointiverkkojen näyttäminen
Liite 5: Attribuuttien muokkaaminen
Liite 6: Uuden piirtoavaruuden luominen
Liite 7: Tallennetun piirtoavaruuden avaaminen näytölle
Liite 8: Piirtoavaruuden tallentaminen
Liite 9: Valitseminen
Liite 10: Siirtäminen
Liite 11: Blokin pyörittäminen valitun rotaatiopisteen ympäri.
Liite 12: Katselupisteen muuttaminen
Liite 13: Poistaminen
Liite 14: Yhdistäminen
Liite 15: Erottaminen
Liite 16: Leikepöydälle kopiointi ja leikepöydältä liittäminen
Liite 17: 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 vaatimusmäärittely
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	Vaatimusmäärittely
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 nelikulmion- 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). 
•	OpenGL:n valo-ominaisuuksien avulla havainnollistetaan kappaleiden muotoa.
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 esimerkiksi seuraavasti. 
/////////////////////////////////////////////////////////////////////////
block.cpp

   Implementation of the caBlock class

Copyright:   Kaisa Kokko, Petri Eskelinen, Mikko Ketola, Lasse Laukkanen

   Class is responsible of the blocks
/////////////////////////////////////////////////////////////////////////

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 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

Kuva 1: 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		

Exoduksen tietorakenteen elementtien relaatiot:

Kuva 2: luokkajako
		  Exoduksen perintähierarkia:

Kuva 3: perintähierarkia
5.1	cManager
Vastaa id-tunnuksien jakamisesta sekä ohjelman eri 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<caSurface*> surfaces	piirtoavaruuden kaikki pinnat
list<cGraphicalElement3d*> selected	piirtoavaruuden valitut kohteet
stack<string> clipboard	leikepöytä
stack<string> undostack	kumoamistoiminnon rakenne
map<int,cGraphicalelement3d*> idmap	taulu elementtien osoittimien hakemiseksi id-tunnusten mukaan

int idcount	id-tunnusten laskuri
queue <int> deletedids	poistettujen id-tunnusten jono
bool changed	tietorakenteen tilan muuttumisesta kertova arvo käyttöliittymän puurakenteen päivitystä varten
bool modified_after_save	tietorakenteen tilan muuttumisesta kertova arvo tallennusta varten

5.1.2	Julkiset metodit
cManager()	luokan muodostin
~cManager()	luokan hajotin
list<caGraphicalElement3d*>* getChildren(id) const	etsii kohteelle id kuuluvat lapsielementit ja palauttaa ne
bool getChanged() const	saantimetodi tietorakenteen tilamuutokselle
void move(x,y,z)	siirtää valittuja kohteita sekä valittuihin blokkeihin yhdistettyjä blokkeja vektorin x,y,z verran
void rotate(x,y,z, anglexy, angleyz, anglexz)	kiertää valittuja kohteita rotaatiopisteen x,y,z ympäri kulmien anglexy, angleyz, anglexz verran
void save(file) const	tallentaa piirtoavaruuden tiedostoon file
void open(file)	avaa tiedoston file sisältämän piirtoavaruuden
void undo()	peruu viimeisimmän toimenpiteen
void redo()	tekee uudelleen viimeisimmän perutun toimenpiteen
void cut()	leikkaa valitut objektit Leikepöydälle
void copy()	kopioi valitut blokit Leikepöydälle
void paste()	liittää Leikepöydällä olevat objektit piirtoavaruuteen
void updateBlock(id, name, optional, material)	päivittää id:n mukaisen blokin tiedot
void updateSurface(id, name, surfacemeshvisible)	päivittää id:n mukaisen tahkon tiedot
void updateEdge(id, name, refinetype, refine, gridcount)	päivittää id:n mukaisen särmän tiedot
void updateControlPoint(id, name, x, y, z)	päivittää id:n mukaisen kontrollipisteen tiedot

void select(id)	valitsee kohteen id:n mukaan
void deselect()	poistaa valinnat kohteista 
bool isSelected(&element) const	Tarkistaa onko valittuna graafiset elementit, jota suoritettava operaatio edellyttää.
void createHexahedron(width,height,depth, material, optional,  combined)
luo uuden heksaedrin kolmen dimension ja annetun sijainnin location mukaan, määrittää sen materiaaliparametrin sekä valinnaisen parametrin sekä täydentää sen tihennystiedot. Jos combine-arvo on asetettu blokki yhdistetään ennalta valittuun tahkoon.
void createTetrahedron(edgelength, material, optional, combined)	
luo uuden tetraedrin sivun pituuden mukaan, määrittää sen materiaaliparametrin sekä valinnaisen parametrin sekä täydentää sen tihennystiedot. Jos combine-arvo on asetettu blokki yhdistetään ennalta valittuun tahkoon.
void createPyramid(baselength,height, material, optional, combined)
luo uuden pyramidin pohjan sivun pituuden ja korkeuden mukaan, määrittää sen materiaaliparametrin sekä valinnaisen parametrin sekä täydentää sen tihennystiedot. Jos combine-arvo on asetettu blokki yhdistetään ennalta valittuun tahkoon.
void createPrism(sidelength,length, material, optional, combined)
luo uuden prisman kolmen dimension mukaan, määrittää sen materiaaliparametrin sekä valinnaisen parametrin sekä täydentää sen tihennystiedot. Jos combine-arvo on asetettu blokki yhdistetään ennalta valittuun tahkoon.
void combineWithMove(surfaceid, point1, point2)	siirtää ja yhdistää ennalta valitun tahkon ja siihen liittyvän blokin tahkoon surface pisteiden point1 ja point2 mukaisesti
void combineWithStretch(surfaceid, point1, point2)	venyttää ja yhdistää ennalta valitun tahkon tahkoon surface pisteiden point1 ja point2 mukaisesti
void separate()	erottaa ennalta valitun yhteisen tahkon blokit toisistaan
void showSurfaceMesh(show) näyttää(1) tai piilottaa(0) ennalta valittujen kohteiden visualisointiverkon
void close()	sulkee ohjelman
void viewMode(type)	muuttaa ennalta valittujen kohteiden esitysmuodon joko rautalankamalliksi(0) tai kiinteäksi(1)
void viewPoint(placeX, placeY, placeZ, directionX, directionY, directionZ, cameraUpX, cameraUpY, cameraUpZ) const	muuttaa kameran sijaintia. Parametreina ovat kameran paikan, katsomissuunnan sekä kameran yläsuunnan koordinaatit.

void setColors(background, ctrlpoints, selected, elements)	ottaa käyttöön käyttäjän määrittämät värit
void addElement(int id, cGraphicalElement3d *element)	lisää elementin managerin tietorakenteisiin ts. idmap-säiliöön ja asianmukaiseen elementtilistaan
int getNewID()	palauttaa uuden Id:n elementin luontia varten
void deleteBlock()	poistaa valitut blokit

5.2	caGraphicalElement3d
Abstrakti pääluokka kaikille piirtoavaruuden elementeille
5.2.1	Attribuutit
int id	elementin tunnus
string name	elementin nimi

5.2.2	Julkiset metodit
caGraphicalElement3d(int id, string name)	luokan muodostin
int getId() const	saantimetodi id:lle
int setId(newid)	asettaa id:n
void setName(name)	settaa elementin nimen
string getName() const	saantimetodi elementin nimelle
virtual list<caGraphicalElement3d*>* getChildren()=0	palauttaa omat lapset
virtual ~caGraphicalElement3d()	virtuaalinen hajotin
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
caBlock(int mat, int opt, string type, int id, string name)	luokan muodostin
virtual void findCombined(&combined)=0	Lisää combined-listaan tähän blokkiin yhdistetyt blokit
void setMaterial(mat)	asettaa blokin materiaaliparametrin
void setOptional(opt)	asettaa blokin valinnaisen parametrin
int getMaterial() const	saantimetodi materiaaliparametrille
int getOptional() const	saantimetodi valinnaiselle parametrille
virtual void save() const	tallentaa omat tietonsa string-tyypin muuttujaan ja palauttaa sen
virtual void setSurface(*surface, int order)=0	asettaa blokille tahkon järjestyksen order mukaan
virtual list<cGraphicalElement3d*>* getChildren()=0	palauttaa omat lapset
virtual ~caBlock()	virtuaalinen hajotin

5.4	cHexahedron
Vastaa heksaedrista, peritään caBlockista.
5.4.1	Attribuutit
cSquareSurface *surfaces[6] 	blokin tahkot
5.4.2	Julkiset metodit
cHexahedron(*location,width,height,depth, imaterial, ioptional, cManager &mgr, int iid, string iname)	luokan muodostin
cHexahedron(string datastring, cManager *p)	luokan muodostin tiedostosta lukemista varten
cHexahedron(cHexahedron *p, cManager *p)	kopionmuodostin
~cHexahedron()	luokan hajotin
list<caGraphicalElement3d*>* getChildren() const	palauttaa omat lapset
void findCombined(*combined) const	Lisää combined-listaan tähän blokkiin yhdistetyt blokit
void setSurface(*surface, int order)	asettaa blokille tahkon järjestyksen order mukaan
string save() const	tallentaa omat tietonsa string-tyypin muuttujaan ja palauttaa sen
5.5	cTetrahedron
Vastaa tetraedrista, peritään caBlockista.
5.5.1	Attribuutit
cTriangleSurface *surfaces[4]	blokin tahkot
5.5.2	Julkiset metodit
cTetrahedron(*location,edgelength, imaterial, ioptional, cManager &mgr, int iid, string iname)	luokan muodostin
cTetrahedron(string datastring, cManager *p)	luokan muodostin tiedostosta lukemista varten
cTetrahedron(cTetrahedron *p, cManager *p)	kopionmuodostin
~cTetrahedron()	luokan hajotin
list<caGraphicalElement3d*>* getChildren()	palauttaa omat lapset
void findCombined(*combined)	Lisää combined-listaan tähän blokkiin yhdistetyt blokit
string save()const	tallentaa omat tietonsa string-tyypin muuttujaan ja palauttaa sen
void setSurface(*surface, int order)	asettaa blokille tahkon järjestyksen order mukaan
5.6	cPyramid
Vastaa pyramidista, peritään caBlockista.
5.6.1	Attribuutit
caSurface *surfaces[5] 	blokin tahkot
5.6.2	Julkiset metodit
cPyramid(baselength,height, imaterial, ioptional, cManager &mgr, int iid, string iname)	luokan muodostin
cPyramid(datastring, cManager *p)	luokan muodostin tiedostosta lukemista varten
cPyramid(cPyramid *p, cManager *p)	kopionmuodostin
~cPyramid()	luokan hajotin
list<caGraphicalElement3d*>* getChildren()const	palauttaa omat lapset
void findCombined(*combined)	Lisää combined-listaan tähän blokkiin yhdistetyt blokit
void setSurface(*surface, int order)	asettaa blokille tahkon järjestyksen order mukaan
string save()const	tallentaa omat tietonsa string-tyypin muuttujaan ja palauttaa sen

5.7	cPrism
Vastaa prismasta, peritään caBlockista.
5.7.1	Attribuutit
caSurface *surfaces[5] 	blokin tahkot
5.7.2	Julkiset metodit
cPrism(depth, sidelength, imaterial, ioptional, cManager &mgr, int iid, string iname)	luokan muodostin
cPrism(datastring, cManager *p)	luokan muodostin tiedostosta lukemista varten
cPrism(cPrism *p, cManager *p)	kopionmuodostin
~Prism()	luokan hajotin
list<caGraphicalElement3d*>* getChildren()const	palauttaa omat lapset
void findCombined(*combined)	lisää combined-listaan tähän blokkiin yhdistetyt blokit
void setSurface(*surface, int order)	asettaa blokille tahkon järjestyksen order mukaan
string save()const	tallentaa omat tietonsa string-tyypin muuttujaan ja palauttaa sen

5.8	caSurface
Vastaa blokin tahkosta, peritään cGraphicElement3d:stä.
5.8.1	Attribuutit
caBlock *block[2]	blokit, joihin tahko kuuluu
bool surfacemeshvisible	kontrolloi visualisointiverkon näkyvyyttä

5.8.2	Julkiset metodit
caSurface(caBlock *parent, bool surfmesh, int iid, string iname)	luokan muodostin
bool getSurfaceMeshVisible()const	saantimetodi vis.verkon näkyvyydelle
void setSurfaceMeshvisible(bool status)	vaihtaa visualisointiverkon näkyvyyden tilaa
void setParent(caBlock *parent)	asettaa tahkolle blokin, jolle se kuuluu
virtual string save()const	tallentaa omat tietonsa string-tyypin muuttujaan ja palauttaa sen
virtual void setControlpoint(cControlPoint *point, int order)=0 asettaa kontrollipisteen järjestyksen order mukaan
virtual void setEdge(cEdge *edge, int order)=0	asettaa särmän järjestyksen order mukaan
virtual void getSurfacePoints(double **vispoints,int n)=0 sijoittaa Bezier-pinnan visualisointipisteet vispoints-koordinaattitaulukkoon, parametri n on visualisointipisteiden määrä särmällä
virtual void getRefinePoints(double **refinepoints, int order)=0		palauttaa särmän tihennyspisteiden koordinaattitaulukon, parametrinä särmän numero
virtual list<caGraphicalElement3d*>* getChildren(int id)=0	palauttaa omat lapset
virtual ~caSurface()	virtuaalinen hajotin

5.9	cTriangleSurface
Vastaa kolmion muotoisesta blokin tahkosta, peritään caSurface:sta. Käyttää TriangleBezier-luokkaa visualisointipisteiden muodostamiseksi.
5.9.1	Attribuutit
cEdge *edges[3]	tahkon särmät
cControlPoint *controlpoints[10]	tahkon kontrollipisteet

5.9.2	Julkiset metodit
cTriangleSurface(cControlpoint *points[10], cEdge *edges[3],int iid,string iname)	luokan muodostin
cTriangleSurface(cTriangleSurface *p, int id)	kopionmuodostin
~cTriangleSurface()	luokan hajotin
list<caGraphicalElement3d*>* getChildren()const	palauttaa omat lapset
void setControlpoint(cControlPoint *point, int order)	asettaa kontrollipisteen järjestyksen order mukaan
void setEdge(cEdge *edge, int order)	asettaa särmän järjestyksen order mukaan
void getSurfacePoints(double **vispoints, int n) const	sijoittaa Bezier-pinnan visualisointipisteet vispoints-koordinaattitaulukoon, parametri n on visualisointipisteiden määrä särmällä
string save()const	tallentaa omat tietonsa string-tyypin muuttujaan ja palauttaa sen
void getRefinePoints(double **refpoints, int order) const	sijoittaa särmän tihennyspisteet refpoints-koordinaattitaulukkon, parametrinä särmän numero

5.10	cSquareSurface
Vastaa neliön muotoisesta blokin tahkosta, peritään caSurface:sta. Käyttää SquareBezier-luokkaa visualisointipisteiden muodostamiseksi.
5.10.1	Attribuutit
cEdge *edges[4]	tahkon särmät
cControlPoint controlpoints[16]*	tahkon kontrollipisteet
5.10.2	Julkiset metodit
cSquareSurface(cControlpoint *points[16], cEdge *edges[4], int iid,string iname)	luokan muodostin
cSquareSurface(cSquareSurface *p, int id)	kopionmuodostin
~cSquareSurface()	luokan hajotin
list<caGraphicalElement3d*>* getChildren()const	palauttaa omat lapset
void setControlpoint(cControlPoint *point, int order)	asettaa kontrollipisteen järjestyksen order mukaan
void setEdge(cEdge *edge, int order)	asettaa särmän järjestyksen order mukaan
void getSurfacePoints(double **vispoints, int n) const	sijoittaa Bezier-pinnan visualisointipisteet vispoints-koordinaattitaulukkoon, parametri n on visualisointipisteiden määrä särmällä
void getRefinePoints(double **refpoints, int order) const	sijoittaa särmän tihennyspisteet refpoints -koordinaattitaulukkon, parametrinä särmän numero
string save()const	tallentaa omat tietonsa string-tyypin muuttujaan ja palauttaa sen

5.11	cEdge
Vastaa blokin särmästä, peritään cGraphicElement3d:stä
5.11.1	Attribuutit
cControlPoint *controlpoints[4]	osoittimet särmän kontrollipisteisiin
int gridcount	tihennyspisteiden määrä
double refine	tihennysparametri
int refinetype	tihennyksen tyyppi

5.11.2	Julkiset metodit
cEdge(cControlPoint *points[4], int gridcount, double refine, int refinetype, int id, string name)	luokan muodostin
cEdge(cEdge *p, int id)	kopionmuodostin
~cEdge()	luokan hajotin
void setControlpoint(cControlPoint *point, int order)	asettaa kontrollipisteen järjestyksen order mukaan
void setGridCount()	asettaa tihennyspisteiden määrän
void setRefine()	asettaa tihennysparametrin
void setRefineType()	asettaa tihennyksen tyypin
int getGridCount()const	saantimetodi tihennyspisteiden määrälle
double getRefine()const	saantimetodi tihennysparametrille
int getRefineType()const	saantimetodi tihennyksen tyypille
list<caGrapihcalElement3d*>* getChildren()const	palauttaa omat lapset
string save()const	tallentaa omat tietonsa string-tyypin muuttujaan ja palauttaa sen
5.12	cControlPoint
Vastaa kontrollipisteestä, peritään cGraphicElement3d:stä
5.12.1	Attribuutit
double x, y, z	pisteen koordinaatit globaalissa koordinaatistossa
5.12.2	Julkiset metodit
cControlPoint(double x, double y, double z, int id, string name)	luokan muodostin
cControlPoint(cControlPoint *p, int id)	kopionmuodostin
~cControlPoint()	luokan hajotin
double getX()const	saantimetodi x-koordinaatille
double getY()const	saantimetodi y-koordinaatille
double getZ()const	saantimetodi z-koordinaatille
void move(x,y,z)	siirtää pistettä vektorin x,y,z verran
void rotate(double x, double y,double z, int anglexy, int angleyz, int anglexz)	kiertää pistettä rotaatiopisteen x,y,z ympäri kulmien anglexy, angleyz, anglexz verran
void setCoordinates(double x,double y, double z)	asettaa pisteen koordinaateiksi x, y ja z
list<caGraphicalElement3d*>* getChildren()const	palauttaa omat lapset
string save()	tallentaa omat tietonsa string-tyypin muuttujaan ja palauttaa sen

6	Yleisimmät operaatiot piirtoavaruuden kohteille

	 Siirtäminen ja pyörittäminen

0. Algoritmin joukot:
Selected-joukko sisältää kaikki piirtoavaruuden valitut elementit. Combined-joukkoon täydennetään blokit, jotka ovat yhdistettynä Selected-joukkoon kuuluviin blokkeihin. Activated-joukkoon täydennetään siirrettävät tai pyöritettävät kontrollipisteet. Processed-joukkoon täydennetään käsitellyt alkiot. 
Annettuna Selected-joukko.
1.	Lisätään Combined-joukkoon blokit, jotka on yhdistetty Selected-joukon blokkeihin.
2.	Lisätään kaikki Selected- ja Combined-joukon alkiot Processed-joukkoon.
3.	Lisätään kaikki edellisessä vaiheessa Processed-joukkoon lisättyjen alkioiden lapset Processed-joukkoon, jos ne eivät siellä jo ole.
3.1.	Jos Processed-joukon alkiolla ei ollut lapsia lisätään se Activated-joukkoon, jos se ei siellä jo ole.
4.	Toistetaan kohtaa 3. kunnes Processed-joukko ei kasva.
5.	Suoritetaan siirto- tai pyöritysoperaatio Activated-joukon alkioille.
6.	Alustetaan Activated-, Processed-, ja Combined-joukko tyhjiksi.

	 Poistaminen

0. Annettu Selected-joukko, joka sisältää osoittimia caBlock-tyyppisiin olioihin. (Selected {kuuluu} Kaikki_blokit) (Kaikki_blokit on joukko, joka sisältää kaikki blokit) 
1. Lisätään Selected-joukkoon Selected-joukkoon kuuluvien alkioiden lapsialkiot. Toistetaan tätä, kunnes joukko ei muutu. 
2. Asetetaan joukko Ei_poistettavat = Kaikki_blokit\Selected. Ei_poistettavat sisältää osoittimia cGraphicalElement3D -tyyppisiin alkioihin.

3. Lisätään Ei_poistettavat-joukkoon Ei_poistettavat-joukkoon kuuluvien alkioiden kaikki lapsialkiot. Toistetaan tätä, kunnes Ei_poistettavat-joukko ei enää muutu. 
4. Asetetaan Poistettavat={kaikki elementit}\Ei_poistettavat.
5. Suoritetaan Poistettavat-joukon alkioille delete-operaatio.

6.1	
Sekvenssikaavioita

Blokin luominen

Kuva 4: blokin luominen

Puun muodostaminen

Kuva 5: puun muodostaminen

7	Muita aliohjelmia
Seuraavat ohjelmaosiot toteutetaan aliohjelmakirjastoina.
7.1	OpenGL ja Glut
Vastaa avaruuden piirtotoimenpiteistä näyttöön ja toteutetaan pääosin aliohjelmakirjastona. Koska ohjelman suoritus etenee Tcl/Tk:n ja Glut:n looppien ohjaamana, niin Glut luovuttaa heti vuoron saatuaan kontrollin cManager luokalle, joka tekee tarvittavat toimenpiteet tietorakenteeseen ja kutsuu Glut-funktioita, jotka hoitavat piirtämisen. Pääsääntöisesti cManager välittää piirtoalueelle joko pinnan kontrollipisteiden (draw<tyyppi>Controlpoints ), visualisointipisteiden (draw<tyyppi>Surface) tai tihennyspisteiden (drawRefinePoints) tietoja riippuen siitä, mitä halutaan näytölle piirtää. cManager muokkaa piirtorutiineille menevät tiedot oikeaan muotoon, esim. muodostaa bezier-pinnan kontrollipisteiden perusteella, sekä valitsee oikeat piirtofunktiot riippuen siitä, millaista pintaa ollaan piirtämässä (neliö, kolmio). Piirtorutiinit puolestaan polygonisoivat niille annetut pinnat ja laskevat normaalit valaistusta varten.

Piirtoalue säilyttää tilamuuttujissaan mm. seuraavia tietoja: kameran paikka, väritaulukko, työskentelypiste (piste, jonka ympäri kamera ja valo liikkuvat) ja valaistustiedot. Nämä tiedot luetaan käyttäjäkohtaisesta tiedostosta, ja niiden tilaa voidaan muuttaa funktioilla: [set][get]Color, [set][get]CameraPoint, [set][get]LightPoint, [set][get]WorkPoint. Kaikki liikenne piirtoalueelta ulospäin pyritään minimoimaan ja näin kontrolli pyritään säilyttämään mahdollisimman paljon cManager-oliolla, joka siis kutsuu tarpeen mukaan piirtofunktiota tai muuttaa piirtoalueen tilamuuttujia.

Funktiot:

p = pisteet, n = taulukon koko
drawTriangleSurface(double p[][3], int n); 	

drawSquareSurface(double p[][3], int n);

p = pisteet, grid = piirretäänkö apuverkko
drawTriangleControlpoints(double p[10][3], int grid); 

drawSquareControlpoints(double p[16][3], int grid);

p = pisteet, n = taulukon koko
drawRefinePoints(double p[][3], int n);

id = kappale, color on rgb-väri
getColor(int id, double color[3]);

setColor(int id, double color[3]);

x,y,z = kiertokulma napakoordinaateissa, d = etäisyys keskipisteestä
setCameraPoint(x,y,z,d);

getCameraPoint(x,y,z,d);

kts. setCameraPoint
setLightPoint(x,y,z,d);

getLightPoint(x,y,z,d);

x,y,z = vektori
setWorkPoint(x,y,z);

applyGrid();

glutMain();

closeGlut();

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öä.
cManager-luokan metodeja ei voi suoraan  kutsua luokan ulkopuolelta ja siksi aliohjelmille annetaan osoitin cManager-olioon.  Osoittimen avulla aliohjelmat voivat viitata kyseisen cManager-luokan metodeihin. 
C++ -aliohjelmia kutsutaan Tcl-puolelta seuraavasti: aliohjelmanNimi parametrit.

Aliohjelmien kutsuja TCL-puolelta:

GetChildren id
Hakee id-numeron perusteella solmun lapset. Lapset tulevat Tcl–puolelle listana.
 
CreateHexahedron length height depth material optional  gridCount refine refineType combined
Pituus, leveys ja korkeus parametrit on kysytty käyttäjältä, muille tulee oletusarvot. Särmiä koskevien parametrien gridCount, refine ja refineType oletusarvot laitetaan kaikille särmille.

CreateTetrahedron sideLenght material optional gridCount refine refineType combined

CreatePrism length sideLenght material optional gridCount refine refineType combined

CreatePyramid length height material optional gridCount refine refineType combined
GetValues id
Parametrina muokattavan kohteen id-numero. Palautetaan listana kohteen arvot. 

UpdateBlock id name optional material
Blokin muokkaamisessa parametreina muokattavan blokin id-numero, nimi sekä material ja optinal parametrit. 
UpdateSurface id name surfacemeshvisible
Tahkon muokkaamisessa parametreina muokattavan tahkon id-numero, nimi sekä muuttuja, joka kertoo näytetäänkö tahkon visualisointiverkko. 
UpdateEdge id name refinetype refine gridcount
Särmän muokkaamisessa parametreina muokattavan särmän id-numero, nimi, tihennystyyppi, tihennyksen voimakkuus sekä tihennyspisteiden määrä. 
UpdateCpoint id name x y z 
Kontrollipisteen muokkaamisessa parametreina muokattavan kontrollipisteen id-numero, nimi sekä x-, y- ja z-koordinaatti. 
Move x y z
Parametreina siirtovektorin koordinaatit x, y ja z.

Rotate x y z anglexy angleyz anglexz
Parametreina rotaatiopisteen koordinaatit  x,y,z ja kulmat anglexy, angleyz, anglexz.	
Save filename
Parametrina tiedostonnimi polkuineen.

Open filename
Parametrina avattavan tiedoston nimi polkuineen.

Undo 
Ei parametreja. Peruu viimeisimmän toimenpiteen.

Redo 
Ei parametreja. Tekee uudelleen viimeisimmän toimenpiteen.

Select id
Parametrina valitun kohteen  id-numero	

Deselect 
Ei parametreja. Poistaa kappaleiden valinnan.

IsSelected element[]
Parametrina lista element[].	Tarkistaa, onko valittuna graafiset elementit, jota valittu
komento edellyttää.

Delete 
Ei parametreja. Poistaa valitut blokit.

CombineWithMove surface point1 point2
Parametreina tahko, johon ennalta valittu tahko yhdistetään siirtämällä pisteiden point1 ja point2 mukaisesti.
CombineWithStretch surface point1 point2 
Parametreina tahko, johon ennalta valittu tahko yhdistetään venyttämällä pisteiden point1ja point2 mukaisesti.
Separate 
Ei parametreja. Erottaa ennalta valitun yhteisen tahkon blokit toisistaan

ShowSurfaceMesh show
Näyttää (1) tai piilottaa (0) ennalta valittujen kohteiden visualisointiverkon.

Close 
Sulkee ohjelman

ViewMode	type 
Parametrina type: wireframe (0) tai solid (1). Muuttaa ennalta valittujen kohteiden 
esitysmuodon joko rautalankamalliksi tai kiinteäksi

viewPoint placeX placey placez directionX directionY directionZ cameraUpX cameraUpY cameraUpZ
Parametreina katselupisteen paikan ja suunnan sekä kameran yläsuunnan koordinaatit. 	
getChanged	
Kysytään tietorakenteelta, onko mitään muuttunut.	

setColors	 background, ctrlpoints, selected, elements	
Ottaa käyttöön käyttäjän määrittämät värit

8	Tiedostoformaatit
Tiedot on ryhmitelty tekstitiedostoihin aihealueittain, jotka on eroteltu toisistaan hakasulkujen sisällä olevien, ko.aihealueitakuvaavien, nimien perusteella. #-merkki toimii kommenttimerkkinä siten, että rivillä sen jälkeen esiintyviä merkkejä ei huomioida. Kommenttimerkin vaikutus lakkaa rivinvaihdon jälkeen
8.1	Laskenta-alueen tallennus
Perusblokeista määritellyn kolmiulotteisen laskenta-alueen tiedot tallennetaan tekstitiedostoon. Sovellus pystyy sekä tallentamaan tiedostoon että lukemaan tallentamiaan tiedostoja.. Kaikki koordinaatit tallennetaan eksponenttimuodossa neljän desimaalin tarkkuudella. Lisäksi luettavuuden lisäämiseksi käytetään |-merkkiä erottelemaan loogisia kokonaisuuksia toisistaan. Tiedostoon tallennettavat tiedot:
- cManager-luokan tiedot
•	Versiotiedot
•	Valon sijainti
- Kameran tiedot
•	kameran sijainti
•	kameran suunta
•	kameran ylössuunta
- Kontrollipisteiden tiedot
•	id
•	nimi
•	koordinaatit
- Särmien tiedot
•	id
•	nimi
•	tihennyspisteiden määrä
•	tihennysparametri
•	tihennystyyppi
•	kontrollipisteiden id:t
- Tahkojen tiedot
•	tyyppi
•	id
•	nimi
•	visualisointiverkon näkyminen (0/1)
•	särmien id:t
•	tahkojen id:t
- Blokkien tiedot
•	tyyppi
•	id 
•	nimi
•	materiaaliparametri
•	valinnainen parametri
•	tahkojen id:t

Esimerkkitiedosto:
# blokkimaailma.exd # tiedoston nimi

[Manager]#version_info|light_location|
1.1|100000E-4 100000E-4 100000E-4|

[Camera]#camera_location|camera_direction|camera_up_direction|
190000E-4 180000E-4 160000E-4|100000E-4 100000E-4 100000E-4|100000E-4 100000E-4 100000E-4| 

[ControlPoints]#id|name|x|y|z|
5|ControlPoint5|123355E-4|105552E-4|223333E-4|
.
.
.

[Edges]#id|name|gridcount|refine|refinetype|controlpoint_ids|
57|Edge57|10|3.0|1|1 5 9 13|
.
.
.

[Surfaces]#type|id|name|surfmeshvisible|edge_ids|controlpoint_ids|
square|70|surface70|0|57 58 59 60|1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16|
.
.
.
 
[Blocks]#type|id|name|material|optional|surface_ids|
hexahedron|75|hexahedron75|2|3|69 70 71 72 73 74|
.
.
8.2	.Kayttäjäkohtaiseten tietojen tallennus
Käyttäjä voi halutessaan tallentaa väreihin ja kappaleiden mittoihin liittyvät oletusasetukset tiedostoon, josta tiedot ladataan aina ohjelman käynnistyessä. 

Esimerkki tiedostosta, johon käyttäjäkohtaiset oletusasetukset on tallennettu.

#userdefault.ini
[Colors]
grid 127 127 127
axle 200 200 200
block 255 0 0
background 0 0 0
text 200 200 200
controlpoint 0 255 255
refinepoint 255 255 255

[BlockDimension]
#width, height, depth
hexahedron 200 200 200
#width
tetrahedron 200
#width, height
pyramid 200 200
#triangle width, square width
prism 200 200 

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

Kuva 6: käyttöliittymä
9.1	Valikkopalkki
Ylimpänä käyttöliittymässä sijaitsee valikkopalkki,  johon on sijoitettu kaikki toiminnot.
Alla lueteltu käyttöliittymän valikkopalkin sisältö. Nimen perässä … tarkoittaa sitä, että kyseinen valinta luo erillisen ikkunan –dialogin -, jossa käyttäjältä kysytään toimintoon tarvittavia 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(hexahedron, 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
9.2	Toolbar-kehys
Valikkopalkin alla sijaitsee Toolbar–kehys, johon tulee pikakuvakkeet toimintoihin, joita eniten tullaan käyttämään. Ainakin luomistoiminnot neljälle perusblokille, tuhoaminen, erottaminen ja yhdistäminen  tulevat sijaitsemaan Toolbar:ssa. 
9.3	Blokkien luonti (Create)
Blokkien luonti on ns. nopea eli blokilta kysytään ainoastaan perusmitat, jotka määrittävät sen. Kysyttävät mitat riippuvat luotavasta blokista:
Heksaedri: pituus,leveys, korkeus				 Tetraedri: sivun pituus				 Pyramidi: pohjan sivun pituus ja kolmion sivun pituus		    Prisma: pohjan pituus ja päätykolmion sivun pituus  
Muut tarvittavat parametrit ko. blokkien luontia varten ovat ennaltamäärättyjä oletusarvoja, jotka ohjelman käynnistyessä luetaan tiedostosta.. Oletusarvoja voi myös käydä muokkaamassa tiedostossa. Jo luodun blokin parametreja voidaan luonnin jälkeen muuttaa editointitilassa. Alla olevassa kuvassa on esimerkki heksaedrin luonti-dialogista. 

Kuva 7: luonti-ikkuna
9.4	Puurakenne & Editointi (Edit)
Käyttöliittymäikkunassa alimpana sijaitsee puurakenne, joka esittää piirtoavaruuden rakenteen puumallina. Solmuja klikkaamalla avautuu puurakenne blokeista aina sen kontrollipisteisiin saakka. Toisin sanoen puun juurisolmun alle avautuu kaikki blokit,  blokin alle tämän kaikki tahkot ja tahkon alle särmät ja kontrollipisteet. Myös särmän alle avautuu sen kontrollipisteet. Jokaista solmua voi editoida painamalla sen kohdalla hiiren oikeaa nappia, jolloin avautuu dialogi solmun arvojen editoimista varten. Riippuu solmusta (blokki, tahko, särmä tai kontrollipiste), mitä ominaisuuksia voidaan muokata:
Blokki:	 nimi, materiaaliparametri ja valinnainen parametri(ei käyttöä vielä)        Tahko:	 nimi, tahkon kontrollipisteet                              		       Särmä: 	nimi, tihennyspisteiden määrä, tihennyksen jyrkkyys, tihennyksen tyyppi,                                         särmän    kontrollipisteet				  Kontrollipiste:   nimi, koordinaatit 

Alla oleva kuva on esimerkkinä tapauksesta, jossa on puurakenteesta valittu särmä (Edge12), jota halutaan editoida. 

Kuva 8: muokkausikkuna

9.5	Yhdistäminen & Erottaminen (Combine & Separate)
Yhdistäminen tapahtuu valitsemalla tahko ja kaksi pistettä. Tämän jälkeen valitaan yhdistystoimenpide joko siirrolla tai ilman siirtoa venyttämällä. Avautuu dialogi, jossa näkyy valittu tahko  pisteineen. Tämän jälkeen valitaan yhdistettävä tahko ja kaksi pistettä.
Erottaminen puolestaan tehdään valitsemalla tahko, joka halutaan erottaa ja tämän jälkeen erotus-toiminto, joka vielä kysyy varmistuksen (Ok tai keskeytä). Jos valitaan ”Ok”, niin erotus tapahtuu.

9.6	Pyörittäminen (Rotate)
Blokkeja voidaan pyörittää valitsemalla haluttu blokki ja määrittämällä pyörityspisteet paikka (x,yz), sekä kolme kulmaa (xy, yz, zx), jotka määräävät pyörityssuunnan.
9.7	Siirtäminen (Move)
Ainoastaan blokkeja voi  siirtää, joten ensin pitää piirtoalueelta olla valittuna blokki, jonka jälkeen valitaan siirrolla blokki voidaan siirtää haluttuun paikkaan. Parametreina käytäjän on annettava blokin uuden paikan koordinaatit (x,y,z). 
10	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

11	Käyttötapaukset

Liite 1: Blokin luominen
Nimi:	Create block

Esiehdot:	-

Kuvaus:	1. Käyttäjä valitsee luontikomennon ja sen jälkeen haluamansa blokkityypin (Tetrahedron, Pyramid, Hexahedron tai Prism). Käyttäjä luo blokin blokkikohtaisten parametrien 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. Jos luodaan prisma joka yhdistetään valittuun neliötahkoon on oltava valittuna myös särmä, joka määrää prisman kolmiopäädyn sijainnin.

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

Jälkitilanne: 	Blokki on luotu.
Liite 2 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 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 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: Yhdistäminen
Nimi:	Combine

Esiehdot:	On oltava valittuna blokin tahko. 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: 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: Leikepöydälle kopiointi ja leikepöydältä liittäminen
Nimi:	Copy ja Paste

Esiehdot:	On oltava vähintää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: 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.