JAUGES XML 1. GENERALITES Une jauge XML se

Transcription

JAUGES XML 1. GENERALITES Une jauge XML se
JAUGES XML
v 2.4
Une tentative de tutoriel non officielle et forcément parcellaire avec quelques considérations personnelles,
applicable à FSX et FS2004, et que je vais essayer de tenir à jour, améliorer, élargir, … d'autant plus facilement
que l'on voudra bien m'y encourager.
Je renvoie vers MSFS SDK pour tout détail : http://msdn.microsoft.com/en-us/library/cc526948.aspx
1.
GENERALITES
Les jauges XML sont écrites via un traitement de texte simple comme Notepad SANS formatage de texte. J'utilise le freeware
"Notepad++" particulièrement bien adapté.
Une jauge XML se compose de :
Une déclaration <Gauge Name="" version="" >
Une image de base (le plus souvent) au format bmp, qui doit se trouver dans le même dossier que le fichier xml.
Un ou des éléments <Element> qui reprennent :
Une image ou un ensemble d'images dont certaines sont mobiles (rotation et/ou translation)
Un ou des texte(s) affichables(s)
Un masque éventuel
Diverses opérations, lectures de paramètres, …
Eventuellement un (et un seul) élément "souris" <Mouse> qui comprend – si nécessaire :
Une ou des zones d'action <Area>
Des actions <Events ID> commandées <Click>
La gestion d'infobulles <Tooltip ID> et/ou <Help ID>
Programmation :
La syntaxe est celle de "msxml", progiciel inclus dans Windows. Il existe un programme "ace.exe" d'édition qui est – peutêtre – recommandable pour la transformation de jauges existantes et compliquées mais pour la création, je préfère le
travail "à la main".
Pour la clarté d'écriture : INDENTER (= faire des escaliers ; - ))
Programmation en "Polonaise inverse" =>
a b + =
(Ah! Les programmatrices HP des années '70
; - ))
Respect de la casse (parfois tout passe – parfois pas ?!)
Respect des espaces (idem)
Les jauges et leurs fichiers images sont regroupées dans un fichier compressé *.cab
Texte de base -
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Non obligatoire -
Explications
-
Méconnaissance/doute, …
-
Attention
TABLE
Modèle de base et quelques principes fondamentaux
Elements tournants : aiguilles, …
Elements glissants : manettes
La balise <Select> : modifications discontinues
Masques
Conditions
Les jauges-textes
Pannes
Souris
Alpha channel pour jauges
Et encore
Sources
FP_Gau_XML.doc – v 2.4 - p 1 de 12 - 13/04/10
3. Principes de base :
Sur une image de base (le plus souvent) , un ou plusieurs éléments images ou textes
•
•
•
•
•
•
•
se positionnent
tournent
glissent
permutent
s'impriment
s'affichent
s'estompent
<Position>
<Rotate>
<Shift>
<Select>
<Text>
<Image>
<Visible>
suivant des interventions via la souris et/ou des opérations sur des variables.
Structure de base :
<Gauge Name="Nom de jauge" Version="1.0">
Nom de jauge au choix mais à particulariser pour chaque jauge
Version=","
? influence ?
<Image Name="Image de base.bmp" ImageSizes=" , , , " Bright="" Alpha="" Luminous="" Use Transparency="" />
ImageSizes est facultatif mais sous FS9, les 2 premiers nombres (en nombre de pixels) représentent les dimensions du
bitmap pour un panel de largeur standard 1024, les 2 derniers pour 640.
Cette donnée devient impérative si les diverses images de la jauge ne sont pas à la même échelle.
Les valeurs des autres caractéristiques sont ="Yes" ou "No"
Bright= l'image reste illuminée suivant la palette "Day" de panel.cfg tout le temps – Ex : diodes, LCD
Luminous= l'image aura – de nuit – une correction de luminosité définie par "Luminous" dans panel.cfg
Alpha= si correctif "alpha" est appliqué (reflets) – nécessite un bitmap supplémentaire
Use Transparency= "No" : N'est Pas transparent (Raison ???)
<Element>
<Position X="" Y="" />
Les coordonnées X,Y se comptent à partir du coin supérieur gauche de l'élément de base – si pas indiquées, alors
alignement exactement sur le coin supérieur gauche de l'image de base.
<Image Name="Image de cet élément.bmp" ……..… />
</Element>
<Element>
<Text …………. >
<String> ………. </String>
</Text>
<Mouse>
…..
</Mouse>
</Gauge>
Tag ouvert <Tag> doit être fermé </Tag>
ou <Tag …………………… /> si il n'y a pas d'opération interne à cette balise.
Les valeurs toujours entre ""
Les éléments définis successivement s'empilent => chaque élément se superpose au précédant
FP_Gau_XML.doc – v 2.4 - p 2 de 12 - 13/04/10
4.
Les éléments tournants :
Aiguilles, boutons rotatifs, …
L
l
V
H
C
h
r
R
"ndl" : 30 x 70
"bkgd" : 120 x 120
Principe : L'aiguille "ndl" pivote autour de "r" aligné sur "R" en pointant sur les valeurs "Vx" définies ou calculées
Structure :
(Cette structure est quelque peu différente si présence d'un masque – cfr infra )
<Gauge Name="Modele de base" Version="1.0">
<Image Name="bkgd.bmp" Bright="" Luminous="" Alpha="" />
<Element>
<Position X="L" Y="H" />
<Image Name="aiguille.bmp" PointsTo="" Bright="No" Luminous="Yes" >
PointsTo="North, East, South ou West" suivant la direction initiale de l'aiguille
<Axis X="l" Y="h" />
</Image>
Coordonnées du point de rotation sur le bitmap "aiguille"
<Rotate>
<Value Minimum="" Maximum="">(A:Parameter,unit) opération(s) </Value>
<Scale X="" Y="" />
Valeur min (négative possible) et max applicables
Scale : échelle en pixel/unité – adapte les variations suivant des limites tolérables ou lisibles
<Nonlinearity> Sous FS-X petit "L"
<Item Value="A1" X="" Y="" />
……..
<Item Value="An" X= "" Y="" />
X,Y = Coordonnées des points sur le bitmap de base – dans le sens horlogique
</Nonlinearity>
<Delay DegreesPerSecond="" />
= Vitesse de rotation de l'aiguille en degrés par seconde
</Rotate>
</Element>
</Gauge>
FP_Gau_XML.doc – v 2.4 - p 3 de 12 - 13/04/10
5. Les éléments glissants : manettes
La structure est similaire à celle des éléments tournants – la référence se fait sur un point de l'élément mobile au lieu d'un
centre de rotation.
<Element>
<Position X="" Y="" />
<Image Name=" " …. >
<Axis X="" Y="" />
</Image>
Coordonnées du point de REFERENCE sur le bitmap mobile
<Shift>
<Value Minimum="" Maximum="">(A:Parameter,unit) opération(s) </Value>
<Scale X="" Y="" />
<Nonlinearity>
<Item Value="A1" X="" Y="" />
……..
<Item Value="An" X= "" Y="" />
Le point de REFERENCE du bitmap mobile se place aux coordonnées Xi Yi suivant la valeur
calculée de la donnée <Value>
Le glissement peut se faire suivant 2 axes (X et Y)
</Nonlinearity>
<Delay PixelsPerSecond="" />
</Shift>
Vitesse du mouvement
</Element>
6. La balise <Select>
Cette balise permet de lier des images à des conditions, donc de procéder à des modifications discontinues – par
opposition aux balises <Rotate> et <Shift>. Ex : Voyants, boutons ON/OFF
<Element>
<Select>
<Value Minimum="" Maximum="">(A:Parameter,unit) opération(s) </Value>
<Case value="x">< … action … /></Case>
<Case value="x+1"><Image Name="nomdimage.bmp" /></Case>
Dans "tel" cas, "telle" image est affichée sinon autre image …
Si "unit" = bool la valeur sera 0 ou 1 et x="0", x+1="1" - l'une des deux valeurs est suffisante
</Select>
</Element>
FP_Gau_XML.doc – v 2.4 - p 4 de 12 - 13/04/10
7. MASQUES
Le masque ou "cache" est une image en deux valeurs de noir qui divise la surface de l'élément qu'elle couvre en :
•
une zone totalement transparente : le bitmap de base apparaît et rien que lui, comme si il n'y avait pas de cache
•
une zone partiellement tranparente : cette zone laisse apparaître l'image intégrée
zone RGB 0,0,0
zone RGB 1,1,1
zone RGB x,x,x
=>
=>
=>
VDO_CHT.bmp
Zone totalement transparente
Zone transparente sauf pour l'image intégrée
Opaque et telle que définie
VDO_CHT_N.bmp
VDO_CHT_Mask.bmp
Aux fins d'une bonne lisibilité, le fond des images a été recoloré en vert au lieu du noir 0,0,0 . La partie noire du masque (à
droite ci-dessus) est du noir 1,1,1
En pratique, l'aiguille n'est visible qu'au travers de la "fenêtre 1,1,1" qui laisse aussi apparaître le fond de la jauge.
La zone 0,0,0 laisse entrevoir uniquement le fond donc PAS la partie de l'aiguille qu'elle recouvre.
Structure :
(Cette structure est quelque peu différente en l'absence d'un masque – cfr supra )
<Gauge … >
<Image Name="VDO_CHT.bmp" />
<Element>
<Position X="0" Y="0" />
Coordonnées du coin sup-gauche du masque par rapport au coin sup-gauche
de l'image de base = inutile ici puisque 0,0
<MaskImage Name="VDO_CHT_Mask.bmp">
<Axis X="104" Y="143" /> Coordonnées de l'ancrage de l'axe sur le bitmap du masque
</MaskImage>
<Image Name="VDO_CHT_N.bmp" PointsTo="North" Bright="No" Luminous="Yes">
<Axis X="16" Y="90" />
Coordonnées de l'axe sur le bitmap de l'aiguille
</Image>
<Rotate>
<Value Minimum="0" Maximum="150">(A:Eng1 cylinder head temperature,celsius)</Value>
<Nonlinearity>
<Item Value="0"
X="-38" Y="-38"/>
<Item Value="50"
X="-36" Y="-40" />
<Item Value="100" X= "0" Y="-50" />
<Item Value="150" X= "36" Y="-40" />
</Nonlinearity>
<Delay DegreesPerSecond="10" />
</Rotate>
</Element>
</Gauge>
Remarque :
Les coordonnées de pointage de l’aiguille sont calculées par rapport au centre de rotation sur le masque et peuvent donc
être négatives – contrairement aux coordonnées lorsqu’il n’y a pas de masque.
FP_Gau_XML.doc – v 2.4 - p 5 de 12 - 13/04/10
8. Les conditions – opérations
CONDITION : (… value 1 …) if{ (Traitement si value 1 VRAI) } els{ (Traitement si FAUX) }
ATTENTION aux espaces !
PAS d'espaces
↑↑ ↑
↑↑ ↑↑
↑
Dans les jauges-textes, une programmation à simple condition se construit comme ci-dessus mais si des conditions se
compliquent alors une syntaxe particulière est d'application – voir les jauges-textes infra.
AUTRE SYNTAXE :
(… value 1 …) s0
0 == if{ (Exec 1) }
els{ l0 1 == if{ (Exec 2) }
els{ l0 2 == if{ (Exec 3) }
els{ (Exec 4) }
Jauge à TROIS ETATS :
<Mouse>
<Click>(G:VarX) 1 + 3 % (&gt;G:VarX)</Click>
</Mouse>
Espaces partout hors parenthèses
Jauge ON/OFF ou TOGGLE :
Sur valeur booléenne :
(G:VarX) ! (&gt;G:VarX)
Activation bouton "PUSH ONCE" (Ex: bouton "test") :
<Area .... >
<Click Kind="LeftSingle+LeftRelease">(G:Var1) ! (&gt;G:Var1)</Click>
</Area>
FLASHING - Clignotement
<Select>
<Value> [Condition] if{ (P:Absolute time,seconds) S % } els{ 0 } </Value>
<Case Value="1">
<Image Name="" />
</Case>
</Select>
= toutes les "S" secondes
Aussi :
<Value> [Condition] if{ (P:Absolute time,seconds) 1 0,d * % } els{ 0 } </Value> = tous les "o,d" secondes
FP_Gau_XML.doc – v 2.4 - p 6 de 12 - 13/04/10
9. Les jauges-textes (diodes, LCD) :
<Position X="" Y="" />
<Text X="" Y="" Lenght="" Height="" Autres caractéristiques ……………. >
<String>Le texte désiré</String>
</Text>
X=
Y=
Length=
High=
Fixed=
Font=
Adjust=
"Largeur de la bande-texte en pixels"
"Hauteurde la bande-texte en pixels"
"Nombre de caractactères (dont "." , signe "-" et espaces éventuels)"
"Nombre de lignes"
"Yes" ou "No"
Yes : PAS de retour à la ligne possible
"Polices reconnues – voir liste dans FS\Fonts"
"Left" (défaut) ou "Center" ou "Right"
Alignement du texte DANS la bande texte.
Aussi reconnu sous FSX bien que formule soit HorizontalAlign=""
Color=
"#RRGGBB" ou "Red, Green, …"
Bright=
"Yes or No"
Yes : reste allumé si cockpit sombre (nuit)
Luminous= " Yes or No "
Yes : adopte éclairage défini dans panel.cfg
Ou
Ou
<String>Le texte ….. </String>
<String>%(Variable)% </String>
<String>%((A:Paramètre,unité))%!a.bf! </String> PAS d'espaces
!a.bf! = réel à a chiffres dont b après virgule
!0xd! = entier x chiffres + 0 significatif
!s! = texte
PREVOIR une longueur de caractère pour le signe "-"
Ou
<String>%(CONDITIONAL)%{if}TEXT TO DISPLAY IF TRUE %{else}TEXT TO DISPLAY IF FALSE %{end}</String>
Ex : <String>%((P:UNITS OF MEASURE, Enum) 0 == )%{if}%((A:Ambient Temperature, Farenheit))%!2d!
%{else}%((A:Ambient Temperature, Celsius))%!2d! %{end </String>
Syntaxe différente des sauts conditionnels - bien que ces derniers acceptés si forme simple
if, else, end
en minuscules
PAS d'espace entre
%(
)%{if}
)%!a,bf!
Espace parfois obligatoire avant %{else} ou %{end}
Le caractère ° [degré] N'est PAS toujours accepté ???
FP_Gau_XML.doc – v 2.4 - p 7 de 12 - 13/04/10
10. LES PANNES :
Création des causes : pour mémoire
Création des conséquences, du moins les plus fréquentes – TROIS Méthodes :
Méthode 1 : programmation directe
<SELECT>
….
<Failures>
<SYSTEM_ELECTRICAL_AVIONICS Action="0" />
<SYSTEM_ELECTRICAL_PANEL Action="Freeze" />
<SYSTEM_ENGINE Action="0" />
<SYSTEM_PITOT_STATIC Action="0" />
<SYSTEM_VACUUM Action="0" />
<GAUGE_Nomdejauge Action="Freeze" />
<GAUGE_Communications Action="Freeze" />
<GAUGE_Navigation Action="Freeze" />
</Failures>
….
</SELECT>
Actions possibles = None (?) , Freeze, Zero, Cover (?), NoDraw (?)
Les tags <Failures> doivent être DANS les tags <SELECT> ou <Text> le cas échéant
Méthode 2 : via une "sous-routine"
<Value Minimum="" Maximum="">(A:PARTIAL PANEL Nom de jauge, enum) 0 == if{ ….. } els{ ….. } </Value>
Valeurs possibles : 0 = ok
1 = fail
2= blank
Aussi <Value>(A:GENERAL ENG FAILED:index) 0 == if{ ….. } els{ ….. } </Value>
Méthode 3 : via une condition de visibilité
<Visible>(............formule / condition ...........)</Visible>
FP_Gau_XML.doc – v 2.4 - p 8 de 12 - 13/04/10
11. Element SOURIS
<Gauge>
…
<Mouse>
UN élément <Mouse> peut être appliqué à la jauge - il peut être scindé en plusieurs <Area> (aire d'influence)
L'élément <Mouse> comprend divers postes :
Une ou plusieurs zones d'application : <Area>
La forme du curseur dans cette zone
La création d'action (clicks divers qui entraînent l'exécution d'évènements (Events)
La définition d'infobulles (Tooltip et/ou HelpID)
<Area Left="" Top="" Right="" Bottom=""> ou <Area Left="" Top="" Width="" Height="">
Les valeurs (en pixels) délimitent la zone du bitmap de base dans laquelle la souris est active
Un seul de ces éléments est parfois suffisant , il marque alors la limite de la zone (Ex : Top="" => la souris est active
SOUS cette limite)
Si aucune aire n'est précisée alors la zone est valable pour toute la surface du bitmap de base
<Cursor Type="" />
Type = Hand ou Normal, DownArrow, UpArrow, LeftArrow, RightArrow, Crosshair, Grab et None
<Click Event="EVENT ID" Repeat ="Yes/No" /> UNE et une seule action !
Autrement :
<Click>0 (&gt;K:Event)</Click> ATTENTION 0 ou 16384 ou ???
Ou <Click Kind="" …………………. />
Voir liste complète à SDK Mouse Parameters
Voir bas de la présente page *
<Tooltip ID ="TOOLTIPTEXT_.........." />
Ou <Tooltip ID="Tooltip">
<DefaultId>TOOLTIPTEXT_... </DefaultId>
<MetricId>TOOLTIPTEXT_...
</MetricId>
<EnglishId>TOOLTIPTEXT_...
</EnglishId>
Respect casse et espaces !
</Tooltip>
= Affichage d'une info-bulle pré-formatée – dans le(s) système(s) correspondant(s)
Voir bas de la présente page **
Ou <Tooltip>%((Lecture de variable))%!a,b! = Formatage comme pour jauge texte</Tooltip>
<Help ID="HELPID_ … " />
Idem que Tooltip mais Texte préformaté only - moins bien que "Tooltip" mais insérable dans même "area"
</Area>
<Area> …. </Area> Diverses zones peuvent être définies mais EVITER les recouvrements
</Mouse>
</Gauge>
Voir aussi Par12 infra pour lancer une action en poussant une touche : <Keys>
* Ex : <Click Event=" COM_RADIO_WHOLE_INC " Repeat ="Yes" />
Voir autres exemples dans "Opérations" – cfr Supra
Voir liste complètes des événements dans SDK à Event ID
incrémente Freq radio COM1 à chaque clic
** Ex : <Tooltip ID ="TOOLTIPTEXT_ALTIMETER_FEET" /> affiche l'altitude en pieds
Voir liste complète des événements dans SDK à Tooltip
Ex : <Tooltip ID="">Affiche ce texte libre</Tooltip>
FP_Gau_XML.doc – v 2.4 - p 9 de 12 - 13/04/10
12 . ALPHA CHANNEL pour jauges :
Principe : créer un dessin des reflets voulus, au format targa (tga) et le convertir en bmp "spécial".
J'utilise Paint Shop Pro par habitude - v 4.1 de 1997, incomplet mais léger :
Sur base d'une copie du bitmap de base de la jauge,
• créer le(s) dessin(s) pour reflets voulus, blanc 200-200-200/255-255-255 sur noir 000-000-000/040040-040; travailler et brouiller légèrement.
• NE PAS trop réduire la luminosité ni le contraste !
• J'enregistre en bmp classique - vu que PSP ne reconnaît pas le format tga.
Il faut alors ouvrir le fichier bmp avec Paint.Net (gratuit – quelques fonctions intéressantes dont la gestion
du format tga) :
Calque/Propriétés : opacité du calque = ± 100 soit entre de 255 (opacité) => 0 (transparence).
ROGNER pour sélectionner la partie utile.
Enregistrer sous .tga en 32bits sans compression.
Laisser ouvert (pour modif' éventuelle ultérieure)
Sous ImageTool, ouvrir le fichier .tga et … :
Image/Make gauge/alpha (transformation auto en 8bits + alpha). Ne pas s'étonner mais le contraste diminue
fortement.
Sauver (automatiquement en .bmp) vers le dossier du groupe des jauges.
Laisser ouvert (pour modif' éventuelle ultérieure).
Transfert fichier cab, … Test, …
Rem : Le fichier .xml doit contenir la déclaration suivante :
<Element>
<Position …………… />
<Image Name="Nom_de_image_avec_reflets.bmp Alpha="Yes" />
</Element>
Cette déclaration doit être placée comme DERNIER ELEMENT – semble-t-il ou APRES les masques ?!
Attention : l'image obtenue est un format "bmp" spécial, toute modification avec un logiciel inapproprié
pourrait ôter les reflets.
FP_Gau_XML.doc – v 2.4 - p 10 de 12 - 13/04/10
13. Et encore
<!-- Commentaire --> ou <Comment> ……. </Comment>
Mais à l'intérieur d'une opération :
&gt; (greater)
&lt; (lesser)
&amp;&amp;
%(… (* commentaire *) ...)%
">"
"<"
"=="
<Update Frequency="a" /> = a fois par secondes (1= défaut)
(G:Var1) à (G:Var9)
variables utilisables dans chaque jauge, mais rien que pour elle
(L:NomVar, unité)
49
S0 --> s49
Nombre de "stacks" disponible par opération
utilisables dans le tableau de bord => exploitables par plusieurs jauges
"NomVar" peut être remplacé par une "appellation" quelconque
L'unité DOIT TOUJOURS être déclarée
Variable booléenne acceptée
AFFECTATION d’une touche pour éxécuter une opération – NE semble PAS fonctionner sous FS9
<Keys>
<On Key="Caractère de la touche">Opération</On>
</Keys>
NE PAS encadrer par une balise <Select>
La touche choisie a priorité sur les touches pré-copnditionnées
Rappels :
<Value>%(A:...................) espace (...............)%!a,bf!</Value>
PAS d'espace entre %( ni entre )%!a,bf!
%(CONDITIONAL)%{if}TEXT TO DISPLAY IF TRUE%{else}TEXT TO DISPLAY IF FALSE%{end}
If, else, end en minuscules
Dans ce cas-ci %{else} avec "e" à la fin, sinon els{} sans "e"
Pas d'espace entre "%" et "{"
Tooltip ID=""
espace
et
ID en majuscules
(G:Var1) 1 == (G:Var3) 1 == &amp;&amp; souvent préférable à
(G:Var1) (G:Var3) &amp;&amp;
Il semble que Nonlinearity passe toujours - PAS NonLinearity
Eclairage des panels et jauges : ultérieurement
FP_Gau_XML.doc – v 2.4 - p 11 de 12 - 13/04/10
14. Sources et remerciements :
Pour tous (?!) détails : http://msdn.microsoft.com/en-us/library/cc526948.aspx
MS SDK – X:\.....\SDK\sdk overview.html
Nick Pike 2005 – voir à http://www.fs2x.com/ section "Tutorials
Stéphane Lavergne 2004 (en Français et devenu introuvable !)
Arne Bartels – dont de nombreuses entrées sur le forum d'Avsim
Dai Griffith
Les jauges de MSFS, et celles de quelques confrères dont Ken Mitchell, …
Cet exercice, fait avec beaucoup de plaisir et de sueur aussi est libre d'exploitation mais devrait rester sous
mon contrôle; merci dès lors de me faire savoir si vous désirer l'exploiter à d'autres fins que personnelles.
Bien entendu, tout commentaire est le bienvenu.
Pierre Fasseaux – 11 juillet 2007
"A vous de jouer", Pierre
Liège, août 2009
[email protected]
www.fassapi.net
FP_Gau_XML.doc – v 2.4 - p 12 de 12 - 13/04/10