; Written by Pavel A. Romashkin, November 1999. ; Type: object method for IDLgrPlot. ; Intended use: zooming inside an object graphics window. ; Side effects: none. ; Use: Call the method on an IDLgrPlot object, passing the coordinates of mouse press and release, ; corresponding to the corners of zooming rectangle. ; To zoom out, pass the full zoom out range through *_range keywords. In this case, mouse click ; coordinates are ignored. pro IDLgrPlot::zoom, obj_window, $ ; Target object window. mouse_press, mouse_release, $ ; Intarr(2) or Lonarr(2) of the mouse action position. sym_size=sym_size, $ ; Size of symbol on the plot. If not specified, will be set to default. xrange=xrange, yrange=yrange, $ ; Set to zoom out to specified ranges. draw=draw ; Set to update the display after zooming. compile_opt IDL2, OBSOLETE Catch, Err_code if (Err_code ne 0) then begin print,'IDLgrPlot::zoom error:' help, /last_message catch, /cancel return endif ; Check for minimum distance between mouse click and release. if n_params() eq 3 then begin Delta = abs(mouse_release - mouse_press) if (Delta[0] < Delta[1]) lt 5 then return endif ; Must have object window reference. if size(obj_window, /type) ne 11 then return ; Obtain necessary object references. self -> getProperty, Parent=Model, data=Data Model -> getProperty, Parent=View View -> getProperty, Parent=Scene Plots_list = Model -> get(ISA='IDLGRPLOT', /all, count=n_plots) ; Obtain axes if present. Search only current model: in case of ; multi-pane plot, other panes will not change. Assume other panes ; to be other models at least. Axes_list = Model -> get(ISA='IDLGRAXIS', /all, count=n_axes) y_list = (x_list = 0) ; Ignore Z-axes since this is 2D graphics. for i=0, n_axes-1 do begin Axes_list[i] -> getProperty, direction = axis_type if axis_type eq 0 then x_list = [x_list, i] else $ if axis_type eq 1 then y_list = [y_list, i] endfor if not keyword_set(xrange) or not keyword_set(yrange) then begin if n_params() lt 3 then begin temp = dialog_message('Supply parameters to Zoom method.') return endif ; Obtain the bracketing data coordinates from the screen range. Temp = Obj_window -> PickData(View, self, mouse_press, press_corner) Temp = Obj_window -> PickData(View, self, mouse_release, release_corner) ; Ranges might be backwards, depending on how user drew the selection rectangle. Sort ranges. xrange = [press_corner[0] < release_corner[0], press_corner[0] > release_corner[0]] yrange = [press_corner[1] < release_corner[1], press_corner[1] > release_corner[1]] endif ; Normalize data coordinates for objects of interest. norm_x = normalize(xrange) norm_y = normalize(yrange) ; Set properties of PLOT object. for i=0, n_plots-1 do begin Plots_list[i] -> setProperty, xrange = xrange, yrange = yrange, $ xcoord_conv = norm_x, ycoord_conv = norm_y ; Plots may have symbols on vertices. Do not change their relative size. Plots_list[i] -> getProperty, symbol=Symbol ; If symbol size not provided, use 0.06 of the normalized scale. if obj_valid(Symbol[0]) then begin if n_elements(sym_size) eq 0 then sym_size = [0.006/norm_x[1], 0.008/norm_y[1]] for j=0, n_elements(Symbol)-1 do Symbol[j] -> setProperty, size=sym_size endif endfor ; Set properties of X and Y AXIS objects. for i=1, n_elements(x_list)-1 do begin Axes_list[x_list[i]] -> setProperty, range = xrange, xcoord_conv = norm_x ;ticks1k, Axes_list[x_list[i]], xrange[1] endfor for i=1, n_elements(y_list)-1 do begin Axes_list[y_list[i]] -> setProperty, range = yrange, ycoord_conv = norm_y ;ticks1k, Axes_list[y_list[i]], yrange[1] endfor if keyword_set(draw) then $ if obj_valid(Scene) then obj_window -> draw, Scene else obj_window -> draw, View end