MathGroup Archive 2009

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Re: Manipulate: How to correctly adjust one

  • To: mathgroup at smc.vnet.net
  • Subject: [mg103072] Re: [mg103062] Re: [mg103049] Manipulate: How to correctly adjust one
  • From: DrMajorBob <btreat1 at austin.rr.com>
  • Date: Mon, 7 Sep 2009 02:34:32 -0400 (EDT)
  • References: <5118287.1252145556385.JavaMail.root@n11>
  • Reply-to: drmajorbob at yahoo.com

That confused me, so I've reworked it a bit, partly to remove side effects  
in calcSliderValues.

DynamicModule[{(*Primary dynamic variables*)choice = 1,
   x,(*Dependent dynamic variables*)xmin, xmax, dx,
   calcSliderValues},(*Routine to calculate dependent variables*)
  calcSliderValues[1] = {1, 10, 1, 0};
  calcSliderValues[-1] = {20, -3, 1, 0.};
  {xmin, xmax, x, dx} = calcSliderValues[choice];
  Panel[Column[{Row[{"scale limits ",
       SetterBar[Dynamic[choice, (choice = #;
           {xmin, xmax, x, dx} = calcSliderValues[choice]) &], {1 ->
          "up integer", -1 -> "down real"}]}](*Setter Row*),
     Dynamic@Row[{"x = ",
        Slider[Dynamic[x], {xmin, xmax, dx}]}] (*Slider Row*),
     Dynamic[x]}] (*Display Column*),
   BaseStyle -> {FontSize -> 16}](*Panel*)]

Bobby

On Sun, 06 Sep 2009 06:38:08 -0500, David Park <djmpark at comcast.net> wrote:

> In the long run it is usually easier to write a custom dynamic. It's  
> worth
> learning how to do it because one can spend a lot of time figuring out  
> how
> to screw Manipulate into the form one wants, which is sometimes possible  
> and
> sometimes not.
>
> The trick for custom dynamics is to divide your variables into primary
> dynamic variables and dependent variables. Write a routine to calculate  
> the
> dependent variables from the primary variables. Use the two-argument  
> form of
> Dynamic to call the routine when a primary variable is changed. So in the
> following: choice is a primary dynamic variable, xmin and xmax are  
> dependent
> variables and calcSliderValues is the routine to calculate them and set  
> the
> initial value for x.
>
> DynamicModule[
>  {(* Primary dynamic variables *)
>   choice = 1, x,
>   (* Dependent dynamic variables *)
>   xmin, xmax, calcSliderValues},
> (* Routine to calculate dependent variables *)
>  calcSliderValues[c_] :=
>   If[c == 1,
>    xmin = 1; x = 1; xmax = 10,
>    xmin = 0; x = 1; xmax = 20];
>  calcSliderValues[choice];
> Panel[
>   Column[{
>     Row[{"setter choice ",
>       SetterBar[
>        Dynamic[choice, (choice = #;
>           calcSliderValues[choice]) &], {1 -> "UP", -1 -> "DOWN"}]}](*
>     Setter Row *),
>     Dynamic@Row[{"x = ", Slider[Dynamic[x], {xmin, xmax}]}] (*
>     Slider Row *),
>     Dynamic[x]
>     }] (* Display Column *),
>   BaseStyle -> {FontSize -> 16}
>   ](* Panel *)
>  ]
>
>
> David Park
> djmpark at comcast.net
> http://home.comcast.net/~djmpark/
>
>
> From: Nasser Abbasi [mailto:nma at 12000.org]
>
> Hello.
>
> This is Mathematica 7.
>
> I have Manipulate control (a slider) which I want to dynamically adjust  
> its
> initial value and maximum value based on what one selects as a choice  
> from
> another control (SetterBar) and also change the position of the slider  
> (i.e.
>
> the current value of the slider) based on the choice selected.
>
> The following code below seems to work initially. Using 'If' statement, I
> check the current choice, and set the initial and maximum value of the
> slider.
>
> The problem though is that the current value of the slider (i.e. the  
> current
>
> position of the slider) remains at whatever value it was before the user
> changed the choice, and this could result in the current value of the  
> slider
>
> being larger than the maximum being set for the new choice.
>
> What I want is the following: When the user selects a new choice (from  
> the
> SetterBar), I want to reset the current position on the slider as well  
> the
> initial and the maximum value.
>
> Here is the code to help explain:
>
> Manipulate[Text[x],
>
>   {{x, 1, "x="}, If[choice == 1, 0, 1],    If[choice == 1, 10, 20], 0.1},
>
>   {{choice, 1, "select choice"},  {1 -> "UP", -1 -> "DOWN"}, ControlType  
> ->
> SetterBar}
>
> ]
>
> So, when one selects UP, I change the initial slider value to start at 1
> instead of at 0, and made the maximum slider to be 10 instead of 20.
> However, the value of 'x' itself could be at say 12 at this time (becuase
> the user was moving it), and so it overflows now.
>
> How can I also update 'x' to start at some specific value each time the  
> user
>
> changes the choice from UP to DOWN or from DOWN to UP?  Putting another  
> If
> statement does NOT work:
>
> Manipulate[Text[x],
>
>  {{x, If[choice == 1, 3, 5], "x="},   If[choice == 1, 0, 1], If[choice  
> == 1,
>
> 10, 20], 0.1},
>
>   {{choice, 1, "select choice"}, {1 -> "UP", -1 -> "DOWN"},
>    ControlType -> SetterBar}
>
> ]
>
> I know I need to use Dynamic[] somewhere, but I not sure where and how to
> force current slider value to rest each time the setterbar is clicked. I
> need some sort of action associated with SetterBar which I can use each  
> time
>
> its value changes, but SetterBar has no such option.
>
> any help is appreciated.
>
> --Nasser
>
>
>
>
>


-- 
DrMajorBob at yahoo.com


  • Prev by Date: Re: Re: Manipulate: How to correctly adjust one
  • Next by Date: Re: how to solve the integer equation Abs[3^x-2^y]=1
  • Previous by thread: Re: How reliable are mathematica's special functions? (Hypergeometric
  • Next by thread: Bug with Integrate in v7?