Exemple de dragage
Voici une séquence d'évènements souris invoquée en draguant quelque chose:
1) m1.press vaut VRAI si vous pressez le bouton de la souris (celui-ci vaut 'left' si c'est le bouton gauche; une valeur non nulle vaut VRAI en Python).
2) m1.drag vaut VRAI si les coordonnées de la souris ont changé depuis le temps de m1.press.
Au moment de l'évènement drag, la position de la souris est rapportée pour être ce qu'elle était à l'instant de
l'évènement press, si bien que le dragage peut démarrer au lieu où l'utilisateur à d'abord cliqué.
Si la souris est en mouvement au moment de l'évènement press,
il est tout à fait possible que la prochaine position vue par l'ordinateur, au moment de l'évènement drag,
puisse être non loin de la position du clic. Ceci explique pourquoi la position de l'évènement drag
est rapportée comme si il survenait à la position press.
3) Aucun évènement ne survient pendant le dragage; vous utilisez continuellement scene.mouse.pos pour mettre à jour
ce que vous draguez.
4) m1.drop vaut VRAI si vous relachez le bouton de la souris.
Vous pouvez programmer le dragage de la souris simplement en lisant continuellement la valeur courante de scene.mouse.pos. Voici une routine complète de dragage d'une sphère avec le bouton gauche appuyé. Notez que les instructions rendent le curseur invisible pendant le dragage.
ball = sphere(pos=(-5,0,0), radius=1., color=color.cyan)
cube = box(pos=(+5,0,0), size=(2,2,2), color=color.red)
pick = None # aucun objet de la scène encore sélectionné
while 1:
if scene.mouse.events:
m1 = scene.mouse.getevent() # obtention de l'évènement drag ou drop
if m1.drag and m1.pick == ball: # si clic sur la balle
drag_pos = m1.pickpos # où la souris était sur la balle
pick = m1.pick # pick vaut maintenant VRAI (non nulle)
scene.cursor.visible = 0 # rend le curseur invisible
elif m1.drop: # relachement le bouton de la souris à la fin du dragage
pick = None # fin du dragage (None vaut FAUX)
scene.cursor.visible = 1 # curseur de nouveau visible
if pick:
new_pos = scene.mouse.project(normal=(0,1,0)) # projection sur le plan xz
if new_pos != drag_pos: # si la souris a bougé depuis la dernière position
pick.pos += new_pos - drag_pos # offset d'où la balle a été cliquée
drag_pos = new_pos # mise à jour de la position dragguée
Si vous faites de nombreux traitements de chaque mouvement de souris ou que vous laissez une trainée derrière l'objet en mouvement, vous pouvez avoir besoin de vérifier si la "nouvelle" position de la souris est en faite différente de la position précédente avant de traiter le "mouvement", comme c'est le cas dans l'exemple ci-dessus. Par exemple, une trainée dessinée avec l'objet courbe qui contient un nombre très important de points tous à la même position peut ne pas être affichée correctement.
Seuls quelques objets de VPython peuvent être "sélectionnés" en cliquant dessusn, incluant la sphère, la boîte et le cylindre. Voici une routine plus générale qui vous permet de draguer soit la hampe soit la pointe d'une flèche:
pointer = arrow(pos=(0,4,0), axis=(3,2,0), color=color.yellow))
tolerance = 0.3 # distance minimale du clic entre la hampe et la pointe
drag = None # n'a pas sélectionnée la hampe ou la pointe de la flèche
while 1:
if scene.mouse.events:
m1 = scene.mouse.getevent() # obtention de l'évènement press, drag ou drop
if m1.press:
if mag(pointer.pos-m1.pos) <= tolerance:
drag = 'tail' # pression proche de la hampe de la flèche
elif mag((pointer.pos+pointer.axis)-m1.pos) <= tolerance:
drag = 'tip' # pression proche de la pointe de la flèche
drag_pos = m1.pos # sauvegarde de la position pressée
elif m1.drag and drag: # si évènement drag et quelque chose à draguer
scene.cursor.visible = 0 # rend le curseur invisible
elif m1.drop: # relachement du bouton de la souris à la fin du dragage
drag = None # fin du dragage (None vaut FAUX)
scene.cursor.visible = 1 # curseur de nouveau visible
if drag:
new_pos = scene.mouse.pos
if new_pos != drag_pos: # si la souris a bougé depuis la dernière position
displace = new_pos - drag_pos # de combien la souris a bougé
drag_pos = new_pos # mise à jour de la position draguée
if drag == 'tail':
pointer.pos += displace # déplace la hampe
else:
pointer.axis += displace # déplace la pointe
Copyright © 2006 Guillaume et Yoann Duriaud. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.