# timOhjeet

TIM ja GeoGebra

Tässä ohjeessa kerrotaan miten GeoGebraa käytetään TIMissä. Itse GeoGebra on niin laaja ohjelmisto, että sen käyttö on opeteltava erikseen.

TIMin GeoGebra-komponentti korvaa "vanhan" tavan, jossa vain upotettiin GeoGebra-tehtävä TIMin sisälle. TIMin GeoGebra-komponentin etuja on:

  • tehtäviä voidaan tehdä ja säilyttää TIMIssä, jolloin ne varmasti aina löytyvät ja niihin on oikeus niillä, joilla on oikeus muokata dokumenttia
  • opettaja voi seurata mitä opiskelijat ovat tehneet tehtävissä
  • tehtävistä voidaan antaa pisteitä

Mitä syvällisemmin ominaisuuksia käytetään, sitä enemmän vaaditaan GeoGebran osaamista ja osin myös JavaScript-ohjelmointitaitoa. Jos tyydytään pelkkään tehtävän näyttämiseen, on käyttäminen silloin helppoa.

Alla pikainen esimerkki jossa käytetään valmista GeoGebra-tehtävää (j2axjgdc) ja pyydettään käyttäjää säätämään keskuskulman arvoa. Säädetty kulma α ja sitä vastaava kehän piste C välitettään TIMille tallennettavaksi. TIM tarkistaa kulman ja antaa 1p, jos se on oikein. Käyttäjä ja opettaja voi selata vastauksia ja katsoa mihin piste C on siirretty. Raporttiin tulostuu kulman nimi ja arvo.

``` {plugin="csPlugin" #geo60}
type: geogebra
stem: 'Säädä keskuskulma 60 asteeksi ja paina Tallenna'
-pointsRule:
    expectCodePlain: "α = 60°"
width: 650
height: 430
material_id: "j2axjgdc"
javascript: |!!
P.setDataInit = function (api, geostate) {
    timgeo.setState(api, geostate);
    timgeo.setPointsCoords(api, geostate.userpts); // käyttäjän pisteiden paikat
}
P.getData = function(){ 
    return {
       "usercode": ggbApplet.getValueString('α'),     // kulma tutkittavaksi
       "userpts":  timgeo.getObjValue(ggbApplet,"C"), // piste C talteen
    }; 
}
!!
```
# geo60

Pohjan GeoGebra-tehtävälle löytää editorin Plugins/Others-välilehdeltä.

Jos et jaksa lukea koko ohjetta ja sinulla on kiire, niin loikkaa suoraan esimerkkiin jossa tallennetaan 3:n pisteen tila.

vesal: En ole GeoGebran ammattilainen, niin toivon että ne jotka osaavat enemmän, korjaavat tätä ohjetta GeoGebran osalta. Painovirheitä saa korjata jokainen joka niitä huomaa :-)

# geochanges

1. Muutoksia GeoGebran oikeuksissa

GeoGebran on muuttanut miten sisältöä voi upottaa koodiin. Tämä aiheuttaa sen että vanhat tyyliin:

``` {plugin="showVideo"}
iframe: true
videoicon: false
hidetext: Piilota GeoGebra
type: small
videoname: "GeoGebra: Karteesinen koordinaatisto"
width: 650
height: 500
file: "https://www.geogebra.org/material/iframe/id/k2hefjk9/width/650/height/500/border/888888/rc/false/ai/false/sdz/true/smb/false/stb/false/stbh/true/ld/false/sri/true/at/auto"
```

olevat upotukset eivät enää toimi esimerkiksi iPadillä. Niiden tilalle pitää kirjoittaa

``` {plugin="csPlugin" #geo2taso}
type: geogebra
lazy: true
beforeOpen: "md:[GeoGebra: Karteesinen koordinaatisto](#)"
borders: false
norun: true
width: 650
height: 500
material_id: "k2hefjk9"
```

tai jos halutaan painike, josta tehtävä aukeaa:

``` {plugin="csPlugin" #geo4}
type: geogebra
open: false
lazy: false
showButton: GeoGebra: Karteesinen koordinaatisto
width: 650
height: 500
material_id: "k2hefjk9"
```

2. Tapoja käyttää

TIMissä GeoGebraa voi käyttää useilla eri tavoilla:

  • upotettuna sisältönä
  • lainataan GeoGebran palvelimelle tallennettu tehtävä sen tunnuksen perusteella
  • käytetään ggb-tiedostoa
  • käytetään xml-tiedostoa
  • luodaan tehtävä GeoGebran komennoilla
  • luodaan tehtävä GeoGebran JavaScript-Api-komennoilla
  • melkein mikä vaan edellisten yhdistelmä

Kussakin käyttötavassa on omat hyvät ja omat huonot puolensa. Seuraavana annetaan esimerkkejä kustakin, kerrotaan miten tapaa käytetään ja mitkä ovat sen hyvät ja huonot puolet.

TIMissä tehtävät esitetään YAML-muotoisena tekstinä. Esimerkeistä käy ilmi käytetty YAML-muoto, mutta siitä voi lukea lisää myös erillisestä dokumentista:

Esimerkkien YAML-kieli näkyy myös kun avaa esimerkin vasemmalta puolelta edit-menun ja ottaa sieltä View source.

2.1 Upotettu sisältö

Tämä tapa ei enää toimi iPadillä, joten vältä tätä!

Upotettu sisältö lähtee siitä, että tehtävä on tehty GeoGebran palvelimelle ja se ajetaan sieltä TIMiin upotettuna sisältönä:

# geo1

Tällainen tehtävä saadaan tehtyä kun upotetun sisällön plugin muokataan seuraavasti:

``` {#geo1 plugin="showVideo"}
iframe: true
videoicon: false
hidetext: Piilota GeoGebra
type: small
videoname: "GeoGebra: Paraabelin polttopiste ja johtosuora.  Klikkaa tehtävä tästä auki."
width: 650
height: 500
file: "https://www.geogebra.org/material/iframe/id/X8EFduVc"
```

Tehtävä on oletuksena kiinni niin, että se pitää avata klikkaamalla. Mikäli tehtävä halutaan aukeavan automaattisesti, voidaa sen tehdä lisäämällä koodiin attribuutti:

open: true

Osoitteessa oleva tunniste X8EFduVc saadaan esimerkiksi GeoGebran sivun osoiteriviltä kun tehtävää (activity) muokataan GeoGebrassa.

Tehtävän tunniste osoiterivillä
Tehtävän tunniste osoiterivillä

Plussia

  • Helppo käyttää

Miinuksia

  • Tehtävää ei voi muokata, jos ei omista tehtävän oikeuksia
  • Ei pysty seuraamaan mitä opiskelijat tekevät tehtävässä
  • Ei pysty pisteyttämään opiskelijoiden toimintaa
  • Tehtävä muuttuu TIMissä jos alkuperäistä muutetaan (voi olla myös plus)

Tämä käyttötapa sopiikin parhaiten silloin, kun GeoGebraa käytetään vain havaintovälineenä. Yleensä tehtävän perään kannattaa silloin laittaa jokin toinen TIMin tehtävä, kuten monivalinta tai avoin kysymys, jolla selvitetään onko opiskelija tehnyt tehtävässä tarkoitetut havainnot.

