#1 [↑][↓] 31-05-2016 11:10:27

Fdd_fr
Membre
Lieu : entre LFPG et LFPO
Inscription : 22-03-2011
Renommée :   57 
Site Web

[FSX][P3D] Programmation XML : Aller plus loin que l'animation d'image

Bonjour à tous,

On trouve facilement des tutos sur internet pour écrire ou modifier des gauges XML; Mais souvent, ces tutos se cantonnent à l'animation graphique de bitmap, qui est il est vrai, la base d'une gauge.

Mais le XML de FSX permet aussi de bâtir des gauges sans images, dont le code sert à contrôler des gouvernes ou systèmes, gérer le plan de vol, simuler des pannes ou tout autre fonction demandant des algorithmes et pas simplement de la manipulation d'images bitmap.

Avec certaines modules Freeware d'extensions, on peut même lire/écrire dans des fichiers (créer une boite noire ou un FMC, sauvegarder les données/paramètres d'un vol) ou manipuler des chaines de caractères, ce que ne permet FSX en version de base.

Le XML est très simple comme langage, dès que l'on a adopté sa notation polonaise inversée qui est assez déroutante au début; Je n'y connaissais rien il y a encore 4 ans, et aujourd'hui, j'ai écris un panel qui contient plus de 20 000 lignes de code (dont une majorité de gauges ne possédant aucune image ! ): donc on apprends vite !

Donc, voilà, je me propose de centraliser ici de petits tutos de tout le monde, concernant les astuces de programmation qui sont peu documenter ou peu habituelles.

Malgré que cette section du forum a l'air d'être plutôt plus orienter création de scènes que écriture de gauge/panels, je pense qu'il serait sympa d'avoir un topic permettant d’approfondir le XML au-delà de la simple animation d'image.

Si vous êtes intéressé, je peux vous proposer des petits tutos sur les points suivants que je maitrise à peu prêt depuis que j'ai écris mon FMC :

- Utilisation de temporisations (Timers) soit pour retarder une action, ou faire clignoter un texte/image ou exécuté du code selon un interval bien précis
- Utilisation des boucles : exécuter un code jusqu'à ce qu'une condition soit vérifier par exemple pour afficher une liste
- Utilisation de XMLTools.dll, permettant de stocké en mémoire et de manipuler les chaines de caractère, et de lire/écrire dans un fichier
- Le paramétrage de la carte du GPS, que l'on peut afficher et personnaliser dans sa propre gauge
- la gestion du plan de vol de FSX

et bien sur, si d'autre créateur de gauges ont envie de faire partager leur connaissances, ils sont le bienvenue sur ce topic que je propose !

Voilà, donc n'hésiter pas à me faire part de votre avis ou demande...

François


Base de donnée SID/STAR FreeNav DB Group
Mon site photo
Win XP32 tweaké - I7 2700K@4,7Ghz - 4Go RAM - 3 SSD - 2 Velociraptors - 5 DD classiques - Nvidia 560 GTI - Ecran 26" 1920x1200 - FSX+ASE2012+pas mal de FTX et d'aéroports.

Hors ligne

#2 [↑][↓] 31-05-2016 11:10:53

Fdd_fr
Membre
Lieu : entre LFPG et LFPO
Inscription : 22-03-2011
Renommée :   57 
Site Web

Re : [FSX][P3D] Programmation XML : Aller plus loin que l'animation d'image

Réservé


Base de donnée SID/STAR FreeNav DB Group
Mon site photo
Win XP32 tweaké - I7 2700K@4,7Ghz - 4Go RAM - 3 SSD - 2 Velociraptors - 5 DD classiques - Nvidia 560 GTI - Ecran 26" 1920x1200 - FSX+ASE2012+pas mal de FTX et d'aéroports.

Hors ligne

#3 [↑][↓] 31-05-2016 11:26:05

ARCC
Membre
Lieu : Loc Maria Plouzane (29)
Inscription : 13-03-2008
Renommée :   

