|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||
|
Membre du Club
![]() Inscription : janvier 2012 Messages : 59 ![]() |
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 :
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 :
Il n'empêche que j'aimerai savoir s'il est possible de bloquer la vue 3D. |
||||
|
|
00
|
|
|
#2 | |||
![]() ![]() Inscription : novembre 2006 Messages : 12 919 ![]() |
Citation:
Code :
__________________
• Mes contributions MATLAB (R2009a - Windows & Linux) • 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) • Des larmes coulèrent doucement des yeux fermés du vieil homme. Moi je pleurais comme un enfant, que d'ailleurs pour lui je ne cesserais d'être ma vie durant (Amkoullel) • Lâché de Mogwai sur St Malo... aie aie aie... ouille ouille ouille |
|||
|
|
10
|
|
|
#3 | ||||
|
Membre du Club
![]() Inscription : janvier 2012 Messages : 59 ![]() |
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 :
Code :
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 |
||||
|
|
00
|
|
|
#4 | |
![]() ![]() Jérôme Inscription : septembre 2009 Messages : 3 598 ![]() |
Bonjour,
Code :
function [txt, indice] = myupdatefcn(empt, event_obj) << j'ai mis "indice" en sortie 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.
__________________
Débutant en MATLAB? Vous voulez faire une Interface Graphique? Les Tutoriels et la FAQ sont là pour vous aider ![]() Une erreur? "Ça ne marche pas" n'est pas une réponse acceptable Expliquez clairement votre problème (erreurs, résultats non attendus...).Citation:
|
|
|
|
10
|
|
|
#5 |
|
Membre du Club
![]() Inscription : janvier 2012 Messages : 59 ![]() |
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 ! |
|
|
00
|
|
|
#6 | |||
![]() ![]() Jérôme Inscription : septembre 2009 Messages : 3 598 ![]() |
Citation:
Citation:
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 Tu veux bien appeler ton Callback à chaque changement, non? Ou ai-je mal compris?
__________________
Débutant en MATLAB? Vous voulez faire une Interface Graphique? Les Tutoriels et la FAQ sont là pour vous aider ![]() Une erreur? "Ça ne marche pas" n'est pas une réponse acceptable Expliquez clairement votre problème (erreurs, résultats non attendus...).Citation:
|
|||
|
|
00
|
|
|
#7 | |
|
Membre du Club
![]() Inscription : janvier 2012 Messages : 59 ![]() |
Bonjour,
Oui, tu as bien compris ce point, mais... ! En fait, j'ai l'intention d'utiliser cette fonction pour afficher des dizaines de graphiques différents, avec des données d'entrées différentes à chaque fois (c'est là que je trouve matlab utile d'ailleurs)... et donc, ce que je veux mettre dans mes callback... sera différent selon l'utilisation ! D'où ma question... Et puis, pour faire simple, l'indice que je vais récupérer avec ma souris, me permettra, à la fin, d'accéder à environ une centaine de variables (au très très bas mot...) - et ce - pour chacun des dizaines de graphiques différents ou je veux cette fonctionnalité : l'interprétation dépendra donc de l'étude que je suis en train de faire, et donc non pas du pauvre graphique que je viens d'afficher. Après tu me diras : tu es obligé de passer par des graphiques ? Non, mais ça aide à la compréhension, et quand tu étudies un système MIMO (linéarisé pour l'étude N°0002134, ce qui est déjà "censé" simplifier le travail), les pôles du système entier sont affichés sur le même graphique... si je veux savoir à quelle entrée et à quelle sortie ils sont liés, avec la fonction "bodeplot" je suis mal barré [En gros, pour faire schématique, imagine que je veuille faire un gui assez conséquent (je sais, matlab n'est pas prévu pour ça, il n'est prévu que pour faire des applications concrètes rapides, mais ça c'est un autre débat)... ce gui doit pouvoir proposer des outils de toutes sortes... pour structurer le tout et me simplifier la vie, je vais utiliser la POO de l'autre discussion (déjà appliqué en partie comme je l'ai dit, et c'est génial - merci encore d'ailleurs) et afficher des graphiques : seulement, j'ai environ une dizaine de graphiques différents à afficher, et je veux que chacun d'entre eux ai cette fonctionnalité qui me semble quand même assez basique : je suis fortement surpris que matlab ne propose pas dans sa magnifique doc une solution toute faite pour ça... comme ce n'est pas le cas, je m'attèle à cette tâche, j'en fait une classe ou une fonction qu'il faudra utiliser d'une certaine manière, et je l'utiliserai pour chacun des graphiques que j'aurai besoin d'afficher (je n'ai pas que des pôles à afficher, j'ai des courbes temporelles, des bodes "faits à la main" - pareil, j'ai fait mon propre bode et j'y ai rajouté des fonctionnalités de "base" que matlab ne propose pas sur ses bodes - et d'autres graphiques issus de la normes, et peut être encore d'autres graphiques dont je n'ai même pas idée aujourd'hui... donc je voudrai m'éviter de me compliquer la tâche à devoir à chaque fois recoder la même chose, d'autant que vu la taille du programme que je dois faire, je me vois mal tout mettre dans le même fichier pour travailler sur le même workspace...] Merci pour ton liens, je l'avais déjà épluché et ça m'avait bien aidé d'ailleurs, je les ai même imprimés en partie (en les résumant sur 3 pages) et affichés sur le mur juste en face de moi, je ne peux pas les louper ^^. Cordialement, ps: et pour répondre à une question qu'on m'a déjà posé : pourquoi je ne programme pas en C++ avec Qt directement ? Pour trois raisons : 1) j'ai envie de maîtriser matlab 2) c'est le langage utilisé par mes encadrants 3) matlab propose pleins d'outils qui m'intéressent vraiment et permet de travailler "en live" si on veut faire des tests, et je n'ai pas envie de refaire une grosse partie de ce qui est déjà très bien fait sur matlab (rapidité des calculs en plus...) ps2: la tâche paraît grosse... elle ne l'est pas tant que ça, il "suffit" de s'atteler à la tâche méthodiquement... et j'ai trois ans pour réaliser ma thèse, et on m'accorde quelques mois pour développer mes outils d'étude. Donc c'est faisable. Et puis si on ne se donne pas de challenge, c'est pas marrant ! [EDIT] : Quelqu'un d'autre a fait quelque chose de similaire et passe par un "handle global"... moche, mais si c'est la seule solution, je l'utiliserai. Je vais essayer de coder ça. (par contre il a eu des bugs, je vais voir tout ça) [EDIT 2] : Aha! je pense que je tiens le bon bout avec evalin : Citation:
|
|
|
|
00
|
|
|
#8 | |||
![]() ![]() Jérôme Inscription : septembre 2009 Messages : 3 598 ![]() |
Je ne vois toujours pas en quoi cela est un problème
![]() Je te propose un exemple simple, qui je l'espère t'aidera: Code :
__________________
Débutant en MATLAB? Vous voulez faire une Interface Graphique? Les Tutoriels et la FAQ sont là pour vous aider ![]() Une erreur? "Ça ne marche pas" n'est pas une réponse acceptable Expliquez clairement votre problème (erreurs, résultats non attendus...).Citation:
|
|||
|
|
00
|
|
|
#9 |
|
Membre du Club
![]() Inscription : janvier 2012 Messages : 59 ![]() |
Bonjour,
Je te remercie beaucoup pour ton exemple, ça m'a éclairé sur certains autres points au passage, il est intéressant (sans ironie), mais... Imagine que je veuille, pour mon application 1, faire "MajTraces1", puis pour mon application tartenpion, faire "MajTracesTartenpion", etc... je suis obligé de recoder tout ce que tu as fait à chaque fois et faire les traitements nécessaires dans toutes ces sous fonctions... c'est lourd et long (pas pour une petite application, mais pour un gros bordel si) Moi j'imaginais plutôt coder une sorte de "boîte noire" que tu viendrais piocher parmis toutes les autres "boîtes noires" qui prend En entrée : - le handle de ton graphique (et peut-être d'autres options) En "sortie" : - l'index qui déclenche un callback à l'extérieur de sa propre fonction Lorsque l'index change, ça déclenche un callback d'un certain type dans le programme de l'utilisateur, et lorsqu'il est déclenché, l'utilisateur fait ce qu'il veut dans son propre callback. Je te rappelle que je suis thésard, et qui dit thésard dit gros gros gros fainéant : tout ce qui peut me simplifier la vie est bon à prendre (ou à développer dans mon cas). Mais j'y suis presque, je posterai ma "boîte noire" en question. Cordialement, ps : ah et sinon j'ai trouvé un slider un peu mieux foutu que l'officiel sur matlab central... (concerne l'autre discussion) il n'est pas temps réel mais bon, c'est le genre de "boîte noire" que je comptais développer aussi. C'est déjà fait : tant mieux ! |
|
|
00
|
|
|
#10 | |
![]() ![]() Jérôme Inscription : septembre 2009 Messages : 3 598 ![]() |
N'ayant pas une vue globale sur ce que tu veux faire, il est difficile de bien t'orienter... Je ne fais qu'en fonction de ce que tu me dis (et ce que je comprends).
Après tu peux très bien te servir du principe de l'autre discussion et y rajouter les éléments de celle-ci.
__________________
Débutant en MATLAB? Vous voulez faire une Interface Graphique? Les Tutoriels et la FAQ sont là pour vous aider ![]() Une erreur? "Ça ne marche pas" n'est pas une réponse acceptable Expliquez clairement votre problème (erreurs, résultats non attendus...).Citation:
|
|
|
|
00
|
|
|
#11 | ||
|
Membre du Club
![]() Inscription : janvier 2012 Messages : 59 ![]() |
Bonjour,
Je me rends bien compte que je touche du doigt un point particulier. Avec le code suivant, tu devrais comprendre. L'intérêt, c'est qu'au final, grâce à ce "truc" que j'essaye de coder, eh bien l'utilisateur pourra l'utiliser en faisant par exemple : Code :
Mon 'uicontrol' sera de type 'indexFromClick' (que je suis donc en train de créer, j'y arrive petit à petit, il faut que je règle quelques détails). Il a besoin des données à afficher 'DataIn' (ici mesPoles), du handle de l'axe où je veux les afficher (ici a), la valeur 'Value' par défaut (ici 0), et le nom du 'Callback' qui s’exécutera dès que la valeur de 'Value' changera (ici ma 'Value' sera la valeur de mon index...) Pour cela, je suis en train d'apprendre le fonctionnement des timer (je viens donc vérifier régulièrement la valeur de mon index : dès qu'elle change, je déclenche la fonction "Callback"). Et pour pouvoir implémenter cela à la sauce (merdique soit dit en passant - oui je sais, je me mets toute la communauté matlab à dos) matlab, et bien j'ai besoin d'apprendre à faire des fonctions qui puissent s'utiliser avec des "set" et des "get". Bon, ce ne sera peut-être pas un uicontrol, ce sera peut-être un autre truc au même niveau que "root" qui possèdera mon nom, mais ça c'est du détail .Cordialement, ps: vu à quel point je m'em***** pour faire cette fichu fonctionnalité, ce sera certainement la seule que je ferai, j'ai autre chose à faire après ps2: si quelqu'un se sent de faire ce boulot à ma place gratuitement, j'accepte... (utopie, utopie, quand tu nous tiens !) |
||
|
|
00
|
|
|
#12 | ||||
![]() ![]() Jérôme Inscription : septembre 2009 Messages : 3 598 ![]() |
Alors une solution déjà mentionnée:
Citation:
Citation:
Citation:
Allez au boulot
__________________
Débutant en MATLAB? Vous voulez faire une Interface Graphique? Les Tutoriels et la FAQ sont là pour vous aider ![]() Une erreur? "Ça ne marche pas" n'est pas une réponse acceptable Expliquez clairement votre problème (erreurs, résultats non attendus...).Citation:
|
||||
|
|
00
|
|
|
#13 | ||||||||
|
Membre du Club
![]() Inscription : janvier 2012 Messages : 59 ![]() |
Bonjour,
J'ai une première version simplifiée fonctionnelle, mais pas comme je le souhaite car : - j'utilise une variable globale alors que je voudrais pouvoir utiliser "get(a, 'index')" dans ma fonction "aCallback" (ce que je n'arrive pas à faire marcher) - les "set" ne fonctionnent pas comme prévu (je crois savoir d'où proviennent mes erreurs : j'ai utilisé des "nested functions" au lieu des functions classiques de matlab) Je la poste quand même... Arborescence générale : main/@uiindexer/uiindexer.m main/@uiindexer/set.m main/@uiindexer/get.m main/main.m main/@uiindexer/uiindexer.m Code :
Code :
Code :
Code :
Cordialement, |
||||||||
|
|
00
|
|
|
#14 |
![]() ![]() Formateur en informatique Inscription : novembre 2007 Messages : 2 538 ![]() |
Bonjour,
Je suis pas sûr que ce soit une bonne idée de nommer tes fonctions GET et SET: elles vont cacher les fonctions GET et SET de MATLAB ce qui peut entrainer des erreurs (c'est d'ailleurs le cas chez moi lorsque j'exécute ton MAIN). De plus, je ne comprends pas bien pourquoi tu déclares des variables globales, surtout que tu ne les utilises pas (pas comme des variables globales en tous cas). Duf
__________________
Modérateur MATLAB Au boulot : Windows 7 , MATLAB 7.14 (r2012a) A la maison : ArchLinux
|
|
|
00
|
|
|
#15 |
|
Membre du Club
![]() Inscription : janvier 2012 Messages : 59 ![]() |
Bonjour,
J'avais oublié de virer cette variable globale (que je n'utilise pas) du main. J'étais en train d'updater, désolé. Quelles erreurs tu as sur matlab ? J'utilise pourtant la méthode décrite par la doc officielle matlab (version R14SP3) pour définir set et get pour ses propres objets. Cordialement, |
|
|
00
|
|
|
#16 |
![]() ![]() Formateur en informatique Inscription : novembre 2007 Messages : 2 538 ![]() |
Désolé j'ai été un peu trop vite, je n'avais pas mis les fichiers dans l'arborescence correcte
__________________
Modérateur MATLAB Au boulot : Windows 7 , MATLAB 7.14 (r2012a) A la maison : ArchLinux
|
|
|
00
|
|
|
#17 |
|
Membre du Club
![]() Inscription : janvier 2012 Messages : 59 ![]() |
J'ai remis à jour (désolé) : en fait il y a bien besoin d'une global, mais sur new_index... T'en penses quoi ? De toutes façons, je revois tout ça demain, il se fait tard maintenant ^^
j'ai aussi rajouté "delete(timerfindall)" (parce que mon code n'est pas propre, les timers sont laissés ouverts |
|
|
00
|
|
|
#18 | |||
![]() ![]() Jérôme Inscription : septembre 2009 Messages : 3 598 ![]() |
Un Timer... pourquoi pas. Moi j'aurais juste mis dans la fonction myupdatefcn un appel à
Qui aurait fait passer la valeur du nouvel indice, sans besoin d'un global. Pour les get/set à mettre en "interne" comme dans l'autre discussion (ma_fcn1 et ma_fcn2), ce qui donnerait quelque chose comme: Code :
__________________
Débutant en MATLAB? Vous voulez faire une Interface Graphique? Les Tutoriels et la FAQ sont là pour vous aider ![]() Une erreur? "Ça ne marche pas" n'est pas une réponse acceptable Expliquez clairement votre problème (erreurs, résultats non attendus...).Citation:
|
|||
|
|
00
|
|
|
#19 | ||||||||||||
|
Membre du Club
![]() Inscription : janvier 2012 Messages : 59 ![]() |
[EDIT : ce message est long et est à moitié useless, et je conseille de passer directement au suivant... je laisse celui-ci car si quelqu'un trouve une solution, je suis quand même preneur.)
Bonjour, Je galère... vous allez comprendre pourquoi : Citation:
pour le vérifier rapidement... (FIN devrait s'afficher à moment donné, mais ne le fait pas : il essaye d'accéder à "this", n'y arrive pas, mais n'affiche pas d'erreur, c'est le comportement de datacursormode qui ne l'a pas prévu). Citation:
ce qui permet de faire fonctionner le tout à la sauce matlab, certes, mais ne permet donc plus d'accéder à des méthodes définies directement dans la structure. Si je n'arrive pas à faire fonctionner le tout à la sauce matlab, c'est ce que je ferais bien sûr. Bon, j'ai recodé le tout pour que ce soit encore plus propre qu'avant, en suivant les consignes de la doc à la lettre, et.... ça foire toujours, of course. Voici le code actuel (remplace entièrement le précédent) : ../@uiindexer/uiindexer.m Code :
Code :
Code :
Code :
Vous pourrez remarquer mes commentaires à la fin du fichier uiindexer.m qui montre où est précisément mon problème. Lors de l’exécution, on constate bien que les lignes qui m'intéressent ne s’exécutent pas puisque "FIN" ne s'affiche pas (lors du clic sur un point du graphique). De plus, si vous faites un : dans la console après avoir cliqué sur un point de la courbe, l'index reste bloqué à sa valeur par défaut (j'ai mis 3 pour le constructeur par défaut). Cordialement, ps: vous pouvez vous amuser à modifier les données d'entrées comme bon vous semble avec set ou directement lors de la définition en faisant "a=uiindexer('data', donnee_perso)" (donnee_perso étant un tableau de données à afficher) ou à l'implémenter dans la figure et l'axe de votre choix, etc... |
||||||||||||
|
|
00
|
|
|
#20 | ||
|
Membre du Club
![]() Inscription : janvier 2012 Messages : 59 ![]() |
Bon,
En appliquant la méthode "Pseudo POO", ça marche, c'est beau, c'est rapide et ça marche... ah oui, et ça marche aussi. Ai-je spécifié que ça marche ? Un seul fichier, pas de restriction sur le nom du répertoire : uiindexer.m Code :
Puis cliquez sur le graphique... et récupérer l'index : Oh miracle, ça marche, c'est puissant, c'est rapide, c'est intuitif, c'est simple... Lors de la création, on peut spécifier la figure, l'axe et les données. Bon, je vais rester avec cette fonction... au pire, peut-être que je l'implémenterai dans une classe façon matlab pour ne pas dépayser les utilisateurs "classiques" de matlab (donc set, get etc...). J'essaye pour l'instant de mettre un maximum de fonctionnalités. Cordialement, ps je suis de retour vendredi, pas avant. |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com