FlightGear - Création d'avions et autres / Creation of aircraft and other

Vous désirez aider à améliorer les avions de Hangar de Helijah, c'est ici que cela se passe / You would like to help improving aircraft from Helijah's hangar, this is where it happens

Vous n'êtes pas identifié(e).

#26 2015-10-07 06:41:29

5H1N0B1
Developpeur
Inscription : 2012-08-07
Messages : 597

Re : Demande de fichier Nasal pour instrument pression d'air

Hello Didier,
Bon ben nickel tu passe directement à la programmation objet, chapeau bas.
Donc tu comprend qu'avec le 

doorsystem = Doors.new();

tu créé un nouvel objet, de type

Door

et tu va l'appeler

doorsystem

Et donc pour appeler une fonction de ton nouvel objet, il faut faire

nomDeMonObjet.NomDeMaFonction();

soit

doorsystem.Doors.leverexport();

Donc nickel.
Après il faut juste voir la visibilité de la variable mais si c'est dans le même fichier et que la création de l'objet n'est pas dans une fonction, alors c'est bon.

Est ce que tu as un message d'erreur ou est ce que ça ne marche tout simplement pas ?
Après l'idée si tu n'as pas de message d'erreur, c'est : ccommencer par mettre des getprop dès le début de la fonction et remplir une variable avec :

var myBackupAirPumpPower = getprop("controls/pneumatic/backup-air-pump/power");

etc...
puis après, un petit peu partout dans ton code tu met des print pour pister les valeur de tes variable et si le code s’exécute correctement quand les variable sont bonnes.

La syntaxe idéal du print :

print("Début de ma fonction, Valeur de myBackupAirPumpPower : " ~ myBackupAirPumpPower);

Et tu en met partout.L'idée c'est de pister le déroulement du code.
Quand ils ne te sont plus utiles, tu peut les mettre en commentaire : # ou les supprimer.

Voilou Bon débug.

5H1N0B1

Dernière modification par 5H1N0B1 (2015-10-07 06:41:56)

Hors ligne

#27 2015-10-07 17:48:06

Didier1963
Developpeur
Lieu : Bordeaux
Inscription : 2012-10-24
Messages : 1 238

Re : Demande de fichier Nasal pour instrument pression d'air

Salut Fabien,

tout d'abord, grand merci pour ton aide.
Je sait que je met un peu la charue avant les boeufs en attaquant direct, au lieu de parcourir d'abord la doc.

Je te le fait dans le désordre et te laisse trier.............. pense à préparer un verre deau et deux aspirines...........

