IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Génération d'une figure par le curseur


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 26
    Points : 13
    Points
    13
    Par défaut Génération d'une figure par le curseur
    Bonjour à toutes et à tous.

    Pour situer un peu le contexte, j'ai créé une fonction qui permet de générer une sorte de cartographie d'un rayonnement d'une antenne en prenant en compte plusieurs phases. (voir image en pièce jointe).

    Pour chaque loi de phase (en ordonnée) correspond un diagramme de rayonnement, et un gabarit associé.

    Grace aux lignes suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dcm_obj = datacursormode(fig);
    set(dcm_obj,'UpdateFcn',@myupdatefcn)
    j'appelle la fonction myupdatefcn qui contient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function [txt,fig] = myupdatefcn(empt,event_obj)
    global l;global diag;
    pos = get(event_obj,'Position');
    txt = {['Direction: ',num2str(pos(1))],...
           ['Loi de phase: '],...
           [l{pos(2)}],...
           ['Niveau (normalisé): ',num2str(diag(pos(2),pos(1)))]};
    et qui permet de faire apparaître sur le curseur les données que je veux.

    J'aimerais en même temps que je place le curseur, générer une figure supplémentaire qui affiche le diagramme correspondant.

    J'ai essayé d'ajouter à la fonction myupdatefcn

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    figure;
    plot(diag(pos(2),:))
    Le problème est que 8 figures s'ouvrent en même temps!

    Une idée?

    Merci
    Images attachées Images attachées  

  2. #2
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Salut,
    Tu as défini une variable diag, qui est aussi une méthode matlab, c'est mal! Dur de prédire ce que va faire matlab dans ce cas.
    Tu obtiens 8 fois exactement la même figure?

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Très bien j'ai remplacé la variable "diag" par "patt".

    En effet c'est exactement 7 fois la même figure (j'avais dit 8, c'était sans compter la figure princiaple représentant la cartographie). Après je ne sais pas si l'ordre est important. La figure 8 vient se placer au-dessus de la figure 1 (la figure principale). Les 6 autres, qui sont exactement les mêmes que la figure 8, viennent se placer derrière la figure 1.

  4. #4
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Je n'arrive pas à reproduire ton problème. Tu peux nous montrer tout le code de myupdatefcn ?
    Tu utilises quel(s) méthodes pour dessiner ta cartographie?

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Voici le code complet de myupdatefcn:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function [txt] = myupdatefcn(empt,event_obj)
    global l;global patt;global gab;global pos;
    %pause(3);
     
    pos = get(event_obj,'Position');
     
    txt = {['Direction: ',num2str(pos(1))],...
           ['Loi de phase: '],...
           [l{pos(2)}],...
           ['Niveau (normalisé): ',num2str(patt(pos(2),pos(1)))]};
     
    figure;   
    plot(0:360,patt(pos(2),:),0:360,gab(pos(2),:));   
    grid on
    xlim([0 360])
    Pour la cartographie j'utilise simplement la commande "contourf", avec comme argument une matrice de taille nx360.

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Ca ne me dérange pas de poster ma fonction si ça peut être plus utile, avec bien entendu un fichier .mat contenant des données "traitables" par la fonction.

  7. #7
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    J'ai fait quelques tests, et j'avoue être sceptique quand au comportement déterministe de Matlab.
    J'ai réussi à reproduire ton problème (avec 4 fenêtres au lieu de 7), une fois, avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    fig = figure;
    [X,Y,Z] = peaks(20);
    surfc(X,Y,Z)
    colormap hsv
    axis([-3 3 -3 3 -10 5])
    dcm_obj = datacursormode(fig);
    set(dcm_obj,'UpdateFcn',@myupdatefcn);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function [txt,fig] = myupdatefcn(empt,event_obj)
    pos = get(event_obj,'Position');
        txt = {['Direction: ',num2str(pos(1))],...
               ['Niveau (normalisé): ',num2str(pos(2))]};
        figure;
        plot(2:4);
    end
    Mais après quelques autres tests le problème à disparu. Bref : si quelqu'un sait expliquer pourquoi matlab peut faire plusieurs appels au callback UpdateFcn, je suis intéressé.
    Pour résoudre le problème, je te propose ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function [txt,fig] = myupdatefcn(empt,event_obj)
    persistent oldPos
    if isempty(oldPos)
        oldPos = [0 0 0];
    end
    pos = get(event_obj,'Position');
    if(~all(pos-oldPos<eps))
        txt = {['Direction: ',num2str(pos(1))],...
               ['Niveau (normalisé): ',num2str(pos(2))]};
        figure;
        plot(2:4);
       oldPos = pos;
    end
    end
    On s'assure ainsi un seul appel à l'UpdateFcn par point cliqué.

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Génial merci ça fonctionne, en tout cas, une seule figure est générée.
    Après, dans la fenêtre Matlab j'ai une erreur et plusieurs warning, qui apparemment n'affectent pas le fonctionnement du programme:

    ??? Error using ==> minus
    Matrix dimensions must agree.
    
    Error in ==> graphics.datatip.datatip>localAxesUpdate at 882
      updatePositionAndString(hThis);
    
    Warning: Error occurred while evaluating listener callback.
    > In graphics.datatip.datatip>localGetDatatipPixelPosition at 727
      In graphics.datatip.datatip>localApplyCurrentOrientation at 707
      In graphics.datatip.datatip>localSetBestOrientation at 586
      In graphics.datatip.datatip>localSetOrientationMode at 572
      In datacursormode>localWindowButtonDownFcnDatatip at 921
      In datacursormode>localWindowButtonDownFcn at 788

  9. #9
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Mmmh...
    Et si tu remplaces
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oldPos = zeros(size(get(event_obj,'Position')));
    ?

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    je l'avais déjà remplacé par
    mais sans succès. Avec votre nouvelle proposition j'ai eu de nouveau le droit à l'apparition de toutes les 7 figures avec les erreurs suivantes:

    ??? Error using ==> minus
    Matrix dimensions must agree.
    
    Error in ==> datacursormode>localWindowButtonDownFcnDatatip at 926
       update(hDatatip);
    
    Error in ==> datacursormode>localWindowButtonDownFcn at 788
         localWindowButtonDownFcnDatatip(fig,hTool,hTarget,doNewDatatip);
    
    ??? Error while evaluating figure WindowButtonDownFcn.

  11. #11
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Chose assez surprenante, je viens de remarquer (je pense) que c'est "grace" à l'erreur qu'une seule figure s'affiche. En effet, le code de myupdatefcn est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    function [txt,fig] = myupdatefcn(empt,event_obj)
    global l;global patt;global gab;global pos;
     
    persistent oldPos
    % if isempty(oldPos)
        oldPos = [0 0];
    % end
    pos = get(event_obj,'Position');
     
    XX=pos-oldPos;
     
    %if ~all(pos)<eps
     
        txt = {['Direction: ',num2str(pos(1)-1)],...
           ['Loi de phase: '],...
           [l{pos(2)}],...
           ['Niveau (normalisé): ',num2str(patt(pos(2),pos(1)))]};
     
        figure;   
        plot(0:360,patt(pos(2),:),0:360,gab(pos(2),:));   
        grid on
        xlim([0 360])
     
    %end
    Le problème vient de l'instruction
    ?

  12. #12
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Je me demande si matlab n'appellerait pas UpdateFcn dans un autre contexte que celui attendu, et dans ce cas get(event_obj,'Position'); renvoie une valeur non attendue.
    Je te propose d'ajouter la vérification suivante pour éviter l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (all(~(size(pos)-[1 2])))
    Cette opération est quelque peu un rafistolage : ce n'est pas sexy, mais ça devrait faire le boulot.

  13. #13
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Oui en parlant de chose pas très sexy j'allais y venir également.

    J'ai aussi fait un peu de bricolage de mon côté pour enfin parvenir à quelque chose de satisfaisant.

    Dans le programme principal j'ai créé une variable global qui me sert de flag, que j'initialise à 1.

    Apparemment lorsque la fonction myupdatefcn est appelée, elle fonctionne comme une boucle. Je l'ai donc modifier ainsi pour eviter de recréer une figure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    function [txt,fig] = myupdatefcn(empt,event_obj)
    global l;global patt;global gab;global pos;global flag;
     
    if flag==1
        pos = get(event_obj,'Position');
     
        txt = {['Direction: ',num2str(pos(1)-1)],...
           ['Loi de phase: '],...
           [l{pos(2)}],...
           ['Niveau (normalisé): ',num2str(patt(pos(2),pos(1)))]};
     
        figure;   
        plot(0:360,patt(pos(2),:),0:360,gab(pos(2),:));   
        grid on
        xlim([0 360])
        flag=flag+1;
    else 
        pos = get(event_obj,'Position');
        txt = {['Direction: ',num2str(pos(1)-1)],...
           ['Loi de phase: '],...
           [l{pos(2)}],...
           ['Niveau (normalisé): ',num2str(patt(pos(2),pos(1)))]};
    end;

  14. #14
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    J'ai essayé avec la nouvelle condition de vous avez proposé, un nouveau message d'erreur apparait:

    ??? One or more output arguments not assigned during call to 'D:\Matlab_WorkSpace\myupdatefcn.m (myupdatefcn)'.
    
    Error in ==> graphics.datatip.datatip>localAxesUpdate at 882
      updatePositionAndString(hThis);
    
    Warning: Error occurred while evaluating listener callback.
    > In graphics.datatip.datatip>localGetDatatipPixelPosition at 727
      In graphics.datatip.datatip>localApplyCurrentOrientation at 707
      In graphics.datatip.datatip>localSetBestOrientation at 586
      In graphics.datatip.datatip>localSetOrientationMode at 572
      In datacursormode>localWindowButtonDownFcnDatatip at 921
      In datacursormode>localWindowButtonDownFcn at 788
    je pense qu'il attend en fait les arguments de sortie qui ne sont plus utilisé dans la fonction vu qu'à partir du deuxième cycle la condition n'est plus respecter.

    Tout ceci est confus dans ma tête

  15. #15
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Il faut bien mettre un else pour chaque if, de façon à s'assurer que txt (pourquoi renvoies tu 'fig'?) prend une valeur quelque soit le chemin logique.
    Dans le doute, tu peux mettre au début du myUpdateFcn:
    txt = {''};

  16. #16
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Ok ça donne ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    function [txt] = myupdatefcn(empt,event_obj)
    global l;global patt;global gab;global pos;
    %pause(3);
    size(pos)
    pos = get(event_obj,'Position');
    if (all(~(size(pos)-[1 2])))
     
    txt = {['Direction: ',num2str(pos(1))],...
           ['Loi de phase: '],...
           [l{pos(2)}],...
           ['Niveau (normalisé): ',num2str(patt(pos(2),pos(1)))]};
     
    figure;   
    plot(0:360,patt(pos(2),:),0:360,gab(pos(2),:));   
    grid on
    xlim([0 360])
     
    else 
        txt = {['Direction: ',num2str(pos(1))],...
           ['Loi de phase: '],...
           [l{pos(2)}],...
           ['Niveau (normalisé): ',num2str(patt(pos(2),pos(1)))]};
    end;
    ça fonctionne très bien, pour le premier clique. Un deuxième clique sur un autre point de la cartographie et les 7 figures apparaissent à nouveau.

    En regardant comme varie
    j'ai remarqué qu'il y en a 6x[1 3], puis la dernière à [1 2] (je ne sais pas pourquoi?)ce qui permet de ne plus avoir les figures grâce à la nouvelle condition que vous avez proposé.
    Lors d'un deuxième clique sur la figure, elle vaut toujours [1 2], et donc la condition est toujours remplie pour générer une figure et donc les 7 apparaissent.

  17. #17
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    As tu essayé de comboter les 2 conditions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (all(~(size(pos)-[1 2])) && ~all(pos-oldPos<eps))
    (L'utilisation de && et non de & est importante ici)

  18. #18
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    En combinant les deux solutions, il n'y a pas de message d'erreur, mais un deuxième clique fait toujours apparaitre 7 figures.

  19. #19
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Le fait d'avoir la figure en plein écran va générer 4 figures au lieu de 7.
    Je sais pas si ça peut faire avancer les choses...

  20. #20
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    J'ai fini par changer de direction.

    J'ai gardé la structure de "myupdatefcn", sans la création de figure.

    J'utilise maintenant l'option "WindowButtonUpFcn' qui me permet, par un clique droit sur la figure, de créer une figure grâce à une deuxième fonction de type Callback comme "myupdatefcn".
    Ainsi je peux tout d'abord rechercher un point qui m'intéresse avec le curseur sans pour autant créer une figure supplémentaire, puis dès que j'ai le point en question, un clique droit et j'ai la figure qu'il me faut.

    J'avais d'abord penser à utilise l'option "WindowButtonMotionFcn" pour afficher les données du curseur par un simple passage de la souris sur la figure, mais sans grand succès, pour le moment en tout cas.

    Merci en tout cas pour le temps passé sur mon problème, à bientôt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/10/2013, 14h21
  2. Déplacer puis rogner une figure par VBA
    Par Louma15 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/03/2013, 09h56
  3. Réponses: 1
    Dernier message: 17/08/2011, 17h35
  4. Réponses: 2
    Dernier message: 14/02/2010, 19h14
  5. Mettre une seule figure par page
    Par Ramy_2008 dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 4
    Dernier message: 15/10/2008, 23h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo