ArchiMAD-lehti

Toistorakenteet GDL:ssä - ArchiMAD

Kirjoittanut Heikki Malkki | 06 syyskuuta 2022

Suunnittelussa tulee usein vastaan tarve toistaa elementtejä, olivat ne sitten pulpetteja luokkahuoneessa tai puita pitkin kadun vartta. Tämä usein hoituu Monista-käskyllä (ctrl+U tai ⌘+U), mutta joskus on tarkoituksenmukaista käsitellä toistettuja elementtejä yhtenä objektina tai tarkemmin hallita toistotapaa. GDL tarjoaa siihen työkalun.

Jos et tiedä mitään GDL-ohjelmoinnista, näillä ohjeilla voit kuitenkin kokeilla esimerkkejä:

  • Luo uusi GDL-objekti: Arkisto -> Kirjastot ja objektit -> Uusi objekti...
  • Valitse vasemmalta 2D-ohjelma ja kirjoita koodikenttään "PROJECT2 3, 270, 2". Tämä käsky yksinkertaisesti luo pohjakuvaan automaattisesti piirrokset ohjelman 3D-elementeistä.
  • Valitse 3D-ohjelma ja kirjoita kokeeksi "BLOCK 1,1,1". Artikkelin esimerkit tulevat tänne. Ohjelmissa huutomerkin jälkeen olevat tekstit ovat kommentteja, ne voi jättää pois.
  • Tallenna objekti sisäiseen kirjastoon.
  • Sijoita objekti pohjaan. Jos kaikki meni hyvin, pitäisi pohjassa ja 3D:ssä näkyä metrin kokoinen kuutio. 

Archicadin monipuolisin toistorakenne on lähes kaikista ohjelmointikielistä löytyvä FOR-silmukka. Sen rakenne näyttää tältä:

FOR muuttuja = alkuarvo TO loppuarvo STEP askel
   <silmukan sisältö>
NEXT muuttuja

Silmukka asettaa jollekin muuttujalle alkuarvon, suorittaa silmukan sisällön, ja sitten kasvattaa arvoa askeleen verran. Silmukkaa jatketaan, kunnes on saavutettu tai ylitetty loppuarvo. Viimeinenkin kierros otetaan mukaan, eli lopetetaan kun muuttuja on suurempi kuin loppuarvo. Niinpä FOR x=0 TO 10 suorittaa silmukan 11 kertaa.

Huomaa, että jos käsiteltävät luvut tai askeleet ovat desimaalilukuja, voi tietokone näennäisesti tehdä "virheen" johtuen desimaalilukujen esitystavasta koneen muistissa. Tällöin voi olla tarpeen lisätä tai vähentää raja-arvosta vähän, jotta pysytään rajan oikealla puolella, tai kiertää desimaalilukujen käyttö kokonaan. Esimerkiksi seuraavassa ohjelmassa, joka piirtää palloja tasavälein kehäksi, on vähennetty loppuarvosta vähän, jotta pysytään sen pienemmällä puolella eikä viimeistä kulmaa (360° eli 0°) piirretä kahteen kertaan. Ohjelma olisi toiminut oikein ilman tätäkin, mutta vain sen takia, että tietokoneen mielestä 7*360°/7 sattuu olemaan hieman vähemmän kuin tasan 360°.

FOR kulma = 0 TO 360-0.1 STEP 360/7
   ROTZ kulma  ! Käännytään pystyakselin suhteen
   ADDY 5      ! Siirrytään "eteenpäin" 5 metriä
   SPHERE 1    ! Piirretään pallo
   DEL 2       ! Perutaan 2 siirtymistä koordinaatistossa
NEXT kulma

STEP-osan voi jättää pois, jolloin askeleen oletusarvo on 1. Jos alkuarvo on suurempi kuin loppuarvo eli tahdotaan laskea alaspäin, on muistettava antaa askeleeksi negatiivinen luku. Muuten silmukka jumittuu matkalle kohti ääretöntä, tai ainakin niin pitkälle kuin muuttujan numeroavaruutta riittää.

Tavallisesti ohjelmointikielistä löytyy FOR-silmukkaan liittyvät käskyt CONTINUE, joka hyppää seuraavaan kierrokseen, ja BREAK, joka hyppää pois silmukasta. GDL:ssä näitä käskyjä ei ole, mutta niitä voi simuloida käyttämällä GOTO:a, jolla voi hypätä tahtomaansa paikkaan ohjelmassa.

FOR muuttuja = alkuarvo TO loppuarvo STEP askel
   <silmukan sisältö>
   IF <ehto sille, että sivuutetaan loput käskyt> GOTO "continue"
   <käskyt, jotka tahdotaan sivuuttaa ehdollisesti>
   "continue":
