rendering/annotation.py
# ----------------------------------------------------------------------------
#  CLASSES: nightly
#
#  Test Case:  annotation.py
#
#  Tests:      mesh      - 3D unstructured, single domain
#              plots     - pc, subset
#              operators - none
#              selection - none
#
#  Defect ID:  none
#
#  Programmer: Brad Whitlock
#  Date:       Mon Jun 3 13:25:18 PST 2002
#
#  Modifications:
#    Kathleen Bonnell, Thu Jul 18 10:33:07 PDT 2002
#    Added test for combinations of ticks/labels/gridlines to ensure
#    that they all play together nicely.  Removed test of userInfo, as it will
#    always have a different timestamp than the baseline image.
#
#    Kathleen Bonnell, Thu Sep  5 10:55:47 PDT 2002 
#    Changed the variable format for SubsetPlots, to reflect new interface
#    which allows subsets of groups. 
#
#    Eric Brugger, Mon Nov 11 14:09:08 PST 2002
#    Changed the test suite extensively since the 2d annotations were
#    enhanced significantly and the 3d annotation field names were changed
#    to match.
#
#    Hank Childs, Tue Nov 19 15:45:12 PST 2002
#    Changed Aslice to Slice to account for interface change in slicing.
#
#    Kathleen Bonnell, Thu Aug 28 14:34:57 PDT 2003
#    Remove compound var name from Subset plots.
#
#    Eric Brugger, Tue Nov 25 15:12:15 PST 2003
#    Added tests for axis labeling with narrow 2d windows.
#
#    Kathleen Bonnell, Wed May  5 08:11:53 PDT 2004
#    Modified slice atts to get same picture since defaults have changed. 
#
#    Kathleen Bonnell, Mon Sep 14 15:01:25 PDT 2009
#    Removed deprecated annotation settings.
#
#    Mark C. Miller, Wed Jan 20 07:37:11 PST 2010
#    Added ability to swtich between Silo's HDF5 and PDB data.
#
#    Kathleen Biagas, Wed Jan  8 13:39:46 PST 2014
#    Added 2d tests 26 & 27, gridlines with a different saved window size.
#
#    Kathleen Biagas, Mon Dec 19 15:45:38 PST 2016
#    Use FilledBoundary plot for materials instead of Subset.
#
#    Alister Maguire, Mon Mar  5 14:10:23 PST 2018
#    Added a test for manipulating the triad attributes. 
#
#    Alister Maguire, Fri Mar  9 10:21:50 PST 2018
#    Now using a 'set manually' flag for the triad attribtues. 
# 
#    Justin Privitera, Wed Oct  9 14:47:05 PDT 2024
#    Changed triadlinewidth to 2 from 3 to avoid rebaselining.
#    The triad line width is now an int not a float and 0 corresponds to 
#    line width 1, so all the values have been shifted up.
#
# ----------------------------------------------------------------------------

TurnOnAllAnnotations()
OpenDatabase(silo_data_path("globe.silo"))

AddPlot("Pseudocolor", "u")
AddOperator("Slice")
slice = SliceAttributes()
slice.project2d = 1
slice.SetAxisType(slice.XAxis)
slice.SetFlip(1)
SetOperatorOptions(slice)
DrawPlots()

# Test gradient backgrounds
a = GetAnnotationAttributes()
a.gradientColor1 = (0, 255, 255)
a.gradientColor2 = (0, 0, 255)
a.gradientBackgroundStyle = 0 # TopToBottom
a.backgroundMode = 1 # Gradient
SetAnnotationAttributes(a)
Test("annot_01")
a.gradientBackgroundStyle = 4 # Radial
SetAnnotationAttributes(a)
Test("annot_02")

# Test setting background/foreground colors
a.backgroundColor = (0, 0, 0)
a.foregroundColor = (255, 255, 255)
a.backgroundMode = 0 # Solid
SetAnnotationAttributes(a)
Test("annot_03")

# Turn off the database
a.databaseInfoFlag = 0
SetAnnotationAttributes(a)
Test("annot_04")

a.databaseInfoFlag = 1

# Turn off the legend
a.legendInfoFlag = 0
SetAnnotationAttributes(a)
Test("annot_05")

a.legendInfoFlag = 1

##
## Test 2D options
##

