function spd_ui_draw_object::GetrubberBandPos,xonly=xonly
compile_opt idl2
str = {idx:0,xrange:[0D,1D],yrange:[0D,1D],vars:ptr_new()}
varstr = {range:[0D,1D]}
if ~ptr_valid(self.panelInfo) then return,0
str_arr = replicate(str,n_elements(*self.panelInfo))
arr_num = 0
left = self.cursorloc[0] < self.rubberstart[0]
right = self.cursorloc[0] > self.rubberstart[0]
bottom = self.cursorloc[1] < self.rubberstart[1]
top = self.cursorloc[1] > self.rubberstart[1]
intersectspanel = 0
for i = 0,n_elements(*self.panelInfo)-1 do begin
xplotpos = ((*self.panelInfo)[i]).xplotpos
yplotpos = ((*self.panelInfo)[i]).yplotpos
if ((*self.panelInfo)[i]).locked then begin
xrange = ((*self.panelInfo)[i]).lockedRange
endif else begin
xrange = ((*self.panelInfo)[i]).xrange
endelse
yrange = ((*self.panelInfo)[i]).yrange
if (right ge xplotpos[0] && $
left le xplotpos[1] && $
(top ge yplotpos[0] || keyword_set(xonly)) && $
(bottom le yplotpos[1] || keyword_set(xonly))) then begin
if keyword_set(xonly) then begin
if (right ge xplotpos[0] && $
left le xplotpos[1] && $
top ge yplotpos[0] && $
bottom le yplotpos[1]) then intersectspanel = 1
endif else intersectspanel = 1
bx_right = right < xplotpos[1]
bx_left = left > xplotpos[0]
bx_top = top < yplotpos[1]
bx_bottom = bottom > yplotpos[0]
bx_left_norm = (bx_left - xplotpos[0])/(xplotpos[1]-xplotpos[0])
bx_right_norm = (bx_right - xplotpos[0])/(xplotpos[1]-xplotpos[0])
bx_bottom_norm = (bx_bottom - yplotpos[0])/(yplotpos[1]-yplotpos[0])
bx_top_norm = (bx_top - yplotpos[0])/(yplotpos[1]-yplotpos[0])
rng_left = bx_left_norm*(xrange[1]-xrange[0])+xrange[0]
rng_right = bx_right_norm*(xrange[1]-xrange[0])+xrange[0]
rng_bottom = bx_bottom_norm*(yrange[1]-yrange[0])+yrange[0]
rng_top = bx_top_norm*(yrange[1]-yrange[0])+yrange[0]
outxrange = [rng_left,rng_right]
outyrange = [rng_bottom,rng_top]
if ((*self.panelInfo)[i]).xscale eq 1 then $
outxrange = 10D ^ outxrange $
else if ((*self.panelInfo)[i]).xscale eq 2 then $
outxrange = exp(outxrange)
if ((*self.panelInfo)[i]).yscale eq 1 then $
outyrange = 10D ^ outyrange $
else if ((*self.panelInfo)[i]).yscale eq 2 then $
outyrange = exp(outyrange)
str_arr[arr_num].idx = i
str_arr[arr_num].xrange = outxrange
str_arr[arr_num].yrange = outyrange
if ptr_valid(((*self.panelInfo)[i]).varInfo) then begin
varInfoArray = *((*self.panelInfo)[i]).varInfo
varstr_arr = replicate(varstr,n_elements(varInfoArray))
for j = 0,n_elements(varInfoArray) - 1 do begin
varrange = varInfoArray[j].range
varlow = bx_left_norm*(varrange[1]-varrange[0])+varrange[0]
varhigh = bx_right_norm*(varrange[1]-varrange[0])+varrange[0]
outvarrange = [varlow,varhigh]
if varInfoArray[j].scaling eq 1 then begin
outvarRange = 10. ^ outvarrange
endif else if varInfoArray[j].scaling eq 2 then begin
outvarRange = exp(outvarrange)
endif
varstr_arr[j].range=outvarrange
endfor
str_arr[arr_num].vars = ptr_new(varstr_arr)
endif
arr_num++
endif
endfor
if (arr_num eq 0 || intersectspanel eq 0) then return,0 else return,str_arr[0:arr_num-1]
end