Donc, avant d'attaquer, quand même, j'ai parcouru un certain nombre de fichier nasal de la "bibliothèque" d'avion que j'ai à dispo (451, que j'avais téléchargés du site FG.org en mai 2014).
Je continue d'ailleurs à les parcourir pour "picorer" dedans et retenir ce qui paraît intéressant pour utiliser plus tard (la gestion du systeme electrique par exemple, ou les instruments).

En même temps, quand ma connection me le permet, je vais voir les liens que tu m'as donné et le wiki FG sur le nasal :
ici

Pour les "print", j'en avait bien deviné l'utilité vu que tu en avais laissé en remarque dans le code de ton fichier pour le 2000 et celui du démarreur Viet; j'avais prévu de l'utiliser quand je serai un peu plus confortable dans la programmation.
Car pour le moment, c'est plutôt du bricolage de récupération de morceaux de code dont je ne comprend pas tout les tenants et aboutissants.

J'ai quelques questions tout de même :

- Je n'ai pas compris l'utilisation des "m." et "me." devant les noms de variable;
- Quelle est la différence entre "Door" et "Doors";
- Peu-t 'on créer un type d'objet (comme Door, par exemple), ou doit-t-on se limiter à des type prédéfinis (si oui, où en trouver la liste).
- dans "doorsystem.Doors.leverexport();" tu as trois noms. Tu me dit "nomDeMonObjet.NomDeMaFonction();", ça fait seulement deux.
Est-ce que, dans ce cas le "nomDeMonObjet" est composé en deux pour lui dire que son nom est "Doors" et qu'il fait partie de la branche "doorsystem"?

Comme je suis encore pas mal "dans les choux", j'avais penssé oublier ces "DoorQuelqueChose" et recommencer de zero avec des "AirPump ", ou BackupAirPump" (qui serait peut-être le mieux si je veux faire une gestion de compresseur et une gestion de pompe manuelle).
Je pense avoir compris que ça fonctionne un peu comme un systême d'abre de priorité.
Comme il s'agit de gestion du sytême d'air, je pense pouvoir appeler ma branche principale "pneumaticsystem". (est-ce que je peux mettre des majuscules à Pneumatic et à System?).
De cette branche principale, branche de 2éme niveau "AirPump", avec une branche de 3ème niveau "Lever".
Autre branche de 2ème niveau"AirCompressor", puisque dans mon systême pneumatique, j'ai deux sources de production d'air : le compresseur et la pompe de secours.

Ensuite, plusieurs sources de consomation d'air : le démarreur/distributeur, les freins, l'extincteur.

Je veux aussi me simplifier la vie en utilisant quelque chose d'existant (le mouvement de mon levier par le fichier doors.nas et sa fonction "leverexport".

Je me suis dit, J'ai déja le mouvement du levier dans les deux sans, il suffirait donc peut-être de trouver un moyen d'appeler la fonction de "toggle" si la position arrive 1 où a 0, tout ça pendant que le "power" est "true".

Donc, si j'ai bien compris, dans le cas où je prenne ce qui existe, il me faut un fichier.nas avec au début la définition des variable pour chaque élément dont je vais avoir besoin :

var BackupAirPumpPower = getprop(" = getprop("controls/pneumatic/backup-air-pump/power");power"); # l'etat du power de la pompe à air de secours
var LeverPosition = getprop(" = getprop("controls/pneumatic/backup-air-pump/lever/position-norm"); # la pôsition de mon levier

J'ai bien vu l'utilisation du "toggle" dan sun fichier.nas, mais n'ai pas compris comment l'utiliser
Si je regarde le code du wiper.nas du 747-400 qui m'a l'air pourtant assez logique (attention, je ne maîtrise pas les tabulation dans l'éditeur de texte du forum) :

# =====
# Doors
# =====

Doors = {};

Doors.new = func {
   obj = { parents : [Doors],
           door1 : aircraft.door.new("controls/electric/wiperl", 0.75),
           door2 : aircraft.door.new("controls/electric/wiperr", 0.75)
         };
   return obj;
};

Doors.door1export = func {
   me.door1.toggle();
}

Doors.door2export = func {
   me.door2.toggle();
}

# ==============
# Initialization
# ==============

# objects must be here, otherwise local to init()
doorsystem = Doors.new();

Pour cette première partie, je pense avoir compris.

# ==============
# Animations
# ==============

var wiperl = func { # la je créé une variable essuieglacegauche, et je lui donne sa fonction
	if (getprop("controls/electric/wiperl/switch") == 1                      #test conditionnel, si la propriété "controls/electric/wiperl/switch" est égale à 1(la vitesse 1 des essuie-glace)
        or getprop("controls/electric/wiperl/switch") == 2){                      # ou la propriété est égale à 2 (la vitesse 2 des essuie-glace)
		if (getprop("controls/electric/wiperl/position-norm") == 1     #test conditionnel, si "controls/electric/wiperl/position-norm" est égale à 1 (la position de l'essuie -glace gauche, après un aller)
               or getprop("controls/electric/wiperl/position-norm") == 0){       # ou la propriété est égale à 0 (la position de l'essuie -glace gauche, après un retour)
			Boeing747.doorsystem.door1export();              #alors toggle " doorsystem.door1export"......c'est là que je suis perdu! 
                                                                  #D'où sort ce "Boeing7473? Est-ce que je doit le remplacer par un "Simoun" ou un "Caudron-Simoun"?

		}                                                 # je referme le curly ouvert après mon second "or"
 	}                                                    # je referme le curly ouvert après mon premier "or"
 	if (getprop("controls/electric/wiperl/switch") == 0){         # test conditionnel, si "controls/electric/wiperl/switch" est à 0
 		if (getprop("controls/electric/wiperl/position-norm") == 1){   # test conditionnel, si "controls/electric/wiperl/position-norm" est égale à 1
 			Boeing747.doorsystem.door1export();                # alors toggle " doorsystem.door1export".
 		}                          # je referme le curly ouvert après mon second "if"
 	}                           # je referme le curly ouvert après mon premier "if"
	if (getprop("controls/electric/wiperl/switch") == 1){                        # test conditionnel, si "controls/electric/wiperl/switch" est égale à 1 (la vitesse 1 des essuie-glace)
		doorsystem.door1.swingtime = 0.75                    #mettre la valeur de la variable "door1.swingtime"  à 0.75 (3/4 de seconde)
	}                           # je referme le curly ouvert après mon  "if"
	if (getprop("controls/electric/wiperl/switch") == 2){                # test conditionnel, si "controls/electric/wiperl/switch" est égale à 2 (la vitesse 2 des essuie-glace)
		doorsystem.door1.swingtime = 0.49                  #mettre la valeur de la variable "door1.swingtime"  à 0.49 (1/2 de seconde)
	}                              # je referme le curly ouvert après mon  "if"

	settimer(wiperl, 0);                        # je remet le timer de "wiper" à 0
}                                 # je referme le curly ouvert après mon  "func", ce qui clos la description de ma fonction
_setlistener("/sim/signals/fdm-initialized", wiperl);                 # je lui demande de mettre en route un écouteur/observateur que j'appelle "wiperl" à l'initialisation des signaux du FDM ?
                          # là, pas trop sur de mon explication pour cette dernière ligne

     

SiVouPlaiMsieur.................

Dernière modification par Didier1963 (2015-10-07 17:55:01)


Pourquoi cet avatar : il a réussi à les arrêter LUI au moins.......
Amicalement, Didier, Poitiers 86; LFBI alt 129m, 46°35'22.9"N 0°18'32.7"E
"Ils ne savaient pas que c'était impossible, alors ils l'on fait" Marc Twain

Hors ligne

#28 2015-10-07 20:33:35

Didier1963
Developpeur
Lieu : Bordeaux
Inscription : 2012-10-24
Messages : 1 238

Re : Demande de fichier Nasal pour instrument pression d'air

BINGOOOOOOOOOOOOOOO !

Il bouge mon levier !

Je suis content...................... mais je ne suis pas content !!!!!!!!!!!!!!

Bhein oui, parceque je n'ai pas tout compris dans le code, et il m'as fallu tâtonner pas mal avant de trouver.


Pourquoi cet avatar : il a réussi à les arrêter LUI au moins.......
Amicalement, Didier, Poitiers 86; LFBI alt 129m, 46°35'22.9"N 0°18'32.7"E
"Ils ne savaient pas que c'était impossible, alors ils l'on fait" Marc Twain

Hors ligne

#29 2015-10-08 20:07:01

5H1N0B1
Developpeur
Inscription : 2012-08-07
Messages : 597

Re : Demande de fichier Nasal pour instrument pression d'air

Je voulais te répondre plus tôt et j'ai pas eu le temps :
Alors pour ce qui est du "m" c'est le même que "obj" c'est ce que tu va trouver dans la fonction "new" : la fonction

new

renvoi un objet (que tu nomme comme tu veux) de type Quetuveux dans ton exemple : Doors.
Donc il y a une fonction new qui est essentielle, puis les autres fonctions de l'objet. Quand tu fait l'appel à une variable de ton objet à travers d'une de ses propre fonction tu doit utiliser

me.maVariablePropre

ou si tu veux appeler une fonction

me.maPropreFonction

.

Dans ton cas ici c'est un cas qui porte à confusion :
En fait tu as 2 types d'objet différents : Door et Doors. donc on est bien dans le cas de "nomDeMonObjet.NomDeMaFonction();" mais effectivement c'est piégeux.

En fait quand tu regarde le new de Doors tu vois qu'il créé 2 objet de type Door et qu'il met dans deux variable différentes qui appartiennent à l'objet Doors

Tu dois avoir ailleurs une definition plus poussée de l'objet Door. Si tu m'as suivi jusque là, tu vois donc que l'objet Doors représentes un groupe de Door.

- Il n'y a de limite aux différents types que l'imagination. A noter que tu peux avoir arborescences d'objets à l'instar de ton groupe de Door... Et qu'en prog plus classique tu peux avoir une hérédité entre les objets, qui permettrai par exemple de définir la couleur de toutes tes porte qu'une seule fois.(je ne sais pas si c'est possible en nasal)

- Quant à ce code là :

doorsystem.Doors.leverexport();

en fait c'est parce que quand tu va voir le nom de ta fonction elle s'appelle Doors.leverexport

- Le code suivant ne peux pas marcher :

var BackupAirPumpPower = getprop(" = getprop("controls/pneumatic/backup-air-pump/power");power");

(Mais c'est peut etre une coquille de copié collé)

Ne t'inquites pas de toute façon c'est toujours à tatons que ça avance. Et c'est toujours 80% de réflexion, 20 % de code...
sauf qu'après tu as exactement le même temps à passer pour tester et corriger les bug
Donc 40% reflexion, 10% de code, et 50% de debug)
Bon courage n'hésites pas si tu as un souci
Fabien

Hors ligne

#30 2015-10-08 21:42:42

Didier1963
Developpeur
Lieu : Bordeaux
Inscription : 2012-10-24
Messages : 1 238

Re : Demande de fichier Nasal pour instrument pression d'air

Merci Fabien,

En effet dans la dernière ligne dont tu parles, il faut retirer :
(" getprop

Erreur de copié-collé de ma part.

En attendant ta réponse, j'ai fait des essais et un peu de lecture côté wiki (mais pas trop pour ne pas me mélanger les pinceaux.

J'ai réduit le code à ça :

# ===========================
# Backup  Air Pump Animations
# ===========================

var AirPumpLever = func {
     if (getprop("controls/electric/wiperl/switch") == 1 or getprop("controls/electric/wiperl/switch") == 2){
          if (getprop("controls/electric/wiperl/position-norm") == 1 or getprop("controls/electric/wiperl/position-norm") == 0){
               doorsystem.leverexport();
          }
      }
      if (getprop("controls/electric/wiperl/switch") == 0){
           if (getprop("controls/electric/wiperl/position-norm") == 1){
                doorsystem.leverexport();
           }
      }
     if (getprop("controls/electric/wiperl/switch") == 1){
          doorsystem.lever.swingtime = 2
     }
     if (getprop("controls/electric/wiperl/switch") == 2){
          doorsystem.lever.swingtime = 1
     }

     settimer(AirPumpLever,0);
}
_setlistener("/sim/signals/fdm-initialized", AirPumpLever);

ce n'est pas encore fini, mais tu peux voir que j'ai changé quelques noms çe qui rend moins confu le code.

J'ai aussi viré les "door1" et "door2" dans la première partie puisque mon "lever" fonctionne très bien

Pour la partie du bas :
- j'ai viré tout ce qui allait avec le "door2" (essuie-glace droit)
- j'ai viré le "Boeing747." et n'ai gardé que le "doorsystem.leverexport ();"
- j'ai changé le "wiperl" en AirPumpLever" au niveau du "var" , du "settimer" et du "setlistener"
- je vais aussi pouvoir virer ce qui concerne la deuxième vitesse d'essuie-glace.

et si je ne me trompe pas, je vais pouvoir changer les :
"controls/electric/wiperl/switch" en "controls/pneumatic/backup-air-pump/power" de façon à ce qui je lance la gestion pompage du fichier "backup-air-pump.nas"  en cliquant sur la pompe, et le mouvement du levier.
et les "controls/electric/wiperl/position-norm" en "controls/pneumatic/backup-air-pump/lever/position-norm"

Une foi tout ça terminé et au point, je devrais pouvoir faire la même chose pour la pompe à essence de secours qui se trouve juste au dessus vers la base de la fenêtre...........

Pour ce qui concerne le systême electrique, sauf erreur, il n'y a pas de batterie :
ce n'est pas un alternateur (qui a donc besoin d'une source électrique pour l'exciter), mais une dynamo, qui elle peu débiter du courant sans apport extérieur.

Prévoir une lampe de poche pour le pilote si il veut faire un vol de nuit !!

Ce qu'il ne pourra de toute façon pas faire car il n'y a pas de feux sur le Simoun.
J'ai épeluché les quelque 150 photos que j'ai glané ici et là, et n'en ai pas vu (même sur le F-BBRM dans les années 60, ou le F-AZAM de feu M. Prost qui volait encore début 2000, donc photo couleur),
ni feu en bout d'aile, ni feux de roulage, ni feu rouge clignotant sur le dessus de la dérive verticale ou le dessus et dessous du fuselage.

Dernière modification par Didier1963 (2015-10-08 21:48:03)


Pourquoi cet avatar : il a réussi à les arrêter LUI au moins.......
Amicalement, Didier, Poitiers 86; LFBI alt 129m, 46°35'22.9"N 0°18'32.7"E
"Ils ne savaient pas que c'était impossible, alors ils l'on fait" Marc Twain

Hors ligne

#31 2015-10-09 17:36:51

Didier1963
Developpeur
Lieu : Bordeaux
Inscription : 2012-10-24
Messages : 1 238

Re : Demande de fichier Nasal pour instrument pression d'air

Bon, voilà, on y est presque :
viet-starter-motor.nas

Après l'avoir adapté et viré tout ce qui ne servait plus, j'ai viré le code de gestion du mouvement du levier du fichier doors.nas et l'ai mis a sa place (dans le fichier viet-starter-motor.nas).

Il me reste à trouver où et comment ajouter un

(setprop("controls/pneumatic/backup-air-pump/power"), 0)

si le reservoir d'air est plein.

à suivre..................

Dernière modification par Didier1963 (2015-10-09 17:37:41)


Pourquoi cet avatar : il a réussi à les arrêter LUI au moins.......
Amicalement, Didier, Poitiers 86; LFBI alt 129m, 46°35'22.9"N 0°18'32.7"E
"Ils ne savaient pas que c'était impossible, alors ils l'on fait" Marc Twain

Hors ligne

Pied de page des forums

Propulsé par FluxBB 1.4.8