Metafor

ULiege - Aerospace & Mechanical Engineering

User Tools

Site Tools


commit:2006:11_14



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

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

Romain BOMAN 2006/11/14 09:06

commit/2006/11_14.txt · Last modified: 2016/03/30 15:23 (external edit)