ArchiMAD-lehti

A-objekti - ArchiMAD

Kirjoittanut Severi Virolainen | 17 toukokuuta 2022

Kukapa ei tarvitsisi aanelosta? Tai -kakkosta tai -kolmosta? BIM-ajasta huolimatta arkkitehti ajattelee vielä aako’oissa. Annan tässä ohjeet oman A-objektin tekemiseen. Sillä voi vedellä A-kokoisia jakoviivoja Archicad-piirustukseen tai planssiin, jolloin näkee heti, miten suunnitelmat sijoittuvat papereille. Oletusarvona mappeihinkin sopiva A4.

Objektin luonti aloitetaan valitsemalla Arkisto > Kirjastot ja objektit > Uusi objekti… Objekti kannattaa saman tien tallentaa esimerkiksi nimellä ”A”. 

Objekti-ikkunan kohdassa Detaljit valitaan Alatyyppi… ja sieltä Dokumentointi-elementti. Samassa näkymässä voi kirjoitella tekijänoikeudet. 

Objekti-ikkunan kohdassa Parametrit luodaan kolme uutta muuttujaa: AX, l ja p. AX on merkkijonotyyppinen (”Abc”), ja sen nimeksi voi antaa ”A?”. Muuttujat l ja p kuvaavat arkin lyhyttä ja pitkää sivua. Ne voi sisentää klikkaamalla Näkymä-sarakkeesta sisennystä. 

Koska kyseessä on yksinkertainen omatarveobjekti, ei ohjelmilla hienostella. Kirjoitamme vain arvolista- ja 2D-ohjelmat. Tehdään ensin arvolistaohjelma. 

Arvolistaohjelma  

Vinkki: Voit kopioida ja sijoittaa koodia, mikä on digilehden kätevyyttä. 

values "AX" "A6", "A5", "A4", "A3", "A2", "A1", "A0" 
 
lyhyt=0.21 
 
pitka=0.297 
 
if AX="A6" then parameters l=lyhyt/2 , p=pitka/2 
if AX="A5" then parameters l=pitka/2 , p=1*lyhyt 
if AX="A4" then parameters l=1*lyhyt , p=1*pitka 
if AX="A3" then parameters l=1*pitka , p=2*lyhyt 
if AX="A2" then parameters l=2*lyhyt , p=2*pitka 
if AX="A1" then parameters l=2*pitka , p=4*lyhyt 
if AX="A0" then parameters l=4*lyhyt , p=4*pitka
 
 
lock "l","p" 

2D-ohjelma 

Vinkki: Voit kopioida ja sijoittaa koodia, mikä on digilehden kätevyyttä. 

hotspot2 0,b,11,a,1+128 
hotspot2 -a,b,12,a,2 
hotspot2 1,b,13,a,3

hotspot2 -a,0,21,b,1+128 
hotspot2 -a,b,22,b,2 
hotspot2 -a,-1,23,b,3

xn = int(a/(l*a_)) 
yn = int(b/(p*a_))

for x = 0 to xn 
line2 -l*x*a_,0,-l*x*a_,yn*p*a_ 
hotspot2 -l*x*a_,0 
hotspot2 -l*x*a_,yn*p*a_ 
next x

for y = 0 to yn 
line2 0,p*y*a_,-xn*l*a_,p*y*a_ 
hotspot2 0,p*y*a_ 
hotspot2 -xn*l*a_,p*y*a_ 
next y 

if xn=0 and yn=0 then 
rect2 -a,0,0,b 
endif  

Tallenna objekti ja kokeile, toimiiko se. Venyttämällä objektia siihen ilmestyy lisää valitsemasi paperikoon kerrannaisia siinä mittakaavassa, joka sattuu olemaan valittuna. Tämä on siis objektin erikoisuus: mittakaavan mukaan todelliseen kokoon skaalautuva! 

Arvolistaohjelma rivi riviltä 

Selitän ensin, mitä kullakin rivillä tapahtuu, minkä jälkeen näkyy itse ohjelmarivi. Olen tässä vaihtanut l-kirjaimet L-kirjaimiksi, jotta ne erottuvat numerosta 1. GDL:ssä ei ole väliä, käyttääkö isoja vai pieniä kirjaimia. Niitä voi sekoittaa vapaasti, vaikkei se olekaan suositeltavaa. 

Määritellään, että muuttuja AX voi saada luetellut arvot. Huomaa, että ”AX”:n jälkeen ei ole pilkkua. 

values "AX" "A6", "A5", "A4", "A3", "A2", "A1", "A0" 

Annetaan muuttujille lyhyt ja pitkä A4-arkin mitat. Muut A-arkit ovat A4:n lyhyen ja pitkän sivun kerrannaisia. 

lyhyt=0.21 
pitka=0.297 

