2 votes

Comment contrôler l'état des déclencheurs (Pause, Lecture) en utilisant du code (pas seulement des boutons)

Il est utile d'utiliser un déclencheur pour l'animation, mais je ne parviens pas à trouver un moyen de modifier l'état du déclencheur dans le code (c'est-à-dire sans avoir à appuyer moi-même sur le bouton Pause ou Lecture).

Par exemple, supposons que je veuille faire une simulation où, lorsqu'un événement se produit, je veux que le déclencheur actuellement actif passe à l'état PAUSE, et lorsqu'un autre événement se produit, je veux que le déclencheur passe à l'état PLAY.

Les boutons pour le faire seront toujours là, mais je veux aussi pouvoir les modifier à partir du code sans avoir à le faire physiquement.

La raison en est que je suis en train d'effectuer une action, et le fait que le déclencheur soit en mode PLAY pendant que je fais cette autre action fait que les choses ne fonctionnent pas.

J'ai donc besoin de le faire passer en mode PAUSE, et quand j'ai terminé, je peux le remettre en mode PLAY.

Voici un petit exemple de ce que je veux dire :

Manipulate[

EventHandler[
   Dynamic@Graphics[
     {Circle[{0,0},1], Text[n,pt] },
     PlotRange->All,ImageSize->200,ImagePadding->10],
   {
     "MouseDown":>
     (
      (* What to do here to cause the trigger to become Paused?"*)
      pt=MousePosition["Graphics"]
     ),

     "MouseDragged":>
    (
     (* while dragging, the trigger remains in PAUSED state "*)
      Print["mouse dragged"];
      pt=MousePosition["Graphics"]
    ),

    "MouseUp":>
   (
     Print["MouseUp"]
     (* What to do here to cause the trigger to Play again?"*)
    )
  }
  ],
     Control[{{n,0,"Run"},0,100,0.01,
            ControlType->Trigger, DisplayAllSteps->True, AnimationRate->1,
            AppearanceElements->{"PlayPauseButton","ResetButton"}}
     ],

     {{pt,{0,0}},ControlType->None}
]

Dans l'exemple ci-dessus, lorsque je fais glisser la souris sur l'écran, je veux que le déclencheur devienne PAUSÉ afin que le nombre affiché ne change pas pendant que je fais glisser la souris. Lorsque le déplacement est terminé, je peux alors faire en sorte que le déclencheur soit de nouveau PLAY si nécessaire.

Donc, ma question : Y a-t-il un moyen de changer l'état du déclencheur comme ci-dessus dans le code ?

Je peux bien sûr ne pas utiliser trigger du tout, et tout coder moi-même d'une autre manière, mais j'ai pensé demander avant d'abandonner, car trigger est pratique à utiliser.

Voici un lien vers plus de documentation sur le déclencheur et les boutons.

La chose la plus proche que j'ai trouvée est l'option Enabled-> pour le trigger, mais cela rend juste le trigger lui-même activé ou non, et n'affecte pas l'état du trigger. i.e. si le trigger est activé, il le restera même si je le désactive.

http://reference.wolfram.com/mathematica/ref/Manipulator.html

http://reference.wolfram.com/mathematica/ref/Trigger.html

merci

3voto

Heike Points 16279

Il existe probablement un moyen plus simple de procéder, mais celui-ci semble fonctionner. Il s'agit essentiellement d'imiter un Trigger en créant une tâche planifiée et en l'arrêtant et la démarrant lorsqu'un bouton de la souris est enfoncé ou relâché ou lorsque le bouton Lecture/Pause est cliqué.

DynamicModule[{start = 0, finish = 100, dt = 0.01, running = False, task, n},
 n = start;
 Manipulate[
  EventHandler[
   Dynamic@
    Graphics[{Circle[{0, 0}, 1], Text[n, pt]}, PlotRange -> All, 
     ImageSize -> 200, ImagePadding -> 10],
   {
    "MouseDown" :>
     (StopScheduledTask[task]; pt = MousePosition["Graphics"]),

    "MouseDragged" :>
     (Print["mouse dragged"]; pt = MousePosition["Graphics"]),

    "MouseUp" :> 
     (If[running, StartScheduledTask[task]]; Print["MouseUp"])
   }],

  Control[Labeled[
   Row[{
    Button[
     Dynamic@If[running, Magnify["\[DoubleVerticalBar]", 1.5], 
       Magnify["\[RightPointer]", 1.5]], 
     (If[running, running = False; StopScheduledTask[task], 
       running = True; StartScheduledTask[task]]), 
     Appearance -> "Palette", ImageSize -> 15, ContentPadding -> False],

    Button[
     Magnify["\[FirstPage]", 1.5], 
     (n = start; ResetScheduledTask[task]), 
     Appearance -> "Palette", ImageSize -> 15, ContentPadding -> False]
   }], "Run", Left]
  ],

  {{pt, {0, 0}}, ControlType -> None}
 ], 

 Initialization :> (task = 
    CreateScheduledTask[n += dt, {dt, Floor[(finish - start)/dt]}]),
 Deinitialization :> RemoveScheduledTask[task]
]

Edit : Modification de l'apparence des commandes pour qu'elles ressemblent davantage aux boutons traditionnels de lecture/pause/réinitialisation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X