# Turn off the 2D axes
a.axes2D.visible = 0
SetAnnotationAttributes(a)
Test("annot2d_01")

a.axes2D.visible = 1

# Test 2D axis labels
a.axes2D.xAxis.label.visible = 0
a.axes2D.yAxis.label.visible = 0
SetAnnotationAttributes(a)
Test("annot2d_02")

a.axes2D.xAxis.label.visible = 1
a.axes2D.yAxis.label.visible = 0
SetAnnotationAttributes(a)
Test("annot2d_03")

a.axes2D.xAxis.label.visible = 0
a.axes2D.yAxis.label.visible = 1
SetAnnotationAttributes(a)
Test("annot2d_04")

a.axes2D.xAxis.label.visible = 1
a.axes2D.yAxis.label.visible = 1

# Test 2D axis titles
a.axes2D.xAxis.title.visible = 0
a.axes2D.yAxis.title.visible = 0
SetAnnotationAttributes(a)
Test("annot2d_05")

a.axes2D.xAxis.title.visible = 1
a.axes2D.yAxis.title.visible = 0
SetAnnotationAttributes(a)
Test("annot2d_06")

a.axes2D.xAxis.title.visible = 0
a.axes2D.yAxis.title.visible = 1
SetAnnotationAttributes(a)
Test("annot2d_07")

a.axes2D.xAxis.title.visible = 1
a.axes2D.yAxis.title.visible = 1

# Test 2D gridlines
a.axes2D.xAxis.grid = 1
a.axes2D.yAxis.grid = 0
SetAnnotationAttributes(a)
Test("annot2d_08")

a.axes2D.xAxis.grid = 0
a.axes2D.yAxis.grid = 1
SetAnnotationAttributes(a)
Test("annot2d_09")

a.axes2D.xAxis.grid = 1
a.axes2D.yAxis.grid = 1
SetAnnotationAttributes(a)
Test("annot2d_10")

a.axes2D.xAxis.grid = 0
a.axes2D.yAxis.grid = 0

# Test auto set ticks off
a.axes2D.autoSetTicks = 0
a.axes2D.xAxis.tickMarks.majorMinimum = -8.
a.axes2D.xAxis.tickMarks.majorMaximum = 8.
a.axes2D.xAxis.tickMarks.majorSpacing = 4.
a.axes2D.xAxis.tickMarks.minorSpacing = 1.
a.axes2D.yAxis.tickMarks.majorMinimum = -9.
a.axes2D.yAxis.tickMarks.majorMaximum = 9.
a.axes2D.yAxis.tickMarks.majorSpacing = 3.
a.axes2D.yAxis.tickMarks.minorSpacing = 1.
a.axes2D.tickAxes = a.axes2D.All  # All
a.axes2D.xAxis.grid = 1
a.axes2D.yAxis.grid = 1
SetAnnotationAttributes(a)
Test("annot2d_11")

a.axes2D.autoSetTicks = 1
a.axes2D.tickAxes = a.axes2D.BottomLeft # BottomLeft
a.axes2D.xAxis.grid = 0
a.axes2D.yAxis.grid = 0

# Test tick locations
a.axes2D.tickLocation = a.axes2D.Inside # Inside
SetAnnotationAttributes(a)
Test("annot2d_12")

a.axes2D.tickLocation = a.axes2D.Both # Both
SetAnnotationAttributes(a)
Test("annot2d_13")

a.axes2D.tickLocation = 1 # Outside

# Test font sizes
a.axes2D.xAxis.label.font.scale = 1.5
a.axes2D.yAxis.label.font.scale = 1.5
a.axes2D.xAxis.title.font.scale = 1.5
a.axes2D.yAxis.title.font.scale = 1.5
SetAnnotationAttributes(a)
Test("annot2d_14")

a.axes2D.xAxis.label.font.scale = 2
a.axes2D.yAxis.label.font.scale = 2
a.axes2D.xAxis.title.font.scale = 2
a.axes2D.yAxis.title.font.scale = 2
SetAnnotationAttributes(a)
Test("annot2d_15")

a.axes2D.xAxis.label.font.scale = 1
a.axes2D.yAxis.label.font.scale = 1
a.axes2D.xAxis.title.font.scale = 1
a.axes2D.yAxis.title.font.scale = 1

