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