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 % (>G:VarX)</Click> </Mouse> Espaces partout hors parenthèses Jauge ON/OFF ou TOGGLE : Sur valeur booléenne : (G:VarX) ! (>G:VarX) Activation bouton "PUSH ONCE" (Ex: bouton "test") : <Area .... > <Click Kind="LeftSingle+LeftRelease">(G:Var1) ! (>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 (>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 : > (greater) < (lesser) && %(… (* 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 == && souvent préférable à (G:Var1) (G:Var3) && 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