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

Interfaces Graphiques Discussion :

definir barres de selection de zone d'interet sur plot


Sujet :

Interfaces Graphiques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Juin 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement de composants
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2009
    Messages : 26
    Par défaut definir barres de selection de zone d'interet sur plot
    Bonjour a tous,

    je commence a connaitre peu a peu Matlab et je souhaite désormais me tourner vers une interface graphique pour traiter mes fichiers.
    Je bloque sur une fonction au sujet de laquelle je n'arrive pas a trouver d'aide (peut etre parce que je ne cherche pas les bons mots clef...)

    L'idée globale est d'afficher sur le GUI un signal temporel issus d'un fichier ascii dont j'aurais défini le nom et le chemin d'accès. Jusque la a priori, pas de souci.

    Sur ce signal temporel, j'ai programmé un certain nombre d'opérations (calcul de spectres, de pics, de valeurs moyennes, etc....) ceci sans trop de problèmes non plus... MAIS:

    Mes signaux temporels ont en fait une zone d'intérêt limitée sur laquelle je souhaite me focaliser. Pour le moment je détecte manuellement cette zone d'intérêt (cad, je plot mon signal, je regarde ou est cette zone (elle est variable d'un fichier a l'autre), et j'introduis des bornes d'études a la main dans mon programme paramétré)
    Je me dis qu'il doit etre possible d'ameliorer grandement cet aspect avec un GUI adapté ==> deux barres verticales mobiles sur le plot qui recupereraient en parametres leur abcisse qui formerait ainsi mes bornes d'etudes.

    Pourriez vous me fournir quelques indications ou quelques voies de recherche pour programmer ces betes la?
    (je prend l'exemple pour ceux qui connaissent d'un graphe Labview ou bien Dasylab sur lesquels ces fonctionnalités existent)

    Merci d'avance
    Cordialement,

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Commençons par l'affichage et le déplacement des deux barres :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    function test
     
    % Ouverture d'une fenetre
    % Voir la FAQ pour le DoubleBuffer
    % http://matlab.developpez.com/faq/?page=graphiques#graphiques_figure_blink
    figure('doublebuffer','on');
     
    % Un tracé 
    th =linspace(0,4*pi,200);
    plot(th,sin(th),'r');
     
    hold on
     
    % Récuparation des limites du graphique
    x = xlim;
    y = ylim;
     
    % Ajout des deux barres (une bleue et une verte)
    % et prise en compte du clic souris avec la propriété ButtonDownFcn
    line([x;x],[y(:) y(:)],'linewidth',3,'buttondownfcn',@bdfcn);
     
    % Blocage des limites du graphique
    set(gca,'xlimmode','manu')
     
    function bdfcn(obj,event)
    % Fonction a exécuter quand on clique sur une barre
    % OBJ : identifiant de la barre sélectionnée
    % WindowButtonMotionFcn : fonction à exécuter quand on déplace la souris
    % WindowButtonUpFcn : fonction à exécuter quand on relâche la souris
    set(gcf,'windowbuttonmotionfcn',{@wbmfcn,obj},  ...
        'windowbuttonupfcn',@wbufcn);
     
    function wbmfcn(obj,event,h)
    % Fonction à exécuter quand on déplace la souris
    % OBJ : identifiant de la fenetre courante
    % H : identifiant de la barre sélectionnée
     
    % Modification du pointeur de la souris (juste esthétique)
    set(obj,'pointer','fleur');
    % Récupération des coordonnées du pointeur de la souris
    cp = get(gca,'currentpoint');
    % Modification de la position en x de la barre sélectionnée
    set(h,'xdata',[cp(1);cp(1)])
     
    function wbufcn(obj,event)
    % Fonction à exécuter quand on relâche la souris
    set(obj,'windowbuttonmotionfcn',[],'pointer','arrow');

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Juin 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement de composants
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2009
    Messages : 26
    Par défaut
    Un grand merci Dut pour ta réponse, extrêmement pertinente.

    Petit bilan de la matinée:

    J'arrive a afficher mon signal avec les deux barres mobiles, ce qui est déjà un très bon point pour moi mais il reste quelques points durs:

    1) a quoi sert le paramètre "event" dans tes fonctions? il n'est utilisé nulle part

    2) comment puis je récupérer les valeurs des bornes min et max? je sèche un peu la, la fonction wbmfcn me semble 'absolue' dans le sens ou elle ne fais pas la différence entre la barre 1 et la barre 2. Dans l'idéal, je souhaiterais en fait que l'affichage des bornes s'effectue dans deux textbox sur mon GUI en temps réel (ou en pseudo temps reel c'est suffisant, si cela nécessite un clic sur un pushbutton pour récupérer ces valeurs, aucune importance)
    J'imagine qu'il faut utiliser la variable cp de la fonction xbmfcn mais comme j'ai séparé les trois fonctions wbmfcn, wbufcn et bdfcn en trois sous-programmes .m a part (je ne sais pas si j'ai bien fait?) et qu'au final, ils sont utilisés en tant que propriété dans le programme principal, je n'arrive pas a récupérer la valeur de cette variable...(du moins ma mauvaise connaissance de la prog ne me le permets pas )

    Si tu le souhaites, je peux te mettre mon code actuel pour qu'éventuellement tu me corriges dans son agencement...

    Encore merci du temps passé
    Cordialement,

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Citation Envoyé par walks Voir le message
    1) a quoi sert le paramètre "event" dans tes fonctions? il n'est utilisé nulle part
    Ce paramètre ne sert à rien ici.
    Par contre, il est obligatoire de le faire figurer dans le code.

    Pou plus d'informations sur ce paramètre => Customizing Callbacks in GUIDE - Event Data


    Citation Envoyé par walks Voir le message
    2) comment puis je récupérer les valeurs des bornes min et max?
    Une méthode avec un bouton :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    function test2
     
    % Ouverture d'une fenetre
    % Voir la FAQ pour le DoubleBuffer
    % http://matlab.developpez.com/faq/?page=graphiques#graphiques_figure_blink
    figure('doublebuffer','on');
     
    % Un tracé 
    th =linspace(0,4*pi,200);
    plot(th,sin(th),'r');
     
    hold on
     
    % Récuparation des limites du graphique
    x = xlim;
    y = ylim;
     
    % Ajout des deux barres (une bleue et une verte)
    % et prise en compte du clic souris avec la propriété ButtonDownFcn
    line([x;x],[y(:) y(:)],'linewidth',3,'buttondownfcn',@bdfcn);
     
    % Blocage des limites du graphique
    set(gca,'xlimmode','manu')
     
    uicontrol('style','pushbutton',...
        'string','Clic',...
        'callback',@buttoncb,...
        'units','normalized',...
        'position',[.05 .05 .1 .1]);
     
    uicontrol('style','edit',...
        'string',[],...
        'units','normalized',...
        'position',[.2 .05 .1 .1]);
     
     
    function bdfcn(obj,event)
    % Fonction a exécuter quand on clique sur une barre
    % OBJ : identifiant de la barre sélectionnée
    % WindowButtonMotionFcn : fonction à exécuter quand on déplace la souris
    % WindowButtonUpFcn : fonction à exécuter quand on relâche la souris
    set(gcf,'windowbuttonmotionfcn',{@wbmfcn,obj},  ...
        'windowbuttonupfcn',@wbufcn);
     
    function wbmfcn(obj,event,h)
    % Fonction à exécuter quand on déplace la souris
    % OBJ : identifiant de la fenetre courante
    % H : identifiant de la barre sélectionnée
     
    % Modification du pointeur de la souris (juste esthétique)
    set(obj,'pointer','fleur');
    % Récupération des coordonnées du pointeur de la souris
    cp = get(gca,'currentpoint');
    % Modification de la position en x de la barre sélectionnée
    set(h,'xdata',[cp(1);cp(1)])
     
    function wbufcn(obj,event)
    % Fonction à exécuter quand on relâche la souris
    set(obj,'windowbuttonmotionfcn',[],'pointer','arrow');
     
    function buttoncb(obj,event)
    % Fonction à exécuter quand on clique sur le bouton
     
    % Récupération de l'identigfiant de la barre bleue
    h(1) = findobj('type','line','linewidth',3,'color','b');
    % Récupération de l'identigfiant de la barre verte
    h(2) = findobj('type','line','linewidth',3,'color',[0 .5 0]);
     
    % Récupération des position en x des deux barres
    xmin = get(h(1),'xdata');
    xmax = get(h(2),'xdata');
     
    % Récupération de l'identifiant de l'objet Edit
    h(3) = findobj('type','uicontrol','style','edit');
    % Affichage des limites fixées par les deux barres
    set(h(3),'string',sprintf('[%.1f %.1f]',xmin(1),xmax(1)))
    Une autre en temps réel :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    function test3
     
    % Ouverture d'une fenetre
    % Voir la FAQ pour le DoubleBuffer
    % http://matlab.developpez.com/faq/?page=graphiques#graphiques_figure_blink
    figure('doublebuffer','on');
     
    % Un tracé 
    th =linspace(0,4*pi,200);
    plot(th,sin(th),'r');
     
    hold on
     
    % Récuparation des limites du graphique
    x = xlim;
    y = ylim;
     
    % Ajout des deux barres (une bleue et une verte)
    % et prise en compte du clic souris avec la propriété ButtonDownFcn
    line([x;x],[y(:) y(:)],'linewidth',3,'buttondownfcn',@bdfcn);
     
    % Blocage des limites du graphique
    set(gca,'xlimmode','manu')
     
    uicontrol('style','edit',...
        'string',sprintf('[%.1f %.1f]',x(1),x(2)),...
        'units','normalized',...
        'position',[.2 .05 .1 .1]);
     
    function bdfcn(obj,event)
    % Fonction a exécuter quand on clique sur une barre
    % OBJ : identifiant de la barre sélectionnée
    % WindowButtonMotionFcn : fonction à exécuter quand on déplace la souris
    % WindowButtonUpFcn : fonction à exécuter quand on relâche la souris
    set(gcf,'windowbuttonmotionfcn',{@wbmfcn,obj},  ...
        'windowbuttonupfcn',@wbufcn);
     
    function wbmfcn(obj,event,h)
    % Fonction à exécuter quand on déplace la souris
    % OBJ : identifiant de la fenetre courante
    % H : identifiant de la barre sélectionnée
     
    % Modification du pointeur de la souris (juste esthétique)
    set(obj,'pointer','fleur');
    % Récupération des coordonnées du pointeur de la souris
    cp = get(gca,'currentpoint');
    % Modification de la position en x de la barre sélectionnée
    set(h,'xdata',[cp(1);cp(1)])
     
    % Récupération de l'identigfiant de la barre bleue
    h(1) = findobj('type','line','linewidth',3,'color','b');
    % Récupération de l'identigfiant de la barre verte
    h(2) = findobj('type','line','linewidth',3,'color',[0 .5 0]);
     
    % Récupération des position en x des deux barres
    xmin = get(h(1),'xdata');
    xmax = get(h(2),'xdata');
     
    % Récupération de l'identifiant de l'objet Edit
    h(3) = findobj('type','uicontrol','style','edit');
    % Affichage des limites fixées par les deux barres
    set(h(3),'string',sprintf('[%.1f %.1f]',xmin(1),xmax(1)))
     
    function wbufcn(obj,event)
    % Fonction à exécuter quand on relâche la souris
    set(obj,'windowbuttonmotionfcn',[],'pointer','arrow');

  5. #5
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Citation Envoyé par Dut Voir le message
    Une autre en temps réel :
    La même chose en utilisant des fonctions imbriquées (nested functions) :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    function test4
     
    % Ouverture d'une fenetre
    % Voir la FAQ pour le DoubleBuffer
    % http://matlab.developpez.com/faq/?page=graphiques#graphiques_figure_blink
    fig = figure('doublebuffer','on');
     
    % Un tracé
    th =linspace(0,4*pi,200);
    plot(th,sin(th),'r');
     
    hold on
     
    % Récuparation des limites du graphique
    x = xlim;
    y = ylim;
     
    % Ajout des deux barres (une bleue et une verte)
    % et prise en compte du clic souris avec la propriété ButtonDownFcn
    h = line([x;x],[y(:) y(:)],'linewidth',3,'buttondownfcn',@bdfcn);
     
    % Blocage des limites du graphique
    set(gca,'xlimmode','manu')
     
    u = uicontrol('style','edit',...
        'string',sprintf('[%.1f %.1f]',x(1),x(2)),...
        'units','normalized',...
        'position',[.2 .05 .1 .1]);
     
        function bdfcn(obj,event)
            % Fonction a exécuter quand on clique sur une barre
            % OBJ : identifiant de la barre sélectionnée
            % WindowButtonMotionFcn : fonction à exécuter quand on déplace la souris
            % WindowButtonUpFcn : fonction à exécuter quand on relâche la souris
            set(fig,'windowbuttonmotionfcn',{@wbmfcn,obj},  ...
                'windowbuttonupfcn',@wbufcn);
     
        end
     
        function wbmfcn(obj,event,hh)
            % Fonction à exécuter quand on déplace la souris
            % OBJ : identifiant de la fenetre courante
            % H : identifiant de la barre sélectionnée
     
            % Modification du pointeur de la souris (juste esthétique)
            set(fig,'pointer','fleur');
            % Récupération des coordonnées du pointeur de la souris
            cp = get(gca,'currentpoint');
            % Modification de la position en x de la barre sélectionnée
            set(hh,'xdata',[cp(1);cp(1)])
     
            % Récupération des position en x des deux barres
            xmin = get(h(1),'xdata');
            xmax = get(h(2),'xdata');
     
            % Affichage des limites fixées par les deux barres
            set(u,'string',sprintf('[%.1f %.1f]',xmin(1),xmax(1)))
     
        end
     
        function wbufcn(obj,event)
            % Fonction à exécuter quand on relâche la souris
            set(fig,'windowbuttonmotionfcn',[],'pointer','arrow');
     
        end
     
    end

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Juin 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement de composants
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2009
    Messages : 26
    Par défaut
    Impeccable!

    vraiment, merci de la rapidité et de la précision de tes réponses, je suis impressionné

    J'ai choisi la première solution puisque de toute façon , un deuxième pushbutton me sera nécessaire pour lancer les calculs sur le signal du plot...

    J'ai un peu "simplifié" ton code, disons que je l'ai adapté a mon niveau de compréhension en supprimant les "findobj" et en nommant séparément mes deux barres dès leur création...ce qui me permettra de les manipuler nominativement...

    Ça avance tranquillement maintenant que ce gros point dur est débloqué de fort belle manière

    Bonnes fêtes de fin d'année a tous
    Cordialement,

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/03/2013, 10h19
  2. selection automatique ( zone de liste )
    Par UDSP50 dans le forum Access
    Réponses: 2
    Dernier message: 12/04/2008, 10h22
  3. Barre de selection de texte
    Par tonybriere dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 04/12/2007, 14h12
  4. [VBA-E]selection de zone de cellules
    Par anisr dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/03/2007, 16h25
  5. Réponses: 4
    Dernier message: 20/06/2006, 11h02

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