;+
;NAME:
; spd_ui_axis_settings__define
;
;PURPOSE:
; axis properties is an object that holds all of the settings necessary for
; plotting a axis as specified in the Trace Properties Line panel
;
;CALLING SEQUENCE:
; axisSettings = Obj_New("SPD_UI_AXIS_SETTINGS")
;
;INPUT:
; none
;
;ATTRIBUTES:
; rangeOption range options (auto, floating, fixed)
; touchedRangeOption has the user modified the rangeOption field
; scaling axis scaling (linear, log10, natural)
; touchedScaling has the user modified the scaling field
; equalXYScaling flag set if equal X & Y axis scaled
; isTimeAxis flag set if axis is time based
; touchedIsTimeAxis has the user modified the isTimeAxis field
; rangeMargin if auto - range margin
; boundScaling flag set if auto scaling is bound
; boundfloating flag set if bounded floating range is used
; minFixedRange min range value if fixed scaling
; touchedMinFixedRange has the user modified the minFixedRange
; maxFixedRange max range value if fixed scaling
; touchedMaxFixedRange has the user modified the maxFixedRange
; minFloatRange min range bound if floating range
; maxFloatRange max range bound if floating range
; minBoundRange min range bound if using bounded autoscaling
; maxBoundRange max range bound if using bounded autoscaling
; floatingSpan value of span if floating
; floatingCenter floating center options (mean, median, appr. mean/median)
; majorTickEvery display major ticks every
; minorTickEvery display major ticks every
; majorTickUnits major tick units (sec, hr, min, day, none)
; minorTickUnits major tick units (sec, hr, min, day, none)
; majorTickAuto set to automatically figure out major ticks
; minorTickAuto set to automatically figure out minor ticks
; firstTickAuto set to automatically figure out first tick
; numMajorTicks number of major ticks
; numMinorTicks number of major ticks
; firstTickAt value where first tick should be
; firstTickUnits first tick unit (sec, hr, min, day, none)
; tickStyle style (inside, outside, both)
; bottomPlacement flag set if ticks should be on bottom axis
; topPlacement flag set if ticks should be on top axis
; majorLength length of major tick
; minorLength length of minor tick
; logMinorTickType For Log minor ticks, log-full-interval,log-first-magnitude,log-last-magnitude,even-spacing
; lineAtZero flag set if line is drawn at zero
; showdate flag set if date strings are shown
; dateString1 string format of date for line 1
; dateString2 string format of date for line 1
; dateFormat1 format of date string for annotation - line 1
; dateFormat2 format of date string for annotation - line 2
; format options include 'Time', 'Date', 'Year', 'Mon', 'Day',
; 'Hours', 'Minutes', 'Seconds', 'Day of Year'
; respective commands are '%time', '%date', '%year', '%mon',
; '%day', '%hours', '%minutes', '%seconds', '%doy'
; annotateAxis flag set to annotate along axis
; placeAnnotation placement of annotation (bottom or top)
; annotateMajorTicks set flag if major ticks are annotated
; annotateEvery value where annotations occur
; annotateUnits units for annotation value (sec, min, hr, day,none)
; firstAnnotation value where annotation of first major tick occurs
; firstAnnotateUnits units for major tick value (sec, min, hr, day,none)
; annotateRangeMin set flag to annotate range min tick
; annotateRangeMax set flag to annotate range max tick
; annotateStyle format style of tick
; if IsTime
; ['date', 'date:doy' , 'date:doy:h:m', 'date:doy:h:m:s', 'date:doy:h:m:s.ms', $
; 'h:m', 'h:m:s', 'h:m:s.ms', 'mo:day', 'mo:day:h:m', 'doy', 'doy:h:m', $
; 'doy:h:m:s', 'doy:h:m:s.ms', 'year:doy', 'year:doy:h:m', 'year:doy:h:m:s', $
; 'year:doy:h:m:s.ms']
; otherwise
; ['d(1234)', 'f0(1234)' , 'f1(123.4)', 'f2(12.34)', 'f3(1.234)', 'f4(0.1234)', $
; 'f5(0.01234)', 'f6(0.001234)', 'e0(123e4)', 'e1(12.3e4)', 'e2(1.23e4)', 'e2(0.123e4)', $
; 'e2(0.0123e4)', 'e2(0.00123e4)', 'e2(0.000123e4)']
;
; annotateOrientation The orientation of the annotations: 0(horizontal) & 1(vertical)
; annotateTextObject Text object that represents that textual style of annotations
; annotateExponent Flag indicates whether to force annotations into an exponential format. 0: default behavior, 1: Always exponential, 2: Never exponential
; majorGrid=majorgrid linestyle object of major grid
; minorGrid=minorgrid linestyle object of minor grid
; orientation orientation of labels 0=Horizontal, 1=Vertical
; margin number of points for label margins
; showLabels flag for whether or not labels are displayed
; labels A container object that stores the text objects which represent each label
; stackLabels A flag to determine whether labels should be stacked
; lazyLabels A flag to determine whether underscores will be converted to carriage returns (and stacking turned off)
; blackLabels A flag to determine whether label colors are all black
; autoticks direct the draw object to make decisions about tick positioning automatically, and mutate axis object settings
; titleobj text object that contains the title for the axis
; subtitleobj text object that contains the subtitle for the axis
; placeLabel placement of labels (left/bottom or right/top)
; placeTitle placement of title (left/bottom 0 or right/top 1)
; titleorientation orientation for title (0=horizontal, 1=vertical)
; titlemargin number of points for title margin
; showtitle flag for whether the title should be displayed (mainly to allow us to turn off titles if panels are locked and titles would overlap panels)
; lazytitles flag to determine whether underscores in titles should be converted to carriage returns
;
;OUTPUT:
; axis property object reference
;
;METHODS:
; SetProperty procedure to set keywords
; GetProperty procedure to get keywords
; GetAll returns the entire structure
;
; GetUnits returns string array of unit options
; GetUnit returns name of unit given an index
; GetOrientations returns string array of plot options
; GetOrientation returns name of plot option given an index
; GetPlacements returns string array of plot options
; GetPlacement returns name of plot option given an index
; GetRangeOptions returns string array of plot options
; GetRangeOption returns name of plot option given an index
; GetStyles returns string array of plot options
; GetStyle returns name of plot option given an index
; GetScalings returns string array of plot options
; GetScaling returns name of plot option given an index
; GetDateFormats returns string array of date format options
; GetDateFormat returns the name of the date format given an index
; GetDateCommands returns array of commands for date formats
; GetDateCommand returns a string with the date command
; GetDateString returns a string with the actual date formatted
; given an index. if a time object is provided it
; will format the time object, otherwise it will
; default to the current date.
;
;HISTORY:
;
;NOTES:
; Methods: GetProperty,SetProperty,GetAll,SetAll are now managed automatically using the parent class
; spd_ui_getset. You can still call these methods when using objects of type spd_ui_axis_settings, and
; call them in the same way as before
;
;$LastChangedBy:pcruce $
;$LastChangedDate:2009-09-10 09:15:19 -0700 (Thu, 10 Sep 2009) $
;$LastChangedRevision:6707 $
;$URL:svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/thmsoc/trunk/idl/spedas/spd_ui/objects/spd_ui_axis_settings__define.pro $
;-----------------------------------------------------------------------------------
;this function integrates several different settings into a 5 element
;array with the following elements [tickStart,majorTickInterval,minorTickInterval,annotationStart,annotationInterval]
function spd_ui_axis_settings::getTickSpacing
compile_opt idl2
if self.firstTickUnits eq 1 then begin
tickStart = self.firstTickAt*60D
endif else if self.firstTickUnits eq 2 then begin
tickStart = self.firstTickAt*60D*60D
endif else if self.firstTickUnits eq 3 then begin
tickStart = self.firstTickAt*60D*60D*24D
endif else begin
tickStart = self.firstTickAt
endelse
if self.majorTickUnits eq 1 then begin
major = self.majorTickEvery*60D
endif else if self.majorTickUnits eq 2 then begin
major = self.majorTickEvery*60D*60D
endif else if self.majorTickUnits eq 3 then begin
major = self.majorTickEvery*60D*60D*24D
endif else begin
major = self.majorTickEvery
endelse
if self.minorTickUnits eq 1 then begin
minor = self.minorTickEvery*60D
endif else if self.minorTickUnits eq 2 then begin
minor = self.minorTickEvery*60D*60D
endif else if self.minorTickUnits eq 3 then begin
minor = self.minorTickEvery*60D*60D*24D
endif else begin
minor = self.minorTickEvery
endelse
if self.firstAnnotateUnits eq 1 then begin
first = self.firstAnnotation*60D
endif else if self.firstAnnotateUnits eq 2 then begin
first = self.firstAnnotation*60D*60D
endif else if self.firstAnnotateUnits eq 3 then begin
first = self.firstAnnotation*60D*60D*24D
endif else begin
first = self.firstAnnotation
endelse
if self.annotateUnits eq 1 then begin
anno = self.annotateEvery*60D
endif else if self.annotateUnits eq 2 then begin
anno = self.annotateEvery*60D*60D
endif else if self.annotateUnits eq 3 then begin
anno = self.annotateEvery*60D*60D*24D
endif else begin
anno = self.annotateEvery
endelse
return, double([tickStart,major,minor,first,anno])
end
FUNCTION SPD_UI_AXIS_SETTINGS::Copy
out = Obj_New("SPD_UI_AXIS_SETTINGS",/nosave)
selfClass = Obj_Class(self)
outClass = Obj_Class(out)
IF selfClass NE outClass THEN BEGIN
dprint, 'Object classes not identical'
RETURN, -1
END
Struct_Assign, self, out
if obj_valid(self.majorGrid) then begin
newGrid=Obj_New("SPD_UI_LINE_STYLE")
newGrid=self.majorGrid->Copy()
out->SetProperty, MajorGrid=newGrid
endif
if obj_valid(self.minorGrid) then begin
newGrid=Obj_New("SPD_UI_LINE_STYLE")
newGrid=self.minorGrid->Copy()
out->SetProperty, minorGrid=newGrid
endif
if obj_valid(self.annotateTextObject) then begin
newText=Obj_New("SPD_UI_TEXT")
newText=self.annotateTextObject->Copy()
out->SetProperty, AnnotateTextObject=newText
endif
newLabels=Obj_New("IDL_Container")
newLabel=Obj_New("SPD_UI_TEXT")
IF Obj_Valid(self.labels) THEN origLabels=self.labels->Get(/all)
nLabels = N_Elements(origLabels)
IF nLabels GT 0 THEN BEGIN
FOR i=0, nLabels-1 DO BEGIN
IF Obj_Valid(origLabels[i]) THEN BEGIN
newLabel = origLabels[i]->Copy()
newLabels->Add, newLabel
ENDIF
ENDFOR
out->SetProperty, Labels=newLabels
ENDIF
; copy title object
newTitle=Obj_New("SPD_UI_TEXT")
IF Obj_Valid(self.titleObj) THEN newTitle=self.titleObj->Copy() ELSE $
newTitle=Obj_New()
out->SetProperty, TitleObj=newTitle
; copy title object
newsubTitle=Obj_New("SPD_UI_TEXT")
IF Obj_Valid(self.subtitleObj) THEN newsubTitle=self.subtitleObj->Copy() ELSE $
newsubTitle=Obj_New()
out->SetProperty, subTitleObj=newsubTitle
RETURN, out
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::GetUnits
if self.scaling eq 0 then begin
if self.isTimeAxis then begin
units = ['seconds', 'minutes', 'hours', 'days']
endif else begin
units = ['n^1']
endelse
endif else if self.scaling eq 1 then begin
if self.isTimeAxis then begin
units = ['10^n sec']
endif else begin
units = ['10^n']
endelse
endif else if self.scaling eq 2 then begin
if self.isTimeAxis then begin
units = ['e^n sec']
endif else begin
units =['e^n']
endelse
endif else begin
units =['unknown']
endelse
RETURN, units
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::GetUnit, index
IF N_Elements(index) EQ 0 THEN RETURN, 0
IF NOT Is_Numeric(index) THEN RETURN, 0
units=self->GetUnits()
IF index GE 0 && index LE N_Elements(units)-1 THEN RETURN, units(index) ELSE RETURN, -1
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::GetFloatingCenters
RETURN, ['mean', 'median', 'approximate mean', 'approximate median']
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::GetFloatingCenter, index
IF ~size(index,/type) THEN RETURN, 0
IF NOT Is_Numeric(index) THEN RETURN, 0
IF index LT 0 OR index GT 3 THEN RETURN, 0
units=self->GetFloatingCenters()
RETURN, units(index)
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::GetAnnotationFormats
IF self.isTimeAxis EQ 1 THEN $
formats = ['date', 'date:h:m', 'date:h:m:s', 'date:h:m:s.ms', $
'h:m', 'h:m:s', 'h:m:s.ms', 'mo:day', 'mo:day:h:m', 'doy', 'doy:h:m', $
'doy:h:m:s', 'doy:h:m:s.ms', 'year:doy', 'year:doy:h:m', 'year:doy:h:m:s', $
'year:doy:h:m:s.ms '] ELSE $
formats = [ '1234 (rounded down)', '1.', '1.2', '1.23', '1.234', '1.1234', $
'1.01234', '1.001234','1.0001234','1.00001234','1.000001234']
;formats = ['d(1234)', 'f0(1234.)' , 'f1(123.4)', 'f2(12.34)', 'f3(1.234)', 'f4(0.1234)', $
;'f5(0.01234)', 'f6(0.001234)', 'e0(1.e+04)', 'e1(1.2e+04)', 'e2(1.23e+04)', 'e3(0.123e+04)', $
;'e4(0.0123e+04)', 'e5(0.00123e+04)', 'e6(0.000123e+04)']
RETURN, FORMATS
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::GetAnnotationFormat, index
IF N_Elements(index) EQ 0 THEN RETURN, 0
IF NOT Is_Numeric(index) THEN RETURN, 0
IF index LT 0 THEN RETURN, 0
formats=self->GetAnnotationFormats()
RETURN, formats(index)
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::GetPlacements
RETURN, ['Bottom','Top']
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::GetPlacement, index
IF N_Elements(index) eq 0 THEN RETURN, 0
IF NOT Is_Numeric(index) THEN RETURN, 0
placements=self->GetPlacements()
IF index LT 0 OR index Ge n_elements(placements) THEN RETURN, 0
RETURN, placements(index)
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::GetOrientations
RETURN, ['Horizontal', 'Vertical']
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::GetOrientation, index
IF N_Elements(index) NE 0 THEN RETURN, 0
IF NOT Is_Numeric(index) THEN RETURN, 0
IF index LT 0 OR index GT 5 THEN RETURN, 0
orientations=self->GetOrientations()
RETURN, orientations(index)
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::GetStyles
RETURN, ['Inside', 'Outside', 'Both Inside and Outside']
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::GetStyle, index
IF N_Elements(index) eq 0 THEN RETURN, 0
IF NOT Is_Numeric(index) THEN RETURN, 0
IF index LT 0 OR index GT 3 THEN RETURN, 0
styles=self->GetStyles()
RETURN, styles(index)
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::GetRangeOptions
RETURN, ['Auto Range', 'Floating Center', 'Fixed Min/Max']
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::GetRangeOption, index
IF N_Elements(index) NE 0 THEN RETURN, 0
IF NOT Is_Numeric(index) THEN RETURN, 0
IF index LT 0 OR index GT 5 THEN RETURN, 0
rangeOptions=self->GetRangeOptions()
RETURN, rangeOptions(index)
END ;--------------------------------------------------------------------------------
PRO SPD_UI_AXIS_SETTINGS::UpdateRange, xRange
; Update min and max ranges based on the type of range (auto, float, fixed)
CASE self.rangeOption OF
'0': BEGIN
self.boundScaling = 1
self.minBoundRange = xRange[0]
self.maxBoundRange = xRange[1]
END
'1': BEGIN
self.boundFloating = 1
self.minFloatRange = xRange[0]
self.maxFloatRange = xRange[1]
END
'2': BEGIN
self.minFixedRange = xRange[0]
self.maxFixedRange = xRange[1]
END
ENDCASE
END ;--------------------------------------------------------------------------------
;gets the current range setting,
;this may not be the actual range that is used in display
;returns 0 if autoscaling
function spd_ui_axis_settings::getRange
if self.rangeOption eq 0 && self.boundscaling then begin
return,[self.minBoundRange,self.maxBoundRange]
endif else if self.rangeOption eq 1 && self.boundFloating then begin
return,[self.minFloatRange,self.maxFloatRange]
endif else if self.rangeOption eq 2 then begin
return,[self.minFixedRange,self.maxFixedRange]
endif else begin
return,0
endelse
end
FUNCTION SPD_UI_AXIS_SETTINGS::GetScalings
RETURN, ['Linear', 'Log 10', 'Natural']
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::GetScaling, index
IF N_Elements(index) NE 0 THEN RETURN, 0
IF NOT Is_Numeric(index) THEN RETURN, 0
IF index LT 0 OR index GT 5 THEN RETURN, 0
scalings=self->GetScalings()
RETURN, scalings(index)
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::GetDateFormats
dateNames = ['Time', 'Date', 'Year', 'Mon', 'Day', 'Hours', 'Minutes', 'Seconds', 'Day of Year']
RETURN, dateNames
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::GetDateFormat, index
IF index LT 0 OR index GT 8 THEN RETURN, -1 ELSE dateNames=self->GetDateFormats()
RETURN, dateNames[index]
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::GetDateCommands
dateCommands= ['%time', '%date', '%year', '%mon', '%day', '%hours', '%minutes', '%seconds', '%doy']
RETURN, dateCommands
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::GetDateCommand, index
IF index LT 0 OR index GT 7 THEN RETURN, -1 ELSE dateCommands=self->GetDateCommands()
RETURN, dateCommands[index]
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::GetDateString, index, TimeObject=timeObject
Catch, theError
IF theError NE 0 THEN BEGIN
Catch, /Cancel
ok = Error_Message(Traceback=1)
RETURN, -1
ENDIF
IF N_Elements(index) EQ 0 THEN RETURN, -1
IF NOT Obj_Valid(timeObject) THEN timeObject = Obj_New("SPD_UI_TIME")
timeObject->GetProperty, TString=timeString
timeStruc = timeObject->GetStructure()
CASE index OF
0: dateString = StrMid(timeString, 11, 5)
1: dateString = StrMid(timeString, 0, 10)
2: dateString = timeStruc.year
3: dateString = timeStruc.mon
4: dateString = timeStruc.date
5: dateString = timeStruc.hour
6: dateString = timeStruc.min
7: dateString = timeStruc.sec
8: dateString = timeStruc.doy
ELSE:
ENDCASE
RETURN, dateString
END ;--------------------------------------------------------------------------------
pro spd_ui_axis_settings::save
obj = self->copy()
if ptr_valid(self.origsettings) then begin
ptr_free,self.origsettings
endif
self.origsettings = ptr_new(obj->getall())
RETURN
end
;*********************************************************
pro spd_ui_axis_settings::reset
if ptr_valid(self.origsettings) then begin
self->SetAll,*self.origsettings
self->save
endif
RETURN
end ;------------------------------------------------------------------
;;looks at saved settings and calculates what user modified
;pro spd_ui_axis_settings::setTouched
;
;
;
; if ~ptr_valid(self.origsettings) then return
;
; if (*self.origsettings).rangeOption ne self.rangeOption then self.touchedRangeOption=1
; if (*self.origsettings).scaling ne self.scaling then self.touchedScaling=1
; if (*self.origsettings).istimeaxis ne self.istimeaxis then self.touchedistimeaxis=1
;
; if ~self->equalTolerance((*self.origsettings).rangeMargin,self.rangeMargin) then self.touchedrangeMargin=1
; if ~self->equalTolerance((*self.origsettings).minBoundRange,self.minBoundRange) then self.touchedMinBoundRange=1
; if ~self->equalTolerance((*self.origsettings).maxBoundRange,self.maxBoundRange) then self.touchedmaxBoundRange=1
; if ~self->equalTolerance((*self.origsettings).minfixedRange,self.minfixedRange) then self.touchedMinfixedRange=1
; if ~self->equalTolerance((*self.origsettings).maxfixedRange,self.maxfixedRange) then self.touchedmaxfixedRange=1
; if (*self.origsettings).lineAtZero ne self.lineAtZero then self.touchedLineAtZero = 1
; if (*self.origsettings).annotaterangemax ne self.annotaterangemax then self.touchedannotaterangemax = 1
;
; self->save
;
;end
PRO SPD_UI_AXIS_SETTINGS::Cleanup
;data format comment says it is object, but is declared numerical
;destroy?
; Obj_Destroy, self.majorGrid
; Obj_Destroy, self.minorGrid
END ;--------------------------------------------------------------------------------
FUNCTION SPD_UI_AXIS_SETTINGS::Init, $
RangeOption=rangeOption, $ ; range options (auto, floating, fixed)
touchedRangeOption=touchedRangeOption, $ ; has the user modified the rangeOption field
Scaling=scaling, $ ; axis scaling (linear, log10, natural)
touchedScaling=touchedscaling, $ ; has the user modifed the scaling field
EqualXYScaling=equalxyscaling, $ ; flag set if equal X & Y axis scaled
IsTimeAxis=istimeaxis, $ ; flag set if axis is time based
touchedIsTimeAxis=touchedIsTimeAxis, $ ; has the user modified the isTimeAxis field
RangeMargin=rangemargin, $ ; if auto - range margin
BoundScaling=boundscaling, $ ; flag set if auto scaling is bound
BoundFloating=BoundFloating, $ ; flag set if bounded floating range is used
minFloatRange=minFloatRange, $ ; minimum range bound if using floating range
maxFloatRange=maxFloatRange, $ ; maximum range bound if using floating range
minBoundRange=minBoundRange, $ ; range for bounded autoscaling
maxBoundRange=maxBoundRange, $ ; max range for bounded autoscaling
minFixedRange=minFixedRange, $ ; min range value if fixed scaling
touchedMinFixedRange=touchedMinFixedRange,$ ; has the user modified the minFixedRange
maxFixedRange=maxFixedRange, $ ; max range value if fixed scaling
touchedMaxFixedRange=touchedMaxFixedRange,$ ; has the user modified the maxFixedRange
FloatingSpan=floatingspan, $ ; value of span if floating
FloatingCenter=floatingcenter, $ ; mean, median, apprx. mean, or apprx. median
MajorTickEvery=majortickevery, $ ; display major ticks every
MinorTickEvery=minortickevery, $ ; display major ticks every
MajorTickUnits=majortickunits, $ ; major tick units (sec, hr, min, day, none)
MinorTickUnits=minortickunits, $ ; major tick units (sec, hr, min, day, none)
MajorTickAuto=majortickauto, $ ; set to automatically figure out major ticks
MinorTickAuto=minortickauto, $ ; set to automatically figure out minor ticks
FirstTickAuto=firsttickauto, $ ; set to automatically figure out the first tick placement
NumMajorTicks=nummajorticks, $ ; number of major ticks
NumMinorTicks=numminorticks, $ ; number of major ticks
FirstTickAt=firsttickat, $ ; value where first tick should be
FirstTickUnits=firsttickunits, $ ; first tick unit (sec, hr, min, day, none)
TickStyle=tickstyle, $ ; style (inside, outside, both)
BottomPlacement=bottomplacement, $ ; flag set if ticks should be on bottom axis
TopPlacement=topplacement, $ ; flag set if ticks should be on top axis
MajorLength=majorlength, $ ; length of major tick
MinorLength=minorlength, $ ; length of minor tick
logMinorTickType=logMinorTickType, $ ; type of logarithmic minor tick
LineAtZero=lineatzero, $ ; flag set if line is drawn at zero
showdate=showdate, $ ; flag set if date strings are shown
DateString1=datestring1, $ ; string format of date for line 1
DateString2=datestring2, $ ; string format of date for line 1
DateFormat1=dateformat1, $ ; format of date for line 1 (annotation purposes)
DateFormat2=dateformat2, $ ; format of date for line 2
AnnotateAxis=annotateaxis, $ ; flag set to annotate along axis
PlaceAnnotation=placeannotation, $ ; placement of annotation (bottom or top)
AnnotateMajorTicks=annotatemajorticks, $ ; set flag if major ticks are annotated
annotateEvery=annotateevery, $ ; value where annotation of major ticks occur
annotateUnits=annotateunits, $ ; units for major tick value (sec, min, hr, day)
FirstAnnotation=firstannotation, $ ; value where annotation of first major tick occurs
FirstAnnotateUnits=firstannotateunits, $ ; units for major tick value (sec, min, hr, day)
AnnotateRangeMin=annotaterangemin, $ ; set flag to annotate range min tick
annotateRangeMax=annotaterangemax, $ ; set flag to annotate range max tick
AnnotateStyle=annotatestyle, $ ; format style of tick (h:m, doy, time, etc....)
annotateOrientation=annotateOrientation, $ ;orientation of the annotations: 0(horizontal) & 1(vertical)
annotateTextObject=annotateTextObject, $ ; Text object that represents that textual style of annotations
annotateExponent=annotateExponent, $ ; Flag indicates whether to force annotations into an exponential format. 0: default behavior, 1: Always exponential, 2: Never exponential
majorGrid=majorgrid, $ ; linestyle object of major grid
minorGrid=minorgrid, $ ; linestyle object of minor grid
Orientation=orientation, $ ; orientation of labels 0=Horizontal, 1=Vertical
Margin=margin, $ ; number of points for label margins
showLabels=showLabels, $ ; flag for whether or not labels are displayed
labels=labels, $ ; A container object that stores the text objects which represent each label
stackLabels=stackLabels, $ ; A flag to determine whether labels should be stacked
lazyLabels=lazyLabels, $ ; A flag to determine whether underscores will be converted to carriage returns (and stacking turned off)
blackLabels=blackLabels, $ ; A flag to determine whether labels are all black (not synced to line)
titleObj=titleObj, $ ; title obj axis
subtitleObj=subtitleObj, $ ; subtitle obj axis
placeLabel=placeLabel, $ ; placement of label (left/bottom or right/top)
placeTitle=placeTitle, $ ; placement of title (left/bottom or right/top)
titleorientation=titleorientation, $ ; orientation of title (0=horizontal, 1=vertical)
titlemargin=titlemargin, $ ; number of points for title margin
showtitle=showtitle, $ ; flag for whether the title should be displayed
autoticks=autoticks, $ ; direct the draw object to make decisions about tick positioning automatically, and mutate axis object settings
nosave=nosave ; don't save on start-up
Catch, theError
IF theError NE 0 THEN BEGIN
Catch, /Cancel
ok = Error_Message(Traceback=Keyword_Set(debug))
RETURN, 0
ENDIF
; Range Properties
; Check that all parameters have values
IF N_Elements(rangeoption) EQ 0 THEN rangeoption = 0
if n_elements(touchedrangeoption) eq 0 then touchedrangeoption=0
IF N_Elements(scaling) EQ 0 THEN scaling = 0
if n_elements(touchedscaling) eq 0 then touchedscaling = 0
IF N_Elements(equalxyscaling) EQ 0 THEN equalxyscaling = 0
IF N_Elements(istimeaxis) EQ 0 THEN istimeaxis = 1
if n_elements(touchedistimeaxis) eq 0 then touchedistimeaxis=0
IF N_Elements(rangemargin) EQ 0 THEN rangemargin = .05d
IF N_Elements(boundscaling) EQ 0 THEN boundscaling = 0
IF n_elements(boundfloating) eq 0 then boundfloating = 0
IF n_elements(minfloatrange) eq 0 then minfloatrange = 0.0
if n_elements(maxfloatrange) eq 0 then maxfloatrange = 0.0
IF N_Elements(minboundrange) EQ 0 THEN minboundrange = 0.0
IF N_Elements(maxboundrange) EQ 0 THEN maxboundrange = 0.0
IF N_Elements(minfixedrange) EQ 0 THEN minfixedrange = 0.0
if n_elements(touchedminfixedrange) eq 0 then touchedminfixedrange = 0
IF N_Elements(maxfixedrange) EQ 0 THEN maxfixedrange = 0.0
if n_elements(touchedmaxfixedrange) eq 0 then touchedmaxfixedrange = 0
IF N_Elements(floatingspan) EQ 0 THEN floatingspan = 20
IF N_Elements(floatingcenter) EQ 0 THEN floatingcenter = 0
; Set all parameters
self.rangeOption = rangeoption
self.touchedrangeoption = touchedrangeoption
self.scaling = scaling
self.touchedscaling = touchedscaling
self.equalXYScaling = equalxyscaling
self.isTimeAxis = istimeaxis
self.touchedistimeaxis = touchedistimeaxis
self.rangeMargin = rangemargin
self.boundScaling = boundscaling
self.boundFloating = boundfloating
self.minFloatRange = minFloatrange
self.maxFloatRange = maxFloatRange
self.minboundRange = minboundrange
self.maxboundRange = maxboundrange
self.minfixedRange = minfixedrange
self.touchedminfixedrange = touchedminfixedrange
self.maxfixedRange = maxfixedrange
self.touchedmaxfixedrange = touchedmaxfixedrange
self.floatingSpan = floatingspan
self.floatingCenter = floatingcenter
; Tick Properties
; Check that all parameters have values
IF N_Elements(majortickevery) EQ 0 THEN majortickevery = 1
IF N_Elements(minortickevery) EQ 0 THEN minortickevery = 1
IF N_Elements(majortickunits) EQ 0 THEN majortickunits = 2
IF N_Elements(minortickunits) EQ 0 THEN minortickunits = 2
IF N_Elements(majortickauto) EQ 0 THEN majortickauto = 1
IF N_Elements(minortickauto) EQ 0 THEN minortickauto = 1
IF N_Elements(firsttickauto) EQ 0 THEN firsttickauto = 1
IF N_Elements(nummajorticks) EQ 0 THEN nummajorticks = 0
IF N_Elements(numminorticks) EQ 0 THEN numminorticks = 0
IF N_Elements(firsttickat) EQ 0 THEN firsttickat = 0
IF N_Elements(firsttickunits) EQ 0 THEN firsttickunits = 0
IF N_Elements(tickstyle) EQ 0 THEN tickstyle = 0
IF N_Elements(bottomplacement) EQ 0 THEN bottomplacement = 0
IF N_Elements(topplacement) EQ 0 THEN topplacement = 0
IF N_Elements(majorlength) EQ 0 THEN majorlength = 1
IF N_Elements(minorlength) EQ 0 THEN minorlength = 1
if n_elements(logMinorTickType) eq 0 then logMinorTickType = 1
; Set all parameters
self.majorTickEvery = majortickevery
self.minorTickEvery = minortickevery
self.majorTickUnits = majortickunits
self.minorTickUnits = minortickunits
self.majorTickAuto = majortickauto
self.minorTickAuto = minortickauto
self.firstTickAuto = firsttickauto
self.numMajorTicks = nummajorticks
self.numMinorTicks = numminorticks
self.firstTickAt = firsttickat
self.firstTickUnits = firsttickunits
self.tickStyle = tickstyle
self.bottomPlacement = bottomplacement
self.topPlacement = topplacement
self.majorLength = majorlength
self.minorLength = minorlength
self.logMinorTickType = logMinorTickType
; Annotation Properties
; Check that all parameters have values
IF N_Elements(lineatzero) EQ 0 THEN lineatzero = 0
IF N_Elements(showdate) EQ 0 THEN showdate = 0
IF N_Elements(datestring1) EQ 0 THEN datestring1 = 'DOY: %doy'
IF N_Elements(datestring2) EQ 0 THEN datestring2 = '%year-%mon-%day'
IF N_Elements(dateformat1) EQ 0 THEN dateformat1 = 0
IF N_Elements(dataformat2) EQ 0 THEN dateformat2 = 0
IF N_Elements(annotateaxis) EQ 0 THEN annotateaxis = 0
IF N_Elements(placeannotation) EQ 0 THEN placeannotation = 0
IF N_Elements(annotatemajorticks) EQ 0 THEN annotatemajorticks = 0
IF N_Elements(annotateevery) EQ 0 THEN annotateevery = 1
IF N_Elements(annotateunits) EQ 0 THEN annotateunits = 2
IF N_Elements(firstannotation) EQ 0 THEN firstannotation = 0
IF N_Elements(firstannotateunits) EQ 0 THEN firstannotateunits = 0
IF N_Elements(annotaterangemin) EQ 0 THEN annotaterangemin = 0
IF N_Elements(annotaterangemax) EQ 0 THEN annotaterangemax = 0
IF N_Elements(annotatestyle) EQ 0 THEN annotatestyle = 0
If n_elements(annotateOrientation) eq 0 then annotateOrientation = 0
If n_elements(annotateTextObject) eq 0 then annotateTextObject = obj_new('spd_ui_text')
If n_elements(annotateExponent) eq 0 then annotateExponent = 0
; Set all parameters
self.lineAtZero = lineatzero
self.showDate = showDate
self.dateString1 = datestring1
self.dateString2 = datestring2
self.dateFormat1 = dateformat1
self.dateFormat2 = dateformat2
self.annotateAxis = annotateaxis
self.placeAnnotation = placeannotation
self.annotateMajorTicks = annotatemajorticks
self.annotateEvery = annotateevery
self.annotateUnits = annotateunits
self.firstAnnotation = firstannotation
self.firstAnnotateUnits = firstannotateunits
self.annotateRangeMin = annotaterangemin
self.annotateRangeMax = annotaterangemax
self.annotateOrientation = annotateOrientation
self.annotateStyle = annotatestyle
self.annotateTextObject = annotateTextObject
self.annotateExponent = annotateExponent
; Axes Properties
; Check that all parameters have values
IF NOT Obj_Valid(majorGrid) THEN majorgrid = Obj_New()
IF NOT Obj_Valid(minorGrid) THEN minorgrid = Obj_New()
; Set all parameters
self.majorGrid = majorgrid
self.minorGrid = minorgrid
; Label Properties
; Check that all parameters have values
IF N_Elements(orientation) EQ 0 THEN orientation = 0
IF N_Elements(margin) EQ 0 THEN margin = 0
if n_elements(showlabels) eq 0 then showlabels = 1
If n_elements(labels) eq 0 then labels = obj_new()
if n_elements(stackLabels) eq 0 then stackLabels = 0
if n_elements(lazyLabels) eq 0 then lazyLabels = 1
if n_elements(blackLabels) eq 0 then blackLabels = 0
IF N_Elements(titleObj) EQ 0 THEN titleObj = obj_new('spd_ui_text')
if n_elements(subtitleObj) eq 0 then subtitleObj = obj_new('spd_ui_text')
if n_elements(placeLabel) eq 0 then placeLabel = 0
if n_elements(placeTitle) eq 0 then placeTitle = 0
if n_elements(titleorientation) eq 0 then titleorientation = 1
if n_elements(titlemargin) eq 0 then titlemargin = 0
if n_elements(showtitle) eq 0 then showtitle = 1
if n_elements(lazyTitles) eq 0 then lazyTitles = 1
; Set all parameters
self.orientation = orientation
self.margin = margin
self.showlabels = showlabels
self.labels = labels
self.stackLabels = stackLabels
self.lazyLabels = lazyLabels
self.blackLabels = blackLabels
self.titleObj = titleObj
self.subtitleObj = subtitleObj
self.placeLabel = placelabel
self.placeTitle = placetitle
self.titleorientation = titleorientation
self.titlemargin = titlemargin
self.showtitle = showtitle
self.lazytitles = lazyTitles
if n_elements(autoticks) eq 0 then autoticks = 1
self.autoticks = autoticks
if ~keyword_set(nosave) then self->save
RETURN, 1
END ;--------------------------------------------------------------------------------
;*********************************************************
PRO SPD_UI_AXIS_SETTINGS__DEFINE
struct = { SPD_UI_AXIS_SETTINGS, $
; Range Properties
rangeOption: 0, $ ; range options (auto, floating, fixed)
touchedRangeOption: 0b, $ ; has the user modified the rangeOption field
scaling: 0, $ ; axis scaling (linear, log10, natural)
touchedScaling: 0b, $ ; has the user modifed the scaling field
equalXYScaling: 0b, $ ; flag set if equal X & Y axis scaled
isTimeAxis: 0, $ ; flag set if axis is time based
touchedIsTimeAxis:0b, $ ; has the user modified the isTimeAxis field
rangeMargin: 0D, $ ; if auto - range margin
touchedRangeMargin:0b, $ ;has the user modified the range margin
boundScaling: 0b, $ ; flag set if auto scaling is bound
boundFloating: 0b, $ ; flag set if floating range is bounded
minFloatRange: 0.0D, $ ; min range bound if using floating range
maxFloatRange: 0.0D, $ ; max range bound if using floating range
minBoundRange: 0.0D, $ ; min range value if bounded auto scaling
touchedMinBoundRange:0b, $ ;has the user modified the min bound range
maxBoundRange: 0.0D, $ ; max range value if bounded auto scaling
touchedMaxBoundRange:0b, $ ;has the user modified the max bound range
minFixedRange: 0.0D, $ ; min range value if fixed scaling
touchedMinFixedRange: 0b, $; has the user modified the minFixedRange
maxFixedRange: 0.0D, $ ; max range value if fixed scaling
touchedMaxFixedRange: 0b,$; has the user modified the maxFixedRange
floatingSpan: 0.0D, $ ; value of span if floating
floatingCenter: 0, $ ; mean, median, apprx. mean, apprx. median
; Tick Properties
majorTickEvery: 0D, $ ; display major ticks every
minorTickEvery: 0D, $ ; display major ticks every
majorTickUnits: 0, $ ; major tick units (sec, hr, min, day, none)
minorTickUnits: 0, $ ; major tick units (sec, hr, min, day, none)
majorTickAuto: 0, $ ; set to automatically figure out major ticks
minorTickAuto: 0, $ ; set to automatically figure out minor ticks
firstTickAuto: 0, $ ; set to automatically figure out the first tick
numMajorTicks: 0LL, $ ; number of major ticks
numMinorTicks: 0LL, $ ; number of major ticks
firstTickAt: 0D, $ ; value where first tick should be
firstTickUnits: 0, $ ; first tick unit (sec, hr, min, day, none)
tickStyle: 0, $ ; style (inside, outside, both)
bottomPlacement: 0, $ ; flag set if ticks should be on bottom axis
topPlacement: 0, $ ; flag set if ticks should be on top axis
majorLength: 0LL, $ ; length of major tick
minorLength: 0LL, $ ; length of minor tick
logMinorTickType:0L, $ ; type of minor tick (0,1,2,3)
; Annotation Properties
lineAtZero: 0, $ ; flag set if line is drawn at zero
touchedLineAtZero:0b, $ ; has the user modified line at zero
showDate:0, $ ; flag to indicate whether date should be displayed
dateString1: '', $ ; string with annotation format
dateString2: '', $ ; string with annotation format
dateFormat1: 0, $ ; time object for annotation
dateFormat2: 0, $ ; time object for annotation
annotateAxis: 0, $ ; flag set to annotate along axis
placeAnnotation: 0, $ ; placement of annotation (bottom or top)
annotateMajorTicks: 0, $ ; set flag if major ticks are annotated
annotateEvery: 1D, $ ; value where annotation of major ticks occur
annotateUnits: 2, $ ; units for major tick value (sec, min, hr, day)
firstAnnotation: 0D, $ ; value where annotation of first major tick occurs
firstAnnotateUnits: 0, $ ; units for major tick value (sec, min, hr, day)
annotateRangeMin: 0, $ ; set flag to annotate range min tick
annotateRangeMax: 0, $ ; set flag to annotate range max tick
touchedAnnotateRangeMax:0b, $ ; has the user modified annotate range max tick
annotateStyle: 0, $ ; format style of tick (h:m, doy, time, etc....)
annotateOrientation: 0, $ ;specify the orientation of the annotations with a number: 0(horizontal) or 1(vertical)
annotateTextObject: Obj_new(), $ ; an object that stores the text style information for the annotations
annotateExponent: 0 , $ ; Flag indicates whether to force annotations into an exponential format. 0: default behavior, 1: Always exponential, 2: Never exponential
; Axes Properties
majorGrid: Obj_New(), $ ;linestyle object for major grid
minorGrid: Obj_New(), $ ;linestyle object for minor grid
; Label Properties
orientation: 0, $ ; orientation of labels 0=Horizontal, 1=Vertical
margin: 0L, $ ; number of points for label margins
showLabels:0b, $ ; flag for not labels are displayed
labels: Obj_new(), $ ; An IDL_Container with text objects for each label
stackLabels:0, $ ; This flag determines whether labels are stacked or are a row
lazyLabels:0, $ ; This flag determines if underscores will be converted to carriage returns (and stacking turned off)
blackLabels:0, $ ; This flag determines if the labels are all colored black (not synced to line)
origsettings: ptr_new(),$ ;To save settings, if reset is needed.
autoticks:0, $ ; directs the draw object to make decisions about tick positioning automatically, and mutate axis object settings
titleobj: obj_new(), $ ; text object for axis title
subtitleobj: obj_new(), $ ; text object for axis subtitle
placeLabel: 0, $ ; placement of labels (left/bottom or right/top)
placeTitle: 0, $ ; placement of title (left/bottom or right/top)
titleorientation: 0, $ ; orientation of title 0=horizontal, 1=vertical
titlemargin: 0, $ ; number of points for title margins
showtitle: 0b, $ ; flag for whether the titles should be displayed
lazyTitles:0, $ ; This flag determines if underscores will be converted to carriage returns for titles
INHERITS SPD_UI_READWRITE, $ ; generalized read/write methods
INHERITS spd_ui_getset $ ; generalized setProperty/getProperty/getAll/setAll methods
}
END