Map browser avec PyMT, suite …


2009-04-28-212736_2960x1050-0.png

Nouvelle version avec :

  • un calcul correct des bords d’écrans (plus de problème d’affichage sur les cotés)
  • l’affichage des sous niveaux jusqu’au niveau en cours (plus de carré gris s’il manque des images)
  • suppression du cache avec pickle (ca prend du temps, et ca fait lagguer l’interface)
  • utilisation d’une queue pour charger les tiles en parallèle
  • n’autorise qu’une seul création de texture à la fois (évite le laggue s’il on doit créer 30 textures d’un coup)
  • réécriture de l’interface (c’est plus joli non ?)
  • factorisation du code + début de documentation

\o/


Map browser avec PyMT


Depuis longtemps, certains que je ne nommerais pas (en fait si, tout ceux qui font du multitouch et un windows…) s’amusent à se balader sur googleearth et companie, pour montrer à quel point c’est fun de faire mumuse avec ses petits doigts. Bon, si on est sous linux, comment qu’on fait nous hein ? Pauvre petit linuxiens quoi…

J’ai commencé un travail en se basant sur PyMT + ModestMaps, qui a un binding python, et supporte 8 sources différentes (dont Blue Marble, Yahoo, Microsoft, OpenStreetMap…).
Après plus d’une semaine à ne pas comprendre pourquoi la librairie ne marchais pas avec les fonctions proposées (comme par exemple, demander un carré de longitude/latitude… et se retrouver avec un carré légèrement déplacé..), j’ai failli baisser les bras.

Puis non. J’ai zappé la partie “user land” de la librairie, et directement attaqué le “core” de la lib. Et c’est une presque réussite. J’ai rajouter 2/3 trucs dans ModestMaps, comme l’utilisation d’un cache intermédiaire, évitant les downloads à répétitions.

Avec quelques threads de download / cache + une mini interface très très basique, j’obtiens ca :

Blue Marble

2009-04-26-221938_2960x1050_scrot-0.png

Microsoft Hybrid (téléchargement en cours)

2009-04-26-222018_2960x1050_scrot-0.png

OpenStreetMap

2009-04-26-222007_2960x1050_scrot-0.png

Microsoft Hybrid + Zoom

2009-04-26-222125_2960x1050_scrot-0.jpg

Je publie ça une fois que j’aurais réglé :

  • les problèmes de zoom trop important (limite de précision d’un double ?)
  • les calculs des limites autour de l’écran (parfois, on voit le fond de la fenêtre)
  • ajouter des fonctions pour passer des pixels en latitude/longitude
  • cleaner le code, et fait la séparation avec un beau InteractiveWidget
  • faire une interface plus “jolie”

Wait & see !


PyMT 0.2, enfin !


Presque 2 mois d’écart avec la 0.1, voici PyMT 0.2 qui est sorti. Pleins de bonnes choses, mais le succès ramène aussi son lot de soucis.

Ainsi, j’ai pu découvrir une analogie entre le monde du web et le monde d’opengl. Parfois, opengl est ATI ce que le javascript est à IE. Je vous passe les détails, mais si vous êtes possesseur d’une carte ATI, vous passerez votre chemin encore une fois… Mais on travaille dessus !

Sinon, avec cette nouvelle version, j’ai une base pour Noya très fonctionnelle, que je montrerais en vidéo très bientôt !


Au retour du TouchCamp…


C’était déconcertant et géant.

Arrivé un peu en retard le samedi matin (merci la SNCF de m’avoir donné un AR Paris formule Duo, alors que j’étais tout seul), j’arrive à la cantine où pleins de gens étaient en train d’écouter un autre gens. (difficile de retenir une masse de prénom.)

Déconcertant car en fait, c’était un tour de table, et la totalité des gens est passé par la case “je me présente au micro”. Pourquoi pas, c’est ca, un Bar Camp : tout le monde acteur. Et ca continue, on a du remplir sur un grand tableau archaïque (bah oui, c’est THE événement du multitouch, et on utilise la craie !) pour faire l’emploi du temps de la journée.

Sur le tableau, pleins de colonnes représentant les tables multitouchs disponibles dont Touchtou, Immersion, Muchomedia, Surface… Premier défi : trouver les représentants des tables, et voir si je peux démarrer PyMT dessus. D’ailleurs les gens là bas disait “pimp”, ca me donne des idées de slogans (Pimp my table).

Et c’est sur Immersion qu’est tombée la lourde tâche de me laisser un accès à leur table 🙂 La conférence PyMT s’est déroulée en début d’après midi. N’ayant pas pu tester le framework avant sur la table (j’ai du faire un allé/retour à Montgallet: j’avais laissé ma batterie de pc à Lille…), la première dizaine de minutes a été laborieuse. Difficile de commencer la présentation + configurer l’ensemble avec la table. Cela a agacé quelques personnes, mais une fois que la démo a commencée, un max de gens était autour de la table. Un vrai succès, malgré avoir essuyer pas mal de bug en live. Certains sont intéressés et impatient de faire une application sous PyMT.