Re : [FSX][P3D] Programmation XML : Aller plus loin que l'animation d'image

Je te suivrais avec interet. Surtout pour la simulation de pannes aleatoires.

A+
Christian


Un ancien sous-marinier qui à pris de la hauteur.

Hors ligne

#4 [↑][↓] 31-05-2016 11:52:18

Marcstrasb
Modérateur
Lieu : Strasbourg - LFST 69 ans
Inscription : 14-03-2008
Renommée :   41 

Re : [FSX][P3D] Programmation XML : Aller plus loin que l'animation d'image

Bonjour François,

Bien que ne maîtrissant pas le sujet, je serai intéressé par tes tutos, ce qui pourra me donner des idées, ne sait on jamais !

A+
Marc


Windows 10 Professional 64 bits - Z490-A PRO (MS-7C75) DDR4 - Intel(R) Core(TM) i3-10100F CPU @ 3.60GHz - CORSAIR Vengeance LPX CMK16GX4M2E3200C 16 Go -  NVIDIA GeForce GTX 1060 6GB - Alimentation CORSAIR HX 750 Watt - Boitier BeQuiet! Pure Base 500 DX - Microsoft Flight Simulator 2020 Store

Hors ligne

#5 [↑][↓] 31-05-2016 12:31:04

BERJU83
Membre
Inscription : 02-10-2009
Renommée :   32 

Re : [FSX][P3D] Programmation XML : Aller plus loin que l'animation d'image

Bonjour,

Bonne idée que ces tutos! Cela peut rendre de signalés services à la communauté.

Même si il pourrait y avoir quelques redondances par rapport au fsdevelopper wiki c'est toujours bon à épingler ici en complément.

Berju.

Hors ligne

#6 [↑][↓] 01-06-2016 08:22:26

Fdd_fr
Membre
Lieu : entre LFPG et LFPO
Inscription : 22-03-2011
Renommée :   57 
Site Web

Re : [FSX][P3D] Programmation XML : Aller plus loin que l'animation d'image

FSdeveloper reste et restera "the reference", mais à l'inconvenient d'être 100% anglophone pour certain.

Je commence par les temporisation.

les temporisations peuvent avoir plusieurs usage :
- retarder la mise en route d'un système pour simuler une initialisation
- faire clignoter un texte ou une image selon une fréquence bien précise
- autoriser le fonctionnement d'un afficheur pendant un laps de temps
- etc ......


L'instruction fondamentale utiliser pour une temporisation est (P:Absolute time,seconds)
Cette instruction renvoie le temps écoulé en secondes depuis le 1er janvier de l'an 0, donc est incrementé en permanence.

Cas n°1 : Retarder la mise en route d'un système : Exemple initialisation des centrales inertielles.
Il suffit d'ajouter le script suivant dans l’événement "Mouse" du switch quii met en route/coupe le système :

(L:MaTempo,number) 0 == if{ (P:Absolute time,seconds) (>L:MaTempo,number) } els{ 0 (>L:MaTempo,number) }

