====== Commit 2006-11-14 ====== * **Redirection des flux standards**: * J'ai programmé un système qui permet de rediriger les flux standards ''std::cout'' et ''std::cerr'' vers +/- n'importe quoi. Ca permet, par exemple de rediriger les sorties dans un fichier sans rien toucher au reste du code! Actuellement, lorsqu'on lance Metafor, la sortie est redirigée dans un fichier ''logfile.txt'' (c'est temporaire - il faudra rendre ça plus général). En mode graphique, la sortie est également redirigée vers la nouvelle console (voir ci-dessous). * **Nouvelle Console**: * Dans le but de créer une vraie interface graphique à Metafor, j'ai réorganisé les différents threads pour obtenir, au final, une application graphique intégrant une console python. * L'ancienne console python utilisable à travers ''VizWin'' (j'étais certainement le seul à l'avoir déjà utilisée) est maintenant devenue la fenêtre principale de Metafor. Cela m'a permis d'inverser les threads (le thread principal est maintenant le thread graphique Qt/VTK et le thread secondaire est python). Bien sur, si on spécifie ''-nogui'', on retrouve la ligne de commande classique. * D'après la doc Qt, l'application Qt doit toujours être dans le thread principal. J'ai jamais vu de problème lorsqu'elle était dans un thread secondaire mais au moins, maintenant, c'est réglé. * __Avantages:__ * C'est plus beau. * On va pouvoir intégrer toutes sortes de choses dans cette fenêtre python (liens vers les ''VizWin'', un object browser, un lien vers l'aide de Metafor, etc). * On bénéficie de l'historique de commandes quel que soit l'endroit d'où on lance Metafor (même en double cliquant sur l'icône). * le thread de lecture de ''std::cin'' (''StdinReader'') est devenu inutile. Conséquence, il n'est plus nécessaire de taper 50x sur ''ENTER'' après ''quit'' pour quitter Metafor. On peut fermer Metafor simplement en détruisant la fenêtre python. * __Inconvénient:__ * J'ai pas réussi à supprimer la console complètement. Autrement dit, Metafor est toujours une "Win32 Console App". Il y a donc une moche fenêtre noire qui s'ouvre lorsqu'on lance Metafor. Le problème vient du fait que python fait des tests sur ''stdin'' et ''stdout'' (commande ''isatty'') pour voir si on est en mode interactif. Dans le cas d'une application purement graphique, python pense qu'on n'est pas en interactif et ça foire parce qu'il n'appelle pas ma fonction de lecture définie par le pointeur ''PyOS_ReadlineFunctionPointer'' (ça pourrait se corriger en commentarisant 3 lignes le source de python - ''parser/myreadline.c'', c'est débile). J'ai aussi essayé d'utiliser une autre fonction que ''PyRun_InteractiveLoop'' pour lancer python mais, dans ce cas, même si ça marche mieux, on perd tout de même certains affichages (si on écrit 'a=2' et puis 'a', python n'affiche pas la valeur de 'a') et écrire des commandes sur plusieurs lignes devient impossible en interactif. Ce qui est dommage c'est que si on fait la modif du source python et qu'on garde ''PyRun_InteractiveLoop'', tout fonctionne parfaitement sans console!... * **BWin**: * Nettoyage du code (application des règles de prog pour le noms des données membres. ===== Projet ===== * Pour le projet Qt (''.pro''), virez ''TabBase.*'' et ajoutez ''TabItem.*'' et ''TextEditStream.*'' des ''SOURCES'' et ''HEADERS''. * Ensuite ajoutez ''TabBaseWidget.ui'' aux ''FORMS''. ===== Screenshot ===== {{ commit:2006:pyconsole.jpg |Nouvelle console}} ===== Fichiers ajoutés/supprimés ===== R mtQt/TabBase.cpp R mtQt/TabBase.h A mtQt/TabBaseWidget.ui A mtQt/TabBaseWidget.ui.h A mtQt/TabItem.cpp A mtQt/TabItem.h A mtQt/TextEditStream.cpp A mtQt/TextEditStream.h A mtGlobal/Teebuf.cpp A mtGlobal/Teebuf.h --- //[[r_boman@yahoo.fr|Romain BOMAN]] 2006/11/14 09:06//