Last news:
Cartes du Ciel is free software released under the terms of the
GNU General Public License \
Last news:
Cartes du Ciel is free software released under the terms of the
GNU General Public License \
Aquesta pàgina dóna consells i exemples de funcions de scripting..
També podeu mirar en el codi de les tres caixa d'eines estàndard des de dins del programa.
Per a més detalls sobre una funció específica vegeu la pàgina Referència d'scripts.
Primer mirem amb detall al codi de la funció Goto (Vés a) de la eina “Eines de l'Observador de la caixa d'eines estàndard.
Això cobreix moltes bases de programació.
El codi de l'script complet es veu així:
// Slew telescope var ra,de: double; a,b,r: string; c: Tstringlist; begin memo_1.clear; if MenuTelescopeConnect.checked then begin if not StrToAR(Edit_1.text,ra) then begin memo_1.lines.add(rserror+' RA!');exit;end; if not StrToDE(Edit_2.text,de) then begin memo_1.lines.add(rserror+' DE!');exit;end; a:=floattostr(ra); b:=floattostr(de); GetSL('STRL1',c); c.clear; c.add('SLEW'); c.add(a); c.add(b); r:=cmd('',c); c.clear; memo_1.lines.add(r); end else memo_1.lines.add(rsTelescopeNot); end.
Doneu una mirada a cada part amb detall:
// Slew telescope
És un comentari, podeu usar // {..} (*..*) per incloure els vostres comentaris.
var ra,de: double; a,b,r: string; c: Tstringlist;
Definim la variable que usarem més endavant en l'script.
Tipus importants de variables són: integer, double, string.
El tipus Tstringlist s'usa aquí per enviar una ordre a Skychart.
begin
El començament del nostre programa.The start of our program.
memo_1.clear;
Netejar la caixa de text ho usem per mostrar missatges. Això assegura que la caixa de textos no estigui plena de missatges anteriors.
if MenuTelescopeConnect.checked then begin
Comprovem la propietat Checked de l'ítem del menú MenuTelescopeConnect. Això ens indica que hem connectat el telescopi al programa.
Si el resultat és veritat (true) executem el bloc de codi que comença a “begin” fins el corresponent “end”.
if not StrToAR(Edit_1.text,ra) then begin memo_1.lines.add(rserror+' RA!');exit;end;
Provem de convertir la AR en format HMS des del text en Edit_1 en la caixa de text a un valor numèric. Si la conversió falla (per haver teclejat un error en la caixa de text) veiem un missatge d'error i se surt.
a:=floattostr(ra);
Convertim de nou la AR a representació en text, però en el format decimal que demana l'ordre.
GetSL('STRL1',c); c.clear;
Creem una instància de l'objecte TStringList identificada per STRL1. Netegem que podrien romandre en l'objecte.
c.add('SLEW'); c.add(a); c.add(b);
Afegim l'ordre i els paràmetres que calen ( en aquest cas AR i DEC) a la llista de cadena (stringlist).
r:=cmd('',c);
Executa l'ordre i desa el resultat en la variable r.
memo_1.lines.add(r);
Mostra el resultat del comandament a la caixa de text.
else memo_1.lines.add(rsTelescopeNot);
En el cas que la prova MenuTelescopeConnect.checked doni fals s'executa aquesta línia.
Mostra en la caixa de text una traducció en l'idioma local de 'Telescopi no connectat'.
end.
El final del programa.
Podeu definir una funció en una llibreria externa per usar-la en l'script com una altra funció local.
Aquest exemple implementa un cronòmetre senzill utilitzant la funció GetTickCount de les API del Windows.
Hi ha dos botons Inici i Parada i dues caixes de text. S'usa una variable entera global (global integer) per desar l'hora inicial.
Script per al botó Inici:
function GetTickCount: Longint; external 'GetTickCount@kernel32.dll stdcall'; var tick: Longint; begin tick:=GetTickCount; setI('Int1',tick); edit_1.text:='Started'; end.
Script per al botó Parada:
function GetTickCount: Longint; external 'GetTickCount@kernel32.dll stdcall'; var t: double; t1,tick: Longint; begin tick:=GetTickCount; getI('Int1',t1); t:=double(tick-t1)/1000; edit_1.text:=''; edit_2.text:=formatdatetime('HH:MM:SS.ZZZ',t/24/3600); end.
Podeu invocar qualsevol funció de llibreria d'aquesta manera, però compte que això és dependent del sistema: la llibreria kernel32.dll library no exiteix en Mac o Linux.
Una altra limitació és que moltes funcions de llibreria esperen un punter a una estructura de paràmetres. Ja que el llenguatge de l'script usa internament codi en bytes (com Java), llavors no pot usar un punter per donar els paràmetres. Una solució és escriure una llibreria de dipòsit en C que exporti la funció om una llista paramètrica plana.
Aquí es descriu com usar un aparell ASCOM directament des del vostre script sense fer ús del telescopi ASCOM intern de Skychart.
Això pot ser usat per accedir a una altra classe d'aparell. Aquest exemple connecta a una cúpula, o accedeix a propietats addicionals per al vostre telescopi.
En el darrer cas heu de tenir cura que l'script treballi com a un concurrent a Skychart per accedir a l'aparell.
El codi següent assignat a un botó permet seleccionar el controlador de cúpula ASCOM que volem utilitzar. El nom del controlador es desa en el camp de text Edit_1.
var V: variant; w,s: widestring; begin V := CreateOleObject('ASCOM.Utilities.Chooser'); w:='Dome'; V.DeviceType:=w; s:=edit_1.text; s:=V.Choose(s); edit_1.text:=s; V:=Unassigned; end.
Remplaceu w:='Dome'; per Telescope, Focuser, Rotator, Camera, Filter per seleccionar una altra classe de controlador.
El codi següent és per al botó “Connecta”. Connectarà al controlador ASCOM de cúpula que havíem triat abans. Usem la variable global Dome1 per desar l'objecte ASCOM.
var D: variant; s: widestring; begin s:=edit_1.text; getV('Dome1',D); if VarIsEmpty(D) then D := CreateOleObject(s); D.connected:=true; setV('Dome1',D); end.
Ara volem afegir un botó per obrir l'interruptor de la cúpula. Això és sols un exemple, en aquest punt qualsevol propietat ASCOM pot ser usada.
La primera prova protegeix contra una caiguda del programa si provem d'usar una variant inicialitzada.
La segona prova protegeix un altre cop un error ASCOM si la cúpula no estes connectada.
var D: variant; begin getV('Dome1',D); if (not VarIsEmpty(D)) then if D.Connected then D.OpenShutter; end.
Afegir un botó per desconnectar el controlador i alliberar recursos.
var D: variant; begin getV('Dome1',D); if (not VarIsEmpty(D)) then if D.Connected then D.connected:=false; D:=Unassigned; setV('Dome1',D); end.
El codi que segueix obre la pàgina de documentació de Cartes del Cel en el navegador web per defecte.
Podeu usar qualsevol tipus de document amb aquesta funció. El document s'obrirà amb el navegador de la mateixa manera que si hi féssiu doble clic amb l'explorador.
begin OpenFile('doc\wiki_doc\en\documentation\start.html'); end. <code> ===== Donar una ordre ===== Hi ha dues maneres d'activar una ordre externa o un programa, depenent de si espereu veure el resultat o no. ==== Esperar el resultat ==== El següent comandament dóna l'ordre DIR en el directori actual. El resultat es guarda en una llista de cadena i més tard es mostra com un text. Conté el llistat de fitxers del directori. <code> var r:TstringList; begin GetSL('STRL1',r); r.clear; RunOutput('dir',r); Memo_1.lines.assign(r); end.
Si l'ordre pot rutllar per un temps indeterminat o no produeix cap info, llavors necessiteu usar la següent forma.
Aquest exemple fa anar el programa de l'observador d'estels variables i en surt immediatament.
begin Run('varobs'); end.