pro spd_ui_zoom_update_panel,panelObj,drawObject,direction,index compile_opt idl2,hidden panelObj->GetProperty, XAxis=xaxis panelStruc = drawObject->GetPanelInfo(index) range=panelStruc.xRange[1]-panelStruc.xRange[0] inc=range*0.15 ;how big is our zoom step(fraction of current range) if inc eq 0 then inc++ ;just in case ; direction is zoomin=0, zoomout=1 IF direction EQ 0 THEN BEGIN newmin = panelStruc.XRange[0] - inc newmax = panelStruc.XRange[1] + inc ;Changing the way that zoom is calculated to make it work sanely, PRC(old code below) ; Expand minumum ; inc = panelstruc.xmajorsize ; if inc eq 0 then inc++ ; while (panelStruc.XRange[0] - inc) - panelStruc.XRange[0] eq 0 do inc = 2*inc ; newmin = panelStruc.XRange[0] - inc ; ; Expand maximum ; inc = panelstruc.xmajorsize ; if inc eq 0 then inc++ ; while (panelStruc.XRange[1] + inc) - panelStruc.XRange[1] eq 0 do inc = 2*inc ; newmax = panelStruc.XRange[1] + inc ENDIF ELSE BEGIN newmin = panelStruc.XRange[0] + inc newmax = panelStruc.XRange[1] - inc ;Changing the way that zoom is calculated to make it work sanely, PRC(old code below) ; newMin=panelStruc.XRange[0] + panelStruc.xMajorSize ; newMax=panelStruc.XRange[1] - panelStruc.xMajorSize ; if newmin gt newmax then begin ; ok = error_message('Major tick size too large, cannot further zoom in on panel ' $ ; +strtrim(index+1,2)+ '.',/center,traceback=0,title="Warning: Zoom") ; return ; endif ENDELSE IF panelStruc.xScale EQ 1 THEN BEGIN newMin = 10^newMin newMax = 10^newMax ENDIF IF panelStruc.xScale EQ 2 THEN BEGIN newMin = exp(newMin) newMax = exp(newMax) ENDIF if newmin ge newmax then begin ok = error_message('Panel ' + strtrim(index+1,2) + $ ' has zero range and cannot zoom any further.', /center,traceback=0,title="Warning: Zoom") return endif if ~finite(newMin) || ~finite(newMax) then begin ok = error_message('Panel ' + strtrim(index+1,2) + $ ' has undefined range and cannot zoom any further.', /center,traceback=0,title="Warning: Zoom") return endif ;xx = xaxis->getall() ;print, 'Old Range: ' + strtrim(xx.maxfixedrange-xx.minfixedrange,2) ;print, 'New Range: ' + strtrim(newmax-newmin,2) ;print, '----------------------------' xaxis->SetProperty, RangeOption=2 xaxis->UpdateRange, [newMin, newMax] end PRO spd_ui_zoom, windowStorage, drawObject, direction compile_opt idl2,hidden IF ~Obj_Valid(windowStorage) THEN RETURN activeWindow=windowStorage->GetActive() newPanels=Obj_New('IDL_CONTAINER') IF N_Elements(activeWindow) GT 0 && Obj_Valid(activeWindow[0]) THEN BEGIN activeWindow[0]->GetProperty, Panels=panels,locked=locked ; print,locked IF Obj_Valid(panels) THEN BEGIN panelObjs = panels->Get(/all) IF NOT Is_Num(panelObjs) THEN BEGIN ;If we're locked to a panel, then only modify locked panel if locked ge 0 && locked lt n_elements(panelObjs) then begin spd_ui_zoom_update_panel,panelObjs[locked],drawObject,direction,locked endif else begin ; for each panel get it info from the draw object and ; update the range FOR i=0, N_Elements(panelObjs)-1 DO BEGIN spd_ui_zoom_update_panel,panelObjs[i],drawObject,direction,i ENDFOR endelse ENDIF ENDIF ENDIF END