Tässä artikkelissa esitellään GDL-kielen koordinaattimuunnoskäskyt, jotka yhdistettyinä silmukointikäskyihin antavat jo hyvän pohjan erilaisten objektien toteuttamiseen yksinkertasillakin elementeillä.
Jos et tiedä mitään GDL-ohjelmoinnista, näillä ohjeilla voit kuitenkin kokeilla esimerkkejä:
Archicadin koordinaattijärjestelmä on oikeakätinen, eli jos oikean käden peukalon ja etusormen laittaa suoraan kulmaan (X- ja Y-akselit) ja keskisormen niitä vasten kohtisuoraan, se osoittaa Z-akselin suunnan.
Koordinaatistossa voi siirtyä erilaisilla siirto- ja kiertokäskyillä. Lisäksi koordinaatistoa voi litistää tai venyttää eri akselien suhteen. Siirtymiä kannattaa ajatella omasta perspektiivistään: Jos käännyn 90° oikealle ja kävelen metrin Y-akselini suuntaan eli eteenpäin, päädyn metrin päähän X-akselin suuntaan origosta.
Siirtoja tai muita muunnoksia perutaan DEL-käskyllä, jonka parametriksi annetaan peruttavien käskyjen määrä. DEL TOP peruu kaikki muunnokset, jolloin palataan objektin origoon. Objektien monimutkaistuessa on kuitenkin parempi perua aina tunnettu määrä muunnoksia, jotta mahdolliset aiemmat koko objektia koskevat muunnokset pysyvät loppuun asti mukana.
Tavallisin koordinaattimuunnos on yksinkertainen siirto. Jokaiselle akselille on oma käskynsä, tai neljäs käsky, joka yhdistää nämä.
ADDX x ! Siirry x metriä oikealle
ADDX y ! Siirry y metriä eteenpäin
ADDX z ! Siirry z metriä ylöspäin
ADD x, y, z ! Edelliset 3 yhdistettynä
Esimerkki: Kaksi kuutiota. Yleensä ohjelmointikielissä sisennyksiä käytetään vain funktioissa sekä ehto- ja toistolauseissa, mutta usein GDL:ssä koodia selventää myös koordinaattimuunnosten alla olevien käskyjen sisennys.
BLOCK 1, 1, 1 ! Ensimmäinen kuutio
ADD 1, 1, 0 ! Siirrytään oikealle (x) ja eteen (y)
BLOCK 1, 1, 1 ! Toinen kuutio
DEL 1 ! Perutaan siirtyminen eli palataan lähtöpisteeseen
Kiertäminen tapahtuu myös oikeakätisesti: Kun oikealla kädellä tarttuu akseliin niin, että peukalo on akselin suunnassa poispäin origosta, sormien suunta kertoo mihin suuntaan kiertokulma kasvaa. Positiivinen suunta on siis vastapäivään ja negatiivinen myötäpäivään.
ROTX x ! Kallistu taaksepäin x astetta
ROTY y ! Kallistu oikealle astetta
ROTZ z ! Käänny vasemmalle z astetta
Neljäs kiertokäsky ROT eroaa näistä: sen avulla voi itse määritellä akselin, ja antaa sille sitten kiertoarvon.
ROT x, y, z, kulma ! Kierrä kulman verran vektorin (x, y, z) suhteen
Esimerkki: Kierretään kuutiota sen pisimmän akselin (kulmasta kulmaan) suhteen.
ROT 1, 1, 1, 90
BLOCK 1, 1, 1
DEL 1
Venytyskäskyjä on neljä:
MULX x ! Skaalaa X-akselin suhteen kertoimella x
MULY y ! Skaalaa Y-akselin suhteen kertoimella y
MULZ z ! Skaalaa Z-akselin suhteen kertoimella z
MUL x, y, z ! Edelliset 3 yhdessä
Venytyskäskyille on harvemmin käyttöä ja niitä on hankalampi visualisoida. Toisaalta voi ajatella, että MULY 2 tekee kaikesta paksumpaa, mutta jos tahdotaan pysyä siinä ajatuksessa että oma perspektiivi on aina normaali, pitäisi ajatella, että kaikki muu on Y-suunnassa puolet litteämpää. Kaikki on suhteellista.
Venytyksiä voi käyttää esimerkiksi silloin kun tahdotaan skaalattu versio jostain peruskappaleesta. Tehdään vedin puolikkaasta toruksesta:
MULX 3
ELBOW .05, 180, .01 ! Kaaren säde, kaaren kulma, 'putken' säde
DEL 1
Kertoimet voivat olla myös negatiivisia, jolloin elementit peilautuvat peilattua akselia kohtisuoraan olevan tason suhteen.
CALL "Nainen odottaa 26" PARAMETERS ALL
ADDX .4 ! Siirrytään vähän sivuun etteivät objektit mene päällekkäin
MULX -1 ! Peilataan X-akselia kohtisuoran YZ-tason suhteen
CALL "Nainen odottaa 26" PARAMETERS ALL
DEL 2
Yksi käyttötapaus on skaalata koko kappale, jotta voidaan käyttää esimerkiksi millimetrimittoja metrien sijaan. Tämä on tosin hiukan kyseenalaista ja saattaa aiheuttaa sekaannusta. Millin kokoinen kuutio:
MUL 0.001, 0.001, 0.001
BLOCK 1, 1, 1
DEL 1
Viimeinen 3D-koordinaattimuunnoskomento on XFORM (transform, muunnos), joka pitää sisällään kaikki edelliset muunnokset ja on lähimpänä tietokoneen omaa käsitystä niistä. Käsky on kuitenkin hankalakäyttöinen ja useimmiten turha ihmiselle, ja usein käytetty lähinnä tuotettaessa GDL-koodia koneellisesti.
XFORM xn_kerroin_xlle, yn_kerroin_xlle, zn_kerroin_xlle, xn_siirto,
xn_kerroin_ylle, yn_kerroin_ylle, zn_kerroin_ylle, yn_siirto,
xn_kerroin_zlle, yn_kerroin_zlle, zn_kerroin_zlle, zn_siirto
Lasketaan siis uusi koordinaatti yhdistelemällä lähtökoordinaatteja kertomalla ne annetuilla kertoimilla ja lisäämällä niihin vakio (siirto). Eli uusi_x = vanha_x * xn_paino_xlle, vanha_y * yn_paino_xlle, vanha_z * zn_paino_xlle + xn_siirto .
Yksi käyttötapaus XFORMille on vinoutuksen (englanniksi shear), harvoin käytetyn muunnoksen, toteuttaminen. Esimerkissä 'kallistetaan' kuutiota X-akselin suuntaan kulman verran sen korkeuden kuitenkin pysyessä samana. Diagonaalisesti kulkevat ykköset kertovat, että objektin mittasuhteet pysyvät muuten samoina (uusi X on vanha X kerrottuna yhdellä jne.), mutta X-suunta on kertoimen TAN(kulma) verran sidoksissa Z-koordinaattiin. TAN(45) = 1, joten yhden metrin korkeudella olevat pisteet siirtyvät oikealle 1 x 1 m verran.
kulma = 45
XFORM 1, 0, TAN(kulma),0, ! X
0, 1, 0 ,0, ! Y
0, 0, 1 ,0 ! Z
BLOCK 1, 1, 1
DEL 1
Pohjaan piirrettäessä käytetään samankaltaisia käskyjä kuin 3D:ssä. Kannattaa huomata, ettei Archicad anna virhettä, jos 2D-komentoja on 3D-ohjelmassa tai päinvastoin. DEL-komento on sama myös 2D:ssä.
ADD2 x, y ! Siirry
ROT2 kulma ! Kierrä kulman verran vastapäivään
MUL2 x, y ! Skaalaa X- ja Y-suunnassa
Usein kannattaa hetki miettiä, miten toteuttaa sarja siirroksia. Ihmismäinen toimintatapa ei välttämättä ole paras ratkaisu GDL-koodiksi. Miten toteuttaa tällainen tuolirinki?
Ensimmäisenä voi tulla mieleen asettaa tuoli, ottaa askel oikeaan, kääntyä hiukan, ja asettaa sitten toinen, ja toistaa tätä kaavaa silmukalla. Tämä kuitenkin vaatisi tuolien kulman lisäsäätöä, jotta ne saa suunnattua keskikohtaan, ja kehää myöten kulkiessa tulee hankalaksi säätää kehän sädettä jne.
Parempi ratkaisu on purkaa siirtyminen kahteen askeleeseen: kääntymiseen ja siirtymiseen eteenpäin. Näitä voisi toistaa putkeen, mutta on yksinkertaisempaa nollata siirtymä ja alkaa alusta.
FOR kulma = 0 TO 360-1 STEP 360/7
ROTZ kulma ! Kulman verran vastapäivään
ADDY 1 ! Metri eteenpäin
CALL "Tuoli 01 26" PARAMETERS ALL
DEL 2 ! Palataan alkuun
NEXT kulma
Silmukoidessa usein kannattaa käyttää kokonaislukumuuttujia eikä suoraan kulmia tai pituuksia. Näin pääsee käsiksi esimerkiksi rivi- ja sarakenumeroihin silmukan sisällä, ja askelia on helpompi muuttaa.
xsiirtyma = 1.1
ysiirtyma = 1.6
FOR nx = 0 TO 9
FOR ny = 0 TO 9
! Kolme siirtymää on eroteltu selvyyden vuoksi erillisiksi.
! Voisi käyttää myös yhtä ADD-käskyä.
ADDX nx * xsiirtyma
ADDY ny * ysiirtyma
! Jos palikan rivi- ja sarakenumeron summa on
! jaollinen kolmella, nostetaan puoli metriä. Miksipä ei.
ADDZ ((nx+ny) % 3 = 0) * 0.5
BLOCK 1, 1, 1
DEL 3
NEXT ny
NEXT nx
Toisaalta siirroksiin ei tarvitse aina suhtautua turhan suunnitelmallisesti – kokeiluista ja virheistäkin voi syntyä jotain mielenkiintoista ja inspiroivaa.