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 :

Sélectionner une partie d'une courbe


Sujet :

Interfaces Graphiques

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 43
    Points : 19
    Points
    19
    Par défaut Sélectionner une partie d'une courbe
    Bonjour à tous,

    Je réalise une interface graphique qui a pour but de sélectionner une partie d'une courbe affichée.
    Je mets 2 curseurs type datacursor et je souhaite ensuite récupérer les coordonnées de ces curseurs.

    Mais j'ai plusieurs pb et questions :

    1) Comment savoir quel curseur je suis en train de déplacer ?
    2) Est-il possible de récupérer les coordonnées de TOUS les curseurs en une seule fois (comme si on le faisait avec "Export Data Cursor to Workspace")
    3) Est-il possible de placer un Data Cursor en spécifiant des coordonnées ?
    4) Existe-t-il une alternative aux Data Cursors ? Quelque chose qui serait facilement manipulable en ligne de code ?

    Merci d'avance pour vos réponses,
    Steve

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    N'ayant pas MATLAB pour faire les tests, je ne répondrais qu'à la 4ème question:
    - Une alternative consiste à définir toi-même tes curseurs sous forme de lignes (verticales en général) dont tu codes entièrement le comportement. Evidemment l'inconvénient est qu'il faut tout coder mais l'avantage qui en découle est que tu contrôles entièrement le comportement.
    Personnellement c'est ce que j'utilise...

    En espérant avoir fait avancer le schmilblick.

    Bonne journée,
    Duf

  3. #3
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Citation Envoyé par steve-movi Voir le message
    Je mets 2 curseurs type datacursor
    Comment tu fais ? Je n'arrive désespérément qu'à en mettre un

    Citation Envoyé par steve-movi Voir le message
    1) Comment savoir quel curseur je suis en train de déplacer ?
    En admettant que tu puisses en mettre 2 tu va utiliser pour chacun sa propre (ou même la même) UpdateFcn qui aura en 1er argument le handle de l'objet concerné

    Citation Envoyé par steve-movi Voir le message
    2) Est-il possible de récupérer les coordonnées de TOUS les curseurs en une seule fois (comme si on le faisait avec "Export Data Cursor to Workspace")
    Ben là je n'arrive pas à voir comment on peut en avoir plusieurs mais a priori pourquoi pas ?
    Quoique les propriétés de position n'ont pas l'air d'être accessibles par le handle de l'objet mais par le "event" dans la UpdataFcn...
    On a déjà eu une grande discussion là-dessus si tu as le courage :
    Pointeur souris sur figure

    Citation Envoyé par steve-movi Voir le message
    3) Est-il possible de placer un Data Cursor en spécifiant des coordonnées ?
    Je n'ai pas l'impression. Toujours le même problème la propriété Position n'est pas sur l'objet DataCursor mais sur "event" (je mets entre guillemets car je n'arrive pas à voir ce que ça représente), et cette propriété est de toute façon en read-only donc non modifiable.

    Citation Envoyé par steve-movi Voir le message
    4) Existe-t-il une alternative aux Data Cursors ? Quelque chose qui serait facilement manipulable en ligne de code ?
    Euh...surement.

    Si c'est pour sélectionner une partie de courbe tu peux peut-être tout simplement créer 2 barres (objet Line) verticales.
    C'est pas non plus super simple il faudra utiliser les Button*Fcn (*=Down et Release je crois).

    Enfin problème pas évident...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 43
    Points : 19
    Points
    19
    Par défaut
    Pour ajouter un autre cursor ==> clic droit et "Creatre New Datatip"

  5. #5
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Bon en fouillant (mais c'est vraiment du bidouillage), en fait le datacursormode crée un objet de Type hggroup.

    Si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    h=findall(gca,'type','hggroup')
    Retourne les handles des objets qui font les Data Cursor : tu peux le voir en récupérant les propriétés String (où tu as ce que tu veux mais qu'il faudra décomposer).

    Bizarrement il n'y a pas de propriété Position donc seule la propriété String pourra être utilisée (pour ce que j'ai fouillé).

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 43
    Points : 19
    Points
    19
    Par défaut
    Ok merci.
    Mais je vais essayer de coder quelque chose de A à Z qui utilise des lignes verticales pour visualiser la sélection sur la courbe.
    Y-a-t-il la possibilité de déplacer ces lignes verticales avec la souris ? Ou est-ce plus simple de faire se déplacer la ligne avec quelque chose du type Slider ?

  7. #7
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Comme l'a dit Caro, il te faut utiliser la propriété ButtonDownFcn de la line.

    Par exemple (à mettre dans une fonction):
    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
     
     
    plot(ax_hdl, [0,0], [-1,1], 'ButtonDownFcn', @(obj, evt) click_on_line(obj))
    set(ax_hdl, 'XLimMode', 'manual', 'YLimMode', 'manual');
     
    function click_on_line(hObject)
     
    % Change windows properties
    set(ancestor(hObject, 'figure'), 'WindowButtonMotionFcn', @(obj, evt) move_line(obj), 'WindowButtonUpFcn', @(obj, evt) release_line(obj));
     
    function release_line(hObject)
     
    % Change windows properties
    set(hObject, 'WindowButtonMotionFcn', [], 'WindowButtonUpFcn', []);
     
    function move_line(hObject)
     
    % Get mouse pointer position
    position = get(ancestor(hObject, 'axes'), 'CurrentPoint');
     
    % Change line position
    set(hObject, 'XData', [position(1), position(1)]);
    Voilà, à tester, j'espère ne pas m'être trop trompé

    Bon courage,
    Duf

  8. #8
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Aaargh j'ai fouillé pour rien non je rigole c'est toujours bien d'apprendre des nouveaux trucs

    Citation Envoyé par steve-movi Voir le message
    Y-a-t-il la possibilité de déplacer ces lignes verticales avec la souris ?
    Oui (c'est ce que j'ai dis...) avec la propriété ButtonDownFcn.
    Et peut-être la WindowButtonUpFcn de la Figure.
    Je n'arrive plus à me souvenir comment on récupère le fait que le bouton de la souris est relâché...ça va peut-être me revenir.

    [EDIT]Ah ben c'est bien ça, merci Duf

    Citation Envoyé par steve-movi Voir le message
    Ou est-ce plus simple de faire se déplacer la ligne avec quelque chose du type Slider ?
    A mon avis même degré de difficulté, et avec un slider ça risque d'être moins fin (ou pas )

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 43
    Points : 19
    Points
    19
    Par défaut
    Merci à tous !

    Je sens que je vais finir par y arriver

    J'ai utilisé le code gracieusement fourni par duf42 mais j'ai des erreurs que je n'arrive pas à corriger car j'ai surement quelques pb de compréhension ^^

    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
     
    function BoutonCurseur_Callback(hObject, eventdata, handles)
    % hObject    handle to BoutonCurseur (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    %affichage des courbes
    line([50000 50000],[-200 400],'LineWidth',3,'Color','g', 'ButtonDownFcn', @(obj, evt) click_on_line(obj));
    line([450000 450000],[-200 400],'LineWidth',3,'Color','g', 'ButtonDownFcn', @(obj, evt) click_on_line(obj));
     
     
    function click_on_line(hObject,handles)
    % Change windows properties
    set(ancestor(hObject, 'figure'), 'WindowButtonMotionFcn', @(obj, evt) move_line(obj), 'WindowButtonUpFcn', @(obj, evt) release_line(obj));
     
     
    function release_line(hObject)
    % Change windows properties
    set(hObject, 'WindowButtonMotionFcn', [], 'WindowButtonUpFcn', []);
     
     
    function move_line(hObject)
    % Get mouse pointer position
    position = get(ancestor(hObject, 'axes'), 'CurrentPoint');
    % Change line position
    set(hObject, 'XData', [position(1), position(1)]);
    Et Matlab me sort cette erreur
    ??? Index exceeds matrix dimensions.

    Error in ==> Decoupage>move_line at 267
    set(hObject, 'XData', [position(1), position(1)]);

    Error in ==> Decoupage>@(obj,evt)move_line(obj) at 255
    set(ancestor(hObject, 'figure'), 'WindowButtonMotionFcn', @(obj, evt) move_line(obj), 'WindowButtonUpFcn',
    @(obj, evt) release_line(obj));

    ??? Error while evaluating figure WindowButtonMotionFcn
    je suis un peu perdu...

  10. #10
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Pour débugger enlève le ";" à la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    position = get(ancestor(hObject, 'axes'), 'CurrentPoint');
    Pour voir ce qu'il te renvoie, en fait je suis pas sur à 100% de la propriété, il faut la propriété de l'axe qui renvoie la position de la souris dans l'axe (et ce doit être une matrice 2x2).

    Il faut aussi vérifier que le handle (ancestor(hObject, 'axes')) est bien celui de l'axe, je pense que le problème vient de là...
    En général pour résoudre çà j'utilise les fonctions imbriquées comme ca plus besoin de chercher le handle mais tu peux aussi utiliser FINDOBJ en faisant attention à ce que tu demandes...

  11. #11
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Vu le message position doit être vide.
    Pourquoi ? C'est une autre question...

    A priori ANCESTOR ça devrait être bon vue l'aide.
    Et CurrentPoint aussi

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 43
    Points : 19
    Points
    19
    Par défaut
    Effectivement :
    position =

    []

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 43
    Points : 19
    Points
    19
    Par défaut
    J'ai l'impression que le handle n'est pas bon en fait.

    J'arrive à avoir une position en remplaçant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    position = get(ancestor(hObject, 'axes'), 'CurrentPoint');
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    position = get(ancestor(gca, 'axes'), 'CurrentPoint');
    Mais ensuite un autre pb apparait
    ??? Error using ==> set
    There is no 'XData' property in the 'figure' class.

    Error in ==> Decoupage>move_line at 267
    set(hObject, 'XData', [position(1), position(1)]);

    Error in ==> Decoupage>@(obj,evt)move_line(obj) at 255
    set(ancestor(hObject, 'figure'), 'WindowButtonMotionFcn', @(obj, evt) move_line(obj), 'WindowButtonUpFcn',
    @(obj, evt) release_line(obj));

    ??? Error while evaluating figure WindowButtonMotionFcn

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 43
    Points : 19
    Points
    19
    Par défaut
    J'ai réussi !! Ca bouge !! lol
    C'était bien un pb de handle.

    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
    function BoutonCurseur_Callback(hObject, eventdata, handles)
    % hObject    handle to BoutonCurseur (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    %affichage des courbes
    handle_l1 = line([50000 50000],[-200 400],'LineWidth',3,'Color','g', 'ButtonDownFcn', @(obj, evt) click_on_line(obj));
    setappdata(0,'handle_l1',handle_l1);
    handle_l2 = line([450000 450000],[-200 400],'LineWidth',3,'Color','g','ButtonDownFcn', @(obj, evt) click_on_line(obj));
    setappdata(0,'handle_l2',handle_l2);
     
     
    function click_on_line(hObject)
    % Change windows properties
    set(ancestor(hObject, 'figure'), 'WindowButtonMotionFcn', @(obj, evt) move_line(obj), 'WindowButtonUpFcn', @(obj, evt) release_line(obj));
     
     
    function release_line(hObject)
    % Change windows properties
    set(hObject, 'WindowButtonMotionFcn', [], 'WindowButtonUpFcn', []);
     
     
    function move_line(hObject)
    % Get mouse pointer position
    position = get(ancestor(gca, 'axes'), 'CurrentPoint');
    % Change line position
    handle_l1 = getappdata(0,'handle_l1');
    set(handle_l1, 'XData', [position(1), position(1)]);
    Mais j'ai encore un pb... Comment savoir si je suis sur la ligne 1 ou la ligne 2 ? Car il faut que mon "move_line" le sache.

  15. #15
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    En effet, c'est une erreur de code:
    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
    function BoutonCurseur_Callback(hObject, eventdata, handles)
    % hObject    handle to BoutonCurseur (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    %affichage des courbes
    handle_l1 = line([50000 50000],[-200 400],'LineWidth',3,'Color','g', 'ButtonDownFcn', @(obj, evt) click_on_line(obj));
    setappdata(0,'handle_l1',handle_l1);
    handle_l2 = line([450000 450000],[-200 400],'LineWidth',3,'Color','g','ButtonDownFcn', @(obj, evt) click_on_line(obj));
    setappdata(0,'handle_l2',handle_l2);
    
    
    function click_on_line(hObject)
    % Change windows properties
    set(ancestor(hObject, 'figure'), 'WindowButtonMotionFcn', @(obj, evt) move_line(hObject), 'WindowButtonUpFcn', @(obj, evt) release_line(obj));
    
    
    function release_line(hObject)
    % Change windows properties
    set(hObject, 'WindowButtonMotionFcn', [], 'WindowButtonUpFcn', []);
    
    
    function move_line(hObject)
    % Get mouse pointer position
    position = get(gca, 'CurrentPoint');
    % Change line position
    set(hObject, 'XData', [position(1), position(1)]);
    Comme ca ca devrait mieux fonctionner... Enfin faut tester

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 43
    Points : 19
    Points
    19
    Par défaut
    Oui cela corrige le pb de la position mais je crois que le handle du set correspond à la "figure" et non à la "line".

    J'ai ça comme erreur
    ??? Error using ==> set
    There is no 'XData' property in the 'figure' class.

    Error in ==> Decoupage>move_line at 282
    set(hObject, 'XData', [position(1), position(1)]);

    Error in ==> Decoupage>@(obj,evt)move_line(obj) at 269
    set(ancestor(hObject, 'figure'), 'WindowButtonMotionFcn', @(obj, evt) move_line(obj), 'WindowButtonUpFcn',
    @(obj, evt) release_line(obj));

    ??? Error while evaluating figure WindowButtonMotionFcn

  17. #17
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    As-tu bien modifié cette ligne?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set(ancestor(hObject, 'figure'), 'WindowButtonMotionFcn', @(obj, evt) move_line(hObject), 'WindowButtonUpFcn', @(obj, evt) release_line(obj));

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 43
    Points : 19
    Points
    19
    Par défaut
    Oupsss j'avais pas vu !
    Merci à tous ça marche !

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

Discussions similaires

  1. donner une couleur a une partie d'une forme
    Par ralf91 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/04/2008, 17h02
  2. Réponses: 1
    Dernier message: 04/04/2008, 12h14
  3. Sélectionner seulement une partie d'une valeur d'une cellule
    Par ArthurO0O dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/08/2007, 11h05
  4. masquer une partie d'une vidéo par une banniere
    Par lezabour dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 16/10/2006, 16h47
  5. copier une partie d'une image vers une autre
    Par gregcat dans le forum Langage
    Réponses: 1
    Dernier message: 14/04/2006, 13h39

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