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 :

[datacursormode] Bloquer la vue d'un plot3, puis récupérer les coordonnées dans le programme


Sujet :

Interfaces Graphiques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Par défaut [datacursormode] Bloquer la vue d'un plot3, puis récupérer les coordonnées dans le programme
    Bonjour,

    Cette discussion fait suite à celle-ci à titre d'information.

    Je souhaite afficher une série de points 3D dans un graphique 3D, mais bloquer la vue selon une direction, de telle sorte que l'utilisateur ne puisse pas tourner le graphique avec les options disponibles. Cela est-il faisable ?

    Par exemple, le code suivant affiche les pôles d'un système dans un graphique 3D (sur 'x' la partie réelle, sur 'y' la partie imaginaire et sur 'z' l'indice) et affiche la vue dans une certaine direction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    sys=tf([1], [1 2 3 4 5]); % ma fonction de transfert
    mesPoles=pole(sys);       % mes poles
    [m,n]=size(mesPoles);     % le nombre de poles dans m
    x=real(mesPoles);         % partie réelle des poles
    y=imag(mesPoles);         % partie imaginaire des poles
    z(m)=0;                   % indice de repérage des poles
    for k=1:1:m
        z(k) = k;
    end
     
    plot3(x,y,z,'x');         % mon graphique avec des croix pour chaque point
    view([0 0 1])             % vue de dessus
    Je voudrais donc déjà, en premier lieu, bloquer la vue. (tourner la vue est l'une des options disponibles au dessus du graphique).

    Mon objectif final est de récupérer les données (d'un point de vue programmation) qui ont permis de tracer le pôle sur lequel l'utilisateur va cliquer : pas seulement les valeurs 'x' & 'y', mais également l'indice 'z' qui me permet de les repérer dans "mesPoles". Je crois que j'ai déjà une piste avec "datacursormode"... j'ai donc déjà ma petite idée pour ce problème, mais pas pour le premier qui consiste à bloquer la vue. (A moins que quelqu'un sache directement comment récupérer l'indice des points tracés dans une vue 2D)

    Je vous remercie par avance pour toute aide.

    Cordialement,

    [EDIT] Après recherches un peu plus approfondies, j'ai trouvé comment récupérer l'indice du point sélectionné. Je l'ai appliqué sur un graphique 2D et ça marche bien (du moins ça l'affiche dans la console en temps réel). Exemple :

    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
    function testPoles
    sys = tf([1], [1 2 3 4 5];
    mesPoles = poles(sys);
     
    f=figure(1);
    plot(mesPoles, 'x')
     
    dcm_obj=datacursormode(f);
    set(dcm_obj, 'enable', 'on', ...             % activation du curseur
        'snaptodatavertex', 'on', ...            % le curseur s'aligne sur les points donnés uniqumeent
        'displaystyle', 'datatip', ...           % mode d'affichage (window ou datatip)
        'UpdateFcn', @myupdatefcn);
     
        function [txt, pos, indice] = my updatefcn(empt, event_obj)
            pos = get(event_obj, 'Position')     % récupère et affiche les coordonnées x et y du point
            indice = get(event_obj, 'DataIndex') % récupère et affiche l'indice du point
            txt = {['Re: ', num2str(pos(1))], ['Im: ', num2str(pos(2))], ['Index: ', num2str(indice)]};
        end
    end
    Maintenant, il faut encore que je sache comment je peux traiter ces données en temps réel dans mon programme pour faire ce que je veux, mais ça, c'est un autre problème.

    Il n'empêche que j'aimerai savoir s'il est possible de bloquer la vue 3D.

  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
    Citation Envoyé par tachmou Voir le message
    Je voudrais donc déjà, en premier lieu, bloquer la vue. (tourner la vue est l'une des options disponibles au dessus du graphique).
    Tu peux rendre le bouton concerné invisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    h = findall(0,'type','uitoggletool','tooltipstring','Rotate 3D');
    set(h,'visible','off');
    C'est bien entendu réversible

  3. #3
    Membre émérite
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Par défaut
    Bonjour,

    Merci encore pour ta réponse ! J'espère que cette réponse sera utile également à d'autres personnes et pas seulement à moi.

    Bon, maintenant, il faudrait qu'en fonction de la dernière valeur enregistrée dans "indice", je puisse mettre à jour tout le reste du programme qui dépend de mon fameux "indice"...

    Je suis formaté "Qt", donc si tu connais, en gros, j'aimerai créer une sorte de "signal" qui se déclenche dès que la valeur de mon "indice" change et qui puisse être lié à un "slot" dans lequel je pourrais faire toutes les modifications que je veux...
    ...mieux encore : j'aimerai que cette variable soit la sortie de ma fonction "dessinerEtRecupererIndice" (qui s'occupe donc de dessiner dans un "axe" les données d'entrée et de donner la possibilité à l'utilisateur de venir cliquer sur les points pour récupérer mon "indice" avant de le donner en sortie...) et que je puisse traiter dans mon programme principal le changement de valeur de cette sortie comme bon me semble.

    Voici un code de base :

    Programme principal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sys = tf([1], [1 2 3 4 5]);
    mesPoles = pole(sys);
    a = axes;
    [indice] = dessinerEtRecupererIndice(a, mesPoles);
     
    %% Code à rajouter pour traiter le changement de valeur d'indice
    %%
    Fonction récupérer indice
    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 [indice] = dessinerEtRecupererIndice(a, mesPoles) %% <<= Rq. : j'ai mis indice en sortie
        plot(mesPoles, 'x') %% <<= ici j'aimerai aussi spécifier que je veux dessiner dans mon axe "a"... je ne sais pas comment faire non plus - certes ça le fait comme il faut si axe est le dernier élément créé... mais c'est magique ça aussi... et si jamais j'ai créé un autre axe ou figure entre temps ? et que je veux quand même l'afficher dans l'ancien axe ? 
        dcm_obj = datacursormode(a)
        set(dcm_obj, 'enable', 'on', ... 
            'snaptodatavertex', 'on', ... 
            'displaystyle', 'datatip', ...
            'UpdateFcn', @myupdatefcn);
    
        function [txt, indice] = myupdatefcn(empt, event_obj)  << j'ai mis "indice" en sortie
            pos = get(event_obj, 'Position');
            indice = get(event_obj, 'DataIndex');
            txt = {['Re: ', num2str(pos(1))], ['Im: ', num2str(pos(2))], ['Index: ', num2str(indice)]};
        end
    end
    (Codes non fonctionnels bien sûr)

    Je m'y prends très certainement très mal : n'hésitez pas à me l'indiquer ! J'aimerai juste un petit coup de pouce, je pense qu'il ne me manque pas grand chose pour que je puisse (enfin!) commencer à développer les outils dont j'ai besoin pour ma thèse...

    Cordialement,

    ps : Dis moi, j'en ai marre de poser des questions idiotes... il n'y aurait pas une doc un peu mieux foutu que l'officielle ? Comme tu as dû le remarquer, je cherche à faire des choses un minimum évoluées, et les infos intéressantes sont extrêmement éparpillées je trouve... en clair : je galère trop pour faire ce que j'ai envie de faire. Tu n'aurais pas un conseil "magique" à me donner à tout hasard ? D'ailleurs, comment tu as fait pour répondre à ma question ? Comment tu le sais ça, qu'il fallait chercher la propriété "tooltipstring" et que sa valeur est "Rotate 3D" ? C'est magique ça quand même...

    ps2 : délire perso parce que je craque... j'aimerai bien faire ctrl+c de ton cerveau partie matlab et ctrl+v dans le mien partie matlab... ok je sors

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function [txt, indice] = myupdatefcn(empt, event_obj)  << j'ai mis "indice" en sortie
    Étant contenu dans le fonctionnement interne du DATACURSORMODE, tu ne pourras pas récupérer tes indices de cette façon.
    Ce qui se rapproche le plus de ce que tu demandes sur les signaux/slots serait ceci qui est plus tourné Java. Mais il te serait plus simple d'utiliser le principe des fonctions imbriquées et de mettre ton traitement sur les indices directement dans la fonction myupdatefcn.

    Pour ce qui est du PLOT:
    Pour ce qui est du 'TooltipString', il faut juste savoir que les boutons présents sur la Toolbar des Figures sont des objets Uitoggletool, et que lors du survol de la souris, c'est le contenu de leur propriété 'TooltipString' qui est affiché. À partir de là, on recherche le handle de l'objet à partir de ces caractéristiques connues avec la fonction FINDALL.

  5. #5
    Membre émérite
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Par défaut
    Bonjour,

    Merci pour tes deux dernières réponses (le plot et le TooltipString, d'ailleurs j'ai envie de dire : "Tricheur!" mais merci pour le tuyau )

    Par contre, la première réponse ne me fait pas plaisir pour trois raisons :
    - Le lien que tu me files concernant les classes nécessite les dernières versions de Matlab... je ne l'avais pas spécifié ici, mais en fait je me trimballe avec la version 7R14 de 2005. J'ai d'ailleurs trouvé un autre moyen de créer des classes en utilisant justement les fonctions imbriquées.
    - Traiter les données dans la fonction myupdatefcn est juste "pas envisageable" : je compte utiliser ce type de fonctionnalité des dizaines voire des centaines de fois selon l'application/les système que je vais concevoir.
    - Je ne peux pas mettre mon "indice" en sortie... bon ok soit, mais il doit y avoir peut être moyen de faire une magouille avec les entrées non ? Et de jouer avec les "update" utilisé dans les gui ? Je m'explique...

    L'idée que j'ai mais que je n'arrive pas à concrétiser proprement, serait de créer (par exemple) un slider (ou autre...) qui ne serait pas visible sur la figure principale, et qui contient la valeur de mon indice. J'envoie le handle de ce slider en entrée de ma fonction "dessinerEtRecupererIndice", ainsi qu'en entrée de la fonction "myupdatefcn". Je mets donc à jour la valeur contenue dans mon slider... qui, en changeant, va appeler son "Callback" ! Et là, paf! ça fait des chokapik! (puisque dans le callback du slider qui m'intéresse je fais mon joyeux bordel... qui se trouvera donc comme je le voulais dans ma fonction principale !)

    Les applications sont multiples et j'envisage même de gérer différents types de plots etc... (j'en ai réellement besoin pour ma thèse si je veux répondre efficacement à une partie de mon sujet... ce n'est donc pas du superflu que je demande là)

    Galère galère...

    Merci à tous ceux qui ont eu le courage de me lire ! Ca paraît tordu, mais ça serait tellement utile et permettrait de faire tellement de choses !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par tachmou Voir le message
    Merci pour tes deux dernières réponses (le plot et le TooltipString, d'ailleurs j'ai envie de dire : "Tricheur!" mais merci pour le tuyau )
    Bon d'accord l'expérience ça aide, mais l'histoire du plot c'est contenu dans la doc:
    Citation Envoyé par doc plot
    plot(axes_handle,...) plots using axes with the handle axes_handle instead of the current axes (gca).
    Le reste dans l'excellent tutoriel de Dut.

    Ensuite comme je te l'ai dit, le plus simple est d'utiliser les fonctions imbriquées, cependant je ne pensais pas à aux classes de l'autre discussion, mais simplement au passage de variable.
    Je ne vois pas en quoi
    Citation Envoyé par tachmou Voir le message
    Traiter les données dans la fonction myupdatefcn est juste "pas envisageable"
    Tu veux bien appeler ton Callback à chaque changement, non? Ou ai-je mal compris?
    Dernière modification par Invité ; 01/02/2012 à 21h07.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/07/2009, 08h54
  2. [MySQL] comment stocker puis recuper les images dans une base de donnée
    Par essono dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/11/2006, 23h07
  3. Réponses: 1
    Dernier message: 22/11/2006, 22h49
  4. Réponses: 1
    Dernier message: 02/11/2006, 10h40
  5. Réponses: 20
    Dernier message: 23/03/2006, 16h21

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