# Test labeling locations
a.axes2D.tickAxes = a.axes2D.Off
SetAnnotationAttributes(a)
Test("annot2d_16")

a.axes2D.tickAxes = a.axes2D.Bottom
SetAnnotationAttributes(a)
Test("annot2d_17")

a.axes2D.tickAxes = a.axes2D.Left
SetAnnotationAttributes(a)
Test("annot2d_18")

a.axes2D.tickAxes = a.axes2D.All
SetAnnotationAttributes(a)
Test("annot2d_19")

a.axes2D.tickAxes = a.axes2D.BottomLeft

# Test how the 2D flags play together
# Especially with gridlines on.  Changing
# databases so can also test that gridline
# length is correct in each direction.

DeleteAllPlots()
OpenDatabase(silo_data_path("curv2d.silo"))

AddPlot("Pseudocolor", "u")
DrawPlots()
ResetView()

# Turn on y axis labels, x grid lines
# and turn off ticks.
a.axes2D.xAxis.label.visible = 0
a.axes2D.yAxis.label.visible = 1
a.axes2D.xAxis.grid = 1
a.axes2D.yAxis.grid = 0
a.axes2D.tickAxes = a.axes2D.Off
SetAnnotationAttributes(a)
Test("annot2d_20")

# Turn on y axis labels, bottom ticks marks,
# and x and y gridlines 
a.axes2D.xAxis.grid = 1
a.axes2D.yAxis.grid = 1
a.axes2D.tickAxes = a.axes2D.Bottom
a.axes2D.tickLocation = a.axes2D.Outside
a.axes2D.xAxis.label.visible = 0
a.axes2D.yAxis.label.visible = 1
SetAnnotationAttributes(a)
Test("annot2d_21")

# Test how the gridlines work by themselves 
# Turn off labels and ticks, 
a.axes2D.tickAxes = a.axes2D.Off
a.axes2D.xAxis.label.visible = 0
a.axes2D.yAxis.label.visible = 0
SetAnnotationAttributes(a)
Test("annot2d_22")

# Test the 2d axes line width.
a.axes2D.tickAxes = a.axes2D.BottomLeft
a.axes2D.tickLocation = a.axes2D.Outside
a.axes2D.lineWidth = 2
SetAnnotationAttributes(a)
Test("annot2d_23")

# Test axis labeling with a narrow window.
a.axes2D.xAxis.label.visible = 1
a.axes2D.yAxis.label.visible = 1
a.axes2D.xAxis.grid = 0
a.axes2D.yAxis.grid = 0
a.axes2D.lineWidth = 0
SetAnnotationAttributes(a)

v = View2DAttributes()
v.viewportCoords = (0.2, 0.95, 0.15, 0.95)
v.windowCoords = (-4.68395, 4.89802, 2.5, 2.5001)
SetView2D(v)
Test("annot2d_24")

v.windowCoords = (0., 0.0001, 0.216897, 4.925)
SetView2D(v)
Test("annot2d_25")

##
## Gridlines with a changed window size (#1676)
##
ResetView()
DeleteAllPlots()
OpenDatabase(silo_data_path("multi_rect2d.silo"))
AddPlot("Pseudocolor", "d")
DrawPlots()
a.axes2D.xAxis.grid = 1
a.axes2D.yAxis.grid = 1
SetAnnotationAttributes(a)
Test("annot2d_26")
swa_orig = SaveWindowAttributes()
swa = SaveWindowAttributes()
swa.height = 800
swa.width = 600
swa.resConstraint = swa.NoConstraint
Test("annot2d_27", swa)

##
## Test 3D options
##

DeleteAllPlots()
OpenDatabase(silo_data_path("globe.silo"))

AddPlot("FilledBoundary", "mat1")
DrawPlots()
v = View3DAttributes()
v.viewNormal = (-0.527602, 0.329431, 0.783014)
v.focus = (0, 0, 0)
v.viewUp = (0.115312, 0.940986, -0.318195)
v.viewAngle = 30
v.parallelScale = 17.3205
v.nearPlane = -34.641
v.farPlane = 34.641
v.perspective = 1
SetView3D(v)

# Turn off the triad.
a.axes3D.visible = 1
a.axes3D.bboxFlag = 1
a.axes3D.triadFlag = 0
SetAnnotationAttributes(a)
Test("annot3d_01")

