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.
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ö
2 Projektin taustat ja 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ö
6 Yleisimmät operaatiot piirtoavaruuden
kohteille
8.2 .Kayttäjäkohtaiseten
tietojen tallennus
9.4 Puurakenne &
Editointi (Edit)
9.5 Yhdistäminen &
Erottaminen (Combine & Separate)
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 11: Blokin
pyörittäminen valitun rotaatiopisteen ympäri.
Liite 12:
Katselupisteen muuttaminen
Liite 16:
Leikepöydälle kopiointi ja leikepöydältä liittäminen
Liite 17:
Toiminnon kumoaminen ja tekeminen uudelleen
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.
Tässä luvussa kerrotaan projektin taustoista sekä Exodus -projektin tavoitteista.
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]
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.
· 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.
· 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.
· 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ä.
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öä.
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ä.
Exoduksen tietorakenteen elementtien relaatiot:
Kuva 2: luokkajako
Exoduksen perintähierarkia:
Kuva 3: perintähierarkia
Vastaa id-tunnuksien jakamisesta sekä ohjelman eri
osioiden välisestä kommunikoinnista.
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
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
Abstrakti pääluokka kaikille piirtoavaruuden
elementeille
int id elementin
tunnus
string name elementin nimi
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
Abstrakti luokka kaikille blokeille, peritään
cGraphicElement3d:stä
int material blokin
materiaaliparametri
int optional blokin
valinnainen parametri
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
Vastaa heksaedrista, peritään caBlockista.
cSquareSurface *surfaces[6] blokin tahkot
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
Vastaa tetraedrista, peritään caBlockista.
cTriangleSurface *surfaces[4] blokin tahkot
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
Vastaa pyramidista, peritään caBlockista.
caSurface *surfaces[5] blokin tahkot
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
Vastaa prismasta, peritään caBlockista.
caSurface *surfaces[5] blokin tahkot
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
Vastaa blokin tahkosta, peritään
cGraphicElement3d:stä.
caBlock *block[2] blokit, joihin tahko kuuluu
bool surfacemeshvisible kontrolloi visualisointiverkon
näkyvyyttä
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
Vastaa kolmion muotoisesta blokin tahkosta,
peritään caSurface:sta. Käyttää TriangleBezier-luokkaa visualisointipisteiden
muodostamiseksi.
cEdge *edges[3] tahkon särmät
cControlPoint *controlpoints[10] tahkon kontrollipisteet
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
Vastaa neliön muotoisesta blokin tahkosta,
peritään caSurface:sta. Käyttää SquareBezier-luokkaa visualisointipisteiden
muodostamiseksi.
cEdge *edges[4] tahkon särmät
cControlPoint controlpoints[16]* tahkon kontrollipisteet
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
Vastaa blokin särmästä, peritään
cGraphicElement3d:stä
cControlPoint *controlpoints[4] osoittimet särmän kontrollipisteisiin
int gridcount tihennyspisteiden määrä
double refine tihennysparametri
int refinetype tihennyksen tyyppi
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
Vastaa kontrollipisteestä, peritään
cGraphicElement3d:stä
double x, y, z pisteen koordinaatit
globaalissa koordinaatistossa
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
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.
Blokin luominen
Kuva 4: blokin luominen
Puun muodostaminen
Kuva 5: puun muodostaminen
Seuraavat ohjelmaosiot toteutetaan
aliohjelmakirjastoina.
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();
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
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
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|
.
.
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]
.
.
.
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ä
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
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.
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
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
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.
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.
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).
[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
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.
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.
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.