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