[Date Index]
[Thread Index]
[Author Index]
Re: Re: Re: How to find which variable caused
*To*: mathgroup at smc.vnet.net
*Subject*: [mg103913] Re: [mg103879] Re: [mg103821] Re: How to find which variable caused
*From*: DrMajorBob <btreat1 at austin.rr.com>
*Date*: Mon, 12 Oct 2009 06:37:52 -0400 (EDT)
*References*: <200910101109.HAA12701@smc.vnet.net>
*Reply-to*: drmajorbob at yahoo.com
Why does that Row display as a column? (Even when I stretch the window
over two monitors.)
Replacing Row with Column gives the same result, except that there's a lot
of excess space in the Text box... even when I specify 0 as the 3rd
argument, as in
Manipulate[
Column[{Dynamic[
Refresh[xFlag = True; yFlag = False; "", TrackedSymbols -> {x}]],
Dynamic[Refresh[xFlag = False; yFlag = True; "",
TrackedSymbols -> {y}]],
Dynamic[Text[
StringJoin["you moved the ", Which[xFlag, "x", yFlag, "y"],
" slider"]]]}, Left, 0], {x, 0, 1}, {y, 0, 1}, {{xFlag, False},
ControlType -> None}, {{yFlag, False}, ControlType -> None}]
Why is that?
Bobby
On Sat, 10 Oct 2009 06:09:45 -0500, John Fultz <jfultz at wolfram.com> wrote:
> This is a very simple version of what you asked for that doesn't solve
> some of
> the fundamental problems you'll probably come across, but it shows you
> the
> techniques to solving them. Principally...
>
> * Contain all evaluation inside of scoped Dynamics to prevent the entire
> Manipulate from refreshing.
> * Add flag variables (and perhaps you'll want other variables, too) as
> control
> variables, but with ControlType->None so they don't appear.
> * Use separate Dynamics, which display inside a Row[] as empty strings
> (this is
> important...remember that if a Dynamic doesn't display onscreen, then
> there's
> nothing available to update...see my previous posts on Dynamic if you're
> at all
> confused about this), to track the individual variables.
> + These separate Dynamics each scope a single variable only.
> + The scoped variable is determined by using Refresh with
> TrackedSymbols
>
> One of the problems my version doesn't solve is sensibly setting a start
> condition, so the evaluation assumes that the initial state has changed
> the y
> parameter (as a result of the initial creation of the flag-tracking
> dynamics).
> That's a problem I'll let you figure out.
>
>
> Manipulate[Row[{
> Dynamic[
> Refresh[xFlag = True; yFlag = False; "", TrackedSymbols -> {x}]],
> Dynamic[
> Refresh[xFlag = False; yFlag = True; "", TrackedSymbols -> {y}]],
> Dynamic[
> Text[StringJoin["you moved the ", Which[xFlag, "x", yFlag, "y"],
> " slider"]]]
> }],
> {x, 0, 1}, {y, 0, 1},
> {{xFlag, False}, ControlType -> None},
> {{yFlag, False}, ControlType -> None}]
>
>
> Sincerely,
> John Fultz
> jfultz at wolfram.com
> User Interface Group
> Wolfram Research, Inc.
>
>
> On Thu, 8 Oct 2009 07:49:43 -0400 (EDT), Nasser Abbasi wrote:
>>
>>
>> "Nasser Abbasi" <nma at 12000.org> wrote in message
>> news:hafbgr$j4r$1 at smc.vnet.net...
>>
>>>> Again, I want something like this
>>>>
>>>> Manipulate[
>>>> process[( pickTheCorrectControlVariableWhichChanged ],
>>>> {a, 0, 1}, {b, 0, 1}, Initialization :>
>>>>
>>>> (process[arg_] := Module[{}, Plot[Sin[arg*x], {x, -Pi, Pi}]])
>>>> ]
>>>>
>>
>>> I made some progress and I think I have a solution.
>>>
>>> I save the old value of each control variable in a global variable,
>>> then
>>> in
>>> the Manipulate expression, I check, using an If statement which current
>>> value of the control variable is different from the old value. I got it
>>> to
>>> work ok finally.
>>>
>>> Here is an example:
>>>
>>> olda = 999;
>>> oldb = 999;
>>>
>>> Manipulate[
>>> If[olda != a, {olda = a; Style[StringJoin["a=", ToString[a]]]},
>>>
>>> If[oldb != b, {oldb = b; Style[StringJoin["b=", ToString[b]]]},
>>>
>>> Text["this message should NOT show up!"]]], {a, 0, 1}, {b, 0, 1},
>>>
>>> LocalizeVariables -> True, TrackedSymbols -> {a, b}]
>>>
>>>
>> It is me again, with the same problem.
>>
>> I found out that I can NOT use global variables in a demo, and I also
>> can't
>> wrap the whole Manipulate inside a module. Any one of the above method
>> will
>> have solved this problem, but rules are rules, so now I have to find
>> another
>> solution. So I am stuck again.
>>
>> Before I recode everything again, which I would hate to do, I thought=
> I'll
>> ask one more time, may be some expert can have a solution. But this one=
> is
>> really hard.
>>
>> I'll explain again the problem to make sure we are all clear on it.
>>
>> I need to write a Manipulate where inside the Manipulate I need to
>> detect
>> which slider or in other words, which control variable was changed. i.e.
>> which slider the user just changed to cause the Manipulate expression to
>> be
>> generated. (I need to do this so I can do different processing based on
>> the
>> slider that was selected)
>>
>> We all know that Manipulate generates a new version of its expression=
> when
>> one of the control variables changes value. I need to know which
>> control
>> variable changed.
>>
>> There is the general layout
>>
>> Manipulate[
>>
>> (* expression that uses control variables *)
>>
>> ,
>>
>> (* controls here which update the control variables values *)
>> ]
>>
>> But there are restriction on the solution, since this will be for a
>> demo.
>> Again, there can NOT be global variables used, (i.e. no variables in the
>> Manipulate initialization section, since these are global), and there
>> can
>> NOT be a module around Manipulate[], i.e. no Module[{...},
>> Manipulate[...]]
>> allowed.
>>
>> Here is a small code to show the problem
>>
>> Manipulate[
>> Text[StringJoin["you moved the ", "x or y", " slider"]],
>> {x, 0, 1},
>> {y, 0, 1}
>> ]
>>
>> Could someone modify the above, so that the code above will tell which
>> slider the user _just_ moved?
>>
>> It seems like an impossible problem for me to solve without the use of
>> global variables or a module around Manipulate.
>>
>> Here is what I tried so far, and this fail:
>>
>> Manipulate[
>> Which[
>>
>> x != oldx,
>> {oldx = x; Text[StringJoin["you moved the ", "x ", " slider"]]},
>>
>> y != oldy,
>> {oldy = y; Text[StringJoin["you moved the ", "y ", " slider"]]},
>>
>> True, Text["why Ami here??"]
>> ],
>>
>> {x, 0, 1},
>> {y, 0, 1},
>> {oldx, -999, ControlType -> None},
>> {oldy, -999, ControlType -> None}
>> ]
>>
>> The reason it fail is because oldx and oldy are updated to the same
>> value
>> of
>> x and y whenever x or y changes before I get the chance to do the
>> comparison. I.e. when the new version of the expression is generated,
>> oldx=x
>> and oldy=y each time. This seems to consequences of Manipulate=
> generating
>> DynamicModule[] for the whole thing. You can see this by using the
>> SnapShot
>> option on the Manipulate output. This will generate the whole expression
>> form. (Nice tool).
>>
>> If someone can make it so that the above will display the correct
>> message
>> each time, then I would declare that person to be the Mathematica Guru
>> of
>> the year.
>>
>> I think I have reached the limit of my current Mathematica understanding
>> when it comes to internals of Manipulate and Dynamics to be to solve
>> this
>> one. But I'll keep on looking.
>>
>> Thank you,
>> --Nasser
>
>
>
--
DrMajorBob at yahoo.com
Prev by Date:
**Re: Re: Re: undocumented feature: TableView**
Next by Date:
**Re: Re: Re: How to find which variable caused the trigger in Manipulate[]**
Previous by thread:
**Re: Re: How to find which variable caused the trigger in Manipulate[]**
Next by thread:
**Re: Re: How to find which variable caused the trigger in Manipulate[]**
| |