Määrätään parametrien l ja p arvot. Jos AX:n arvo on ”A6”, saa l arvon lyhyt jaettuna kahdella, ja p saa arvon pitka jaettuna kahdella. Huomaa, että l ja 1 näyttävät samalta. Toinen on pieni L ja toinen on ykkönen. 

if AX="A6" then parameters L=lyhyt/2 , p=pitka/2 
if AX="A5" then parameters L=pitka/2 , p=1*lyhyt 
if AX="A4" then parameters L=1*lyhyt , p=1*pitka 
if AX="A3" then parameters L=1*pitka , p=2*lyhyt 
if AX="A2" then parameters L=2*lyhyt , p=2*pitka 
if AX="A1" then parameters L=2*pitka , p=4*lyhyt 
if AX="A0" then parameters L=4*lyhyt , p=4*pitka  

Lukitaan parametrit l ja p, jotta käyttäjä voi nähdä ne, muttei muuttaa niitä. 

lock ”L”,”p” 

2D-ohjelma rivi riviltä 

Selitän ensin, mitä kullakin rivillä tapahtuu, minkä jälkeen näkyy itse ohjelmarivi. Olen tässä vaihtanut l-kirjaimet L-kirjaimiksi, jotta ne erottuvat numerosta 1. GDL:ssä ei ole väliä, käyttääkö isoja vai pieniä kirjaimia. Niitä voi sekoittaa vapaasti, vaikkei se olekaan suositeltavaa. 

Jotta A-ruudukkoa voisi kätevästi venytellä näytöllä, tarvitaan siirreltäviä tartuntapisteitä. Ruudukon leveys on parametri a ja korkeus parametri b. A-ruudukon halutaan yleensä kasvavan nimiöstä vasemmalle ja ylöspäin, joten objektin origo on sijoitettu oikeaan alanurkkaan. Se on siis lähtöpiste ruudukolle. 

Liikuteltavia pisteitä on kaksi. Toinen vaikuttaa parametriin a ja toinen parametriin b. Objektin vasen ylänurkka sisältää molemmat arvot, joten on kätevintä, että molemmat liikuteltavat pisteet ovat samassa pisteessä, jolloin ne liikkuvat yhdessä. 

Yhden liikuteltavan pisteen määrittely vaatii kolme ohjelmariviä. 

Ensin määritellään parametrin a liikkuva tartuntapiste. Koska a kasvaa poikkeuksellisesti oikealta vasemmalle, joudutaan käyttämään miinusmerkkejä. 

Sijoitetaan 2D-tartuntapiste koordinaatteihin 0 ja b. 11 on pisteen ID, jolla ei ole merkitystä, mutta sen tulee olla objektin sisällä uniikki. Sitten kerrotaan, että halutaan vaikuttaa parametriin a. Numero 1 tarkoittaa, että tämä piste on origo, josta parametrin a arvo mitataan. Siihen lisätään statusarvo 128, joka tarkoittaa, että piste piilotetaan näkyvistä. 

hotspot2 0,b,11,a,1+128 

Sijoitetaan varsinainen liikuteltava piste koordinaatteihin -a ja b. Miinus tarvitaan, koska objekti venyy vasemmalle. 12 on pisteen uniikki ID. Sitten kerrotaan, että halutaan vaikuttaa parametriin a. Numero 2 tarkoittaa, että tämä on se liikuteltava piste, johon parametrin a arvo mitataan. Se on siis pisteiden 1 ja 2 väli. 

hotspot2 -a,b,12,a,2 

Sijoitetaan negatiivinen suuntapiste koordinaatteihin 1 ja b. Arvon 1 (yksi metri) tilalla voisi olla mikä tahansa positiivinen luku. Minulla on tapana käyttää numeroa 1. Nämä piste 3 ja piste 1 määrittelevät akselin, jota pitkin liikuteltavan pisteen arvoa mitataan. Suunta annetaan origosta eli pisteestä 1 negatiiviseen suuntaan eli tällä kertaa positiiviseen, koska a liikkuu negatiiviseen. 13 on pisteen uniikki ID. Sitten kerrotaan, että halutaan vaikuttaa parametriin a. Numero 3 tarkoittaa, että tämä on mitta-akselin negatiivisen suunnan määräävä piste. Tämä piste on aina piilossa. 

hotspot2 1,b,13,a,3 

Parametrin b liikkuva piste määritellään samalla tavalla. Erona on, että b:n arvo on positiivinen, joten piste 2 liikkuu b:n suuntaan ja piste 3 on suoraan alaspäin arvolla -1. 

hotspot2 -a,0,21,b,1+128 
hotspot2 -a,b,22,b,2 
hotspot2 -a,-1,23,b,3 

Sitten lasketaan, montako kokonaista arkkia mahtuu määritellyn suorakaiteen (0,0 ja -a,b) sisään. Vierekkäin mahtuu xn ja päällekkäin yn kappaletta.  

