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 :

Passage de R2012 à R2016 pour les graphiques Handle des UIControl


Sujet :

Interfaces Graphiques

  1. #1
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2014
    Messages : 82
    Points : 45
    Points
    45
    Par défaut Passage de R2012 à R2016 pour les graphiques Handle des UIControl
    bonjour
    j'ai developpé une application matlab avec des figures et UI control dans la version R2012b

    je dois maintenant la porter en R 2016b et je rencontre des problemes car, si je comprends bien, le systemes graphique a été modifié avec R2014.

    Le site de matlab indique que certains codes graphiques devront être revisités (= adaptés ?) pour fonctionner.

    Parmi les modifications, il semble que les UIcontrol aient été modifiés:

    avant h= uicontrol (parametres) retournait un handle qui pouvait si besoin être utilisé comme un nombre.

    R2014 et plus , la même commande h= uicontrol (parametres) retourne une structure et donc h ne peut plus être utilisé comme un nombre.

    Mon code ne marche plus à cause de cela...d'autant que il y a des commandes callback d'autre éléments graphique qui utilise le handle du UI control en tant que "nombre".

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        StatePanel.HandleState(indice)=uicontrol('Style','pushbutton','Position',PositionUIControl,'String',NomState,'FontSize',TaillePolice,'Parent',StatePanel.HDessin);  % Hpanel
        StatePanel.ListUIControlInclus(IndiceUIControl)=StatePanel.HandleState(indice);    % pour fonctionnementdes sliders du panel
        IndiceUIControl=IndiceUIControl+1;
     
     
       % TextCallback=['RepositionneBouttonState(' num2str(StatePanel.HandleState(indice)) ');']; 
     
       TextCallback=['RepositionneBouttonState(' num2str(StatePanel.HandleState(indice)) ', ' StatePanel.Name '.WithHighDessin );'];
             % RepositionneBouttonState(Handle)  est une fonction pour deplacer
             % le bouton a la sourie
       set(StatePanel.HandleState(indice),'callback',TextCallback);
    la ligne qui ne fonctionne plus est "TextCallback=['RepositionneBouttonState(' num2str(StatePanel.HandleState(indice)) ', ' StatePanel.Name '.WithHighDessin );'];"

    car StatePanel.HandleState(indice) n'est plus un handle mais une structure. (c'est donc num2str qui plante, logique)

    je n'ai pour le moment aucune idee de la façon de corriger et j'ai bien peur de devoir réécrire une bonne partie de l'application. (qui n'est pas petite)

    Dans les propriétés de la structure retournée par la commande UIControl, je ne vois rien qui ressemble à un handle.



    Sur le site de Matworks j'ai trouvé un utilitaire censé faciliter ce type de portage ("analyse du code et propositions de corrections" ; Il se nomme "R2014b Graphics Update Tools" et le fichier à telecharger est "R2014b Graphics Update Tools.mltbx" (je comprends vu l'extension que c'est une toolbox ?) mais je n'ai aucune idée de comment installer et utiliser cet utilitaire.

    Des idées ?

    Merci

  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 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    C'est effectivement un problème de conception. Je pense que tu vas malheureusement devoir modifier ton code en profondeur.

    La propriété 'Tag' est très pratique pour identifier un composant.

    Tu crées par exemple un bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uicontrol('Style', 'PushButton', 'Tag', 'okButton')
    Et ensuite, pour le retrouver n'importe où dans le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    h = findobj('Type', 'UiControl', 'Tag', 'okButton')
    Pour les Callback, tu devrais éviter de les définir avec des chaines de caractères.
    C'est moins efficace et ce n'est par exemple pas pris en charge par le MATLAB compiler.

    Par exemple, plutôt que d'écrire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function testButton1
     
    figure(1)
    clf
     
    uicontrol('Style', 'PushButton', ...
        'Tag', 'okButton', ...
        'Callback', 'disp(''OK'')')
    Tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function testButton2
     
    figure
     
    uicontrol('Style', 'PushButton', ...
        'Tag', 'okButton', ...
        'Callback', @dispOK)
     
    function dispOK(~,~)
     
        disp('OK')
    Tu peux aussi attribuer un même Callback à plusieurs objets :
    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 testButton3
     
    figure(1)
    clf
     
    uicontrol('Style', 'PushButton', ...
        'Units', 'Normalized', ...
        'Position', [0.1 0.1 0.1 0.1], ...
        'Tag', 'okButton', ...
        'String', 'OK', ...
        'Callback', @dispButton)
     
    uicontrol('Style', 'PushButton', ...
        'Units', 'Normalized', ...
        'Position', [0.3 0.1 0.1 0.1], ...
        'Tag', 'cancelButton', ...
        'String', 'Cancel', ...
        'Callback', @dispButton)
     
    function dispButton(hObject, event)
     
       str = get(hObject, 'String');
     
       disp(str)
    Tu peux également passer des arguments :

    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
    function testButton4
     
    figure(1)
    clf
     
    uicontrol('Style', 'PushButton', ...
        'Units', 'Normalized', ...
        'Position', [0.1 0.1 0.1 0.1], ...
        'Tag', 'okButton', ...
        'String', 'OK', ...
        'Callback', {@dispButton, 'OK'})
     
    uicontrol('Style', 'PushButton', ...
        'Units', 'Normalized', ...
        'Position', [0.3 0.1 0.1 0.1], ...
        'Tag', 'cancelButton', ...
        'String', 'Cancel', ...
        'Callback', {@dispButton, 'Cancel'})
     
    function dispButton(hObject, event, str)
     
       disp(str)
    Tu peux toujours retrouver les objets à l'aide de findobj dans le Callback :

    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
    function testButton5
     
    figure(1)
    clf
     
    uicontrol('Style', 'PushButton', ...
        'Units', 'Normalized', ...
        'Position', [0.1 0.1 0.1 0.1], ...
        'Tag', 'okButton', ...
        'String', 'OK', ...
        'Callback', {@dispButton, 'OK'})
     
    uicontrol('Style', 'PushButton', ...
        'Units', 'Normalized', ...
        'Position', [0.3 0.1 0.1 0.1], ...
        'Tag', 'cancelButton', ...
        'String', 'Cancel', ...
        'Callback', {@dispButton, 'Cancel'})
     
    function dispButton(hObject, event, str)
     
        h = findobj('Style', 'PushButton');
        for i = 1:numel(h)
     
            disp(sprintf('Button %d : %s', i, h(i).Tag))
     
        end
     
        disp(sprintf('Button pressed : %s', hObject.Tag))
        disp(sprintf('String : %s', str))
    Une dernière version avec des fonctions imbriquées (Nested Functions), plus complexe à mettre en œuvre selon moi quand on débute :
    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
    function testButton6
     
    figure(1)
    clf
     
    button(1) = uicontrol('Style', 'PushButton', ...
        'Units', 'Normalized', ...
        'Position', [0.1 0.1 0.1 0.1], ...
        'Tag', 'okButton', ...
        'String', 'OK', ...
        'Callback', {@dispButton, 'OK'});
     
    button(2) = uicontrol('Style', 'PushButton', ...
        'Units', 'Normalized', ...
        'Position', [0.3 0.1 0.1 0.1], ...
        'Tag', 'cancelButton', ...
        'String', 'Cancel', ...
        'Callback', {@dispButton, 'Cancel'});
     
        function dispButton(hObject, event, str)
     
            for i = 1:numel(button)
     
                disp(sprintf('Button %d : %s', i, button(i).Tag))
     
            end
     
            disp(sprintf('Button pressed : %s', hObject.Tag))
            disp(sprintf('String : %s', str))
     
        end
     
    end
    Tu trouveras beaucoup d'informations dans la FAQ Interfaces graphiques (GUI) et dans ces tutoriels : Interfaces Graphiques (GUI)

    Un dernier conseil, prend du recul et quand tu auras trouvé le courage de réécrire ton code, ne modifie pas directement l'existant.
    Crée un nouveau projet en conservant le précédent. C'est beaucoup plus efficace au final
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2014
    Messages : 82
    Points : 45
    Points
    45
    Par défaut Merci pour les conseils
    bonjour.

    Un grand Merci Monsieur Jérome Briot pour vos explications et conseils que je vais étudier sérieusement dans les jours qui viennent.

    Bien qu’utilisateur de l'environnement matlab simulink depuis 15 ans au moins, je reste un débutant et en réalité un autodidacte. Le seul cour d'informatique que j'ai jamais subi date de 1982 et traitait de la mise en oeuvre d'un IBM1130 dont la programmation en Fortran se faisait avec des cartes perforées... y compris le passage des donnes d'entrées et des résultats...flexible quoi!

    J'ai en conséquence des lacunes de fond en informatique qui génèrent probablement des choix de programmation non pertinents. Je trouve une solution aux problèmes que je rencontre, mais elle peut être "non optimale" (voire etrange pour un informaticien).

    L'usage du caractère " @ " (que j'ai vu précédemment à votre message mais sans rien y comprendre, dans le modèle de Simulink S level 2 S function) est par exemple complètement inconnu pour moi et la notation de callback que vous utiliser pour le passage de parametres à une fonction avec cet "opérateur" " @ " est également inconnu pour moi. Pour l'instant je n'ai pas trouvé de documentation la dessus dans la documentation de Matlab.
    En conséquence votre message m'est très précieux , tout comme globalement le site Developpez.com / matlab.

    Quant à re développer globalement mon projet, il va vraiment falloir du courage et du temps. Les 2 manquent...

    Retour après test de vos propositions si j'ai des questions. (j'espere sous 1 semaine).

    Merci Beaucoup

  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 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    En regardant d'un peu plus près le code, tu n'as pas besoin de passer le handle en argument du Callback :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       TextCallback=['RepositionneBouttonState(' StatePanel.Name '.WithHighDessin );'];
             % RepositionneBouttonState(Handle)  est une fonction pour deplacer
             % le bouton a la sourie
       set(StatePanel.HandleState(indice),'callback',TextCallback);
    Tu récupèreras l'handle dans la fonction RepositionneBouttonState avec gbco

    Si tu n'y arrive pas, montre nous le code de la fonction RepositionneBouttonState

    Pour le caractère @, c'est juste un choix de syntaxe fait par l'équipe de MathWorks.

    Dans le cas ci-dessus, tu peux écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set(StatePanel.HandleState(indice),'callback', {@'RepositionneBouttonState, [StatePanel.Name '.WithHighDessin']});
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  5. #5
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2014
    Messages : 82
    Points : 45
    Points
    45
    Par défaut Question 1 code testButton2
    re bonjour

    Question 1
    dans le code testButton2
    function dispOK(~,~) pourquoi faut-il mettre dans la déclaration de la fonction dispOK "(~,~)" en paramètre et qu'est ce que cela signifie?
    j'ai noté que si je retire "(~,~)" de la déclaration de fonction, j'ai une erreur "Too many input arguments" lors de l'appel du callback sauf que que dans la définition du callback " 'Callback', @dispOK " il n'y a aucun argument !

    argument factice ???

    bizarre!

  6. #6
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2014
    Messages : 82
    Points : 45
    Points
    45
    Par défaut Question2 code function testButton3
    Dans cet exemple 'qui fonctionne fort bien...) je ne comprends pas la gestion des paramètres:

    l'appel de la fonction "dispButton" est fait par "'Callback', @dispButton " je ne vois pas de parametres

    mais la déclaration de fonction dispButton " function dispButton(hObject, event) " demande 2 parametres " hObject" et "event"

    il vient alors 2 questions
    1) comme se fait il que à l'appel de la fonction dispButton je n'ai pas de message du style "not enough parameters" ?
    pour moi l'appel d'une fonction se fait avec le même nombre de variables que sa déclaration !

    2) comment sont définies les valeurs des parametres " hObject" et "event"

    j'imagine que peut être " hObject" et "event" sont des mot réservés similaires à "gcf (current figure handle)", "gca" (current axes handle) etc ? Mais je ne trouve pas leur signification dans la documentation.


    merci

  7. #7
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Cela fait partie des subtilités des langages dit de haut niveau. Certaines choses sont masquées…

    Quand tu définis un Callback sous la forme @myCallback, MATLAB attend implicitement une fonction myCallback avec deux arguments d'entrée par défaut. On nomme couramment ces deux arguments hObject et event :
    • hObject est l'identifiant de l'objet (handle) qui a déclenché le Callback (donc équivalent à gcbo).
    • event est une structure d'événements lié à l'objet hObject.


    Donc si tu définis un bouton comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uicontrol('Callback', @myCallback)
    Tu dois forcément définir la fonction comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function myCallback(hObject, event)
    Encore une fois ces deux arguments sont passés de manière implicite.

    Si tu veux passer des arguments supplémentaires, ils viendront en 3ème, 4ème, 5ème… position :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uicontrol('Callback', {@myCallback, arg1, arg2, arg3, arg4})
    Ce qui donne au niveau de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function myCallback(hObject, event, arg1, arg2, arg3, arg4)
    L'utilisation de ~ n'est pas spécifique aux Callback. C'est un opérateur qui permet de dire à MATLAB de ne pas tenir compte de l'argument remplacé par ce caractère.

    Un exemple, la fonction max renvoi la valeur maximale et l'indice de la valeur maximale dans un tableau ;

    Il arrive souvent que l'on ai juste besoin de l'indice, pas de la valeur correspondante. Voici comment faire :

    Dans le code ci-dessus, MATLAB renvoi uniquement l'indice

    En mélangeant les deux points que je viens de t'expliquer, si tu crées un Callback dans lequel tu n'as besoin de gérer ni l'objet ni l'événement associé, tu écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function myCallback(~, ~)
    Dans tous les cas, l'utilisation de ~ n'est pas obligatoire. Mais cela permet parfois d'améliorer les performances des codes MATLAB.

    J'espère avoir été clair.
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  8. #8
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2014
    Messages : 82
    Points : 45
    Points
    45
    Par défaut
    Merci Monsieur Jérome
    C'est parfaitement clair.
    je vais poursuivre les études.

    Concernant le ~ il va m'être utile par exemple pour récupérer seulement une dimension d'une matrice avec Size. Actuellement je mets une variable intile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [A, NbColonne] = size(Matrice);
    et je pourrai écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [~,  NbColonne] = size(Matrice);
    ce qui fait une variable en moins.

    Merci

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Citation Envoyé par Cata25 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [~,  NbColonne] = size(Matrice);
    Dans ce cas précis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NbColonne = size(Matrice, 2);
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

Discussions similaires

  1. Couleurs pour les graphiques avec Matlab
    Par mansgueg dans le forum MATLAB
    Réponses: 1
    Dernier message: 24/06/2010, 16h27
  2. Réponses: 2
    Dernier message: 07/05/2010, 17h14
  3. une bibliotèque pour les graphique 3D
    Par cedrix57 dans le forum 3D
    Réponses: 6
    Dernier message: 06/04/2009, 10h20
  4. Problème avec ChartFX pour les graphiques
    Par Saten dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/10/2008, 16h41

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