Re: Manipulate: How to correctly adjust one control parameters based on current setting of another control?
- To: mathgroup at smc.vnet.net
- Subject: [mg103062] Re: [mg103049] Manipulate: How to correctly adjust one control parameters based on current setting of another control?
- From: "David Park" <djmpark at comcast.net>
- Date: Sun, 6 Sep 2009 07:38:08 -0400 (EDT)
- References: <5118287.1252145556385.JavaMail.root@n11>
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