Re: Interactive 2d zoom and some Dynamic questions
- To: mathgroup at smc.vnet.net
- Subject: [mg84572] Re: Interactive 2d zoom and some Dynamic questions
- From: dh <dh at metrohm.ch>
- Date: Fri, 4 Jan 2008 05:40:34 -0500 (EST)
- References: <flfaf0$a9e$1@smc.vnet.net>
Hi Szabolcs,
nice little tool. If you don't mind, I like to propose to add axes to
the zoomed picture by adding:
AxesOrigin -> {Min[range[[1]]], Min[range[[2]]]}
to your graphics.
happy New Year, Daniel
Szabolcs Horvát wrote:
> Happy new year, MathGroup!
>
> And now, the question:
>
> First of all, those people who haven't seen it yet should definitely
> check out Daniel Huber's very nice Zoom2D palette:
> http://groups.google.com/group/comp.soft-sys.math.mathematica/browse_thread/thread/58c77e4614440e57/5876f0611112765e
>
> But I would like to have something simpler, a "quick and dirty" zoom
> that has the simplest possible UI, and keeps the graphic in the
> notebook. So I came up with this:
>
> zoomGraphics[graph_Graphics] :=
> With[
> {gr = First[graph],
> opt = DeleteCases[Options[graph], PlotRange -> _],
> plr = PlotRange /. Options[graph, PlotRange],
> rectangle = {Dashing[Small],
> Line[{#1, {First[#2], Last[#1]}, #2,
> {First[#1], Last[#2]}, #1}]} & },
> DynamicModule[{dragging = False, first, second, range = plr},
> Panel@EventHandler[
> Dynamic@Graphics[
> If[dragging, {gr, rectangle[first, second]}, gr],
> PlotRange -> range, Sequence @@ opt
> ],
> {{"MouseDown", 1} :> (first = MousePosition["Graphics"]),
> {"MouseDragged", 1} :>
> (dragging = True;
> second = MousePosition["Graphics"]),
> {"MouseUp", 1} :>
> If[dragging,
> dragging = False;
> range = Transpose@{first, second}, range = plr] }
> ]
> ]]
>
> Usage example:
>
> Plot[1/x, {x, 0, 1}] // zoomGraphics
>
> Drag to zoom, click to reset. Remove Panel if you don't like it (or
> replace it with Framed). It's there to show the active ("draggable") area.
>
> I do not understand Dynamic things well, so comments, suggestions (e.g.
> for improving performance), problem cases where zoomGraphics fails are
> most welcome.
>
> One of the biggest problems with this is that EvantHandler prevents
> resizing the graphic from working. This is unacceptable because if we
> want to zoom, most likely we also want to keep the resize functionality.
>
> It also prevents dynamic things, like Locators from working properly. I
> could set PassEventsDown -> True in EventHandler, but zooming would
> still interfere with resizing or moving a Locator (and other strange
> behaviour appears too.) One solution that I can imagine is to zoom only
> while CTRL (or some other modifier key) is pressed. But I do not know
> how to implement this properly. This is what I have so far:
>
> zoomGraphics[graph_Graphics] :=
> With[
> {gr = First[graph],
> opt = DeleteCases[Options[graph], PlotRange -> _],
> plr = PlotRange /. Options[graph, PlotRange],
> rectangle = {Dashing[Small],
> Line[{#1, {First[#2], Last[#1]}, #2, {First[#1],
> Last[#2]}, #1}]} &,
> keyCheck =
> Function[{arg}, If[CurrentValue["ControlKey"], arg], HoldAll]},
> DynamicModule[{dragging = False, first, second, range = plr},
> Panel@EventHandler[
> Dynamic[
> Graphics[
> If[dragging, {gr, rectangle[first, second]}, gr],
> PlotRange -> range, Sequence @@ opt
> ]],
> {{"MouseDown", 1} :>
> keyCheck[first = MousePosition["Graphics"]],
> {"MouseDragged", 1} :>
> keyCheck[dragging = True; second = MousePosition["Graphics"]],
> {"MouseUp", 1} :>
> keyCheck@
> If[dragging, dragging = False;
> range = Transpose@{first, second}, range = plr]}]
> ]]
>
> OK, now zooming only works while CTRL is pressed. Now it is somewhat
> safer to set PassEventsDown -> True, and resizing works when CTRL is not
> pressed. But resizing and selecting graphics interferes with zooming
> when CTRL is pressed. The zoom level is also often reset unexpectedly
> if CTRL is not released (and pressed again), and the graphics are not
> deselected, between consecutive zoom attempts. I don't completely
> understand what is happening here. Is it possible to somehow set
> PassEventsDown -> True only when CTRL is not pressed? As a desperate
> attempt, I tried PassEventsDown ->
> Dynamic@Not@CurrentValue["ControlKey"], but, unsurprisingly, it does not
> work.
>
> As an alternative solution, I also tried using
> GraphicsGrid[{{zoomGraphics[someGraphic]}}] with the original version of
> zoomGraphics to enable resizing (not moving Locators), but now the
> events don't seem to reach the EventHandler.
>
> Another question: Could someone please explain, preferably with a
> working example, what PassEventsUp is for?
>
> Szabolcs
>