pro spd_ui_draw_object::goodTicks,$
isTime,$
range, $
scaling, $
numTicks, $
tickValues=tickValues, $
tickInterval=tickInterval,$
minorTickNum=minorTickNum,$
logMinorTickType=logMinorTickType, $
nozero=nozero,$
nicest=nicest
compile_opt idl2,hidden
minorTickNum = -1
if keyword_set(nicest) then begin
numTicks=5
endif
if n_elements(tickValues) gt 0 then begin
tmp = temporary(tickValues)
endif
if n_elements(tickInterval) gt 0 then begin
tmp = temporary(tickInterval)
endif
if (range[1] - range[0]) / (numTicks+1) eq 0 then begin
tickValues = dindgen(numTicks+2)/(numTicks+1)
tickInterval = 1D/(numTicks+1)
return
endif
if ~isTime then begin
if ~keyword_set(nicest) then begin
factors = [5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100]
minorTicks = [5,10,15,2, 5, 3 ,7 ,4 ,9 ,5 ,5 ,6 ,6 ,7 ,7 ,8 ,8 ,9 ,9 ,10]-1
ticksbias=1
endif else begin
factors = [1D,2D,5D,10]
minorTicks = [10,4,5,10]-1
ticksbias=0
endelse
realTickIntervalFloor = self->nicenum((range[1]-range[0])/(numTicks+1),/floor,factors=factors,factor_index=factorIndexFloor,bias=ticksBias)
realTickIntervalCeil = self->nicenum((range[1]-range[0])/(numTicks+1),/ceil,factors=factors,factor_index=factorIndexCeil,bias=ticksBias)
endif else begin
minorTicks = [10,4,3,6,10]-1
factors = [1D,2D,3D,6D,10D]
ticksBias=0
realTickIntervalFloor = self->nicenumtime((range[1]-range[0])/(numTicks+1),/floor,factors=factors,factor_index=factorIndexFloor,bias=ticksBias)
realTickIntervalCeil = self->nicenumtime((range[1]-range[0])/(numTicks+1),/ceil,factors=factors,factor_index=factorIndexCeil,bias=ticksBias)
endelse
tickStartFloor = ceil(range[0]/realTickIntervalFloor,/l64)*realTickIntervalFloor - range[0]
tickStopFloor = floor(range[1]/realTickIntervalFloor,/l64)*realTickIntervalFloor - range[1]
realTickNumFloor = round((range[1]-range[0]+tickStopFloor-tickStartFloor)/realTickIntervalFloor + 1,/l64)
tickStartCeil = ceil(range[0]/realTickIntervalCeil,/l64)*realTickIntervalCeil - range[0]
tickStopCeil = floor(range[1]/realTickIntervalCeil,/l64)*realTickIntervalCeil - range[1]
realTickNumCeil = round((range[1]-range[0]+tickStopCeil-tickStartCeil)/realTickIntervalCeil + 1,/l64)
if ~keyword_set(nozero) then begin
if abs(numTicks-realTickNumCeil) lt abs(numTicks-realTickNumFloor) || $
(abs(numTicks-realTickNumCeil) eq abs(numTicks-realTickNumFloor) && $
realTickNumCeil gt realTickNumFloor) then begin
realTickInterval = realTickIntervalCeil
tickStart = tickStartCeil
realTickNum = realTickNumCeil
minorTickNum = minorTicks[factorIndexCeil]
endif else begin
realTickInterval = realTickIntervalFloor
tickStart = tickStartFloor
realTickNum = realTickNumFloor
minorTickNum = minorTicks[factorIndexFloor]
endelse
endif else begin
if (abs(numTicks-realTickNumCeil) lt abs(numTicks-realTickNumFloor) || $
(abs(numTicks-realTickNumCeil) eq abs(numTicks-realTickNumFloor) && $
realTickNumCeil gt realTickNumFloor)) && realTickNumCeil gt 0 then begin
realTickInterval = realTickIntervalCeil
tickStart = tickStartCeil
realTickNum = realTickNumCeil
minorTickNum = minorTicks[factorIndexCeil]
endif else begin
realTickInterval = realTickIntervalFloor
tickStart = tickStartFloor
realTickNum = realTickNumFloor
minorTickNum = minorTicks[factorIndexFloor]
endelse
endelse
if scaling eq 2 then begin
minorTickNum = 1
endif
if scaling eq 1 && keyword_set(logMinorTickType) then begin
if logMinorTickType eq 1 || logMinorTickType eq 2 then begin
if realTickInterval gt 1 then begin
minorTickNum = 9
endif
endif
endif
if ~finite(realTickNum) || realTickNum le 0 then return
if realTickNum gt self.maxTickNum then begin
self.statusBar->update,'ERROR: The current settings will result in the creation of ' + strcompress(string(realTickNum),/remove_all) + ' major ticks. Draw operation failed.'
self.historyWin->update,'ERROR: The current settings will result in the creation of ' + strcompress(string(realTickNum),/remove_all) + ' major ticks. Draw operation failed.'
return
endif
realTickValues = dindgen(realTickNum)*realTickInterval+tickStart
tickValues = realTickValues/(range[1]-range[0])
tickInterval = realTickInterval/(range[1]-range[0])
return
end