# Scripts in Kstars: de DCOP-interface

Een van de doelstellingen in &kstars; is het inbouwen van de mogelijkheid om samengestelde handelingen in een script vast te leggen. Hiermee kunt u virtuele rondreizen in het hemelgewelf ontwerpen, en leraren zullen hiermee demonstraties voor in de klas kunnen maken, waarmee bepaalde astronomische concepten kunnen worden toegelicht. Het is nu reeds mogelijk om voor &kstars; dit soort scripts te schrijven, hoewel nog niet alle gewenste functies beschikbaar zijn. En ook moeten deze scripts nu nog met de hand worden geschreven, maar in de toekomst zullen we een grafisch hulpmiddel toevoegen voor het bouwen van scripts. In dit hoofdstuk leggen we uit hoe u in &kstars; een script schrijft.

De KDE-architectuur stelt met de DCOP-interface het benodigde raamwerk beschikbaar voor het maken van scripts in programma's. DCOP betekent Desktop Communication Protocol (Bureaubladcommunicatieprotocol). Met behulp van DCOP kunnen in &kde; programma's vanuit andere programma's worden bestuurd, of vanuit een terminal, of met behulp van een tekstscript.

## DCOP-functies

De DCOP-interface van &kstars; heeft de volgende functies:

- `lookTowards( const QString direction )`: Richten van de focus van het schermbeeld in de richting die door het argument "direction" wordt gegeven. Dit kan de naam zijn van een hemelobject, of een van de volgende woorden of afkortingen: zenith (of z), north (n), northeast (ne), east (e), southeast (se), south (s), southwest(sw), west(w), northwest (nw). ("zenith"->zenit, "north"->noord, "northeast"->noordoost, "east"->oost, "southeast"->zuidoost, "south"->zuid, "southwest"->zuidwest, "west"->west, "northwest"->noordwest - dit dient alleen als toelichting, het is duidelijk dat van deze waarden alleen de Engelse namen zullen worden begrepen ... )

- `setRaDec( double rk, double dec )`: Richten van de focus op de opgegeven equatoriale coördinaten ("rk" en "dec" ->rechte klimming en declinatie).

- `setAltAz(double hgte, double az)`: Richten van de focus op de opgegeven horizontale coördinaten ("hgte" en "az" ->hoogte en azimut).

- `zoomIn()`: Inzoomen.

- `zoomOut()`: Uitzoomen.

- `defaultZoom()`: Het standaard zoomniveau (=3) herstellen.

- `setLocalTime(int jaar, int mnd, int dag, int hr, int min, int sec)`: De simulatieklok instellen op de opgegeven datum en tijd ("jaar"->jaar, "mnd"->maand, "dag"->dag, "hr"->uur, "min"->minuut).

- `waitFor( double t )`: "t" seconden pauzeren, alvorens verder te gaan met de volgende opdrachten van de script.

- `waitForKey( const QString k )`: De verdere uitvoering van de script stoppen, totdat de opgegeven toets "k" wordt ingedrukt. Momenteel kunt u nog geen gecombineerde toetsaanslagen opgeven (zoals &Ctrl;C); u kunt alleen enkelvoudige toetsaanslagen gebruiken. Om de spatiebalk op te geven typt u space.

- `setTracking( bool volgen )`: Volgen aan of uitschakelen. ("volgen" is een booleaanse variabele, wat betekent dat die alleen de standaardwaarden "true" of "false" kan hebben (wel volgen, of niet volgen)).

- `changeViewOption( const QString optie, const QString waarde )`: Instellen van een weergaveoptie. Er zijn er vele tientallen beschikbaar; in principe kunnen alle opties die in het venster Weergaveopties kunnen worden gewijzigd ook hier worden veranderd. Het eerste argument ("optie") is de naam van de optie, (de namen komen uit het configuratiebestand `kstarsrc`), en het tweede argument ("waarde") is de gewenste waarde. De argumentontleder is robuust, dus als u per ongeluk verkeerde gegevens invult zal het die op een nette manier weigeren.

- `setGeoLocation( const QString stad, const QString provincie, const QString land )`: De waarnemingslocatie naar de gewenste stad veranderen. Als er geen stad wordt gevonden die met de opgegeven waarden overeenkomt, gebeurt er niets.

- `stop()` [clock]: De simulatieklok stoppen.

- `start()` [clock]: De simulatieklock starten.

- `setScale(float s)` [clock]: Instellen van de snelheid van de simulatieklok. "s"=1.0 correspondeert met de natuurlijke snelheid, "s"=2.0 twee keer zo snel, enzovoorts.

## De DCOP-functies testen

