Forum général.général connection GNUplot et script linux

Posté par  .
Étiquettes : aucune
0
2
avr.
2008
Salut,

je veux créer un script linux qui prend en argument deux valeurs $1 et $1, ce script doit lancer gnuplot et tracer le point (x,y). ce que je veux réaliser en gros:

la première fois je lance par exemple :
./script.sh 2 3
./script.sh 3 4

je demande quoi écrire dans le script pour que quand je lance ces deux commandes par exemple je doit avoir une droite qui connecte (2,3)--->(3,4)

le problème que j ai , c'est que a chaque lancement une nouvelle fenêtre se lance, moi je veux tracer dans la même fenêtre ( la fenêtre dois que je la ferme manuellement)

besoin vraiment de votre aide

Merci d'avance
  • # Incohérence

    Posté par  . Évalué à 2.

    Je pense que tu as oublié d'expliquer quelque chose.

    Tu souhaites passer les coordonnées d'un seul point alors que tu veux tracer une droite. Je ne crois pas qu'un bon mathématicien soit capable de faire ça. Alors avec un simple script ça ne va pas être facile :-)

    La solution est toute simple:
    ./script.sh 2 3 3 4
    Après, je ne sais pas ce qui est dans ton script, mais là déjà tu as les deux points, donc possibilité de tracer une droite.

    Tu as peut-être oublié de préciser que tu as un programme qui ne te fourni que 2 paramètres à la fois. Ou quelque chose du genre.
    • [^] # Re: Incohérence

      Posté par  . Évalué à 1.

      Pas forcément si le script peut lire des données depuis gnuplot.

      Ensuite pour le contenu du script il faut réussir à communiquer avec gnuplot.

      Je ne le connais pas du tout mais a ta place je regarderais du coté de DBUS/DCOP, ou des arguments de gnuplot.

      Sinon peut être propager des messages systèmes qui simulerais des clicks, mais là ça deviens très tarabiscotté.
    • [^] # Re: Incohérence

      Posté par  . Évalué à 1.

      Merci pour vos réponses.
      je vois que j'ai pas bien expliquer ce que je veux faire.

      bon les arguments du script sont $1 qui est a chaque fois incrémenter de 1 ( automatiquement) et $2 qui est donné aléatoirement. bon si je lance par exemple ce scripte 100 fois je vais avoir 100 points . donc ce que je veux faire c'est de tracer le graphe qui passe par tous ces points !!!

      les problèmes que j'ai : comment connecter ces points avec gnuplot ???
      le 2 éme : je veux par exemple , si je lance ce script 100 fois , gnuplot me tracera ces 100 points (connecté) dans une seule fenêtre. (avec le programme que j'ai réalisé, si je lance 100 fois ce script , ja vais avoir 100 graphe , chaque graphe c'est que le point donné en argument!!!!)

      j'éspère que j'ai bien expliquer mon problème
      • [^] # Re: Incohérence

        Posté par  . Évalué à 2.

        Bonsoir, ce qu'il te faut, c'est détacher le process gnuplot de ton script pour qu'il reste dans son co1n. Voici une idée pour faire cela:
        # Le nom du pseudo-fichier qui va permettre d'envoyer les instructions
        # à gnuplot (c'est une FIFO, pour ceux qui suivent pas)
        MAFIFO=/tmp/ma_jolie_fifo_a_moi_que_jai
        
        if [ ! -f $MAFIFO ]; then
          # C'est la première fois, il faut donc la créer
          mkfifo $MAFIFO
        
          # ...et lancer gnuplot
          gnuplot < $MAFIFO &
          # Ne pas oublier le '&', car le gnuplot il est grand, il est majeur,
          # il va vive sa vie bien gentillement de son côté
        fi
        
        # Bon, bin plus qu'à envoyer une commande:
        echo "Hello you..." >> $MAFIFO
        # Je sait pas pourquoi, mais je pense qu'il va pas l'aimer celle là,
        # pourtant j'suis poli :)
        
        voila l'idée, plus qu'à remplir joyeusement et avec entrain.
        • [^] # Re: Incohérence

          Posté par  . Évalué à 1.

          Merci bien.
          Mais malheureusement j'ai pas bien compris le code. si tu peux m'aider plus ça va me faire un grand plaisir.
          ou je peux utiliser les arguments!!! (x et y) .
          et merci aussi de m'expliquer ce que cette instruction fait:
          commande >> $MAFIFO
          • [^] # Re: Incohérence

            Posté par  . Évalué à 2.

            En même temps, le code ne fonctionnais pas... Voici qui fonctionne:
            MAFIFO=kapoueee
            if [ ! -p $MAFIFO ]; then
              mkfifo $MAFIFO
              ( while true; do
                  cat $MAFIFO
                done | gnuplot
              ) &
              echo "set multiplot"     > $MAFIFO
              echo "set xrange [0:10]" > $MAFIFO
              echo "set yrange [0:10]" > $MAFIFO
            fi
            echo "plot \"< echo $1 $2\" w p pt 2" >> $MAFIFO
            
            • [^] # Re: Incohérence

              Posté par  . Évalué à 1.

              Re,
              Merci beaucoup Mensieur.Cristopher: le code Marche bien. mais j'ai eu un petit problème c'est que j'ai fermé la fenêtre manuellement et apres quand j'ai voulais lancer le script, rien ne s'affichera.
              En gros, c'est ça le code que je cherche.
              Merci beaucpoup une autre fois.
              • [^] # Re: Incohérence

                Posté par  . Évalué à 2.

                Là par contre je vais te décevoir: ce n'est pas possible (simplement, en tout cas)...

                Le problème est le suivant: quand tu ferme la fenêtre, c'est normal pour gnuplot, donc il ne fait rien, il ne préviens pas, il ne se termine pas. Donc, comme on ne peut pas savoir du côté du script que la fenêtre à été fermée, on ne peut pas réagir en conséquence.

                Les seules solutions reposent sur du bricolage. Je fais quelques essais et je te tiens au courant.
                • [^] # Re: Incohérence

                  Posté par  . Évalué à 2.

                  Bon en fait voila, c'est presque pas compliqué...
                  MAFIFO=kapoueee
                  if [ ! -p $MAFIFO ]; then
                    MAFNETRE="Mon GNUPLOT a moi"
                    mkfifo $MAFIFO
                    ( tail -f $MAFIFO | gnuplot ; rm $MAFIFO ) &
                    echo "set term x11 title '$MAFNETRE'" > $MAFIFO
                    echo "set multiplot"     > $MAFIFO
                    echo "set xrange [0:10]" > $MAFIFO
                    echo "set yrange [0:10]" > $MAFIFO
                    ( sleep 5 ; while
                        xprop -name "$MAFNETRE" WM_NAME > /dev/null 2>&1
                      do sleep 1; done ; echo "quit" > $MAFIFO
                      sleep 1 ; echo "exit" > $MAFIFO ) &
                  fi
                  echo "plot \"< echo $1 $2\" w p pt 2" >> $MAFIFO
                  
                  • [^] # Re: Incohérence

                    Posté par  . Évalué à 1.

                    Merci ,,,
                    mais il y'a encore un petit problème, la fenêtre se ferme après 5ms!!
                    j'essaye de travailler avec un 3ème argument. qui prend 2 valeurs "oui" ou "non",
                    oui : ça veut dire c'est le dernier point a tracer dans la fenêtre ("donc la fenêtre(gnuplot) doit se fermer apres une seconde par exemple)
                    non: ça veut dire il y'a des autres points a ajouter a ce graphe ( et dans ce cas ton premier code fait le travail)
                    j'ai pas réussi encore a le faire, mais je crois que c'est une bonne méthode. Que dite vous Mr.Cristophe et Merci de m'aider encore une fois
                    • [^] # Re: Incohérence

                      Posté par  . Évalué à 2.

                      mais il y'a encore un petit problème, la fenêtre se ferme après 5ms!!

                      Il vaut vérifier que la commande xprop fonctionne, car c'est elle qui détecte que l'on a fermé la fenêtre. Pour cela, taper xprop -h dans un terminal devrais confirmer que c'est bon. S'il ne trouve pas la commande, cela vas être difficile.

                      j'essaye de travailler avec un 3ème argument. qui prend 2 valeurs "oui" ou "non",
                      oui : ça veut dire c'est le dernier point a tracer dans la fenêtre ("donc la fenêtre(gnuplot) doit se fermer apres une seconde par exemple)


                      il suffit de rajouter à la fin le code suivant:
                      if [ "$3" = "oui" ]; then
                         echo "quit" > $MAFIFO
                      fi
                      • [^] # Re: Incohérence

                        Posté par  . Évalué à 1.

                        Re,
                        je vois que la solution c'est quand l'argument3 est "oui" il faut executer la commande
                        rm -f kapoueee, qd je le fait manuellement ça marche, qu'on je lance le script une nouvelle fois ça marche bien, mais quand j'ai rajouter cette commande au script, le message d'erreur suivant s'affiche : cat: kapoueee: Aucun fichier ou répertoire de ce type

                        voici le script :

                        MAFIFO=tube
                        if [ ! -p $MAFIFO ]; then
                        MAFENETRE="MOn Graphe"
                        r="countinue"
                        mkfifo $MAFIFO
                        (
                        while [ "$r" = "countinue" ]; do
                        cat $MAFIFO
                        done | gnuplot
                        ) &
                        echo "set term x11 title '$MAFNETRE'" > $MAFIFO
                        echo "set multiplot" > $MAFIFO
                        echo "set xrange [0:4000]" > $MAFIFO
                        echo "set yrange [0:400]" > $MAFIFO
                        fi
                        echo "plot \"< echo $1 $2\" w p pt 2" >> $MAFIFO
                        if [ "$3" = "oui" ]; then
                        echo "quit" > $MAFIFO
                        r="nocountinue"
                        rm -f tube
                        fi

                        je demande pourquoi ce script ne marche pas "la commande rm -f tube" cause toujours un problème
                        • [^] # Re: Incohérence

                          Posté par  . Évalué à 2.

                          la variable r ne sert à rien, car comme indiqué au fin-fond de la page de man de bash:

                          If a command is terminated by the control operator &, the shell executes the command in the background in a subshell.

                          Le subshell signifie qu'il a lancé un nouveau shell, donc la variable r n'est plus la même, donc changer sa valeur dans le premier shell ne sera pas vu dans le deuxième shell.

                          Si tu fais rm tube, tu détruit le "fichier", mais pas ce qui lis de l'autre côté. Si tu ne veux pas de problème, il faut faire:

                          echo "quit" > $MAFIFO ; sleep 1; echo "exit" > $MAFIFO
                          sleep 1; rm $MAFIFO


                          comme dans mon 2e exemple, pour n'éffacer le "fichier" que quand l'autre côté en a bien terminé avec.
                          • [^] # Re: Incohérence

                            Posté par  . Évalué à 1.

                            Merci,

                            maintenant ça marche bien,

                            Merci encore une autre fois...
                            • [^] # Re: Incohérence

                              Posté par  . Évalué à 1.

                              Re,
                              Je vais vous deranger une autre fois Mr.Cristophe
                              est-ce que vous pouvez m'expliquer que fait cette commande exactement:
                              echo "plot \"< echo $1 $2\" w p pt 2" >> $MAFIFO

                              car je voulais supprimer le echo argment1 argument2 qui apparait dans le graphe, mais j'ai pas réussi...
                              • [^] # Re: Incohérence

                                Posté par  . Évalué à 2.

                                pour supprimer la légende, il suffit de rajouter:

                                echo "unset key" > $MAFIFO

                                après le set yrange

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.