function remove_zeros, sval, ideallen=ideallen
compile_opt idl2, hidden
f = stregex(sval, '\.?0*$',length=len)
if keyword_set(ideallen) then begin
if (strlen(sval)-len) lt ideallen then begin
newstr = strmid(sval, 0, ideallen )
if strmid(newstr,strlen(newstr)-1,1) eq '.' then newstr=strmid(newstr,0,strlen(newstr)-1)+' '
return, newstr
endif else return, strmid(sval, 0, (strlen(sval)-len) )
endif else return, strmid(sval, 0, (strlen(sval)-len) )
end
function remove_leading_F, sval
sval = strtrim(sval)
if strlen(sval) le 8 then return, sval
if strmid(sval, 0, 4) eq 'FFFF' then begin
sval = strmid(sval, 4, strlen(sval)-1)
endif
if strmid(sval, 0, 4) eq 'FFFF' then begin
sval = strmid(sval, 4, strlen(sval)-1)
endif
return, sval
end
function formatannotation,axis,index,value,data=data
compile_opt idl2
str_element,data,'noformatcodes',noformatcodes,success=s
if s eq 0 then begin
noformatcodes = 0
endif
str_element,data,'maxexplen',maxexplen,success=s
if s eq 0 then begin
maxexplen = -1
endif
str_element,data,'negexp',negexp,success=s
if s eq 0 then begin
negexp = 0
endif
months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
if noformatcodes then begin
expformat = '^'
sciformat = 'e'
endif else begin
expformat = '!U'
sciformat = '!3x!X10!U'
endelse
roundingfactor = 1d-15
if finite(value,/nan) then begin
return,strtrim(string(value))
endif
if in_set('range',strlowcase(tag_names(data))) then begin
val = (value + data.range[0]/(data.range[1]-data.range[0]))*(data.range[1]-data.range[0])
relativecuttoff = (data.range[1]-data.range[0])*roundingfactor
if val le relativecuttoff && val ge -relativecuttoff then begin
val = 0
endif
if ~data.timeaxis then begin
rval = round(val)
if abs(val - rval) lt roundingfactor then val = rval
endif
endif else begin
val = value
endelse
oval = 1d*val
if data.scaling eq 1 then begin
val = 10d^val
endif else if data.scaling eq 2 then begin
val = 1d*exp(val)
endif else begin
val = 1d*val
endelse
if ~finite(val) then begin
return,strtrim(string(val))
endif
if data.timeAxis then begin
tm = (val - floor(val))*1000d
val = floor(val) + round(tm)*10d^(-3)
ts = time_struct(val)
if ts.fsec ge 1d then begin
td = time_double(ts)
ts = time_struct(td)
endif
if data.formatid eq 0 then begin
return,string(ts.year,format='(I4.4)') + '-' + $
months[ts.month-1] +'-'+ $
string(ts.date,format='(I2.2)')
endif else if data.formatid eq 1 then begin
return,string(ts.year,format='(I4.4)') + '-' + $
months[ts.month-1] +'-'+ $
string(ts.date,format='(I2.2)') + '/' + $
string(ts.hour,format='(I2.2)') + ':' + $
string(ts.min,format='(I2.2)')
endif else if data.formatid eq 2 then begin
return,string(ts.year,format='(I4.4)') + '-' + $
months[ts.month-1] +'-'+ $
string(ts.date,format='(I2.2)') + '/' + $
string(ts.hour,format='(I2.2)') + ':' + $
string(ts.min,format='(I2.2)') + ':' + $
string(ts.sec,format='(I2.2)')
endif else if data.formatid eq 3 then begin
return,string(ts.year,format='(I4.4)') + '-' + $
months[ts.month-1] +'-'+ $
string(ts.date,format='(I2.2)') + '/' + $
string(ts.hour,format='(I2.2)') + ':' + $
string(ts.min,format='(I2.2)') + ':' + $
string(ts.sec,format='(I2.2)') + '.' + $
string(ts.fsec*1000,format='(I3.3)')
endif else if data.formatid eq 4 then begin
return,string(ts.hour,format='(I2.2)') + ':' + $
string(ts.min,format='(I2.2)')
endif else if data.formatid eq 5 then begin
return,string(ts.hour,format='(I2.2)') + ':' + $
string(ts.min,format='(I2.2)') + ':' + $
string(ts.sec,format='(I2.2)')
endif else if data.formatid eq 6 then begin
return,string(ts.hour,format='(I2.2)') + ':' + $
string(ts.min,format='(I2.2)') + ':' + $
string(ts.sec,format='(I2.2)') + '.' + $
string(ts.fsec*1000,format='(I3.3)')
endif else if data.formatid eq 7 then begin
return,string(ts.month,format='(I2.2)') + ':' + $
string(ts.date,format='(I2.2)')
endif else if data.formatid eq 8 then begin
return,string(ts.month,format='(I2.2)') + '-' + $
string(ts.date,format='(I2.2)')+ '/' + $
string(ts.hour,format='(I2.2)') + ':' + $
string(ts.min,format='(I2.2)')
endif else if data.formatid eq 9 then begin
return,string(ts.doy,format='(I3.3)')
endif else if data.formatid eq 10 then begin
return,string(ts.doy,format='(I3.3)') + '/' + $
string(ts.hour,format='(I2.2)') + ':' + $
string(ts.min,format='(I2.2)')
endif else if data.formatid eq 11 then begin
return,string(ts.doy,format='(I3.3)') + '/' + $
string(ts.hour,format='(I2.2)') + ':' + $
string(ts.min,format='(I2.2)') + ':' + $
string(ts.sec,format='(I2.2)')
endif else if data.formatid eq 12 then begin
return,string(ts.doy,format='(I3.3)') + '/' + $
string(ts.hour,format='(I2.2)') + ':' + $
string(ts.min,format='(I2.2)') + ':' + $
string(ts.sec,format='(I2.2)') + '.' + $
string(ts.fsec*1000,format='(I3.3)')
endif else if data.formatid eq 13 then begin
return,string(ts.year,format='(I4.4)') + '-' + $
string(ts.doy,format='(I3.3)')
endif else if data.formatid eq 14 then begin
return,string(ts.year,format='(I4.4)') + '-' + $
string(ts.doy,format='(I3.3)') + '/' + $
string(ts.hour,format='(I2.2)') + ':' + $
string(ts.min,format='(I2.2)')
endif else if data.formatid eq 15 then begin
return,string(ts.year,format='(I4.4)') + '-' + $
string(ts.doy,format='(I3.3)') + '/' + $
string(ts.hour,format='(I2.2)') + ':' + $
string(ts.min,format='(I2.2)') + ':' + $
string(ts.sec,format='(I2.2)')
endif else if data.formatid eq 16 then begin
return,string(ts.year,format='(I4.4)') + '-' + $
string(ts.doy,format='(I3.3)') + '/' + $
string(ts.hour,format='(I2.2)') + ':' + $
string(ts.min,format='(I2.2)') + ':' + $
string(ts.sec,format='(I2.2)') + '.' + $
string(ts.fsec*1000,format='(I3.3)')
endif else if data.formatid eq 17 then begin
return,string(ts.year,format='(I4.4)') + '-' + $
string(ts.month, format = '(I2.2)') + '-' + $
string(ts.date,format='(I2.2)')+ '/' + $
string(ts.hour,format='(I2.2)') + ':' + $
string(ts.min,format='(I2.2)') + ':' + $
string(ts.sec,format='(I2.2)')
endif else if data.formatid eq 18 then begin
return,string(ts.year,format='(I4.4)') + '-' + $
string(ts.month, format = '(I2.2)') + '-' + $
string(ts.date,format='(I2.2)')+ '/' + $
string(ts.hour,format='(I2.2)') + ':' + $
string(ts.min,format='(I2.2)') + ':' + $
string(ts.sec,format='(I2.2)') + '.' + $
string(ts.fsec*1000,format='(I3.3)')
endif else if data.formatid eq 19 then begin
return,string(ts.year,format='(I4.4)') + '-' + $
string(ts.month, format = '(I2.2)') + '-' + $
string(ts.date,format='(I2.2)')+ 'T' + $
string(ts.hour,format='(I2.2)') + ':' + $
string(ts.min,format='(I2.2)') + ':' + $
string(ts.sec,format='(I2.2)')
endif else if data.formatid eq 20 then begin
return,string(ts.year,format='(I4.4)') + '-' + $
string(ts.month, format = '(I2.2)') + '-' + $
string(ts.date,format='(I2.2)')+ 'T' + $
string(ts.hour,format='(I2.2)') + ':' + $
string(ts.min,format='(I2.2)') + ':' + $
string(ts.sec,format='(I2.2)') + '.' + $
string(ts.fsec*1000,format='(I3.3)')
endif else begin
ok = error_message('Illegal annotation format',/traceback)
return,''
endelse
endif else begin
prefix = ''
suffix = ''
neg=0
dec=0
use_oval = 0
precision = data.formatid-1 > 0
negzero = ( (val eq 0) && (strmid(strtrim(val,1),0,1) eq '-') ) ? 1:0
spd_ui_usingexponent,val,data,type=type,expsign=expsign
if type eq -1 then return,''
if type eq 0 then begin
spd_ui_getlengthvars, val, dec, neg
if data.formatid eq 0 then begin
formatString = '(I' + strtrim(string(neg+dec,format='(I)'),2)+')'
if precision lt dec then precision = dec < 9
endif else begin
if data.exponent eq 0 then begin
p0 = abs(val) lt 1 ? 1:0
prec = ((precision+1-dec+p0) > 0)
endif else begin
prec = precision
endelse
check_dround, val, neg, dec, prec
formatString = '(D' + strtrim(string(negzero+neg+dec+1+prec,format='(I)'),2)+$
'.' + strtrim(prec,2)+')'
endelse
endif else if type eq 1 then begin
spd_ui_getlengthvars, val, dec, neg
if val eq 0 then $
return, remove_zeros(string(val,format='(D'+strtrim(precision+2+negzero)+'.'+strtrim(precision)+')'))
if expsign eq -1 then begin
esign = '-'
exponent = ceil(abs(alog10(abs(val))))
endif else if expsign eq 1 then begin
esign = ''
exponent = floor(abs(alog10(abs(val))))
endif else if expsign eq 0 then begin
esign = ''
exponent = 0
endif
val = val * (10d^exponent)^(-expsign)
if ~finite(val) then return,strtrim(string(val))
check_eround, val, neg,dec, precision, exponent,expsign
if abs(val) ge 0 and abs(val) lt 10 then begin
if maxexplen ne -1 and negexp eq 1 then begin
exponent = strtrim(exponent,2)
if esign ne '-' then exponent=' '+exponent
suffix = sciformat + esign + exponent
endif else suffix = sciformat + esign + strtrim(exponent,2)
endif else begin
return,''
endelse
if data.formatid eq 0 then begin
formatString = '(I' + strtrim(string(neg+dec,format='(I)'),2)+')'
endif else begin
formatString = '(D' + strtrim(string(neg+precision+2,format='(I)'),2)+'.' + $
strtrim(precision,2) + ')'
endelse
endif else if type eq 2 then begin
if finite(oval, /infinity) then begin
if oval lt 0 then $
return, remove_zeros(string(0d,format='(D'+strtrim(precision+2)+'.'+strtrim(precision)+')')) $
else return, 'Infinity'
endif
spd_ui_getlengthvars, oval, dec, neg
use_oval = 1
check_dround, oval, neg, dec, precision
prec = ((precision+1-dec) > 0)
formatString = '(D' + strtrim(string(neg+dec+prec+1+negzero,format='(I)'),2)+'.' + $
strtrim(prec,2) + ')'
prefix = 'e' + expformat
endif else if type eq 3 then begin
if finite(oval, /infinity) then begin
if oval lt 0 then $
return, remove_zeros(string(0d,format='(D'+strtrim(precision+2)+'.'+strtrim(precision)+')')) $
else return, 'Infinity'
endif
spd_ui_getlengthvars, oval, dec, neg
use_oval = 1
check_dround, oval, neg, dec, precision
prec = ((precision+1-dec) > 0)
formatString = '(D' + strtrim(string(neg+dec+prec+1+negzero,format='(I)'),2)+'.' + $
strtrim(prec,2) + ')'
prefix = '10' + expformat
endif else if type eq 4 then begin
typecode=size(val,/type)
if typecode eq 1 then begin
strvalue = strtrim(string(val,FORMAT='(Z2)'))
endif else if typecode eq 2 then begin
strvalue = strtrim(string(val,FORMAT='(Z4)'))
endif else if typecode eq 3 then begin
strvalue = strtrim(string(val,FORMAT='(Z8)'))
endif else begin
strvalue = strtrim(string(val,FORMAT='(Z16)'))
endelse
return, strvalue
endif else begin
ok = error_message('Illegal annotation type',/traceback)
return,''
endelse
if stregex(formatstring, '[0,1,2,3,4,5,6,7,8,9]+',/extract) ge 255 then return, 'Overflow'
if maxexplen ne -1 then begin
if use_oval then begin
mainstr = string(oval,format=formatString)
if negexp eq 1 then begin
if strmid(mainstr,0,1) ne '-' then mainstr=' '+mainstr
endif
return, prefix + remove_zeros(mainstr,ideallen=maxexplen) + suffix
endif else begin
if data.formatid eq 0 then return, prefix + string(val,format=formatString) + suffix
return, prefix + remove_zeros(string(val,format=formatString)) + suffix
endelse
endif else begin
if use_oval then begin
return, prefix + remove_zeros(string(oval,format=formatString)) + suffix
endif else begin
if data.formatid eq 0 then return, prefix + string(val,format=formatString) + suffix
return, prefix + remove_zeros(string(val,format=formatString)) + suffix
endelse
endelse
endelse
end