U kunt zeer eenvoudig de DCOP-functies uitproberen met behulp van het programma kdcop. Als u.kdcop uitvoert krijgt u een lijst te zien van alle lopende programma's. Als &kstars; draait komt die ook voor in de lijst. De meeste van de DCOP-functies worden getoond onder de kop KStarsInterface, maar de klokfuncties staan onder de kop clock.U kunt een functie uitvoeren door erop te dubbelklikken. Als de functie argumenten nodig heeft zal er een venster worden geopend waarin u de waarden kunt invoeren.

## Het schrijven van een DCOP-script

DCOP-functies kunnen worden aangeroepen vanaf de commandoregel van Linux, deze regels kunnen worden opgenomen in een script. We zullen een voorbeeldscript maken die omschakelt naar equatoriale coördinaten, het beeld op de Maan instelt, een beetje inzoomt, en de kloksnelheid tot 1 uur per seconde vergroot. Na de Maan 20 seconden te hebben gevolgd wordt de klok gestopt en wordt er uitgezoomd. U kunt deze script gebruiken als een voorbeeld voor nieuwe scripts. Ik zal eerst de hele script tonen, en daarna de diverse onderdelen ervan uitleggen.

    #!/bin/bash
    #KStars-script: Volgen van de Maan!
    #
    KSTARS=`dcopfind -a 'kstars*'`
    MAIN=KStarsInterface
    CLOCK=clock#1
    dcop $KSTARS $MAIN  changeViewOption UseAltAz false
    dcop $KSTARS $MAIN  lookTowards Moon
    dcop $KSTARS $MAIN  defaultZoom
    dcop $KSTARS $MAIN  zoomIn
    dcop $KSTARS $MAIN  zoomIn
    dcop $KSTARS $MAIN  zoomIn
    dcop $KSTARS $MAIN  zoomIn
    dcop $KSTARS $MAIN  zoomIn
    dcop $KSTARS $CLOCK setScale 3600.
    dcop $KSTARS $CLOCK start
    dcop $KSTARS $MAIN  waitFor  20.
    dcop $KSTARS $CLOCK stop
    dcop $KSTARS $MAIN  defaultZoom
    ##

Sla dit script op in een bestand. U kunt elke bestandsnaam kiezen, Ik stel voor om een beschrijvende naam te kiezen als `volgmaan.kstars`. Typ daarna het volgende in om de script uitvoerbaar te maken: ``chmod` `a+x` `volgmaan.kstars`` . De script kan dan op elk moment worden uitgevoerd door ``./volgmaan.kstars`` te typen in de map waarin het script zich bevindt. Let erop dat het script alleen werkt als &kstars; al loopt. U kunt de opdracht `dcopstart` gebruiken om in een script een nieuw exemplaar van &kstars; op te starten.

En nu de uitleg van de script. De bovenste regel laat zien dat het bestand een `BASH`-shellscript is. De volgende twee regels zijn commentaarregels (elke regel die begint met een # is commentaar, en wordt door de shell overgeslagen). In de volgende drie regels worden voor het gemak wat variabelen gedefiniëerd, voor later gebruik. De variabele `KSTARS` identificeert het nu lopende &kstars;-programma, wanneer de opdracht `dcopfind` wordt gebruikt. `MAIN` and `CLOCK` identificeren de beide DCOP-interfaces van &kstars;.

De rest van de script is een lijst van DCOP-opdrachten. De eertste stelt de equatoriale coördinaten in door de optie UseAltAz op false ("false" -> uit, "true"->aan) in te stellen (ook hier weer kunt u alle opties die u met Weergaveopties wijzigen kunt instellen vinden door uw configuratiebestand `kstarsrc` te bestuderen). De volgende opdracht centreert het beeld op de Maan en stelt automatisch volgen in. Daarna stellen we het standaard zoomniveau in, om daarna vijf keer in te zoomen. Vervolgens wordt de snelheid van de klok ingesteld op 1 uur (3600sec) per seconde, en wordt de klok gestart (voor het geval die nog niet liep). De volgende regel stopt de uitvoering van de script gedurende 20 seconden terwijl de Maan wordt gevolgd bij zijn beweging langs de hemel. Tenslotte wordt de klok gestopt en wordt het standaard zoomniveau weer ingesteld.

We hopen dat u plezier heeft van de scriptmogelijkheden van Kstars. Als u een interessante script heeft gemaakt willen wij die graag van u ontvangen op ons emailadres kstars@30doradus.org. We zouden graag zien wat u heeft gemaakt en kunnen wellicht scripts op onze webpagina plaatsen. En als u ideeën heeft over hoe het maken van scripts kan worden verbeterd (of welk onderdeel van &kstars; dan ook), laat het ons dan weten op kstars-devel@lists.sourceforge.net, of stuur een wensenlijstje naar bugzilla.