pro spd_ui_draw_object::getRange,dataptrs,axisSettings,mirror=mirror,scaling=scaling,range=range,istime=isTimeAxis,fail=fail,center=center, errmsg=errmsg, isspec=isspec
compile_opt idl2
fail = 1
axisSettings->getProperty,rangeOption=rangeOption, $
rangeMargin=rangeMargin,$
boundScaling=boundScaling, $
boundfloating=boundfloating,$
minFloatRange=minFloatRange,$
maxFloatRange=maxFloatRange,$
minBoundRange=minBoundRange, $
maxBoundRange=maxBoundRange, $
minFixedRange=minFixedRange, $
maxFixedRange=maxFixedRange, $
floatingSpan=floatingSpan, $
floatingCenter=floatingCenter,$
scaling=scaling,$
isTimeAxis=isTimeAxis,$
annotateStyle=annotateStyle,$
annotateExponent=annotateExponent
if rangeOption eq 2 then begin
if maxFixedRange le 0 && scaling ne 0 then begin
self.statusbar->update,'Error: Negative range with logarithmic X/Y axis, Using automatically scaled range instead.'
self.historywin->update,'Error: Negative range with logarithmic X/Y axis, Using automatically scaled range instead.'
rangeOption = 0
endif else if minFixedRange le 0 && scaling ne 0 then begin
self.statusbar->update,'Error: Negative range with logarithmic X/Y axis, Using automatically scaled range instead'
self.historywin->update,'Error: Negative range with logarithmic X/Y axis, Using automatically scaled range instead'
rangeOption = 0
endif else if minFixedRange gt maxFixedRange then begin
self.statusbar->update,'Error: Min Fixed Range greater than Max Fixed Range, Using automatically scaled range instead'
self.historywin->update,'Error: Min Fixed Range greater than Max Fixed Range, Using automatically scaled range instead'
rangeOption = 0
endif
endif
centers = dblarr(n_elements(dataptrs))
for i = 0,n_elements(dataptrs)-1 do begin
if ~ptr_valid(dataPtrs[i]) then continue
if keyword_set(mirror) && ptr_valid(mirror[i]) then begin
centers[i] = 0
endif else if scaling eq 1 then begin
if floatingCenter eq 0 || floatingCenter eq 2 then begin
centers[i] = mean((*dataPTrs[i]),/nan)
endif else if floatingCenter eq 1 || floatingCenter eq 3 then begin
centers[i] = median((*dataPTrs[i]))
endif else begin
self.statusBar->update,'Error: Unrecognized floating center option'
range = double([0,1])
return
endelse
endif else if scaling eq 2 then begin
if floatingCenter eq 0 || floatingCenter eq 2 then begin
centers[i] = mean((*dataPTrs[i]),/nan)
endif else if floatingCenter eq 1 || floatingCenter eq 3 then begin
centers[i] = median((*dataPTrs[i]))
endif else begin
self.statusBar->update,'Error: Unrecognized floating center option'
range = double([0,1])
return
endelse
endif else begin
if floatingCenter eq 0 || floatingCenter eq 2 then begin
centers[i] = mean(*dataPTrs[i],/nan)
endif else if floatingCenter eq 1 || floatingCenter eq 3 then begin
centers[i] = median(*dataPTrs[i])
endif else begin
self.statusBar->update,'Error: Unrecognized floating center option'
range = double([0,1])
return
endelse
endelse
endfor
center = mean(centers,/nan)
if rangeOption eq 2 then begin
range = [minFixedRange,maxFixedRange]
if scaling eq 1 then begin
range = double(alog10(range))
endif else if scaling eq 2 then begin
range = double(alog(range))
endif else begin
range = double(range)
endelse
endif else if rangeOption eq 1 then begin
case scaling of
0: range = [center-floatingSpan,center+floatingSpan]
1: range = [alog10(center)-floatingSpan,alog10(center)+floatingSpan]
2: range = [alog(center)-floatingSpan,alog(center)+floatingSpan]
endcase
if keyword_set(boundfloating) then begin
range[0] = max([range[0],minFloatRange],/nan)
range[1] = min([range[1],maxFloatRange],/nan)
endif
range = double(range)
endif else if rangeOption eq 0 then begin
minRange = !values.d_nan
minLogRange = !values.d_nan
maxRange = !values.d_nan
for i = 0,n_elements(dataptrs) -1 do begin
if ~ptr_valid(dataPtrs[i]) then continue
minRangeTmp = min(*dataPtrs[i],/nan)
maxRangeTmp = max(*dataPtrs[i],/nan)
if scaling ne 0 then begin
minLogRangeTmp = exp(min(alog(*dataPtrs[i]),/nan))
minLogRange = min([minLogRange,minLogRangeTmp],/nan)
endif else if keyword_set(mirror) && ptr_valid(mirror[i]) then begin
rangeAbs = max([abs(maxRangeTmp),abs(minRangeTmp)],/nan)
maxRangeTmp = rangeAbs
minRangeTmp = -rangeAbs
endif
minRange = min([minRange,minRangeTmp],/nan)
maxRange = max([maxRange,maxRangeTmp],/nan)
endfor
if keyword_set(isspec) && scaling ne 0 then begin
if (maxRange-minRange) eq 0 then begin
scaling = 0
endif
endif
if scaling eq 1 then begin
minRange=alog10(minLogRange)
maxRange=alog10(maxRange)
endif else if scaling eq 2 then begin
minRange=alog(minLogRange)
maxRange=alog(maxRange)
endif
margin = rangeMargin*(maxRange-minRange)
if margin eq 0 && rangeMargin ne 0 then begin
if maxRange eq 0 then begin
margin = 1
endif else begin
margin = rangeMargin * maxRange
endelse
endif
maxRange+= abs(margin)
minRange-= abs(margin)
if keyword_set(boundScaling) then begin
if scaling eq 0 then begin
minRange = max([minRange,minBoundRange],/nan)
maxRange = min([maxRange,maxBoundRange],/nan)
endif else if scaling eq 1 then begin
minRange = max([minRange,alog10(minBoundRange)],/nan)
maxRange = min([maxRange,alog10(maxBoundRange)],/nan)
endif else if scaling eq 2 then begin
minRange = max([minRange,alog(minBoundRange)],/nan)
maxRange = min([maxRange,alog(maxBoundRange)],/nan)
endif
if minRange gt maxRange then begin
self.statusBar->update,'No data found within range when using bound autoscaling range option.'
errmsg = {TYPE:'ERROR', VALUE:'Bound autoscaling range option set. No data found within range.'}
range = double([minRange,maxRange])
return
endif
endif
range = double([minRange,maxRange])
endif else begin
self.statusBar->update,'Error: Illegal range option on axis'
range = double([0,1])
endelse
if ~finite(range[0]) || ~finite(range[1]) then begin
self.statusbar->update,'There is no real and finite data in the current range.'
errmsg = {TYPE:'ERROR', VALUE:'There is no real and finite data in the current range.'}
return
endif
if range[1]-range[0] lt 0 then begin
self.statusbar->update,'Error: range interval is less than 0'
self.historyWin->update,'Error: range interval is less than 0'
errmsg = {TYPE:'ERROR', VALUE:'Range interval is less than 0.'}
return
endif
data_struct = {scaling:scaling,timeAxis:isTimeAxis,formatid:annotateStyle,exponent:annotateExponent}
if range[1] eq range[0] then begin
self.statusbar->update,'Warning: range interval is 0: ' +'Range: [' + formatannotation(0,0,range[0],data=data_struct) + ',' + formatannotation(0,0,range[1],data=data_struct) + ']
self.historyWin->update,'Warning: range interval is 0: ' +'Range: [' + formatannotation(0,0,range[0],data=data_struct) + ',' + formatannotation(0,0,range[1],data=data_struct) + ']
endif else begin
self.historyWin->update,'Range: [' + formatannotation(0,0,range[0],data=data_struct) + ',' + formatannotation(0,0,range[1],data=data_struct) + '] will be used to plot.'
endelse
fail = 0
end