Audela |
![]() |
L'interface Audace n'est pas figée et il est tout à fait possible d'y ajouter des fonctionnalités. Nous allons aborder ici la façon de créer un nouveau panneau d'observation afin de pouvoir réaliser des opérations pour une application spécifique. La réalisation d'un tel panneau nécessite une connaissance préalable du langage script Tcl/Tk utilisé par Audela. Afin de parler concret, nous allons nous appuyer sur un exemple. Nous nous proposons de créer un panneau qui va permettre de réaliser l'acquisition et le prétraitement d'une image du ciel profond par une méthode très précise :
Nous voulons réaliser les images en binning 2x2 (moyenne définition)
Les images seront posées 30 secondes
Un télescope automatique est relié à Audace et nous voulons utiliser la méthode du shift & add. Cette méthode consiste à prendre plusieurs images du champ légèrement décalées les unes par rapport aux autres. Nous réaliserons 5 images au foyer F=1,20 mètre.
Un flat sera réalisé en faisant des images du ciel nocturne à côté de l'objet. Nous réaliserons 5 images de flat pour réaliser un flat de synthèse.
Nous supposons qu'une image bias et une image de dark existent sur le disque dur. L'image du bias s'appelle c:\audela\d0b2.fit et l'image de dark s'appelle d30b2.fit.
Le prétraitement sera automatiquement réalisé juste après les poses.
Le but du panneau est de paramétrer le nom des fichiers bias et dark et de lancer la pose et d'avoir un retour sur l'état du script (status). On souhaite donc réaliser un panneau comme ci dessous :

Le script se présente sous la forme d'une seul fichier (mon_acq2.tcl dans notre exemple) placé dans le dossier audela/audace/panneau. Au démarrage, l'interface Audace va trouver le fichier dans ce dossier et va ajouter automatiquement un intitulé (Mon acquisition dans cet exemple) au menu Panneau :