NEXT muuttuja

FOR muuttuja = alkuarvo TO loppuarvo STEP askel
   <silmukan sisältö>
   IF <ehto silmukan keskeyttämiselle> GOTO "break"
NEXT muuttuja
"break":

Silmukoiden tyypillinen käyttötapaus on elementtien toisto kahteen suuntaan. Silloin silmukat laitetaan sisäkkäin, eli on muistettava laittaa NEXT -käskyt 'käänteiseen' järjestykseen:

FOR x = 0 TO 10
   FOR y = 0 TO 10
      ADD x, y, 0     ! Siirrytään paikkaan x,y
      BLOCK 0.5, 0.5, 0.5
      DEL 1           ! Palataan origoon
   NEXT y
NEXT x

FOR-silmukan lisäksi GDL:ssä on kolme muuta silmukointikäskyä, jotka sisältävät pelkästään ehdon, eivät muuttujan kasvatusta. Nämä eroavat toisistaan siinä, tarkistetaanko ehto ennen vai jälkeen silmukan sisällön suorittamista, ja onko ehto vaatimus vai kielto. Eri silmukointirakenteet voi usein muuttaa toisikseen valitsemalla ehdot sopivasti, joten eri versioiden käyttö on useimmiten makukysymys. Koska käytännössä silmukointiin yleensä liittyy yksinkertainen muuttujan kelaus tasavälein, FOR-silmukka on usein luontevin valinta.

WHILE ehto DO
   <silmukan sisältö>
ENDWHILE

Niin kauan kuin ehto on tosi, suoritetaan silmukka. Tarkistetaan ehto ensin, eli jos se on alussa epätosi, ei suoriteta kertaakaan.

DO
   <silmukan sisältö>
WHILE ehto

Sama kuin edellä, mutta ehto tarkistetaan sisällön suorittamisen jälkeen. Suoritetaan siis aina vähintään kerran.

REPEAT
   <silmukan sisältö>
UNTIL ehto

Sama kuin edellinen, mutta ehto on käänteinen: Suoritetaan niin kauan kuin ehto on epätosi.

Silmukoiden käytössä tärkeintä on muistaa tarkistaa, että niistä on mahdollista päästä pois. Jos ehto ei muutu tai lasketaan numeroita poispäin loppuarvosta, voi silmukka jäädä suorittamaan itseään äärettömästi. Archicad ei mitenkään tarkista tällaista tapausta, joten yksinkertaisellakin silmukalla on mahdollista vetää ohjelma täysin solmuun. Silloin ainoa pakokeino on ohjelman pakkolopettaminen ja käynnistys uudelleen. Kannattaa myös muistaa, että Archicad ajaa GDL-ohjelman myös silloin, kun GDL-editorissa klikkaa esikatselukuvaa.

Jos joutuu työskentelemään monimutkaisen silmukan kanssa, yksi tapa varautua ikuisen silmukan vaaraan on itse lisätä silmukkaan toistoraja:

lehmat_lentaa = 0
laskuri = 0
REPEAT
   laskuri = laskuri + 1
   IF laskuri > 1000000 THEN END
   <silmukan sisältö>
UNTIL lehmat_lentaa

Yhdistetään lopuksi opittuja esimerkkiin. Piirretään ~20 x 15 m koronakatsomo, johon jätetään 7 m tila esiintyjälle.

! Aloitetaan puolikkaalla, jotta keskimmäinen tuoli osuu nollaan
FOR x = -10.5 TO 10.51  STEP 1.5
   FOR y = 0 TO 15 STEP 1.5
      ! Esiintyjä on origossa. Lasketaan etäisyys Pythagoraan avulla.
      IF SQR(x**2 + y**2)<7 GOTO "continue"       
      ADD x, y, 0
      ! Kutsutaan tuoliobjektia
      CALL "Tuoli 02 25" PARAMETERS A=0.4, B=0.4, ZZYZX=0.8
      DEL 1
      "continue":
   NEXT y
NEXT x 

Pienessäkin esimerkissä on heti paljon parantamisen varaa: Ehkä tuolit voisi kääntää esiintyjää kohti tai asettaa muuttujat objektin parametreiksi, jotta sitä voisi käyttää muilla mitoilla ja toistettavilla objekteilla. Ehkä elementtien väli voisi olla säädettävissä suoraan pohjassa kahvoilla (HOTSPOT). Muuttujiin voisi lisätä materiaalin, sen voisi satunnaistaa, ja objekti voisi laskea myös tuolien määrän määräluetteloon. GDL:n voima ja vaara on sen monipuolisuus – aina voi tehdä enemmän. Pitää osata lopettaa ajoissa – tai ulkoistaa.