# Turn off the bounding box
a.axes3D.triadFlag = 1
a.axes3D.bboxFlag = 0
SetAnnotationAttributes(a)
Test("annot3d_02")

# Turn some axes off
a.axes3D.bboxFlag = 1
a.axes3D.xAxis.label.visible = 0
a.axes3D.yAxis.label.visible = 1
a.axes3D.zAxis.label.visible = 0
a.axes3D.xAxis.tickMarks.visible = 0
a.axes3D.yAxis.tickMarks.visible = 1
a.axes3D.zAxis.tickMarks.visible = 0
SetAnnotationAttributes(a)
Test("annot3d_03")

# Turn on all gridlines
a.axes3D.xAxis.label.visible = 1
a.axes3D.yAxis.label.visible = 1
a.axes3D.zAxis.label.visible = 1
a.axes3D.xAxis.tickMarks.visible = 1
a.axes3D.yAxis.tickMarks.visible = 1
a.axes3D.zAxis.tickMarks.visible = 1
a.axes3D.xAxis.grid = 1
a.axes3D.yAxis.grid = 1
a.axes3D.zAxis.grid = 1
SetAnnotationAttributes(a)
Test("annot3d_04")

# Turn off titles, labels and ticks
# want to ensure gridlines work alone
a.axes3D.xAxis.label.visible = 0
a.axes3D.yAxis.label.visible = 0
a.axes3D.zAxis.label.visible = 0
a.axes3D.xAxis.title.visible = 0
a.axes3D.yAxis.title.visible = 0
a.axes3D.zAxis.title.visible = 0
a.axes3D.xAxis.tickMarks.visible = 0
a.axes3D.yAxis.tickMarks.visible = 0
a.axes3D.zAxis.tickMarks.visible = 0
SetAnnotationAttributes(a)
Test("annot3d_05")

# Mix up which ticks, titles, labels, 
# or gridlines are turned on
a.axes3D.xAxis.label.visible = 1
a.axes3D.yAxis.label.visible = 0
a.axes3D.zAxis.label.visible = 0
a.axes3D.xAxis.title.visible = 0
a.axes3D.yAxis.title.visible = 0
a.axes3D.zAxis.title.visible = 1
a.axes3D.xAxis.tickMarks.visible = 0
a.axes3D.yAxis.tickMarks.visible = 1
a.axes3D.zAxis.tickMarks.visible = 0
a.axes3D.xAxis.grid = 0
a.axes3D.yAxis.grid = 0
a.axes3D.zAxis.grid = 1
SetAnnotationAttributes(a)
Test("annot3d_06")

a.axes3D.xAxis.label.visible = 1
a.axes3D.yAxis.label.visible = 1
a.axes3D.zAxis.label.visible = 1
a.axes3D.xAxis.title.visible = 1
a.axes3D.yAxis.title.visible = 1
a.axes3D.zAxis.title.visible = 1
a.axes3D.xAxis.tickMarks.visible = 1
a.axes3D.yAxis.tickMarks.visible = 1
a.axes3D.zAxis.tickMarks.visible = 1
a.axes3D.xAxis.grid = 0
a.axes3D.yAxis.grid = 0
a.axes3D.zAxis.grid = 0

# Change the 3D axis type
a.axes3D.axesType = a.axes3D.StaticEdges
SetAnnotationAttributes(a)
Test("annot3d_07")

# Change the 3D axis type
a.axes3D.axesType = a.axes3D.FurthestTriad
SetAnnotationAttributes(a)
Test("annot3d_08")

# Change the 3D axis type
a.axes3D.axesType = a.axes3D.OutsideEdges
SetAnnotationAttributes(a)
Test("annot3d_09")

# Change the 3D axis type
a.axes3D.axesType = a.axes3D.StaticTriad
SetAnnotationAttributes(a)
Test("annot3d_10")

# Change the triad attribtues manually
a.axes3D.triadSetManually = 1
a.axes3D.triadColor = (66, 244, 215)
a.axes3D.triadLineWidth = 2
a.axes3D.triadFont = 1
a.axes3D.triadBold = 0
a.axes3D.triadItalic = 0
SetAnnotationAttributes(a)
Test("annot3d_11")

Exit()