3. TIMin GeoGebra-komponentti viittaamalla tunnisteeseen

Edellistä vastaava toiminto saadaan TIMin csPlugin-komponentilla kun laitetaan sen tyypiksi geogebra:

# geo2

Tämä saadaan koodilla:

``` {plugin="csPlugin" #geo2}
type: geogebra
borders: false
norun: true
width: 650
height: 500
material_id: "X8EFduVc"
```

Tässä tunniste (id) on selvitetty kuten edelläkin. Attribuuttien merkitykset:

  • borders: kun false, jätetään pois TIM tehtäville tyypilliset reunukset (oletus true). Raameja ei ehkä kannata piilottaa jos tehtävässä on Tallenna-painike.
  • norun: piilotetaan tallennuspainike (oletus false, eli painike näytetään)
  • width: tehtävalueen leveys
  • height: tehtäväalueen korkeys
  • material_id: tehtävän tunniste GeoGebrassa

Plussia:

  • helppo käyttää
  • laajentamalla tulee paljon mahdollisuuksia

Miinuksia:

  • tämmöisenään lataantuu automaattisesti, mikä ei ole hyvä isoissa dokumenteissa. Tähän on lääkkeitä myöhemmin
  • tämmöisenään ei voi seurata käyttäjän toimia eikä arvostella. Näihin ohjeita myöhemmin.
  • muokkaus edelleen vain GeoGebran kautta tehtävän omistajan toimesta

3.1 Pienin määrä attribuutteja

Kun attribuutit karsitaan minimiin, eli:

``` {plugin="csPlugin" #geo3}
type: geogebra
material_id: "X8EFduVc"
```

saadaan seuraava tulos:

# geo3

Edelliseen verrattuna tässä on se ero, että on tallennuspainike ja raamit ja koko tulee oletuksilla (800 x 450). Kokoa joutuu kuitenkin usein säätämään sen mukaan, miten tehtävän saa mahtumaan.

4. Ei automaattista avaamista

Upotuksen oletusasetuksiin verrattuna on se ero, että tehtävät latautuvat näyttöön automaattisesti. Tässä on se vika, että jos isossa dokumentissa on paljon tehtäviä, menee niiden automaattisessa aukaisemisessa kauan aikaa.

Tähän on muutama ratkaisu

  • avaaminen erillisestä painikkeeta
  • laiska lataaminen

Huomattakoon että kaikki mitä tässä alaluvussa sanotaa, toimii myös muille GeoGebran käyttötavoille kuin material-id:hen perustuviin.

4.1 Avaaminen painikkeesta

``` {plugin="csPlugin" #geo4}
type: geogebra
material_id: "X8EFduVc"
open: false
lazy: false
showButton: Tutki paraabelin johtosuoraa
```

jolla saadaan painike

# geo4

Tehtävä aukeaa vasta painiketta painamalla ja näin isokaan dokumentti ei hidastu, vaikka siinä olisi kymmeniä tai satoja GeoGebra-komponentteja. Haittana on että käyttäjä joutuu avaamaan tehtävät erikseen ja ei näe mitä on tulossa.

4.2 Sulkeminen painikkeesta

Lisäämällä hideButton saadaan lisäksi piilotuspainike:

``` {plugin="csPlugin" #geo4}
type: geogebra
material_id: "X8EFduVc"
open: false
lazy: false
showButton: Tutki paraabelin johtosuoraa
hideButton: Piilota
```

Lopputulos

# geo11

4.3 Esikatselukuva

Tehtävään voidaan liittää esimerkiksi ruutukaappauskuva tehtävästä, joka näytetään ennenkuin tehtävä aukeaa. Ruutukaappauksen ottamisesta ja lisäämisestä on enemmän varsinaisessa TIMin käyttöohjeessa.

Tällöin esimerkiksi koodilla

``` {plugin="csPlugin" #geo5}
type: geogebra
beforeOpen: "md:![](/images/188561/image.png)"
open: false
lazy: false
borders: false
width: 650
height: 500
material_id: "X8EFduVc"
```

saataisiin tehtävä:

# geo5

4.4 Laiska lataaminen

Tehtävä voidaan myös asettaa lataantumaan laiskasti. Itse asiassa, jos dokumentissa on paljon (kymmeniä) tehtäviä, ne lataantuvat automaattisesti laiskasti.

Laiskuus voidaan pakottaa attribuutilla lazy ja siinä voidaan käyttää myös esikatselukuvaa:

``` {plugin="csPlugin" #geo6}
type: geogebra
beforeOpen: "md:![](/images/188561/image.png)"
lazy: true
borders: false
width: 650
height: 500
material_id: "X8EFduVc"
```

Tämä näyttää seuraavalle ja aukeaa, kun hiiren kuljettaa tehtävän päälle:

# geo6

 

4.5 Ilmoitusteksti laiskasta lataamisesta

Attribuuttiin beforeOpen voidaan kirjoittaa myös mitä tahansa muuta TIM-koodia, esimerkiksi pelkkää tekstiä, joka näkyy ennen tehtävän lataantumista.

# geo7
Paraabelin johtosuora

 

4.6 Älä käytä yhdessä laiskaa lataamista ja erikseen avaamista

Ei ehkä kannata laittaa molemia ominaisuuksia kerralla. Eli jos on laiska lataaminen ja vielä erikseen open: false, niin silloin käyttäjä joutuu ensin viemään kursorin tehtävän päälle ja sitten tulee vasta se painike ja sitten painamaan sitä.

Koska pitkissä dokumenteissa laiskuus tulee automaattisesti, kannattaa ehkä lisätä jokaiseen tehtävään, jossa on open: false, myös

lazy: false

jotta molemmat eivät ole yhtäaikaa.

5. Oletustallentaminen

Kun ei ole attribuuttia:

norun: true

tai se on false arvossa, tulee automaattisesti näkyviin Tallenna-painike. Sen tekstiä voi tarvittasessa muuttaa attribuutilla:

button: "Kokeile ja tallenna tilanne välillä"

Jos ei tehdä mitään muuta, tallentuu käyttäjän tilanne ggb-muodossa joka kerta, kun hän painaa Tallenna-painiketta. Opettaja voi Teacher-näkymästä katsella opiskelijoiden vastauksia ja pisteyttää niitä käsin. Jatkossa kerrotaan, miten voidaan pisteyttää automaattisesti.

Oletustallennuksen vika on se, että ggb on ISO ja tallennetaan joka kerta koko GeoGebra-tehtävän sisältö. Jos alkuperäistä tehtävää muutetaan, niin vastauksista tämä ei näy ja kukin opiskelijan uusi vastaus perustuu hänen edelliseen vastaukseensa (ellei erikseen aloita alusta).

Myöhemmin esitetään muita tallennusvaihtoehtoja, jotka tosin ovat hieman työläämpiä ja pitää tehdä erikseen jokaiselle tehtävälle.

Tallentamiseen liittyvät asiat ovat riippumattomia GeoGebran käyttötavasta, eli toimivat muulloinkin kuin material_id -attribuutin kanssa.

6. ggb-tiedoston käyttäminen

Mikäli jossakin verkossa on tehtävää varten tehty ggb-tiedosto, voidaan myös sitä käyttää suoraan:

``` {plugin="csPlugin" #geo8}
type: geogebra
borders: false
norun: true
width: 840
height: 500
filename: "https://dev.geogebra.org/examples/ggb/sine-curves.ggb"
```

Edellä on jouduttu säätämään leveyttä ja korkeutta jotta alkuperäisen tehtävän kaikki ominaisuudet näkyisivät.

# geo8

Tähän liittyy samat plussat ja miinukset kuin GorGebran tunnisteen käyttöönkin.

7. Base64 koodatun ggb-datan käyttö

Jos jostakin saa tehtävän base64-koodattuna ggb-tiedostona, voidaan sitä käyttää suoraan. Tämä dokumentin lopussa oleva työkalu on yksi tapa tuottaa base64-koodattuja ggb-tiedostoja.

Mikä on GeoGebran base64?

Edellisiin tässä on se ero, että annetaan -data attribuutti ja sen perään ggbBase 64 sisältö. Miinusmerkki data-attribuutin edessä tarkoittaa sitä, että sisältöä ei anneta erikseen selaimelle, vaan se toimitetaan ainoastaan GeoGebran käyttöön.

``` {plugin="csPlugin" #geo363}
type: geogebra
borders: false
norun: true
width: 600
height: 450
-data: UEsDBBQACAgIAGdouU4AA...BLBQYAAAAABAAEAAgBAADDEAAAAAA=
```

Rivin -data: saa kirjoittaa myös TIMin monirivistä YAML-merkintää käyttäen:

-data: |!!
    UEsDBBQACAgIA...
!!

jolloin on helpompi vaihtaa datan tilalle XML-tiedosto, jos sen katsoo paremmaksi vaihtoehdoksi.

# geo9

Dataa ggb-muotoa varten saa esim olemassa olevasta GeoGebra tiedostosta niin, että sen lyhytnimen pudottaa dokumentin lopussa olevaan työkaluun kohtaan Set constraction ja sitten load. Sen jälkeen painaa Get contraction GGB.

Plussia:

  • kohtuullisen helppo käyttää
  • koko tehtävä on tuossa yhdessä merkkijonossa ja sen voi siirtää johonkin GeoGebra-työkaluun, muokata ja palauttaa takaisin. Eli kaikki jotka TIMissä pääsevät muokkaamaan dokumenttia, voivat halutessaan muokata tehtävää.

Miinuksia:

  • merkkijono on saatava kopioitua kokonaisena, muuten se ei toimi
  • merkkijonoa ei voi itse käsin muutella, muokkaus pitää tehdä jollakin työkalulla

8. XML-datan käyttö

Voit saada tehtävän kuvauksen myös jostakin XML-datana. Yksi tapa saada XML-dataa on ohjeen lopussa oleva työkalu. Itse asiassa ggb-tiedosto on zip-tiedosto jonka sisällä on muutamia XML-tiedostoja joista suurin on se, joka kelpaa tähän.

XML-dataa käytetään seuraavasti (koska XML-data on iso, on ensin vain leikattu esimerkki ja sitten seuraavasta voi avata kokonaisen esimerkin):

``` {plugin="csPlugin" #geo10}
type: geogebra
borders: false
norun: true
width: 600
height: 450
-data: |!!
<?xml version="1.0" encoding="utf-8"?>
<geogebra format="5.0" version="5.0.541.0" app="graphing" platform="w" id="29203A00-A088-4FC8-9A90-7B0F2BDD4D7A"  xsi:noNamespaceSchemaLocation="http://www.geogebra.org/ggb.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<gui>
	<window width="1198" height="600" />
... ISO pala poistettu välistä ...
<element type="conicpart" label="d">
	<show object="true" label="false"/>
	<objColor r="153" g="51" b="0" alpha="0.10000000149011612"/>
	<layer val="0"/>
	<labelMode val="0"/>
	<lineStyle thickness="5" type="0" typeHidden="1" opacity="178"/>
	<eigenvectors  x0="1" y0="0" z0="1.0" x1="0" y1="1" z1="1.0"/>
	<matrix A0="1" A1="1" A2="25.7513" A3="0" A4="5.8" A5="2.55"/>
	<eqnStyle style="implicit"/>
	<outlyingIntersections val="false"/>
	<keepTypeOnTransform val="true"/>
</element>
</construction>
</geogebra>
!!
```

Esimerkin koodi kokonaisena

# geo10

Edellä mainitulla työkalulla saa myös XML-muodon.

Plussia:

  • kohtuullisen helppo käyttää
  • koko tehtävä on tuossa yhdessä merkkijonossa ja sen voi siirtää johonkin GeoGebra-työkaluun, muokata ja palauttaa takaisin. Eli kaikki jotka TIMissä pääsevät muokkaamaan dokumenttia, voivat halutessaan muokata tehtävää.
  • jos ymmärtää rakenteen, voi pikkumuutokset tehdä suoraan XML-dataan

Miinuksia:

  • merkkijono on saatava kopioitua kokonaisena, muuten se ei toimi

9. Komentojen käyttö

Tietyssä mielessä paras tapa säilyttää tehtävät olisi käyttää komentoja. Komentoja voi esimerkiksi kopioda tämän dokumentin lopussa olevasta työkalusta ja sitten muokata tarpeen mukaan. Toistaiseksi komentojen kaveriksi tarvii vähintään minimaalisen XML:än, jolla alustetaan näkymä halutuksi. Tuota XML:ää voi joutua muuttamaan kuvion keskityksen ja zoomauksen takia.

Pohjaksi voi toki ottaa minkä tahansa material_id, ggb-tieodston, ggbBase64- tai XML-datan pohjalta tehdyn version. Itse asiassa voikin olla hyvä idea että on jokin vakiopohja tietyille tehtävätyypeille (esim material-id:n pohjalta) ja sitten tehtäviä tehdään tämän päälle "vain" ilmoittalla kommennot jotka tulee lisäksi.

``` {plugin="csPlugin" #geoc1}
type: geogebra
borders: false
norun: true
width: 600
height: 450
javascript: |!!
!!
commands: |!!
A = (0, 0)
B = (3, 0)
c: Circle[A, B]
B': Rotate[B, 60°, A]
α: Angle[B, A, B']
d: CircleSector[A, B, B']
!!
-data: |!!
<geogebra format="5.0">
<euclidianView>
    <coordSystem xZero="250" yZero="200" scale="50" yscale="50"/>
	<axis id="0" show="false" />
	<axis id="1" show="false" />
</euclidianView>
</geogebra>
!!
```
# geoc1

Plussat:

  • täysi omistusoikeus tehtävään ja kuka tahansa TIM-käyttäjä jolla on dokumentin muokkausoikeus, voi muokata tehtävää
  • vie TIMistä vähemmän tilaa kuin ggb tai XML-versio.
  • pisteytyksen tekeminen helpointa, kun on tarkka kontrolli olioiden nimiin

Miinukset:

  • työläämpi tehdä kuin muut versiot

  • esim labelit tulevat automaattisesti näkyviin ja niitä pitää erikseen piilotella lisäämällä käsin komentoja tyyliin:

    ShowLabel(B, false)

9.1 Kikkoja

