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 :

Problème rotate3D sur axes GUI


Sujet :

Interfaces Graphiques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 22
    Par défaut Problème rotate3D sur axes GUI
    Bonjour à tous,

    J'ai un soucis avec des axes d'une interface graphique.
    J'ai créé une fonction nested, Axes_update, qui récupère différentes informations (le handle de l'axe à update, les données à tracer ...) et qui le "met à jour". Vous trouverez le code ci après.

    Mon soucis est donc le suivant : Après un choix sur une listbox d'une variable à tracer, j'appelle Axes_update. Elle met bien à jour les graphiques et autorise la rotation3D. MAIS pour ce qui est du "reset" de la vue 3D, elle ne garde que les paramètres (axes et vue) de la première variable choisie, c'est à dire celle qui correspond au premier appel de Axes_update et donc au premier appel de "rotate3D on".

    Exemple : si la première variable choisie a une valeur sur l'axe Z allant de 0 à 150, Axes_update la trace et permet la rotation3D.
    Mais si l'utilisateur choisit une nouvelle variable, ayant des valeurs allant de 0 à 1000 sur l'axe des Z, Axes_update la trace, permet la rotation MAIS si l'utilisateur se retrouve dans une vue peu agréable (ce qui arrive souvent), si il revient à la vue d'origine (double clic ou clic-droit -> Reset to original view), la vue revient sur les axes de la première variable (0 à 150)

    J'ai essayé d'effectuer un "rotate3D off" avant tout nouveau "rotate3D on" mais rien n'y fait.

    Existerait-il un moyen de reset rotate3D pour résoudre mon problème ? Ou alors existerait il un moyen de résoudre mon problème ?

    Merci d'avance !

    Un appel à la fonction se fait de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    nomAxe=handles.Axes_CartoNomi3D;
            titre='Visualisation pré-modélisation';
            type='3D';
            typePoint='*';
            taillePoint=50;
            Axes_update(hObject,handles,nomAxe,titre,type,typePoint,taillePoint,Carto.data(:,1),Carto.data(:,2),Carto.data(:,Carto.paramVisu_idx+2))
            Carto = getappdata(handles.grid_CartoModelisation,'Carto');
    Voici le code de la 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
    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
    77
    78
    % Fonction de mise à jour des graphiques en accord avec les paramètres
    % choisis.
    function Axes_update(hObject,handles,axeName,titleName,axeType,markerType,markerSize,X,Y,Z)
    % axeType : plot(2D) ou scatter(3D)
    % Carto = getappdata(handles.grid_CartoModelisation,'Carto');
    
    Carto = getappdata(handles.grid_CartoModelisation,'Carto');
    
    if strcmp(axeType,'2D')
        Carto.NaNplotind=0;
        for i=1:length(X)
            if(isnan(X(i))||isnan(Y(i)))
                Carto.NaNplotind=1;
            end
        end
        if (Carto.NaNplotind==1)
            Carto.userMessage='Au moins une valeur de ce paramètre n''''est pas un nombre';
            set(handles.StaticText_userMessages,'String',strcat(Carto.userMessage,{' - Graphiques 2D non mis à jour, Cas intraitable - '},titleName));
        else
            axes(axeName);
            % gestion affichage points d'appuis
            if ((Carto.modelisationmodel~=0)&&(Carto.CB_ptsAppuis==1))
    
                if (not(ischar(whatIsMyIndex(hObject,handles,Carto.upSorted,Carto.isoN))))
    
                    Matrix(:,1)=Carto.data(:,1);
                    Matrix(:,2)=Carto.data(:,2);
                    Matrix(:,3)=Carto.data(:,Carto.paramVisu_idx+2);
                    valuesToPlotIsoN(hObject,handles,Carto.isoN,Matrix)    
                    Carto = getappdata(handles.grid_CartoModelisation,'Carto');
    
                end
            end
            plot(X,Y,markerType,'MarkerSize',markerSize)
            if ((Carto.modelisationmodel~=0)&&(Carto.CB_ptsAppuis==1))
                hold on
                    if (not(ischar(whatIsMyIndex(hObject,handles,Carto.upSorted,Carto.isoN))))
                        plot(Carto.valuesToPlot(:,1),Carto.valuesToPlot(:,2),'rs','MarkerSize',markerSize+1,'MarkerEdgeColor','k',...
                            'MarkerFaceColor','k')
                    end
                hold off
            end
            legend(strcat(Carto.param(Carto.paramVisu_idx+2),{' ('},Carto.legende(Carto.paramVisu_idx+2),')'),'Location','BestOutside','Orientation','horizontal')
            axis([min(min(0,min(X)),min(0,min(Carto.reseauxiso.C))) max(max(Carto.reseauxiso.C)*(1.05),max(X)*(1.05)) min(0,min(Y)) max(Y)*(1.1)])
            xlabel('C (N.m)')
            ylabel(strcat(Carto.param(Carto.paramVisu_idx+2),{' ('},Carto.legende(Carto.paramVisu_idx+2),')'))
            title(strcat(titleName,{' '},Carto.param(Carto.paramVisu_idx+2),{' - isoN '},num2str(Carto.titleValue)));
            set(handles.StaticText_userMessages,'String',strcat(Carto.userMessage,{' - Graphiques mis à jour - '},titleName));
        end
    elseif strcmp(axeType,'3D')
        
        axes(axeName);
        rotate3d off
        rotate3d on
        
        scatter3(X,Y,Z,markerSize,Z,markerType)
        if ((Carto.modelisationmodel~=0)&&(Carto.CB_ptsAppuis==1))
            hold on
                scatter3(Carto.data(:,1),Carto.data(:,2),Carto.data(:,Carto.paramVisu_idx+2),markerSize+50,'k','rs')
            hold off
        end
        colorbar('location','EastOutside')
        axis([min(min(X)*0.9,min(X)*1.1) max(X) min(min(Y)*0.9,min(Y)*1.1) max(Y) min(min(Z)*0.9,min(Z)*1.1) max(Z)])
        xlabel('N (tour(s)/min)')
        ylabel('C (N.m)')
        zlabel(strcat(Carto.param(Carto.paramVisu_idx+2),{' ('},Carto.legende(Carto.paramVisu_idx+2),')'))
        title(strcat(titleName,{' '},Carto.param(Carto.paramVisu_idx+2)))
        
        if axeName==handles.Axes_CartoNomi3D
            set(handles.ST_cb_nomi3D,'String',strcat('(',Carto.legende(Carto.paramVisu_idx+2),')'));
        elseif axeName==handles.Axes_CartoMaxi3D
            set(handles.ST_cb_maxi3D,'String',strcat('(',Carto.legende(Carto.paramVisu_idx+2),')'));
        end
        set(handles.StaticText_userMessages,'String',strcat(Carto.userMessage,{' - Graphiques mis à jour - '},titleName));
    end
    
    setappdata (handles.grid_CartoModelisation,'Carto',Carto);

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 22
    Par défaut
    Rebonjour à tous,

    Hum ... Je n'ai toujours aucune réponse. Si mon problème n'est pas clair, n'hésitez pas à me poser des questions !

    J'ai d'ailleurs un autre soucis que je me permet d'évoquer ici :
    J'ai par ailleurs dans mon interface graphique un "Static Text" qui me sert à afficher des messages à l'utilisateur. Dans tout mon code, dès que j'effectue la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set(handles.StaticText_userMessages,'String',inString);
    où inString est une chaîne de caractères quelconque, le static text prend la valeur et celle ci s'affiche bel et bien dans l'interface graphique.
    Or, alors que j'ai créé un "Push Button" save qui permet de sauvegarder des datas (des grosse matrices en gros) sous excel, je met à jour le même "Static Text" avant de lancer les commandes "xlswrite" pour afficher à l'utilisateur que la sauvegarde commence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    set(handles.StaticText_userMessages,'String',cell2mat(strcat({'En cours de sauvegarde dans le fichier '},Carto.Filename,{'. Veuillez patienter.'})));
    Hors le static text prend bien la valeur (j'ai fait la commande suivante et je sors bien de la boucle while)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while(not(strcmp(inString,(get(handles.ST_FileName,'String')))))
    set(handles.StaticText_userMessages,'String',inString)
    end
    Le pire c'est que juste après les xlswrite j'effectue la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set(handles.StaticText_userMessages,'String',cell2mat(strcat({'Sauvegarde des cartographie des paramètres modélisés dans '},Carto.Filename,{' terminée.'})));
    qui met bien à jour le StaticText. J'ai aussi essayé de créer la toute bête nested function suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function MajUserMessage(hObject,handles,inString)
    Carto = getappdata(handles.grid_CartoModelisation,'Carto');
     
    set(handles.StaticText_userMessages,'String',inString);
     
    setappdata(handles.grid_CartoModelisation,'Carto',Carto);
    assignin ('base','Carto',Carto);
    que j'appele pour changer mon StaticText mais rien y fait. Même pas mon dernier essai à mettre une grosse boucle for autour du while ...

    "I need somebody, help !" ^^

    Merci d'avance,
    Kulnae.

  3. #3
    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
    Pour ta première question, la documentation spécifie que la remise à zéro avec ROTATE3D donne une orientation par défaut :

    Reset to Original View — Reset to the default view (azimuth -37.5°, elevation 30°).
    Pour la seconde question, je ne trouve pas la question dans ton message

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 22
    Par défaut
    Pour le ROTATE3D : en effet, il y a bien retour à la vue d'origine mais avec les axes (x,y,z) de la première variable qui a été affichée dans cet "axes" (nom GUI d'un graphique). Et comme j'affiche des variables ayant des valeurs différentes sur l'axe des Z, je me retrouve avec des axes (x,y,z) totalement inadaptés.

    Pour la 2e question, la question est :
    "Comment mettre à jour graphiquement un static text dès le changement de sa valeur String effectué ?"

    En fait, dans une fonction Callback, je met à jour 2 fois la valeur string du static text. Le static text prendra bien 2 valeur différentes mais la seule valeur qui sera affichée graphiquement sera la 2e valeur, celle mise en dernière.
    Encore plus clairement, je met à jour le ST (Static Text) au début de mon Callback sur un Push Button pour dire "Attention, vous avez demandé à faire ceci et cela". Les instructions étant des xlswrite, elles sont longues et on a tout à fait le temps de les voir s'éxécuter (30 secondes à peu près). La fin du Callback étant atteinte, je met à jour une 2e fois le ST pour dire "Fini !"
    Est-ce plus clair

  5. #5
    Invité
    Invité(e)
    Par défaut
    Le rafraichissement est bloqué par l'exécution de la fonction, ce n'est qu'une fois terminée que tes deux changements ont lieu, et ceci a lieu tellement vite que tu ne vois que le dernier.
    Pour forcer le rafraichissement, insère un drawnow juste après le premier changement.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 22
    Par défaut
    Merci ! Problème des static text résolu !
    Je me doutais bien que l'écriture se faisait à la toute fin de la fonction et tu m'as fourni l'instruction adéquate

    Reste le problème "default view" du "rotate3D" ...
    As-tu une idée toi Winjerome ?

Discussions similaires

  1. récupérer le click up de la souris sur une gui axes
    Par ArnaudFu13 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 05/11/2012, 14h52
  2. Problème de picking sur axe Z inversé
    Par Awakening dans le forum OpenGL
    Réponses: 2
    Dernier message: 09/03/2011, 00h59
  3. Réponses: 0
    Dernier message: 26/06/2010, 19h21
  4. [CR8] Problème tableau sur plusieurs pages???
    Par christophe28 dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 02/11/2004, 15h46
  5. [MFC] Problème pointeur sur une classe
    Par mick74 dans le forum MFC
    Réponses: 7
    Dernier message: 14/04/2004, 14h17

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