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

1        Johdanto. 1

2        Projektin taustat ja vaatimusmäärittely. 2

2.1    Projektin taustat. 2

2.2    Vaatimusmäärittely. 2

2.2.1    Ensisijaiset toiminnalliset vaatimukset. 3

2.2.2    Toissijaiset toiminnalliset vaatimukset. 3

2.2.3    Ei-toiminnalliset vaatimukset. 4

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

4        Sovelluksen rakenne. 7

5        Luokkajako. 9

5.1    cManager. 1

5.1.1    Attribuutit. 1

5.1.2    Julkiset metodit. 1

5.2    caGraphicalElement3d. 4

5.2.1    Attribuutit. 4

5.2.2    Julkiset metodit. 4

5.3    caBlock. 4

5.3.1    Attribuutit. 4

5.3.2    Julkiset metodit. 4

5.4    cHexahedron. 5

5.4.1    Attribuutit. 5

5.4.2    Julkiset metodit. 5

5.5    cTetrahedron. 6

5.5.1    Attribuutit. 6

5.5.2    Julkiset metodit. 6

5.6    cPyramid. 6

5.6.1    Attribuutit. 6

5.6.2    Julkiset metodit. 6

5.7    cPrism. 7

5.7.1    Attribuutit. 7

5.7.2    Julkiset metodit. 7

5.8    caSurface. 8

5.8.1    Attribuutit. 8

5.8.2    Julkiset metodit. 8

5.9    cTriangleSurface. 9

5.9.1    Attribuutit. 9

5.9.2    Julkiset metodit. 9

5.10      cSquareSurface. 9

5.10.1      Attribuutit. 10

5.10.2      Julkiset metodit. 10

5.11      cEdge. 10

5.11.1      Attribuutit. 10

5.11.2      Julkiset metodit. 11

5.12      cControlPoint. 11

5.12.1      Attribuutit. 11

5.12.2      Julkiset metodit. 11

6        Yleisimmät operaatiot piirtoavaruuden kohteille. 13

6.1    Sekvenssikaavioita. 15

7        Muita aliohjelmia. 17

7.1    OpenGL ja Glut. 17

7.2    TCL/C++ -muunnos. 18

8        Tiedostoformaatit. 22

8.1    Laskenta-alueen tallennus. 22

8.2    .Kayttäjäkohtaiseten tietojen tallennus. 24

9        Käyttöliittymän kuvaus. 26

9.1    Valikkopalkki. 26

9.2    Toolbar-kehys. 27

9.3    Blokkien luonti (Create). 27

9.4    Puurakenne & Editointi (Edit). 28

9.5    Yhdistäminen & Erottaminen (Combine & Separate). 29

9.6    Pyörittäminen (Rotate). 29

9.7    Siirtäminen (Move). 30

10      Lähteet. 31

11      Käyttötapaukset. 32

Liite 1: Blokin luominen. 32

Liite 2 Ohjelman sulkeminen. 33

Liite 3 Pinnanmuotojen näyttäminen. 34

Liite 4 Tahojen visualisointiverkkojen näyttäminen. 35

Liite 5: Attribuuttien muokkaaminen. 36

Liite 6: Uuden piirtoavaruuden luominen. 37

Liite 7: Tallennetun piirtoavaruuden avaaminen näytölle. 38

Liite 8: Piirtoavaruuden tallentaminen. 39

Liite 9: Valitseminen. 40

Liite 10: Siirtäminen. 41

Liite 11: Blokin pyörittäminen valitun rotaatiopisteen ympäri.. 42

Liite 12: Katselupisteen muuttaminen. 43

Liite 13: Poistaminen. 44

Liite 14: Yhdistäminen. 45

Liite 15: Erottaminen. 46

Liite 16: Leikepöydälle kopiointi ja leikepöydältä liittäminen. 47

Liite 17: Toiminnon kumoaminen ja tekeminen uudelleen. 48

 


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.