Si la tempo est égale à 0 (signe que le système est à l'arrêt) alors on initialise la tempo en injectant la valeur du temps absolue. Dans le cas contraire (MaTempo n'est pas = à 0, cela veut dire que le système était déjà en route on qu'on cherche à l'éteindre, alors il faut réinitialiser la tempo pour qu'elle fonctionne lors du prochain démarrage du système: on remet à 0 la valeur de la tempo).

Ensuite, dans le paramètre visibilité de votre centrale inertielle ou de tout autre système en dépendant, il suffit d'insérer dans la condition de Visiblité :

<Visibility>(P:Absolute time, seconds) (L:MaTempo,number) 30 + &gt;</Visibility>

Ici, le système sera mis en route 30 secondes après son activation.







Cas n°2 : L'inverse : afficher quelques chose pendant x secondes après une action (souris ou autre)
Exemple concret : Sur le pilote automatique d'un Airbus, en mode managé, les afficheurs de vitesse et cap affichent en permanence "---", mais si le pilote veut pré-régler une valeur de vitesse et de cap, en tournant le bouton correspondant, l'afficheur est à nouveau actif, et ce pendant 15 secondes après la dernières action sur le bouton tournant.

Exemple avec le bouton "HDG"

On insère le script suivant dans l'évenement "Mouse" :

(M:Event) 'WheelDown' scmp 0 == if{ 1 (>K:HEADING_BUG_DEC) (P:Absolute time, seconds) (>L:tempo_hdg,number) }
(M:Event) 'WheelUp' scmp 0 == if{ 1 (>K:HEADING_BUG_INC) (P:Absolute time, seconds) (>L:tempo_hdg,number) }

Ainsi, dès que l'on actionne la roulette de la souris pour tourner le bouton HDG, donc actualise la valeur de la tempo "Tempo_HDG"


Ensuite, dans la section d'affichage du pilote automatique, pour la fenêtre HDG, il suffit d'insérer la condition de visibilité suivante :

Dans la section se chargeant de l'afficheur de cap :

<GaugeString>
%((P:Absolute time,seconds) (L:tempo_hdg,number) 20 + &lt; )%{if}%((A:Autopilot heading lock dir,degrees))%!03d!%{else}%---%{end}
</GaugeString>

Dès que j'actionne le bouton avec la molette de la souris, j'actualise la valeur de Tempo_HDG ; donc pendant 20 secondes, la condition du test sera vrai et la gauge affichera la valeur de cap et non pas les 3 tirets.






Cas n°3 : Faire clignoter un Texte/une bitmap ou contrôler le dosage d'une commande en boucle

Ici on va utiliser en plus la fonction mathématique Modulo, qui donne le reste entier d'une division (cette fonction est très utile aussi pour les switch):

la fonction :

(P:Absolute time,seconds) 1 % 0.5 1 * > !

Le premier chiffre est la longueur du cycle total en seconde
le second chiffre est la part du temps du cycle ou la condition est exécuté

Dans l'exemple si dessus, la condition est donc vérifiée pendant 1/2 seconde sur 1 secondes.

Donc si vous mettez ce script dans une condition de visibilité d'un texte ou d'une image, comme :

<Visibility>(P:Absolute time,seconds) 1 % 0.5 1 * > ! </Visibility>

Celui-ci clignotera une fois par seconde.


Autre exemple d'application; ralentir l'action sur une gouverne (car étant donner que les gauges sont exécuté 18x par secondes, une action répétée sur de nombreux cycles peut être trop brutale ou importante:

1.26 3.5 (A:ACCELERATION BODY Z, feet per second squared) rng
(A:Vertical Speed,feet per minute) 4800 &lt; and
(P:Absolute time,seconds) 1 % 0.05 1 * > ! and if{ 1 (>K:AP_PITCH_REF_INC_UP) }

Ici, si l'avion accélère entre certaine proportions, et que la vitesse verticale est inférieur à 4800ft/mn, alors j'actionne les élévateurs afin d'augmenter l'incidence de l'avion, mais l'action sur ces élévateurs n'est appliqué que tous les vingtièmes de secondes afin d'en limiter l'amplitude.


Voilà pour un premier essai.

A vous de me dire si cela vous intéresse, si la méthode de rédaction va et si ça peut servir à quelqu'un.

Dernière modification par Fdd_fr (01-06-2016 08:30:10)


Base de donnée SID/STAR FreeNav DB Group
Mon site photo
Win XP32 tweaké - I7 2700K@4,7Ghz - 4Go RAM - 3 SSD - 2 Velociraptors - 5 DD classiques - Nvidia 560 GTI - Ecran 26" 1920x1200 - FSX+ASE2012+pas mal de FTX et d'aéroports.

Hors ligne

#7 [↑][↓] 01-06-2016 09:37:06

BERJU83
Membre
Inscription : 02-10-2009
Renommée :   32 

Re : [FSX][P3D] Programmation XML : Aller plus loin que l'animation d'image

Bonjour François,

Bien sûr que ça peut servir! Même si nous n'avons pas toujours un besoin immédiat...comme pour un dictionnaire.
Merci.
Berju.

Hors ligne

#8 [↑][↓] 01-06-2016 13:13:01

cdtromain
Membre
Lieu : FOOG ou LFBH
Inscription : 09-12-2012
Renommée :   

Re : [FSX][P3D] Programmation XML : Aller plus loin que l'animation d'image

eusa_clap
Merci à toi, je dèbute dans le language xml.
tes exemples pour l'instant ne me concernent pas mais d'autres certainements !

Fsdevelopper en anglais sur un sujet qui est du chinois au début pour moi, c'est pas simple.
alors je ne peux que t'encourager dans cette voie
Encore merci
Romain

Dernière modification par cdtromain (01-06-2016 13:14:33)


514207365088signatureFSXWar.jpg396110miragedriver.png

Hors ligne

#9 [↑][↓] 02-06-2016 09:29:55

JRdE
Membre
Lieu : Perpignan
Inscription : 11-12-2010
Renommée :   

Re : [FSX][P3D] Programmation XML : Aller plus loin que l'animation d'image

Bonjour, et merci, c'est très intéressant, certainement. J'aurai eu une question, si je ne craignais de parasiter le post.
Par ailleurs, suggèrerais-je aux modérateurs la création d'une balise [XML] ?
De fait, la fonction "recherche" ne fonctionne qu'avec au moins huit caractères, donc cela ne serait pas très pertinent, et en réouvrant Pilote-virtuel.com dans un autre onglet et en testant la fonction recherche, je découvre qu'en mettant

[FSX] XML

j'obtiens bien une liste de posts sur le sujet.
Voilà, voilà... Expérimenter, ça marche.
Bonne journée


Jean, LFMP - ATIS 04 68 63 75 12
Hydravions, tagazous au raz-du-gazon, dans les gorges et sous les ponts,
Explorations lointaines, et Coups d'Etats

Hors ligne

#10 [↑][↓] 02-06-2016 14:10:42

Fdd_fr
Membre
Lieu : entre LFPG et LFPO
Inscription : 22-03-2011
Renommée :   57 
Site Web

Re : [FSX][P3D] Programmation XML : Aller plus loin que l'animation d'image

Si tu as des questions ou points particulier sur lequel tu veux des renseignements, n'hésite pas ; ce topic est fait pour cela et j'essairai d'y répondre dans la limite de mes faibles compétences, car j'ai encore pas mal de "trous" à combler.

Je vais préparer la suite avec les explications pour créer une boucle dans le code pour afficher une liste de données, comme par exemple la liste des pistes d'un aéroport, ou les fréquence ILS de ses pistes, les fréquences Radio, ou la longueur des pistes, etc...

J'essaie de pondre cela pour ce weekend.

Dernière modification par Fdd_fr (02-06-2016 14:11:12)


Base de donnée SID/STAR FreeNav DB Group
Mon site photo
Win XP32 tweaké - I7 2700K@4,7Ghz - 4Go RAM - 3 SSD - 2 Velociraptors - 5 DD classiques - Nvidia 560 GTI - Ecran 26" 1920x1200 - FSX+ASE2012+pas mal de FTX et d'aéroports.

Hors ligne

#11 [↑][↓] 02-06-2016 18:51:17

David W.
Membre
Lieu : Haguenau - LFSH
Inscription : 15-03-2008
Renommée :   22 
Site Web

Re : [FSX][P3D] Programmation XML : Aller plus loin que l'animation d'image

Belle initiative Fdd_fr wink

Hors ligne

#12 [↑][↓] 02-06-2016 23:37:55

JRdE
Membre
Lieu : Perpignan
Inscription : 11-12-2010
Renommée :   

Re : [FSX][P3D] Programmation XML : Aller plus loin que l'animation d'image

Fdd_fr a écrit :

Si tu as des questions ou points particulier sur lequel tu veux des renseignements, n'hésite pas ; ce topic est fait pour cela.

Bonsoir et merci.
Ainsi donc, je pille une jauge XML de crosoft récupérée sur le Lockeed Vega, celle du sélecteur de réservoir.
Je l'installe. J'ai aussi installé le starter Cessna, et tout fonctionne bien, pas de démarrage si le sélecteur est sur Off.

je vous mets les éléments mouse de la jauge :

<Gauge Name="fuel_popup" Version="1.0">
  <Image Name="fuel_popup_background.bmp"/>

  <!-- ========================= Fuel Selector ===================== -->
  <Element>
    <Position X="75.75" Y="74.75"/>
    <Image Name="fuel_popup_fuel_selector_knob.bmp" PointsTo="South">
      <Axis X="20.75" Y="68.75"/>
    </Image>
    <Rotate>
      <Value>(A:Fuel tank selector 1,enum)</Value>
      <Nonlinearity>
        <Item Value="0" X="35" Y="98"/>  <!-- Off -->
        <Item Value="1" X="115" Y="98"/>  <!-- All = Main -->
        <Item Value="2" X="37" Y="47"/>  <!-- Left Wing -->
        <Item Value="3" X="113" Y="47"/>  <!-- Right Wing -->
        <Item Value="6" X="76" Y="28"/>  <!-- Center Wing -->
        <Item Value="7" X="115" Y="98"/>  <!-- Main -->
        <Item Value="8" X="76" Y="120"/> <!-- Aux -->
      </Nonlinearity>
    </Rotate>
  </Element>
 
  <Mouse>
         
    <!-- Fuel Selector -->
    <Tooltip ID="TOOLTIPTEXT_VEGA_FUEL_SELECTOR"/>
    <Area Left="29" Top="75" Width="24" Height="36">
       <Cursor Type="Hand"/>
       <Click Event="FUEL_SELECTOR_OFF"/>
    </Area>
    <Area Left="29" Top="37" Width="26" Height="35">
       <Cursor Type="Hand"/>
       <Click Event="FUEL_SELECTOR_LEFT"/>
    </Area>
    <Area Left="60" Top="28" Width="30" Height="31">
       <Cursor Type="Hand"/>
       <Click>
         6 (&gt;K:FUEL_SELECTOR_SET)
       </Click>
    </Area>
    <Area Left="96" Top="34" Width="25" Height="39">
       <Cursor Type="Hand"/>
       <Click Event="FUEL_SELECTOR_RIGHT"/>
    </Area>
    <Area Left="93" Top="75" Width="29" Height="37">
       <Cursor Type="Hand"/>
       <Click>
         7 (&gt;K:FUEL_SELECTOR_SET)
       </Click>
    </Area>
    <Area Left="59" Top="91" Width="33" Height="30">
       <Cursor Type="Hand"/>
       <Click>
         8 (&gt;K:FUEL_SELECTOR_SET)
       </Click>
    </Area>
</Mouse>
</Gauge>

Puis je simplifie la jauge, ne laissant que le all et le off :

<Gauge Name="fuel_popup" Version="1.0">
  <Image Name="fuel_pop_background.bmp"/>
 
  <!-- ========================= Fuel Selector ===================== -->
  <Element>
    <Position X="75.75" Y="74.75"/>
    <Image Name="fuel_popup_fuel_selector_knob.bmp" PointsTo="South">
      <Axis X="20.75" Y="68.75"/>
    </Image>
    <Rotate>
      <Value>(A:Fuel tank selector 1,enum)</Value>
      <Nonlinearity>
        <Item Value="0" X="35" Y="98"/>  <!-- Off -->
        <Item Value="1" X="115" Y="98"/>  <!-- All = Main -->
       </Nonlinearity>
    </Rotate>
  </Element>
   
  <Mouse>
   
    <!-- Fuel Selector -->
    <Tooltip ID="TOOLTIPTEXT_VEGA_FUEL_SELECTOR"/>
    <Area Left="29" Top="75" Width="24" Height="36">
       <Cursor Type="Hand"/>
       <Click Event="FUEL_SELECTOR_OFF"/>
    </Area>
 
    <Area Left="93" Top="75" Width="29" Height="37">
       <Cursor Type="Hand"/>
       <Click>
         7 (&gt;K:FUEL_SELECTOR_SET)
       </Click>
    </Area>

    </Mouse>
</Gauge>

Et là, grosse surprise : si je lance les magétos alors que le sélecteur est sur Off, l'avion est pris de vertige et se met à tourner très rapidement sur son axe longitudinal, comme si l'on était en mode slew et qu'on martèle la touche Home. castet
1 je ne sais pas pourquoi
2 je voudrais que ça n'arrive pas !
Je peux faire une simple interrupteur on off, mais l'idée de la manette me plait bien.
Merci de m'éclairer, si c'est possible...


Jean, LFMP - ATIS 04 68 63 75 12
Hydravions, tagazous au raz-du-gazon, dans les gorges et sous les ponts,
Explorations lointaines, et Coups d'Etats

Hors ligne

#13 [↑][↓] 03-06-2016 09:44:42

Fdd_fr
Membre
Lieu : entre LFPG et LFPO
Inscription : 22-03-2011
Renommée :   57 
Site Web

Re : [FSX][P3D] Programmation XML : Aller plus loin que l'animation d'image

oula, c'est en format FS9, je n'ai pas bien l'habitude..

Je regarderais ton code ce soir en rentrant, mais essaie parfois il y a des piège bête genre des caractères non-autorisés dans les commentaires qui peuvent faire planter une gauge (vécu !).

Enlève tes signes "=" de ton commentaires (2 "=" qui se suivent est une instruction en XML, donc ça peut mettre la pagaille, car contrairement à ce qu'on pourrait penser, le parser lit ce qui'il y a dans les commentaires; Par exemples si tu mets un "é" ou "ç", ça plante directe ! )

François


Base de donnée SID/STAR FreeNav DB Group
Mon site photo
Win XP32 tweaké - I7 2700K@4,7Ghz - 4Go RAM - 3 SSD - 2 Velociraptors - 5 DD classiques - Nvidia 560 GTI - Ecran 26" 1920x1200 - FSX+ASE2012+pas mal de FTX et d'aéroports.

Hors ligne

#14 [↑][↓] 03-06-2016 15:50:24

Lagaffe
Membre
Lieu : LFPO / retraité
Inscription : 13-03-2008

Re : [FSX][P3D] Programmation XML : Aller plus loin que l'animation d'image

Bonjour,

Pour vérifier et être sur de la syntaxe d'un fichier XML il y a un truc tout bête qui consiste à essayer de l'ouvrir avec un navigateur internet.
En cas d'erreur de syntaxe, le fichier s'ouvrira mais ne sera pas formatté / indentté.

Ce truc est aussi valable pour les fichiers modeldef.xml !

Un second pour la route: utiliser Notepad++ qui est un très bon éditeur au lieu de Notepad de base. Notepad++ permet de voir d'un coup d'oeil si il manque une balise fermante, etc ....

Dernière modification par Lagaffe (03-06-2016 15:52:25)


@+ Didier
mini-Logo-Beaver-small.jpg
W10 Pro 64b Build 22H2 - Boitier HAF 932 - Z390 STRIX-F - 9900K - 2x16 Go - NVidia 3060 Ti 8 Go - Alim Corsair 800W - Ecran 34" - NVidia Studio ready 536.23
P3D v5.4 = http://www.pilote-virtuel.com/img/members/53/P3Dv5HF-Reglages-A.jpg - MSFS Deluxe/STORE - X-Plane 12B

Hors ligne

#15 [↑][↓] 10-06-2016 09:11:35

Fdd_fr
Membre
Lieu : entre LFPG et LFPO
Inscription : 22-03-2011
Renommée :   57 
Site Web

Re : [FSX][P3D] Programmation XML : Aller plus loin que l'animation d'image

Je continue mes petits tutos pour ceux que cela interesse.

Aujourd'hui, je vais essayer d'expliquer comment faire une boucle dans le code; Cette fonction est très utilie pour afficher des listes dans votre gauge, comme par exemple la liste des pistes d'un aéroport (avec ou sans les informations s'y rattachant), mais cela peut être aussi la liste des waypoints du plan de vol en cours, ou des fréquences radio d'un aéroport, ou des listes de données qui vous sont propre....

[large]Nota : Une boucle est toujours exécutée entièrement dans un cycle de gauge.[/large]

Commençons par exemple par la liste des pistes d'un aéroport, avec quelques informations complémentaires.

Pour cela, nous allons utiliser les macros du GPS de FS, qui donnent accès à une multitude d'information.

Pour utiliser les macro du GPS, il faut en tout premier lieu déclarer son usage dans votre gauge par :

<Macro id="Macro" Name="C:fs9gps"></Macro>

Ensuite, il va falloir faire ce qu'on appelle un "Transfert ICAO", pour préparer dire au GPS que l'on veut obtenir acceder aux informations d'un élément partituculier, ici un aéroport.
L'objet de ce tuto étant les boucles, je ne rentrerai pas dans le détail concernant la programmation du GPS de FSX, mais je vous recommande la lecture d'un ouvrage extrêmement bien fait de Rob Mc Elrath qui est une mine d'information pour toutes ses fonctions cachées : http://www.robbiemcelrath.com/fs/guides/gps

Pour effectuer mon transfert ICAO j'utilise la commande suivante :

'A      ' (C:fs9gps:FlightPlanDestinationAirportIdent,string) scat (>C:fs9gps:WaypointAirportICAO, string)

Puisque dans FSX, l'identigfiant d'un aéroport est constitué de la lettre "A", suivi de 6 espaces et enfin du code ICAO à 4 caractères de cette aéroport.

(C:fs9gps:FlightPlanDestinationAirportIdent,string) est une macro qui retourne le code ICAO à 4 lettres de l'aéroport de destination qui est dans le plan de vol courrant.

Une fois se transfert fait, le GPS est prêt pour envoyer toutes les infos concernant cet aéroport.

En premier, on stocke dans une variable "L" le nombre total de piste (y compris Helipad et piste "hydravion")

(C:fs9gps:WaypointAirportRunwaysNumber) (>L:NB_list_RWY, number)

Attention, l'index commence à 0 c'est à dire que la première piste à l'index 0, la seconde, l'index 1 etc...

Maintenant, nous allons afficher les infos sur ces pistes :

[small]<GaugeString>
%((L:NB_list_RWY, number) s2 0 !=)
    %{if}
        %(0 sp1)
        %{loop}
            %(l1 (>C:fs9gps:WaypointAirportCurrentRunway))

            %((L:NB_list_RWY, number) l1 == )%{if}%{end}

            %((C:fs9gps:WaypointAirportRunwayLength,feet) 3000 &gt; )%{if}%((C:fs9gps:WaypointAirportRunwayDesignation,string))%!s!\t%{else}%{end}

            %((C:fs9gps:WaypointAirportRunwayLength,feet) 3000 &gt; )%{if}%((C:fs9gps:WaypointAirportRunwayDirection,degrees) dnor )%!03d!% - %((C:fs9gps:WaypointAirportRunwayDirection,degrees) 180 - dnor )%!03d!\t%{else}%{end}

            %((C:fs9gps:WaypointAirportRunwayLength,feet) 3000 &gt; )%{if}%((C:fs9gps:WaypointAirportRunwayLength,feet))%!d!% Ft\t%{else}%{end}

            %((C:fs9gps:WaypointAirportRunwayLength,feet) 3000 &gt; )%{if}%((C:fs9gps:WaypointAirportRunwayLength,meters))%!d!% M%{else}%{end}
           
            %(l1 ++ s1 l2 &lt;)
        %{next}
    %{end}
</GaugeString>[/small]

1ere ligne : (L:NB_list_RWY, number) s2 0 !=
Ici, on teste c'est la condition d'affichage de notre texte : il faut qu'il y ait au moins 1 piste et on stocke le nombre de piste dans le registre 2

2eme ligne : (0 sp1) : Si c'est la cas, alors on initialise dans le registre 1 le premier index : 0

3eme ligne : {loop} : début de notre boucle

4eme ligne : (l1 (>C:fs9gps:WaypointAirportCurrentRunway)) : on envoie le premier index (valeur 0 pour le moment) au GPS de FSX

5eme ligne : ((L:NB_list_RWY, number) l1 == )%{if}%{end} on teste si cet index est égal à la derniere piste de la liste : si c'est le cas, on arrete la boucle, si non, alors on affiche

6eme ligne : ((C:fs9gps:WaypointAirportRunwayLength,feet) 3000 &gt; )%{if}%((C:fs9gps:WaypointAirportRunwayDesignation,string))%!s!\t%{else}%{end}
On affiche le nom de la piste : Le GPS va renvoyer par exemple "06-24". Notez que j'ai mis une condition d'affichage : Pour que la piste soit affichée, elle doit faire au moins 3000ft. Ceci permet de ne pas afficher les helipad, ou les piste gazonnées.

7eme ligne :   %((C:fs9gps:WaypointAirportRunwayLength,feet) 3000 &gt; )%{if}%((C:fs9gps:WaypointAirportRunwayDirection,degrees) dnor )%!03d!% - %((C:fs9gps:WaypointAirportRunwayDirection,degrees) 180 - dnor )%!03d!\t%{else}%{end}
Ici, je vais afficher la cap des pistes. Le GPS ne retourne que le cap de la proemiere piste, donc il faut ajouter une instruction (cappiste 180 - dnor) pour afficher le cap de la piste opposée

8eme ligne :%((C:fs9gps:WaypointAirportRunwayLength,feet) 3000 &gt; )%{if}%((C:fs9gps:WaypointAirportRunwayLength,feet))%!d!% Ft\t%{else}%{end}
affichage de la longueur de la piste en Pieds

9eme ligne :  %((C:fs9gps:WaypointAirportRunwayLength,feet) 3000 &gt; )%{if}%((C:fs9gps:WaypointAirportRunwayLength,meters))%!d!% M%{else}%{end}
Affichage de la longeur en metre

10eme ligne : (l1 ++ s1 l2 &lt;)
On incrémente le compteur de boucle et on véririf qui soit bien inférieur au nombre total de piste pour passer à l'index suivant

11eme ligne : {next} si le resultat du test précédent est vrai, on retourne  au début de la boucle pour la prochaine itération.
Si le resultat est faux, alors en exécute l'instruction de la ligne 12 : {end} : On sort de la boucle.


Exemple de résultat de plusieurs boucle :

830217frequenceetpistes.jpg

TOut cela est obtenu grace au macro du GPS et à des boucles.

Voilà, les boucles sont très utiles car de nombreuses informations renvoyées par les macro du GPS sohnt indexées, donc il faut exécuté une boucle pour les afficher ou les exploitées (liste de waypoints, liste des fréquences, liste des avions AI, liste de Navaids à proximité etc ......


N'hésiter pas à poser des question

Dernière modification par Fdd_fr (10-06-2016 09:15:42)


Base de donnée SID/STAR FreeNav DB Group
Mon site photo
Win XP32 tweaké - I7 2700K@4,7Ghz - 4Go RAM - 3 SSD - 2 Velociraptors - 5 DD classiques - Nvidia 560 GTI - Ecran 26" 1920x1200 - FSX+ASE2012+pas mal de FTX et d'aéroports.

Hors ligne

Pied de page des forums