La suite de cette page expose le contenu complet du fichier script définissant le panneau. Pour le comprendre il faut connaître le langage Tcl/Tk et donc pratiquer les scripts de Audela. Nous avons écrit, en italique, le texte propre aux spécificités de ce panneau. Le reste du texte constitue la charpente sur laquelle on construit un nouveau panneau. Enfin, signalons qu'il est important de respecter un certain nombre de règles d'écriture pour que le panneau puisse être facilement intégré de façon standard dans l'interface Audace.
# fichier : mon_acq2.tcl
# description : panneau de methode d'observation personnelle.
# auteur : Alain KLOTZ
# date de MAJ : 19 Sep 2000
#
namespace eval ::Monacq {
# ============================================================
# === definition du namespace Monacq pour créer un panneau
===
# ============================================================
# =======================================================================
# === definition des fonctions de construction automatique
du panneau ===
# =======================================================================
variable This
proc init {{in ""}} {
createPanel $in.monacq
}
proc createPanel {this} {
variable This
global panneau
set This $this
set panneau(menu_name,Monacq) "Mon acquistion"
set panneau(Monacq,label_bias) "Fichier bias"
set panneau(Monacq,bias) "c:/audela/d0b2"
set panneau(Monacq,label_dark) "Fichier dark"
set panneau(Monacq,dark) "c:/audela/d30b2"
set panneau(Monacq,label_nom) "Fichier objet"
set panneau(Monacq,nom) "c:/audela/obj"
set panneau(Monacq,go) "GO"
set panneau(Monacq,label_status) "Status"
set panneau(Monacq,status) "Appuyer sur GO"
MonacqBuildIF $This
}
proc pack {} {
global unpackFunction
variable This
set unpackFunction ::Monacq::unpack
set a_executer "pack $This -anchor center -expand 0 -fill y -side left"
uplevel #0 $a_executer
}
proc unpack {} {
# --- ne pas toucher cette proc
variable This
set a_executer "pack forget $This"
uplevel #0 $a_executer
}
# ===========================================================
# === definition des fonctions a executer dans le panneau ===
# ===========================================================
proc cmdGo {} {
# --- fonction appelee par appui sur le bouton GO
variable This
global panneau
if {[::tel::list]!=""} {
set radec0 [tel1 coord]
} else {
# --- infos status
set panneau(Monacq,status) "Pb pas de tel"
$This.fra3.lab2 configure -text $panneau(Monacq,status)
update
return
}
if {[::cam::list]!=""} {
# --- calcule 5 positions legerement décalées autour de l'objet
set list_radec [mc_listradec [list optic naxis1 384 naxis2 256 foclen 1.2 \
pixsize1 18e-6 pixsize2 18e-6 crota2 0 \
ra [mc_angle2deg [lindex $radec0 0]] \
dec[mc_angle2deg [lindex $radec0 1]] ] \
{random 5} 20 ]
# --- effectue les 5 poses sur l'objet
for {set i 1} {$i<=5} {incr i} {
# --- infos status
set panneau(Monacq,status) "Flat $i /5"
$This.fra3.lab2 configure -text $panneau(Monacq,status)
update
# --- mise en forme des coordonnees a pointer
set ii [expr $i-1]
set radec [lindex $list_radec $ii]
ra [mc_angle2hms [lindex $radec 0]]
dec [mc_angle2dms [lindex $radec 1] dec]
set radec [list $ra $dec]
# --- pointage du telescope
tel1 goto $radec
# --- acquistion de l'image
acq 30 2
# --- sauvegarde de l'image sur le disque
saveima $panneau(Monacq,nom)-$i
}
# --- calcule 1 position hors champ a coté de l'objet pour le flat
set list_radec [mc_listradec [list optic naxis1 384 naxis2 256 foclen 1.2 \
pixsize1 18e-6 pixsize2 18e-6 crota2 0 \
ra [mc_angle2deg [lindex $radec0 0]] \
dec[mc_angle2deg [lindex $radec0 1]] ] \
{random 2} 1000 ]
set radec [lindex $list_radec 1]
set ra [lindex $radec 0]
set dec [lindex $radec 1]
# --- calcule 5 positions tres décalées autour de ce champ
set list_radec [ mc_listradec [list optic naxis1 384 naxis2 256 foclen 1.2 \
pixsize1 18e-6 pixsize2 18e-6 crota2 0 \
ra $ra \
dec $dec ] \
{random 5} 500 ]
# --- effectue les 5 poses sur le champ de flat
for {set i 1} {$i<=5} {incr i} {
# --- infos status
set panneau(Monacq,status) "Objet $i /5"
$This.fra3.lab2 configure -text $panneau(Monacq,status)
update
# --- mise en forme des coordonnees a pointer
set ii [expr $i-1]
set radec [lindex $list_radec $ii]
ra [mc_angle2hms [lindex $radec 0]]
dec [mc_angle2dms [lindex $radec 1] dec]
set radec [list $ra $dec]
# --- pointage du telescope
tel1 goto $radec
# --- acquistion de l'image
acq 30 2
# --- sauvegarde de l'image sur le disque
saveima f$panneau(Monacq,nom)-$i
}
# --- infos status
set panneau(Monacq,status) "Pretraitement"
$This.fra3.lab2 configure -text $panneau(Monacq,status)
update
# --- pretraitement : synthèse du flat
opt2 f$panneau(nom)- $panneau(Monacq,dark) $panneau(Monacq,bias) i 5
ngain2 i i 1000 5
smedian i f$panneau(Monacq,nom) 5
# --- pretraitement : corrections et compositage des images
opt2 $panneau(nom)- $panneau(Monacq,dark) $panneau(Monacq,bias) i 5
div2 i f$panneau(Monacq,nom) i 1000 5
noffset2 i i 200 5
register2 i j 5
smedian j $panneau(Monacq,nom) 5
# --- infos status
set panneau(Monacq,status) "Fini"
$This.fra3.lab2 configure -text $panneau(Monacq,status)
update
}
}
}
proc MonacqBuildIF {This} {
# ============================
# === graphisme du panneau ===
# ============================
global audace
global panneau
#--- Frame du panneau
frame $This -borderwidth 2 -height 75 -width 101 -bg $audace(color,backColor) \
-borderwidth 2 -relief groove
#--- Frame du titre du panneau
frame $This.fra1 -borderwidth 2 -height 75 -relief groove -width 92 \
-bg $audace(color,backColor2)
#--- Label du titre
label $This.fra1.lab1 -borderwidth 1 -text $panneau(menu_name,Monacq) \
-bg $audace(color,backColor2)
pack $This.fra1.lab1 -in $This.fra1 -anchor center -expand 1 -fill both -side top
place $This.fra1 -x 4 -y 4 -width 92 -height 22 -anchor nw -bordermode ignore
#--- Frame general
frame $This.fra2 -borderwidth 1 -height 77 -relief groove -bg $audace(color,backColor2)
#--- Label pour le nom du bias
label $This.fra2.lab1 -text $panneau(Monacq,label_bias) \
-bg $audace(color,backColor2) -relief flat
pack $This.fra2.lab1 -in $This.fra2 -anchor center -fill none -padx 4 -pady 1
#--- Entry pour le nom du bias
entry $This.fra2.ent1 -font {{Arial} 8 bold} -textvariable panneau(Monacq,bias) \
-bg $audace(color,entryColor2) -relief groove
pack $This.fra2.ent1 -in $This.fra2 -anchor center -fill none -pady 2 -padx 4
#--- Label pour le nom du dark
label $This.fra2.lab2 -text $panneau(Monacq,label_dark) \
-bg $audace(color,backColor2) -relief flat
pack $This.fra2.lab2 -in $This.fra2 -anchor center -fill none -padx 4 -pady 1
#--- Entry pour le nom du dark
entry $This.fra2.ent2 -font {{Arial} 8 bold} -textvariable panneau(Monacq,dark) \
-bg $audace(color,entryColor2) -relief groove
pack $This.fra2.ent2 -in $This.fra2 -anchor center -fill none -pady 2 -padx 4
#--- Label pour le nom de l'objet
label $This.fra2.lab3 -text $panneau(Monacq,label_nom) \
-bg $audace(color,backColor2) -relief flat
pack $This.fra2.lab3 -in $This.fra2 -anchor center -fill none -padx 4 -pady 1
#--- Entry pour le nom du bias
entry $This.fra2.ent3 -font {{Arial} 8 bold} -textvariable panneau(Monacq,nom) \
-bg $audace(color,entryColor2) -relief groove
pack $This.fra2.ent3 -in $This.fra2 -anchor center -fill none -pady 2 -padx 4
#--- Bouton GO
button $This.fra2.but1 -borderwidth 1 -text $panneau(Monacq,go) \
-bg $audace(color,backColor2) -command { ::Monacq::cmdGo }
pack $This.fra2.but1 -in $This.fra2 -anchor center -fill none -pady 8 \
-ipadx 25 -ipady 8
place $This.fra2 -x 4 -y 32 -width 92 -height 198 -anchor nw -bordermode ignore
#--- Frame des status
frame $This.fra3 -borderwidth 1 -height 77 -relief groove -bg $audace(color,backColor2)
#--- Label pour la designation du status
label $This.fra3.lab1 -text $panneau(Monacq,label_status) \
-bg $audace(color,backColor2) -relief flat
pack $This.fra3.lab1 -in $This.fra3 -anchor center -fill none -padx 4 -pady 1
#--- Label pour le status
label $This.fra3.lab2 -text $panneau(Monacq,status) \
-bg $audace(color,backColor2) -relief flat
pack $This.fra3.lab2 -in $This.fra3 -anchor center -fill none -padx 4 -pady 1
place $This.fra3 -x 4 -y 236 -width 92 -height 50 -anchor nw -bordermode ignore
}
# ================================
# === intialisation du panneau ===
# ================================
global audace
::Monacq::init $audace(base)
# === fin du fichier mon_acq2.tcl ===