Xn saa arvon int(a/(L*a_)). L on lyhyen sivun pituus ja a_ on piirustuksen mittakaava – esimerkiksi 1:50-kuvassa sen arvo on 50. Yhden arkin leveys mittakaavaan kasvatettuna on siis sen leveys kerrottuna mittakaavalla. Esimerkiksi A4:n lyhyt sivu 1:50-kuvassa on 0,21 m * 50 = 10,5 m. Jaetaan ruudukon leveys a tuolla luvulla ja saadaan luku, joka ei luultavasti mene tasan, eli pilkun jälkeen on desimaaleja. Funktio int poistaa nuo luvut pilkun perästä. Esimerkiksi int(9,786) tuottaa luvun 9. 

xn = int(a/(L*a_)) 

Yn lasketaan vastaavalla tavalla, mutta suhteessa suorakaiteen korkeuteen b ja arkin pitkään sivuun p. 

yn = int(b/(p*a_)) 

Tietokoneohjelmoinnin perustoisto on ”for-next-luuppi” eli rakenne joka toistaa käsky sarjaa jostain johonkin. Luupilla on alku ja loppu. GDL:ssä toistetaan käskyt for- ja next-rivien välissä. Tässä niitä on kolme: yksi viiva ja kaksi pistettä. Toistokierroksia on tässä luupissa xn+1 kappaletta, sillä aloitamme nollasta ja päädymme vierekkäin mahtuvien arkkien määrään xn. Ensimmäisellä kierroksella kolme riviä toistetaan x:n arvolla 0, sitten 1, 2, 3 ja niin edelleen kunnes viimeisenä arvolna xn. 

for x = 0 to xn 
line2 -L*x*a_,0,-L*x*a_,yn*p*a_ 
hotspot2 -L*x*a_,0 
hotspot2 -L*x*a_,yn*p*a_ 
next x

Jotta luuppi näkyisi kokonaisena, käyn sisällä olevat rivit läpi tässä erikseen.  

Piirretään 2D-viiva pisteestä -L*x*a_,0 pisteeseen -L*x*a_,yn*p*a_. Lähtöpiste -L*x*a_,0 on x kertaa yhden arkin leveys mittakaavaan kasvatettuna ja kiinni x-akselissa. Pystysuoran viivan loppupiste -L*x*a_,yn*p*a_ on vaakasuunnassa samassa pisteessä, mutta pystysuunnassa sen päätepiste on yn kertaa yhden arkin pituus mittakaavaan kasvatettuna. 

line2 -L*x*a_,0,-L*x*a_,yn*p*a_ 

Tartuntapisteet tehdään viivan molempiin päihin, joiden koordinaatit ovat siis samat kuin viivan alku- ja loppupään. 

hotspot2 -L*x*a_,0 
hotspot2 -L*x*a_,yn*p*a_

Vaakasuorat viivat piirretään täsmälleen samalla logiikalla. Ainoa ero on, että vaakakoordinaatit ovat negatiivisia, jotta viivat piirtyisivät vasemmalle. 

for y = 0 to yn 
line2 0,p*y*a_,-xn*L*a_,p*y*a_ 
hotspot2 0,p*y*a_ 
hotspot2 -xn*L*a_,p*y*a_ 
next y

Tietokoneiden älykkyys perustuu pitkälti if-then-lauseeseen. Siinä kerrotaan, että jos jotakin, niin sitten jotakin. GDL:ssä if-lauseen jälkeen tehdään kaikki aina endif-riviin asti, jos ehto on tosi. 

Jos xn eli arkkien määrä vaakaan ja yn eli arkkien määrä pystyyn ovat molemmat nollia, niin piirretään objektin koon mukainen suorakaide. 2D-suorakaiteen vastakkaiset nurkat ovat pisteissä -a,0 ja 0,b 

if xn=0 and yn=0 then 
rect2 -a,0,0,b 
endif 

Viimeistely 

Kuvissa näkyy objektin tunnuskuvana ruudukko. Tunnuskuva on mikä tahansa kuva, joka sijoitetaan Tunnuskuva-ikkunaan. Se voi olla vaikkapa kuva kissastasi tai sopiva kuvaruutukaappaus. 

Lopuksi 

Toivon, että tämä lyhyen koodin avaaminen synnyttää pienen inspiraation. GDL on helppo ohjelmointikieli, jonka perusteet oppii päivässä. Mestariksi tuleminen viekin sitten kauemmin, kuten kaikissa kielissä. 

Virallinen GDL Reference Guide löytyy Archicadin Ohje-valikosta kohdasta Käyttöohjeet. Se ei varsinaisesti opeta, mutta on niin aloittelevan kuin kokeneenkin GDL-ohjelmoijan jatkuva apulainen. 

Nordic BIM Group järjestää GDL-kursseja, tietääkseni seuraavan kerran syksyllä. Suosittelen GDL:n opettelua etenkin matemaattisesti ketterille arkkitehdeille. Ohjelmointitaito tuo Archicadin käyttöön aivan uuden vaihteen.