Pienenä ongelmana komentojen käytössä on se, että oletuksena kaikki labelit tulevat näkyviin ja mm sidot pisteet voivat mennä "hassuihin" paikkoihin.

Otetaan esimerkiksi alkuperäinen tehtävä material_id:n mukaan pwnfhg4d:

# geoy1

Kun tämä id laitetaan lopussa olevaan työkaluun ja pyydetään sieltä vastaavat komennot, saadaan komennot:

A: (0, 0)
c: Circle[A, 1]
B: Point[c]
B': Rotate[B, 180°, A]
f: Segment[B, B']
α: Angle[B', A, B]
d: CircleArc[A, B, B']
C: Point[d]
g: Segment[C, B]
h: Segment[B', C]
β: Angle[B', C, B]

ja kun nämä komennot kopioidaan komentopohjaan, saadaan tulos:

# geoy2

Ensinnäkin kuva jää pieneksi, koska edellisestä komentojen mallista kopioidussa pohjassa on pienempi skaalaus. Siksi muutetaan skaalausta:

<euclidianView>
    <coordSystem xZero="250" yZero="200" scale="187" yscale="187"/>

Tarkan skaalauksen näkee työkalulla, kun ottaa XML-datan ja katsoo sen vastaavan rivin. Samalla voitaisiin muuttaa myös keskitystä vastaavasti, mutta tämä on melkein parempi nyt. Toinen oleellinen vika on että pisteet ovat eri järjestyksessä, kuviot eri värisiä ja erityisesti piste C on pisteen B päällä.

Ongelmat saadaan korjattua kun komentoihin lisätään:

ShowLabel(B, false)
ShowLabel(B',false)
ShowLabel(A,false)
ShowLabel(C,false)
ShowLabel(β,false)
SetLabelMode(α,2)
SetCoords(B,-1,1)
SetCoords(C,-2,-1)
SetColor(A,"Black")
SetColor(C,"Orange")
SetColor(α,"Magenta")
SetColor(β,"Green")
# geoy3

Näistä yksi tärkeimistä komennoista on

SetCoords(B,-1,1)

jolla saadaan alkuperäinen piste B kiertymään lähimmäksi paikkaa -1,1. Sitten C, joka on alunperin B:n päällä, saadaan siirrettyä kauemmaksi B:stä komennolla:

SetCoords(C,-2,-1)

Loput komennot ovatkin "vain" ulkoasun viilaamista.

Esimerkiksi labelin näyttömuodon muuttaminen komennolla SetLabelMode(α,2).

10. JavaScriptin käyttö

Samat asiat voi tehdä myös JavaScriptillä. Lue lisää GeoGebran JavaScriptAPI:sta:

TIMin ja GeoGebran JavaScriptistä

Teemme nyt aluksi malliksi äskeisestä ympyrä-tehtävästä samanlaisen version, mutta niin, että lisäkomennot peruskomentojen jälkeen tehdään JavaScriptillä.

``` {plugin="csPlugin" #geoj1}
type: geogebra
borders: false
norun: true
width: 600
height: 450
commands: |!!
A: (0, 0)
c: Circle[A, 1]
B: Point[c]
B': Rotate[B, 180°, A]
f: Segment[B, B']
α: Angle[B', A, B]
d: CircleArc[A, B, B']
C: Point[d]
g: Segment[C, B]
h: Segment[B', C]
β: Angle[B', C, B]
SetColor(A,"Black")
SetColor(C,"Orange")
SetColor(α,"Magenta")
SetColor(β,"Green")
!!
javascript: |!!
P.setDataInit = function (api, geostate) {
    timgeo.setState(api, geostate);
    timgeo.setAllLabelsVisible(api, false);  // kaikki labelit piiloon
    timgeo.setLabelStyle(api,"α",2);         // näytetään asteluku ja näkyviin
    api.setCoords('B',-1,1);                 // etsitään lähin kehän piste B:lle
    api.setCoords('C',-2,-1);
}
!!
-data: |!!
<geogebra format="5.0">
<euclidianView>
    <coordSystem xZero="250" yZero="200" scale="187" yscale="187"/>
	<axis id="0" show="false" />
	<axis id="1" show="false" />
</euclidianView>
</geogebra>
!!
```
# geoj1

Värit voitaisiin asettaa

api.setColor("B", 21,101,192);

kutsuilla, mutta sitten pitää itse miettiä värien koodit. Tosin värikoodit voi katsoa työkalussa kun ottaa olio XML-koodin ja sieltä voi katsoa kyseisen olion värikoodit rivistä:

<objColor r="21" g="101" b="192" alpha="0"/>

JavaScriptillä voidaan myös ajaa komentoja tyyliin:

api.evalCommand(
     'SetColor(A,"Black")\n'+
     'SetColor(C,"Orange")\n'+
     'SetColor(α,"Magenta")\n'+
     'SetColor(β,"Green")\n'    
);     

mutta koska tämä on pidempi kuin suora komentojen antaminen, voi olla järkevämpää asettaa värit suoraan komento-listassa.

# params

11. Näkymän säätäminen parametreilla

Alustavaa näkymää voidaan säätää GeoGebran appletin parametreilla. Niistä voit lukea lisää:

Alla esimerkkikoodi. Tehtävästä tulisi tyhjä, jos jätettäsiin commands osa tyhjäksi.

``` {plugin="csPlugin" #geop1}
type: geogebra
borders: false
norun: true
width: 800
height: 600
commands: |!!
A = (0, 0)
B = (3, 0)
c: Circle[A, B]
B': Rotate[B, 60°, A]
α: Angle[B, A, B']
d: CircleSector[A, B, B']
!!
javascript: |!!
P.appName = "graphing";
P.height = 600;
P.showMenuBar = true;
P.showAlgebraInput = true;
P.showToolBar = true;
P.customToolBar = "0 77 73 62 | 1 501 67 , 5 19 , 72 75 76 | 2 15 45 , 18 65 , 7 37 | 4 3 8 9 , 13 44 , 58 , 47 | 16 51 64 , 70 | 10 34 53 11 , 24  20 22 , 21 23 | 55 56 57 , 12 | 36 46 , 38 49  50 , 71  14  68 | 30 29 54 32 31 33 | 25 17 26 60 52 61 | 40 41 42 , 27 28 35 , 6";
P.showToolBarHelp = true;
P.showResetIcon = true;
P.enableLabelDrags = true;
P.enableShiftDragZoom = true;
P.showZoomButtons = true;
P.capturingThreshold = 3;
P.showFullscreenButton = true;
!!
-data: |!!
<geogebra format="5.0">
<euclidianView>
    <coordSystem xZero="250" yZero="200" scale="50" yscale="50"/>
	<axis id="0" show="false" />
	<axis id="1" show="false" />
</euclidianView>
</geogebra>
!!
```
# geop1

Jos edellä on

P.appName = "classic";

niin, saadaan "perinteisen" näköinen GeoGebra-tehtävä.

# app

12. GeoGebran sovellustyypit (app)

GeoGebrassa on useita eri sovellustyyppejä (app):

Tarvittaessa app-tyyppiä voidaan vaihtaa esim 3D:ksi

``` {plugin="csPlugin" #geo2}
type: geogebra
borders: false
norun: true
width: 1000
height: 800
javascript: |!!
P.appName = "3D";
!!
-data: |!!
UEs...AIAQAAaxIAAAAA
!!
```

13. Muita asetuksia

Jostakin syystä esimerkiksi jos halutaan yhtäaikaa näyttää sekä 3D että 2D säätimiä, pitää laittaa

``` {plugin="csPlugin" #geo2}
type: geogebra
...    
javascript: |!!
P.showAlgebraInput = true;
!!
...
```

13.1 Mahdolliset asetukset:

P.appName = "graphing";
P.width = 1200;
P.height = 600;
P.showMenuBar = true;
P.showAlgebraInput = true;
P.showToolBar = true;
P.customToolBar = "0 77 73 62 | 1 501 67 , 5 19 , 72 75 76 | 2 15 45 , 18 65 , 7 37 | 4 3 8 9 , 13 44 , 58 , 47 | 16 51 64 , 70 | 10 34 53 11 , 24  20 22 , 21 23 | 55 56 57 , 12 | 36 46 , 38 49  50 , 71  14  68 | 30 29 54 32 31 33 | 25 17 26 60 52 61 | 40 41 42 , 27 28 35 , 6";
P.showToolBarHelp = true;
P.showResetIcon = true;
P.enableLabelDrags = true;
P.enableShiftDragZoom = true;
P.enableRightClick = false;
P.errorDialogsActive = false;
P.useBrowserForJS = false;
P.allowStyleBar = false;
P.preventFocus = true;
P.showZoomButtons = true;
P.capturingThreshold = 3;

14. Käyttäjän vastauksen tallentaminen

Kaikki edellä kuvatut tavat voidaan muuttaa sellaiseksi, että käyttäjä voi tallentaan tilanteen. Tähän riittää poistaa rivi:

norun: true

tai vaihtaa se

norun: false

Otetaan esimerkiksi tehtävä, jossa on piste ympyrän kehältä:

``` {plugin="csPlugin" #geoyt1}
type: geogebra
borders: false
norun: true
width: 650
height: 500
material_id: "pwnfhg4d"
```
# geoyt1

Tässä käyttäjä voi oikeastaan liikuttaa vaan pisteitä A, B ja C (vihreä, sininen ja oranssi). Tällöin tehtävän koko tilan tallentaminen on melkoista muistitilan haaskausta.

# points3

14.1 Esimerkki kolmen pisteen tilasta

Jotta koko tilaa ei turhaan tallenneta, kirjoitetaan uudelleen JavaScript osuus, joka kertoo mitä tallennetaan ja miten tallennus otetaan takaisin:

``` {plugin="csPlugin" #geoyt2}
type: geogebra
width: 650
height: 500
material_id: "pwnfhg4d"
javascript: |!!
P.setDataInit = function (api, geostate) {
    timgeo.setState(api, geostate);
    timgeo.setPointsCoords(api, geostate.usercode);
}

P.getData = function(){ 
   return {"usercode": timgeo.getObjValue(ggbApplet,"A,B,C")}; 
}
!!
```

Tässä on raamit palautettu takaisin, jotta käyttäjä mieltää paremmin, että tehtävään kuuluu Tallenna-painike. Ja painike siis tuli näkyviin kun norun jätettiin pois.

# geoyt2

Kokeile liikutella oranssia pistettä (C) ja sen yläpuolella olevaa sinistä pistettä (B) ja paina aina välillä Tallenna-painiketta. Sitten voit selailla tallentamiasi vastauksia tehtävän yläpuolella olevalla valitsimella. Voi vaihtaa sivun yläreunasta Velp-näkymään ja sitten ruksia tehtävän päällä olevan Velp-ruksin. Nyt tehtävää selatessa näet mitä dataa on tallentunut kullakin kerralla.

14.2 Tilan tallentaminen

Tallentaminen perustuu siihen, että kun painetaan Tallenna-painiketta, TIM kutsuu funktiota P.getData(). Kirjoitimme tähän funktioon tässä esimerkissä:

P.getData = function(){ 
   return {"usercode": timgeo.getObjValue(ggbApplet,"A,B,C")}; 
}

Tämä tarkoittaa että tehtävän tilana palautetaan JSON-olio, jossa on "ominaisuus" (attribuutti) usercode.

Huomaa että koska api ei ole funktion parametrina, pitää käyttää globaalia muuttujaa ggbApplet ilmaisemaan mitä GeoGebra-tehtävää käsitellään.

Attribuuttien nimet saa valita melko vapaasti, ainoastaan muutama:

  • data - varattu koko tilan talletamiseksi joko ggbBase64- tai XML-muodossa
  • usercode - varattu siihen käyttöön, että tämä tieto näytettään VELP-muotoisessa selailussa ja tähän tallennettua tekstiä voidaan pisteyttää TIMin normaaleilla pisteytystavoilla. Samoin tämä arvo tulostuu raportteihin.

Tehtävän tilaa voi tallentaa useampaankin attribuuttiin. Esimerkiksi edellä voisi olla

P.getData = function(){ 
   return {
      "usercode": timgeo.getObjValue(ggbApplet,"C"),
      "userstate": timgeo.getObjValue(ggbApplet,"A,B,C")
    }; 
}

Tämä tarkoittaisi sitä, että "näkyvästi" on tallennettu vain pisteen C arvo, mutta sisäisesti kaikkien liikuteltavien pisteiden arvo. Kun tieto otetaan takaisin käyttöön, pitäisi siihen käyttää nyt userstate-attribuutin arvoa.

Vastaavasti jos koko tila olisi "pakko" tallentaa XML:änä ja sitten haluttaisiin näyttää VELP-selailussa ja raporteissa vain C-pisteen kooordinaattia, niin tilana voitaisiin palauttaa:

P.getData = function(){ 
   return {
      "usercode": timgeo.getObjValue(ggbApplet,"C"),
      "data": ggbApplet.getBase64()
    }; 
}

Tällöin valmiiksi tehty tilanpalautus osaa näyttää uuden tilan.

Lista kaikista käytössä olevista GeoGebran JavaScriptAPIN:n funktioista löytyy:

14.3 TIMin apufunktiot GeoGebran tietojen käsittelyyn

Näiden lisäksi on tukku TIMin `timgeo'-olioon kirjoitettuja apufunktioita, joista suurinta osaa voi testata dokumentin lopun työkalulla.

getConstructionState(api)

  • palauttaa tehtävän koko tilan merkkijonona. Tätä ei sellaisenaan juurikaan voi käyttää hyödyksi, mutta siitä voi opiskelella mitä kannattaisi tallentaa

getObjXML(api, objnames)

  • palauttaa yhden tain usean olion tilan XML:nä. Tätä voi joskus käyttää tilan tallentamiseen, koska täällä on myös värit yms mukana.

getObjValue(api, objnames)

  • palauttaa olion tai olioiden arvon. Arvo voi olla järkevää tallentaa tilana kuten esimerkissä.

getObjsCommands(api, objnames)

  • palauttaa olion tai olioiden kommennot

getObjCommand(api, name)

  • kuten edellä, mutta vai yhdestä olioista. Käytännössä tätä ei tarvitse kun voi aina kutsua tuota monikkomuotoista yhdellä olioilla.

getCommands(api)

  • palauttaa kaikki kommenot. Värit yms jäävät puuttumaan.

setState(api, geostate)

  • asettaa tehtävän tilan geostate-olion tietojen mukaan. Käyttää data ja commands-attribuutteja.

setLabelsVisible(api, objnames, visible)

  • asettaa valittujen labeleiden arvot näkyviin true tai pois false

setAllLabelsVisible(api, visible)

  • asettaa tehtävän kaikki labelit näkyviin tai pois

setLabelStyle(api, objnames, style)

  • asettaa valituille labeleille halutun tyylin. Jos piilotettuja näyttää ne samalla.

setPointsCoords(api, lines)

  • asettaa merkkijonon perusteella olioiden koordinaatit otaten huomioon, että sidotut pisteet laitetaan lähimmäksi pyydettyä pistettä ja sidontaa ei menetetä. Käytetään yhdessä getObjValue funkion kanssa.

setXmlProperty(api, obj, prop)

  • asettaan olio ominaisuuden XML attribuutti-rivin perusteella

setTextValue(api, name, value)

  • asettaa tesktiolion tekstiarvon. Jos value on undifined ei tee mitään

getPureValue(api, objnames)

  • palauttaa olioiden arvot ilman mitään ylimääräisiä merkkejä. jos esim getObjValue palauttaisi 60°, niin tämä palauttaa '60'.

getNumberValue(api, objnames)

  • palauttaa olioiden numeeriset arvot, kulmista radiaaneina

deleteObject(api, objnames)

  • tuhoaa nimetyt oliot

deleteAllObjects(api)

  • tuhoaa kaikki oliot

removeLines(s, remove)

  • poistaa merkkijonosta kaikki rivit joissa esiintyy termi remove (voi olla regexp). Käytetään esim poistamaan komentojoukosta sellaiset kommennot, joita on tuotettu yhdellä komennolla useita, kuten esim InteriorAngles. Näin tilaa palautettaessa ei komennot moninkertaistu. Poistetut komennot pitää yleensä lisätä sitten yhtenä kappaleena loppuun. Jos tätä joutuu paljon käyttämään, kannattaa harkita kannattaisiko tila silloin kuitenkin tallentaa ggbBase64 muodossa (joka ostaa oletuksen lukea).

14.4 Raportti näyttää usercoden

Jos em. tehtävästä otetaan raportti opettajan näkymässä painalla tehtävän vieressä All answers-linkkiä, saadaan esimerkiksi:

Ankka Aku; akankka; 503.geoj1; 2019-06-01 14:52:16.213731+00:00; 5; 
A = (0.0, 0.0)
B = (-0.71, 0.71)
C = (0.64, -0.76)

----------------------------------------------------------------------------------
Lappalainen Vesa; vesal; 503.geoj1; 2019-06-01 16:08:38.980675+00:00; 5; 
A = (0.24, 0.01)
B = (0.26, 1.01)
C = (-0.2, -0.89)

14.5 Tilan palauttaminen selattaessa

Kun käyttäjä avaa sivun uudelleen ja tehtävä ladataan, kutsutaan funktiota:

P.setDataInit

Vastaavasti jos vastausselaimella selataan vastauksia, niin vastauksen tai opettajan tilassa myös tekijän vaihtuessa kutsutaan funktiota

P.getData

Oletuksena tästä funktiosta kutsutaan tuota samaa P.setDataInit funktiota:

P.setData = function(geostate) {
    P.setDataInit(ggbApplet, geostate);
}

Tätä tarvitsee muuttaa lähinnä silloin, jos tehtävä on luonteeltaan sellainen, että käyttäjän toimenpiteet luovat uusia olioita (esim pisteitä) ja ne pitää hävittää ensin näytöstä. Silloin ennen setDataInit-kutsua yleensä tyhjennetään tehtäväalue ja sitten luodaan uudelleen. Tyhjäntämien voi olla tilanteesta riippuen joku komennoista:

ggbApplet.reset();
ggbApplet.newConstruction();
timgeo.deleteAllObjects();

Yksinkertaisissa tapauksissa funktiossa setDataInit pitäisi tallennettu tieto palauttaa näyttöön. Jos esimerkiksi on tallennettu pisteiden arvoja, niin ne voidaan palauttaa sen mukaan. GeoGebran valmiissa Apissa on funktio

void setCoords(String objName, double x, double y)

joka sopisi käyttöön, mutta

timgeo.getObjValue(ggbApplet,"A,B,C")

on palauttanut merkkijonon joka on muotoa:

A = (0, 0)
B = (-0.74, 0.68)
C = (-0.9, -0.43)

Tämän käsittelyn helpottamiseksi on siis kutsu:

timgeo.setPointsCoords(api, geostate.usercode);

jolla pisteiden arvot laitetaan kohdalleen. Tämä käyttäminen on sikäli järkevä, että jos on sidottuja pisteitä esimerkiksi ympyrän kehällä, niin pistettä ei irroteta kehältä, vaan etsitään lähin piste niin että sidonta säilyy.

15. Pisteiden antaminen

Yksi suurimmasta TIMin oman GeoGebra-komponentin eduista on se, että sillä voidaan myös pisteyttää opiskelijoiden vastauksia.

Tehtävän pisteyttäminen voi perustua pisteiden laskemiseen GeoGebran koodin puolella tai pisteden laskemiseen TIMissä normaaleilla TIMin tavoilla.

GeoGebran puolella pisteyttäminen on sikäli järkevää, että data on alkuperäisessä muodossa ja voidaan käyttää GeoGebran funktioita arvojen tutkimiseen. Huonona puolena tässä on se, että taitavalla JavaScript-käyttäjälle jää mahdollisuus "huijata" ja tehdä vastaava pistemäärän lähetys itse. Eli tämän tavan käyttöä pitää harkita pääsykoe yms. luonteisissa tilanteissa, joissa pisteillä on paljon merkitystä.

Edelleen kannattaa huomata, että voidaan käyttää myös mitä tahansa muuta edellä esitettyä tapaa tehtävän ylläpitämiseksi, kuin tässä esimerkissä oleva material_id (siis ggb-tiedosto, ggbBase64-data, XML_data, komennot, JavaScrpt tai mikä tahansa niiden yhdistelmä). Tässä esimerkkinä käyetään material_id vain siksi, että valmis koodi pysyy lyhimpänä.

15.1 Pisteiden laskeminen GeoGebran puolella

Oletetaan että edellisessä ympyrätehtävässä olisi annettu tavoitteeksi saada piste C niin, että kateetit ovat mahdollisimman saman mittaiset. Sovitaan että tehtävästä saa 2 pistettä jos ero on alle 5% ja 1 pistettä jos ero on alle 10%.

Pistetään tilapäisesti kaikki muuttujat näkyville (tässä voisi käyttää myös sivun lopun työkalua). Voit kokeilla tässä pisteiden saamista useita kertoa. Ehkä % olivat jopa liian tiukkoja.

# geoyt3

Eli meitä kiinnostaa sivujen h ja g pituudet ja niiden suhteet.

Tarvittava koodi:

``` {plugin="csPlugin" #geoyt3}
type: geogebra
-pointsRule:           # Tämä tarvitaan jotta TIM tietää mistä kentästä  
    pointsKey: points  # pisteet löytyvät
width: 650
height: 500
stem: Liikuta pistettä C niin, että kateetit ovat mahdollisimman yhtäpitkiä
material_id: "pwnfhg4d"
javascript: |!!
P.setDataInit = function (api, geostate) {
    timgeo.setState(api, geostate);
    timgeo.setAllLabelsVisible(api, true); // Jotta nähtiin mitä olioita 
    timgeo.setPointsCoords(api, geostate.usercode);
}

P.getData = function(){ 
   let points = 0;             // Lasketaan pisteet sovituilla säännöillä
   let api = ggbApplet;        // lyhennetään api:n nimi
   let h = api.getValue('h');  // haetaan sivujen pituudet
   let g = api.getValue('g');
   let diff = Math.abs(h-g);   // pituuksien erotus
   let m = Math.max(h,g);      // kumpiko sivu on pidempi
   if ( diff < 0.10*m ) points = 1; // verrataan eroa siihen
   if ( diff < 0.05*m ) points = 2; 
   return {
      "usercode": timgeo.getObjValue(api,"A,B,C"),
      "points": points,        // Palautetaan myös tehtävän pistemäärä
   }; 
}
!!
```

15.2 Viestin näyttäminen vastauksesta

Mikäli vastaukseen liittyen haluaa näyttää jonkin viestin, voi sen tehdä käyttäen pisteiden palautuksessa message-attribuuttia:

P.getData = function(){
   let points = 0;            
   let api = ggbApplet;        // lyhennetään api:n nimi
   let v =  timgeo.getPureValue(ggbApplet,'v');
   let message = "";
   if ( Math.round(v) == v ) message = "Hienoa pyöristit! 😊";
   else message = 'Voi ei, unohdit pyöristää! 😥?';
   if ( v == 24  ) points = 2;
   return {
      "usercode": v,
      "data": api.getXML(),
      "points": points,        // Palautetaan myös tehtävän pistemäärä
      "message": message,
   };
}

Viesti voi olla mitä tahansa HTML:ää ja sen voi muodostaa ihan miten monimutkaisesti tahansa käyttäen JavaScriptiä. Eli sen avulla voi yrittää johdatella vastaajaa oikeaan suuntaan.

15.3 Pisteiden laskeminen TIMin normaaleilla tavoilla

Aloitetaan esimerkillä, jossa käyttäjän pitää osata kirjoittaa kulman nimi. Koodi on tehty XML-datasta, joten se on sen verran pitkä, että se pitää aukaista alta erikseen.

Kulman nimen kysyminen, XML-data

Esimerkki ei sellaisenaan ole järkevin esimerkki GeoGebran ja TIMin yhteistyöstä, koska käyttäjän täytettävä tekstilaatikko voisi olla TIMin tavallinen tekstilaatikko ja kuva voisi olla tavallinen kuva. Se että kuva on GeoGebra-kuva antaa mahdollisuuden siihen, että käyttäjä voi siirrellä pisteitä ja saada kulman "normaaliin asentoon". Ja tällöin opettajaa voisi kuvitteellisesti kiinnostaa onko oppilas käyttänyt tätä tekniikkaa. Siksi esimerkissä tallennetaan kulman nimen lisäksi se, mihin käyttäjä on pisteet siirtänyt.

# geoaxml

Koodissa oleelliset rivit:

  • laitetaan TIMissä niin, että usercode tuottaa yhden pisteen jos tekstiksi on kirjoitettu DEF

    -pointsRule:
        expectCodePlain: "DEF"

    Lue lisää pisteytysäännöistä csPlugin-dokumentista

  • sitten kirjoitettaan JavaScriptiin säännöt tilan tallentamisesta ja paluttamisesta

    javascript: |!!
      // tähän tilan käsittely
    !!
  • tilan tallentaminen:

    P.getData = function(){ 
        return {
           "usercode": ggbApplet.getValueString('kulmannimi'),
           "userpts":  timgeo.getObjValue(ggbApplet,"D,E,F"),
           "usercmds": timgeo.getObjCommand(ggbApplet, 'kulmannimi'),
       }; 
    }

    Eli on haluttu, että tutkittavana asiana (usercode) on nimenomaan pelkkä teksti, joka on kirjoitettu kulman nimeksi. Tämä näkyy VELP selailuissa ja raporteissa. Mielenkiinnosta on tallennettu myös mihin käyttäjä on siirtänyt pisteet D, E ja F vastatessaan. Eli onko hän esimerkiksi siirtänyt pisteitä niin, että saa sivun DE oikealla jolloin kulman nimi on helppo muodostaa. Opettaja näkee sitten kunkin opiskelijan tilanteen kun selailee vastauksia. Tallennetaan myös kommenot, jota tarvitaan muuttujan kulmannimi muuttamiseksi.

  • tilan palauttaminen näkymään:

    P.setDataInit = function (api, geostate) {
        timgeo.setState(api, geostate);
        timgeo.setPointsCoords(api, geostate.userpts); // käyttäjän pisteiden paikat
        api.evalCommand(geostate.usercmds); // kirjoitettu teksti takaisin
    }

    Kun uusi käyttäjä valitaan opettajan sivulla tai opiskelija tai opettaja vaihtaa vastauksen numeroa, niin otetaan tilasta ensin perustiedot ja sitten palautetaan käyttäjän koordinaatti­pisteiden paikat ja lopuksi suoritetaan komennot, jotka olivat tuottaneet arvon kulmannimi-muuttujaan.

  • tosin tässä tapauksessa koska usercode sisältää sellaisenaan ihan käypäisen arvon, voitaisiin kiroittaa evalCommand sijaan:

        api.setTextValue('kulmannimi',geostate.usercode);

    missä on se vika, että jos arvoa ei ole, niin se näkyy UNDEFINED. Tämän takia parempi olisi:

        timgeo.setTextValue(api, 'kulmannimi', geostate.usercode);

    Tällöin voitaisiin tilan tallennuksesta jättää kokonaan pois rivi, jossa komennot tallennettiin. Sen hyöty tuleekin enemmän silloin, jos tallennettavia muuttujia on enemmän. Usean muuttuujan komennot voi tallentaa esimerkiksi:

           "usercmds": timgeo.getObjCommand(ggbApplet, 'kulmannimi, kulma2'),

    ja palautus voidaan silti tehdä vain yhdellä lauseella kuten nytkin.

Tämän version XML-toteutuksessa on myös oikeinmerkki, joka näytetään hetki kun kentään on kirjoitettu oikea vastas ja siitä poistutaan. Ratkaisu pilaa hyödyn siitä, että tehtävä arvostellaan TIMissä ja siksi tämäkin tehtävä olisi kannattanut arvostella kokonaan GeoGebran puolella ja palauttaa TIMiin vain tila ja pisteet.

Seuraavana sama esimerkki ilman GeoGebran puolella olevaa tarkistusta ja sitten mahdollisimman pitkälle tehtynä ilman XML:ää. Tästä esimerkistä voidaan nähdä miten eri tekniikoita voidan yhdistää tehtävän tekemiseen.

Oliot komennoilla, ulkoasu objxml:llä, edelleen tarkistus myös GeoGebrassa.

  • Tässä versiossa on tehty samat kuin edellisessä oli tehty kokonaan XML:llä, mutta tällä kertaa niin, että oliot on luotu komennoilla (commands) ja sitten olioiden ulkoasu on aseteltu objxml-attribuutilla. Tämä on kohtuullisen joustava tapa muutenkin muokata ulkoasua.

Oliot komennoilla, ulkoasu JavaScriptillä, ei tarkistusta GeoGebrassa

  • Tässä versiossa on riisuttu pois kaikki geoGebran puolella tapahtuva tarkistaminen ja kaikki kodi on siirretty joko komentoihin tai JavaScriptiin.

  • koska ei osattu komennoill atai JavaScriptiolla muuttaa syöttökentän leveyttä (joko voi korjata jos osaa), niin tämä on tehty muuttamalla olion XML-esitystä:

      timgeo.setXmlProperty(api, 'textkulma', '<length val="5" />');

15.4 Monimutkaisempi arvostelu TIMin puolella

Palataan alkuperpäiseen kehäkulmatehtävään. Sen vikana on se, että osaava javaScript-käyttäjä voi lähettää oikean vastauksen selaimesta osaamatta mitään geometriasta. On varmempaa jos pisteet annetaan siitä, että piste C on oikeassa paikassa. Alkuperäisessä tehtävässä pisteet A ja B olivat kiinnitetty joten periaatteesa pelkkä piste C riittää laskukuihin. Siltä varalta että alkuperäisestä tehtävästä irrotettaisiin A ja B kiinnityksestään, tehdään tehtävä niin, että käyteään kaikkia kolmea pistettä kulman arvon laskemiseen ja tehdään laskeminen TIMin puolella. Koska tähän ei ole mitään valmista koodia, kirjoitetaan tarkistusfunktio itse käyttäen TIMin extrafiles-attribuuttia.

Arvostelu TIMin puolella Python-koodilla

# angle60
# ggbtool

16. Työkalu ggb, xml ja material_id käsittelyyn

Seuraavalla työkalulla voit käsitellä ggb ja xml tietoja.

Työkalun saat omalle sivullesi koodilla:

``` {plugin="csPlugin" #geotool}
type: geogebra
tool: true
```

Voit myös muuttaa olemassa olevan tehtäväsi tilapäisesti työkaluksi lisäämällä tool-rivin.

# geotool

16.1 Tyhjästä aloittaminen

Voit aloittaa työkalun käyttämisen tyhjästäkin muokkaamalla haluamallasi tavalla GeoGebra-pohjaa.

16.2 Tietojen lataaminen

Voit aloittaa myös lataamalla jonkin valmiin tehtävän ja tutkimalla/muokkaamalla sitä.

  1. Selvitä jostakin material_id tai ggb-tiedoston osoite, Voit aloittaa kokeeksi vaikka material_id:llä

    X8EFduVc
  2. Liitä id tai ggb-tiedoston nimi Load sanan vasemmalle puolelle

  3. Paina Load

16.3 ggb-datan tai XML-datan lataaminen

Voit aloittaa myös jos saat jostakin valmiin ggbBase64 datan tai XML-datan (voit kokeilla kopioida jonkin tässä ohjeessa aikaisemmin olleen datan pohjaksi).

  1. Liitä ggbBase64-data tai XML-data Copy area yläpuolella olevaan nimettömään data-laatikkoon.
  2. Paina datan tyypin mukaan Set Constraction-rivillä joko GGB tai XML

16.4 Palaaminen aikaisemmin ladattuun tilanteeseen

Jos haluat erilaisten muutoskokeilujen jälkeen palata aikaisemmin GGB tai Load -toiminnolla alustamaasi tilanteeseen, niin paina Reset.

16.5 Palaaminen tyhjään tilanteeseen

Jos haluat palata ihan tyhjään tilanteeseen, niin tyhjennä data-laatikko ja paina GGB.

16.6 Tehtävän siirtäminen TIM-tehtäväksi

Kun olet saanut aikaiseksi halutunlaisen tehtävän niin sen saat siirrettyä TIMiin seuraavasti:

  1. Paina Get constructions-riville joko GGB tai XML sen mukaan kummanko tyyppisenä haluat tehtävän siirtää TIMiin.
  2. Paina Copy area (tosin saman voit tehdä maalaamalla data-laatikon ja valitsemalla kaikki ja sitten Ctrl-C)
  3. Siirry TIM-dokumenttiin johon haluat laittaa tehtävän.
  4. Sopivaan TIM-pohjaan liitä data: riville (tai XML tapauksessa data: |!! rivin jälkeen) leikepöydällä oleva data.

16.7 TIMissä olevan tehtävän muokkaaminen työkalulla

Jos haluat muokata TIMissä olevaa tehtävää työkalulla, niin toimi seuraavasti:

  1. Tyhjennä data-laatikko
  2. Paina Set construction-rivin GGB jotta saat tehtävän ihan tyhjäksi.
  3. Kopioi TIM-tehtävän data: sisältö data-laatikkoon.
  4. Paina Set construction-rivillä datan sisällön mukaan joko GGB tai XML
  5. Muokkaa tehtävää.
  6. Siirrä tehtävän sisältö TIM-tehtäväksi aikaisemmilla ohjeilla.

17. Kaiken tekeminen HTML:llä

17.1 srchtml

Edellisten lisäksi voi halutessaan tehdä kaiken suoraan HTML:llä käyttäen srchtml-attribuuttia

Koodi kaiken tekemiseksi HTML:llä

# geohtml

Hyötynä tästä olisi että voi täysin itse säätää mitä missäkin näkyy. Voidaan periaattessa vaikka sijoittaa scrhtml-attribuuttiin jokin valmis upotetun GeoGebran esimerkki. Tosin ilman muutoksia sen konstruktiota ei saada TIMiin talteen eikä opiskelijan vastauksia voi pisteyttää.

17.2 prehtml ja posthtml

Osan suoran HTML:än käytöstä saa käyttäen GeoGebra-komponentin attribuutteja:

prehtml: '<p>Tämä näkyy ennen komponenttia</p>'
posthtml: '<p>Tämä näkyy komponentin jälkeen</p>'

Näillä voi hyvin pitkälle muutella muutenkin mitä komponentin aluessa näkyy. Esimerkiksi voisi lisätä erilaisia ikoneita, joita näytetään erilaisista vastauksista.

Tosin näitä käyttäessä on usein syytä muuttaa vähintään komponenti korkeutta erikseen, sillä muuten noille teksteille ei jää tilaa:

``` {plugin="csPlugin" #geoprepost}
type: geogebra
height: 500
material_id: "X8EFduVc"
prehtml: '<p>Tämä näkyy ennen komponenttia</p>'
posthtml: '<p>Tämä näkyy komponentin jälkeen<p>'
javascript: |!!
P.height = 400;
!!
```
# geoprepost

19. Yhteenveto TIMin GeoGebra-komponentin attribuuteista:

material_id
filename
width
height
javascript
prehtml
posthtml
data
commands
objxml
-pointsRule:
lazy
button
beforeOpen
open
showButton
srchtml
borders
lang
norun

These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.