Il a trop à raconter, je vais terminer ce billet en remerciant grandement Jim’, pour son charisme et son investissement sur ce TouchCamp, c’était une réussite. (et merci pour le reste à toi et ln, j’espère sincérement te revoir bientôt 🙂 )


Python et les decorateurs avec __init__


Question: comment faire pour générer un évenement de chargement après l’initialisation d’une classe, de manière générique ?

Sur cette simple question, prenons un example :

  1. class A(object):
  2. def __init__(self):
  3. print 'init A'
  4.  
  5. class B(A):
  6. def __init__(self):
  7. print 'init B'
  8. super(B, self).__init__()
  9. print 'fin init B'
  10.  
  11. B()

Le programme affiche successivement :

init B
init A
fin init B

Le but est d’exécuter une fonction, à la fin de init B. Pour cela, on peut faire appel au décorateur python.
Voilà de quoi j’ai rêvé cette nuit (mmh…) :

  1. def decorate_onload(f):
  2. def my_init(*args, **kwargs):
  3. inst = args[0]
  4. if hasattr(inst, '__decorate_onload__'):
  5. return f(*args, **kwargs)
  6. inst.__setattr__('__decorate_onload__', True)
  7. f(*args, **kwargs)
  8. print 'launch on_load!'
  9. return my_init
  10.  
  11. class A(object):
  12. @decorate_onload
  13. def __init__(self):
  14. print 'init A'
  15.  
  16. class B(A):
  17. @decorate_onload
  18. def __init__(self):
  19. print 'init B'
  20. super(B, self).__init__()
  21. print 'fin init B'
  22.  
  23. class C(B):
  24. @decorate_onload
  25. def __init__(self):
  26. print 'init C'
  27. super(C, self).__init__()
  28. print 'fin init C'
  29.  
  30. C()

Et ce code magique affiche… :

init C
init B
init A
fin init B
fin init C
launch on_load!

Le print ‘on_load’, est bien appellé seulement quand l’intégralité du widget a terminé de charger !
Comment ca marche ? C’est tout simple :

  1. def decorate_onload(f):
  2. def my_init(*args, **kwargs):
  3. inst = args[0]

Ici, on définit un nouveau décorateur, et on récupère l’instance de la classe en cours d’initialisation

  1. if hasattr(inst, '__decorate_onload__'):
  2. return f(*args, **kwargs)

L’instance de la classe est unique. Si la fonction de chargement est déjà hooker par un init, on ne fait rien.

  1. inst.__setattr__('__decorate_onload__', True)

Sinon, on indique que l’on gère le onload. Cela sera valable au tout premier appel du décorateur sur l’instance => il sera toujours executé par le init de plus haut niveau.

  1. f(*args, **kwargs)
  2. print 'launch on_load!'
  3. return my_init

On exécute le init normalement, et on affiche ‘on_load’. C’est ici que l’on peut remplacer par un appel de fonction sur l’instance de l’object.

Simple, encore fallait-il le trouver.


PyMT 0.1 est sortie !


PyMT
PyMT 0.1 est sortie !

Pour rappel, PyMT est un framework python basé sur pyglet, spécialement étudié pour développer des applications graphiques en multitouch.

Après un bon mois de travail, la béta de PyMT contient :

  • Simulateur multitouch à la souris
  • Système d’évenement multi-touch
  • Reconnaissance basique de forme
  • Scatter widget (zoom, rotation, translation, basé sur 2 points)
  • SVG Widgets
  • Image / Video / Sound widget
  • Clavier virtuel
  • XML Widget
  • Layout basique (arrangement horizontal ou vertical)
  • Système de plugin
  • Système basic d’animation.

Et une dizaine d’examples l’accompagne !

C’est du bon boulot pour un premier jet. Il reste encore beaucoup à faire, beaucoup d’idée à explorer, mais le minimum vital est là. Avec PyMT, vous pouvez facilement développer des nouvelles applications prêt pour le multitouch !

Plus d’informations ici : http://pymt.txzone.net/

Et merci à Flippo, Sharath and Thomas, vous êtes excellents 🙂


PyMT, le framework multitouch en Python


Depuis quelques temps, j’ai intégré l’équipe de développement de PyMT par Thomas Hansen, développeur principal de PyMT. PyMT un framework multitouch, écrit en Python, basé sur le toolkit pyglet.

En fait, j’abandonne Noya en C: je recommence le tout en Python. J’en ai marre de passer du temps à coder des choses simples, comme la gestion des listes, les exceptions, sans arrêt penser à libérer la mémoire… Et au final, le peu de temps que j’ai pour coder librement, très très peu finisse dans du concret. C’est aussi que je ne trouvais aucun toolkit pour créer une UI facilement intégrable dans Noya.

PyMT rassemble presque tous les besoins nécessaire pour Noya ! Il manque un bon serveur de son utilisable “comme pour un tracker”, c’est à dire qu’il puisse lire des sons, et les synchroniser entre eux selon un bpm prédéfini.

Et pour l’instant, j’arrive à ca :

PyMT - BubbleMenu + plugins