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 :

Comportement étrange entre GUIs : [set(gcf,'UserData')] et [get(gcf,'UserData')] [Débutant]


Sujet :

Interfaces Graphiques

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 13
    Points : 14
    Points
    14
    Par défaut Comportement étrange entre GUIs : [set(gcf,'UserData')] et [get(gcf,'UserData')]
    Bonjour,

    J'ai un programme qui fait appel à un éditeur de sélection de région sur une image à travers un bouton. Cet éditeur, je l'ai récupéré sur le Filexchange (CROIEditor). Voilà alors la petite histoire :

    J'ai besoin de laisser la possibilité à l'utilisateur de définir un roi et j'ai bien aimé la proposition que j'ai trouvé sur le Filexchange. Donc lorsque l'utilisateur appuie sur le bouton correspondant de l'interface graphique, voilà le code exécuté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    manual_selection(handles.rgb_CT);
    pour ce qui est de la fonction manual_selection, en voici le 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
     
     
    function manual_selection(img)
           roiwindow = CROIEditor(img);
     
            % you can also assign an image after you created the window.
            % e.g. roiwindow.image = thenewimage;
     
           set(gcf,'UserData',{});
           addlistener(roiwindow,'MaskDefined',@your_roi_defined_callback)
     
           function your_roi_defined_callback(h,e)
                [mask, labels, n] = roiwindow.getROIData; % retrieve the generated data
                                                                               % one could also use mask = roiwindow.roi   ; ...
                delete(roiwindow);  % this also closes the figure
                set(gcf,'UserData',{'selected';mask});
           end
    end
    Tout le problème réside alors dans le fait de pouvoir récupérer le masque définit par l'utilisateur dans le GUI principal pour pouvoir traiter certaines données !
    Je ne vais pas copier ici le contenu de tout le CROIEditor qui fait 500 lignes mais certaines parties.

    Une fois que l'utilisateur a définit sa région d'intérêt, il appuie sur le bouton "appliquer" qui lève un évènement 'MaskDefined' et grâce à notre addlistener on peut alors récupérer ce masque dans la fonction manual_selection. le masque en question est sauvegardé dans une variable puis récupéré dans l'interface principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    selection_output = get(gcf,'UserData');
    Voilà alors le problème... Une fois la fonction manual_selection exécutée, j'ai tenté un
    uiwait(gcf) pour attendre que l'utilisateur ait finit de définir sa région. Malheureusement ça ne marche pas comme prévu dès qu'une action est terminée le script reprend. Exemple : une première région est définie, l'utilisateur ne peut en définir une deuxième complémentaire et n'a pas le temps d'appuyer sur le bouton "appliquer".

    Je tente donc le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while isempty(selection_output)
        uiwait(gcf);
        selection_output = get(gcf,'UserData');
    end
     
    size(selection_output)
    operation_check = selection_output{1}
    Donc pour le coup ça marche !

    MAIS... que faire si l'utilisateur décide soudainement d'annuler ce qu'il faisait et fermer la fenêtre ?! j'ai donc tenté de modifier le code lors de la fermeture de la fenêtre également :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            function closefig(this,h,e)
     
                temp = get(gcf,'UserData');
                if isempty(temp)
                set(gcf,'UserData',{'cancelled'});
                end
     
                uiresume(gcf); % on appellera cette ligne marqueur1
                delete(this);    % on appellera cette ligne marqueur2
            end;
    Les ennuis commencent, voilà alors l'erreur inattendue que j'ai :
    ans =

    526 526 3

    Cell contents reference from a non-cell array object.

    Error in test3_1_listbox>pushbutton8_Callback (line 809)
    operation_check = selection_output{1}

    Error in gui_mainfcn (line 96)
    feval(varargin{:});

    Error in test3_1_listbox (line 42)
    gui_mainfcn(gui_State, varargin{:});

    Error in @(hObject,eventdata)test3_1_listbox('pushbutton8_Callback',hObject,eventdata,guidata(hObject))


    Error while evaluating uicontrol Callback
    La taille de la variable en sortie est de 526 526 3... ca ressemble à une image donc la fonction get(gcf,'UserData') fonctionne peut-être sur un autre gcf que celui attendu !

    J'ai donc essayé de glisser entre marqueur1 et marqueur2 la ligne suivante :
    Undefined function 'wait' for input arguments of type 'double'.

    Error in CROIEditor/closefig (line 203)
    wait(gcf);

    Error in CROIEditor>@(varargin)this.closefig(varargin{:}) (line 315)
    'CloseRequestFcn',@this.closefig, 'visible','off');

    Error using waitfor
    Error while evaluating figure CloseRequestFcn


    ans =

    1 1


    operation_check =

    cancelled
    Bon cette fois j'ai une erreur MAIS la sortie est bien celle que l'on attendait ! par contre la fenêtre ne se ferme plus...

    Je tente donc de remplacer uiwait(gcf) par (laisser le temps au script principal de récupérer la valeur ?) :
    Retour à la case départ, le programme fait une pause puis on a exactement la même erreur qu'auparavant :
    ans =

    526 526 3

    Cell contents reference from a non-cell array object.

    Error in test3_1_listbox>pushbutton8_Callback (line 809)
    operation_check = selection_output{1}

    Error in gui_mainfcn (line 96)
    feval(varargin{:});

    Error in test3_1_listbox (line 42)
    gui_mainfcn(gui_State, varargin{:});

    Error in @(hObject,eventdata)test3_1_listbox('pushbutton8_Callback',hObject,eventdata,guidata(hObject))


    Error while evaluating uicontrol Callback
    A partir de là je manque d'idée pour faire fonctionner mon interface... quelqu'un aurait une idée s'il-vous-plaît ?

    Merci d'avance !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Si j'ai bien compris ce que tu souhaitais faire :
    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
    function manual_selection(img)
    mask = [];
    labels = [];
    n = [];
     
    roiwindow = CROIEditor(img);
    addlistener(roiwindow, 'MaskDefined', @your_roi_defined_callback);
     
    handleEditor = findall(0, 'Name', 'Analyzer - ROI Editor');
    waitfor(handleEditor)
     
    if ~isempty(mask)
        % Traitement des données mask, labels, n
    else
        % Annulé
    end
     
        function your_roi_defined_callback(~,~)
            [mask, labels, n] = roiwindow.getROIData;
        end
    end

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 13
    Points : 14
    Points
    14
    Par défaut
    Merci pour la réponse!

    Pour le coup, oui, tu as parfaitement compris ça marche comme je le voulais !


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

Discussions similaires

  1. [Forms6i] Un IF-ELSIF au comportement étrange
    Par lafouine dans le forum Forms
    Réponses: 11
    Dernier message: 13/09/2005, 16h40
  2. Comportement étrange apres une désinstallation
    Par Sunchaser dans le forum Excel
    Réponses: 4
    Dernier message: 06/08/2005, 20h44
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 22h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 10h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 12h23

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