plots/label.py
# ----------------------------------------------------------------------------
#  MODES: serial
#  CLASSES: nightly
#
#  Test Case:  label.py
#
#  Tests:      Tests the label plot
#
#  Programmer: Brad Whitlock
#  Date:       Fri Oct 22 15:50:06 PST 2004
#
#  Modifications:
#    Brad Whitlock, Wed Oct 27 15:08:27 PST 2004
#    I made the baseline images larger.
#
#    Mark C. Miller, Mon Apr 25 21:35:54 PDT 2005
#    I added tests for different data types
#
#    Kathleen Bonnell, Thu Jul 14 07:53:46 PDT 2005
#    Added TestLabeledVTK, to test reading and use of char data from VTK.
#
#    Brad Whitlock, Thu Aug 4 14:25:22 PST 2005
#    Added tests for labelling subsets and I also removed the single cell/node
#    stuff and replaced it with tests for setting individual cell/node
#    colors and text heights.
#
#    Jeremy Meredith, Wed Sep  7 12:06:04 PDT 2005
#    Allowed spaces in variable names.
#
#    Brad Whitlock, Tue Nov 15 09:56:44 PDT 2005
#    Added another test for sliced vectors.
#
#    Brad Whitlock, Tue Apr 25 15:47:21 PST 2006
#    I added tests for making sure that Label plots of structured meshes
#    actually show their logical index nature by default. The tests also
#    show the Label plot with zooms that used to make the labels be incorrectly
#    offset from the other plots.
#
#    Mark C. Miller, Wed Jan 20 07:37:11 PST 2010
#    Added ability to swtich between Silo's HDF5 and PDB data.
#
#    Cyrus Harrison, Thu Mar 25 09:57:34 PDT 2010
#    Added call(s) to DrawPlots() b/c of changes to the default plot state
#    behavior when an operator is added.
#
#    Alister Maguire, Mon Feb 26 10:22:04 PST 2018
#    Added TestMixedVariables for testing datasets with mixed variables.
#
#    Kathleen Biagas, Mon Nov 28, 2022
#    Replace obsolete Label text attributes with new versions.
#
# ----------------------------------------------------------------------------
RequiredDatabasePlugin(("Boxlib2D", "SAMRAI", "VTK"))


# Create label attributes with somewhat larger text.
def CreateLabelAttributes():
    L = LabelAttributes()
    L.textFont1.scale = 5
    L.textFont2.scale = 5
    return L

def SaveTestImage(name):
    # Save these images somewhat larger than a regular test case image
    # since the images contain a lot of text.
    swa = SaveWindowAttributes()
    swa.width = 500
    swa.height = 500
    swa.screenCapture = 0
    Test(name, swa)

def TestGeneralFeatures():
    TestSection("General label plot features")
    OpenDatabase(silo_data_path("curv2d.silo"))

    AddPlot("Label", "curvmesh2d")
    DrawPlots()
    SaveTestImage("label_0_00")

    # Change the zoom a few times to see the number of labels adaptively change.
    v0 = View2DAttributes()
    v0.windowCoords = (-11.6154, 11.8294, -3.18886, 8.33075)
    v0.viewportCoords = (0.2, 0.95, 0.15, 0.95)
    v0.fullFrameActivationMode = v0.Off
    SetView2D(v0)
    SaveTestImage("label_0_01")

    v1 = View2DAttributes()
    v1.windowCoords = (-1.0815, 1.29556, 1.98696, 3.15493)
    v1.viewportCoords = (0.2, 0.95, 0.15, 0.95)
    v1.fullFrameActivationMode = v1.Off
    SetView2D(v1)
    SaveTestImage("label_0_02")

    v2 = View2DAttributes()
    v2.windowCoords = (1.78125, 3.00819, 0.209532, 0.812385)
    v2.viewportCoords = (0.2, 0.95, 0.15, 0.95)
    v2.fullFrameActivationMode = v2.Off
    AddPlot("Mesh", "curvmesh2d")
    DrawPlots()
    SetActivePlots(0)
    SetView2D(v2)
    SaveTestImage("label_0_03")

    # Turn on nodes
    L = CreateLabelAttributes()
    L.showNodes = 1
    SetPlotOptions(L)
    SaveTestImage("label_0_04")

    # Turn off cells
    L.showCells = 0
    SetPlotOptions(L)
    SaveTestImage("label_0_05")

    # Try showing nodes and cells and alter their respective sizes
    L.showCells = 1
    L.showNodes = 1
    L.textFont1.scale = 6
    L.textFont2.scale = 5
    SetPlotOptions(L)
    SaveTestImage("label_0_06")

    # Change the cell color.
    L.textFont1.color = (0,255,0,255)
    L.textFont1.useForegroundColor = 0
    SetPlotOptions(L)
    SaveTestImage("label_0_07")

    # Change the node color
    L.textFont2.color = (100,10,255,255)
    L.textFont2.useForegroundColor = 0
    SetPlotOptions(L)
    SaveTestImage("label_0_08")
    L.textFont1.color = (0,255,0,255)
    L.textFont2.color = (0,255,0,255)

    # Change the structured indices to regular indices
    L.showCells = 1
    L.labelDisplayFormat = L.Index
    L.textFont1.scale = 5
    SetPlotOptions(L)
    SaveTestImage("label_0_09")

    # Make the text a little bigger
    L.textFont1.scale = 8
    L.textFont2.scale = 8
    L.showCells = 0
    SetPlotOptions(L)
    SaveTestImage("label_0_10")

    # Test different text alignments
    L.textFont1.scale = 6
    L.textFont2.scale = 6
    L.horizontalJustification = L.Left
    SetPlotOptions(L)
    SaveTestImage("label_0_11")
    L.horizontalJustification = L.Right
    SetPlotOptions(L)
    SaveTestImage("label_0_12")
    L.horizontalJustification = L.HCenter
    L.verticalJustification = L.Top
    SetPlotOptions(L)
    SaveTestImage("label_0_13")
    L.verticalJustification = L.Bottom
    SetPlotOptions(L)
    SaveTestImage("label_0_14")

    # Test changing the number of labels.
    L.verticalJustification = L.VCenter
    SetPlotOptions(L)
    ResetView()
    SaveTestImage("label_0_15")
    L.numberOfLabels = 40
    SetPlotOptions(L)
    SaveTestImage("label_0_16")

    # Turn off restricting the number of labels.
    L.restrictNumberOfLabels = 0
    SetPlotOptions(L)
    SaveTestImage("label_0_17")
    DeleteAllPlots()

    # test different data types from the file
    OpenDatabase(silo_data_path("wave0000.silo"))

    AddPlot("Label", "chars")
    DrawPlots()
    v3d=GetView3D()
    v3d.viewNormal=(0, 1, 0)
    v3d.viewUp=(0, 0, -1)
    SetView3D(v3d)
    SaveTestImage("label_0_18")
    DeleteAllPlots()

    AddPlot("Label", "shorts")
    DrawPlots()
    SaveTestImage("label_0_19")
    DeleteAllPlots()

    AddPlot("Label", "ints")
    DrawPlots()
    SaveTestImage("label_0_20")
    ResetView()
    DeleteAllPlots()

def TestCurvilinear2D():
    TestSection("Curvilinear 2D")
    OpenDatabase(silo_data_path("curv2d.silo"))

    AddPlot("Pseudocolor", "u")
    AddPlot("Mesh", "curvmesh2d")
    m = MeshAttributes()
    m.opaqueMode = m.Auto
    SetPlotOptions(m)
    # Do a point variable
    AddPlot("Label", "u")
    DrawPlots()
    ResetView()
    SaveTestImage("label_1_00")

    # Make the labels a little larger and zoom in on the cells
    v0 = View2DAttributes()
    v0.windowCoords = (-0.632297, 0.483674, 3.38963, 4.57713)
    v0.viewportCoords = (0.2, 0.95, 0.15, 0.95)
    v0.fullFrameActivationMode = v0.Off
    SetView2D(v0)
    L = CreateLabelAttributes()
    L.textFont1.scale = 5
    L.textFont2.scale = 5
    SetPlotOptions(L)
    SaveTestImage("label_1_01")

    # Change the a cell centered variable
    ChangeActivePlotsVar("d")
    SaveTestImage("label_1_02")

    # Change to a node centered vector variable
    v0.windowCoords = (-0.662647, 0.179177, 3.52611, 4.4219)
    SetView2D(v0)
    ChangeActivePlotsVar("vel")
    SaveTestImage("label_1_03")

    # Change to a mesh variable
    ChangeActivePlotsVar("curvmesh2d")
    L.showNodes = 1
    SetPlotOptions(L)
    SaveTestImage("label_1_04")

    # Turn off a material
    v0.windowCoords = (-1.73904, -0.385797, 2.20216, 3.64214)
    SetView2D(v0)
    SaveTestImage("label_1_05")
    SetActivePlots((0,1,2))
    TurnMaterialsOff("2")
    SaveTestImage("label_1_06")
    DeleteAllPlots()

def TestRectilinear2D():
    TestSection("Rectilinear 2D")
    OpenDatabase(silo_data_path("rect2d.silo"))

    AddPlot("Pseudocolor", "ascii")
    AddPlot("Mesh", "quadmesh2d")
    m = MeshAttributes()
    m.opaqueMode = m.Auto
    SetPlotOptions(m)
    AddPlot("Label", "ascii")
    DrawPlots()
    ResetView()
    v0 = View2DAttributes()
    v0.windowCoords = (0.425121, 0.574879, 0.566829, 0.766505)
    v0.viewportCoords = (0.2, 0.95, 0.15, 0.95)
    v0.fullFrameActivationMode = v0.Off
    SetView2D(v0)
    L = CreateLabelAttributes()
    L.textFont1.scale = 5
    L.textFont2.scale = 5
    SetPlotOptions(L)
    SaveTestImage("label_2_00")

    # Change to a cell centered float variable.
    ChangeActivePlotsVar("d")
    SaveTestImage("label_2_01")

    # Change to a node centered variable
    ChangeActivePlotsVar("u")
    SaveTestImage("label_2_02")

    # Change to a node centered vector variable
    ChangeActivePlotsVar("vel")
    v1 = View2DAttributes()
    v1.windowCoords = (0.478575, 0.543393, 0.650721, 0.737145)
    SetView2D(v1)
    SaveTestImage("label_2_03")

    # Change to the mesh variable
    SetActivePlots((0,2))
    DeleteActivePlots()
    AddPlot("FilledBoundary", "mat1")
    AddPlot("Label", "quadmesh2d")
    DrawPlots()
    L.showNodes = 1
    L.textFont1.scale = 5
    L.textFont2.scale = 5
    SetPlotOptions(L)
    SaveTestImage("label_2_04")

    # Turn off a material
    SetActivePlots((0,1,2))
    TurnMaterialsOff("16")
    SaveTestImage("label_2_05")
    DeleteAllPlots()


def TestUnstructured2D():
    TestSection("Unstructured 2D")
    OpenDatabase(silo_data_path("ucd2d.silo"))

    AddPlot("Mesh", "ucdmesh2d")
    m = MeshAttributes()
    m.opaqueMode = m.Auto
    SetPlotOptions(m)
    AddPlot("Label", "ucdmesh2d")
    L = CreateLabelAttributes()
    L.showNodes = 1
    L.textFont1.scale = 6
    L.textFont2.scale = 6
    L.textFont1.color = (255,0,0,255)
    L.textFont2.color = (255,0,0,255)
    L.textFont1.useForegroundColor = 0
    L.textFont2.useForegroundColor = 0
    L.restrictNumberOfLabels = 0
    SetPlotOptions(L)
    DrawPlots()
    v0 = View2DAttributes()
    v0.windowCoords = (-0.154956, 4.15496, -0.154956, 4.15496)
    v0.viewportCoords = (0.2, 0.95, 0.15, 0.95)
    v0.fullFrameActivationMode = v0.Off
    SetView2D(v0)
    SaveTestImage("label_3_00")

    # Change to a nodal variable
    ChangeActivePlotsVar("d")
    SaveTestImage("label_3_01")

    # Change to a cell centered variable
    ChangeActivePlotsVar("p")
    SaveTestImage("label_3_02")

    # Change to a mesh variable and remove a material.
    ChangeActivePlotsVar("ucdmesh2d")
    AddPlot("FilledBoundary", "mat1")
    DrawPlots()
    L.textFont1.useForegroundColor = 1
    L.textFont2.useForegroundColor = 1
    SetPlotOptions(L)
    SetActivePlots((0,1,2))
    TurnMaterialsOff("2")
    SaveTestImage("label_3_03")
    DeleteAllPlots()

def TestSlice():
    TestSection("Testing slicing 3D data to 2D")
    OpenDatabase(silo_data_path("noise.silo"))

    AddPlot("Mesh", "Mesh")
    m = MeshAttributes()
    m.opaqueMode = m.Auto
    SetPlotOptions(m)
    AddPlot("Pseudocolor", "chromeVf")
    AddPlot("Label", "chromeVf")
    SetActivePlots((0,1,2))
    # Add a slice operator to all of the plots
    AddOperator("Slice")
    s = SliceAttributes()
    s.normal = (0,0,1)
    s.upAxis = (0,1,0)
    s.project2d = 0
    SetOperatorOptions(s)
    # Make the labels a little bigger
    L = CreateLabelAttributes()
    L.textFont1.scale = 7
    L.textFont2.scale = 7
    L.depthTestMode = L.LABEL_DT_NEVER
    SetPlotOptions(L)
    DrawPlots()

    # Look at the slice from the front
    v0 = View3DAttributes()
    v0.viewNormal = (-0.550782, 0.318825, 0.771355)
    v0.focus = (0, 0, 0)
    v0.viewUp = (0.200365, 0.94765, -0.248624)
    v0.viewAngle = 30
    v0.parallelScale = 17.3205
    v0.nearPlane = -34.641
    v0.farPlane = 34.641
    v0.imagePan = (0, 0)
    v0.imageZoom = 1.82449
    v0.perspective = 0
    v0.eyeAngle = 2
    v0.centerOfRotationSet = 0
    v0.centerOfRotation = (0, 0, 0)
    SetView3D(v0)
    SaveTestImage("label_4_00")

    # Look at the slice from the back. It will only be visible if the
    # quantized normals were thrown out.
    v1 = View3DAttributes()
    v1.viewNormal = (-0.681715, 0.349442, -0.642771)
    v1.focus = (0, 0, 0)
    v1.viewUp = (0.26946, 0.936726, 0.223465)
    v1.viewAngle = 30
    v1.parallelScale = 17.3205
    v1.nearPlane = -34.641
    v1.farPlane = 34.641
    v1.imagePan = (0, 0)
    v1.imageZoom = 1.82449
    v1.perspective = 0
    v1.eyeAngle = 2
    v1.centerOfRotationSet = 0
    v1.centerOfRotation = (0, 0, 0)
    SetView3D(v1)
    SaveTestImage("label_4_01")

    # Project the slice to 2D
    s.project2d = 1
    SetOperatorOptions(s)
    v2 = View2DAttributes()
    v2.windowCoords = (-8.64231, -5.11567, 2.53613, 6.24948)
    SetView2D(v2)
    SaveTestImage("label_4_02")

    # Set the slice normal so it does not line up with an axis.
    s.normal = (1,2,3)
    SetOperatorOptions(s)
    SaveTestImage("label_4_03")
    DeleteAllPlots()

def TestLabeledVTK():
    TestSection("VTK with labels")
    OpenDatabase(data_path("vtk_test_data/labeledBox.vtk"))

    AddPlot("Mesh", "mesh")
    AddPlot("Label", "cellLabel")
    AddPlot("Label", "nodeLabels")
    DrawPlots()
    SetActivePlots((1, 2))
    l = LabelAttributes()
    l.textFont1.scale = 8
    l.textFont2.scale = 8
    l.depthTestMode = l.LABEL_DT_NEVER
    SetPlotOptions(l)

    v = GetView3D()
    v.viewNormal = (-0.826308, 0.365749, 0.428303)
    v.focus = (0, 0, 0)
    v.viewUp = (0.262408, 0.92288, -0.28184)
    v.parallelScale = 1.55885
    v.nearPlane = -3.11769
    v.farPlane  =  3.11769
    v.imageZoom = 0.941919
    SetView3D(v)

    SaveTestImage("label_5_01")
    DeleteAllPlots()

def TestLabellingSubsets():
    TestSection("Labelling subsets")
    OpenDatabase(silo_data_path("bigsil.silo"))

    AddPlot("Mesh", "mesh")
    AddPlot("Subset", "blocks")
    AddPlot("Label", "blocks")
    l = LabelAttributes()
    l.restrictNumberOfLabels = 0
    l.textFont1.scale = 5
    l.depthTestMode = l.LABEL_DT_NEVER
    SetPlotOptions(l)
    SetActivePlots((0,1,2))
    TurnDomainsOff()
    TurnDomainsOn(("domain1","domain10","domain19"))
    DrawPlots()

    v = View3DAttributes()
    v.viewNormal = (0.465057, -0.448026, -0.763541)
    v.focus = (0.166667, 0.166667, 0.5)
    v.viewUp = (-0.243345, -0.893956, 0.376333)
    v.viewAngle = 30
    v.parallelScale = 0.552771
    v.nearPlane = -1.10554
    v.farPlane = 1.10554
    v.imagePan = (0.0545619, 0.050939)
    v.imageZoom = 1.32578
    v.perspective = 1
    v.eyeAngle = 2
    v.centerOfRotationSet = 0
    v.centerOfRotation = (0.166667, 0.166667, 0.5)
    SetView3D(v)
    SaveTestImage("label_6_00")

    SetActivePlots((1,2))
    ChangeActivePlotsVar("domains")
    SaveTestImage("label_6_01")

    SetActivePlots(1)
    DeleteActivePlots()
    AddPlot("FilledBoundary", "mat")
    SetActivePlots(1)
    DrawPlots()
    ChangeActivePlotsVar("mat")
    SaveTestImage("label_6_02")

    # Try an AMR dataset
    DeleteAllPlots()
    OpenDatabase(data_path("boxlib_test_data/2D/plt0822/Header"))

    AddPlot("Mesh", "Mesh")
    AddPlot("Subset", "patches")
    s = SubsetAttributes()
    s.legendFlag = 0
    SetPlotOptions(s)
    AddPlot("Label", "patches")
    l = LabelAttributes()
    l.restrictNumberOfLabels = 0
    l.textFont1.scale = 4.7
    SetPlotOptions(l)
    DrawPlots()
    v = View2DAttributes()
    v.windowCoords = (0.0126663, 0.0146908, 0.115281, 0.117298)
    v.viewportCoords = (0.2, 0.95, 0.15, 0.95)
    v.fullFrameActivationMode = v.Off  # On, Off, Auto
    v.fullFrameAutoThreshold = 100
    SetView2D(v)
    SaveTestImage("label_6_03")

    SetActivePlots((1,2))
    ChangeActivePlotsVar("levels")
    v = View2DAttributes()
    v.windowCoords = (0.0250949, 0.0437515, 0.11359, 0.132218)
    v.viewportCoords = (0.2, 0.95, 0.15, 0.95)
    v.fullFrameActivationMode = v.Off  # On, Off, Auto
    v.fullFrameAutoThreshold = 100
    SetView2D(v)
    SetActivePlots(2)
    l.textFont1.scale = 4
    SetPlotOptions(l)
    SaveTestImage("label_6_04")
    DeleteAllPlots()

    # Try a dataset with real material names.
    OpenDatabase(silo_data_path("noise.silo"))

    AddPlot("Mesh", "Mesh")
    AddPlot("FilledBoundary", "mat1")
    AddPlot("Label", "mat1")
    l = LabelAttributes()
    l.textFont1.scale = 5
    SetPlotOptions(l)
    SetActivePlots((0,1,2))
    AddOperator("Slice")
    DrawPlots()
    v = View2DAttributes()
    v.windowCoords = (-9.37363, -6.58974, -2.85531, -0.327839)
    v.viewportCoords = (0.2, 0.95, 0.15, 0.95)
    v.fullFrameActivationMode = v.Off  # On, Off, Auto
    v.fullFrameAutoThreshold = 100
    SetView2D(v)
    SaveTestImage("label_6_05")
    DeleteAllPlots()


def TestLabellingTensors():
    TestSection("Labelling tensors")
    OpenDatabase(silo_data_path("noise.silo"))

    AddPlot("Mesh", "Mesh")
    AddPlot("Tensor", "grad_tensor")
    t = TensorAttributes()
    t.useStride = 1
    SetPlotOptions(t)
    AddPlot("Label", "grad_tensor")
    SetActivePlots((0,1,2))
    AddOperator("Slice")
    DrawPlots()
    ResetView()
    SaveTestImage("label_7_00")

    v = View2DAttributes()
    v.windowCoords = (-9.13799, -4.37695, -7.71782, -2.97379)
    v.viewportCoords = (0.2, 0.95, 0.15, 0.95)
    v.fullFrameActivationMode = v.Off  # On, Off, Auto
    v.fullFrameAutoThreshold = 100
    SetView2D(v)
    SaveTestImage("label_7_01")

    v.windowCoords = (-8.50106, -7.83502, -6.43747, -5.77381)
    v.viewportCoords = (0.2, 0.95, 0.15, 0.95)
    v.fullFrameActivationMode = v.Off  # On, Off, Auto
    v.fullFrameAutoThreshold = 100
    SetView2D(v)
    SaveTestImage("label_7_02")

    # Now see how changing the text height affects binning
    ResetView()
    l = LabelAttributes()
    l.textFont1.scale = 3
    SetActivePlots(2)
    SetPlotOptions(l)
    SaveTestImage("label_7_03")

    l.textFont1.scale = 6
    SetPlotOptions(l)
    SaveTestImage("label_7_04")

    SetView2D(v)
    SaveTestImage("label_7_05")

    DeleteAllPlots()

def TestLabelling3D():
    TestSection("Labelling in 3D with Z buffer")
    OpenDatabase(silo_data_path("noise.silo"))

    AddPlot("Pseudocolor", "airVf")
    AddPlot("Label", "airVf")
    L = LabelAttributes()
    L.restrictNumberOfLabels = 0
    L.depthTestMode = L.LABEL_DT_NEVER
    SetPlotOptions(L)
    DrawPlots()
    ResetView()
    SaveTestImage("label_8_00")

    # Turn on depth testing
    L.depthTestMode = L.LABEL_DT_AUTO
    SetPlotOptions(L)
    SaveTestImage("label_8_01")

    # Apply an Isosurface operator to make things really convoluted
    SetActivePlots((0,1))
    AddOperator("Isosurface")
    iso = IsosurfaceAttributes()
    iso.contourNLevels = 1
    iso.variable="hardyglobal"
    SetOperatorOptions(iso)
    v = View3DAttributes()
    v.viewNormal = (0.883239, -0.244693, -0.400019)
    v.focus = (0, 0, 0)
    v.viewUp = (0.435303, 0.745036, 0.505404)
    v.viewAngle = 30
    v.parallelScale = 17.3205
    v.nearPlane = -34.641
    v.farPlane = 34.641
    v.imagePan = (0.022398, -0.134568)
    v.imageZoom = 3.35882
    v.perspective = 1
    v.eyeAngle = 2
    v.centerOfRotationSet = 0
    v.centerOfRotation = (0, 0, 0)
    SetView3D(v)
    DrawPlots()
    SaveTestImage("label_8_02")

    #
    # Try labelling a mesh that has interior stuff
    #
    DeleteAllPlots()
    OpenDatabase(silo_data_path("globe.silo"))

    AddPlot("Pseudocolor", "speed")
    AddPlot("Mesh", "mesh1")
    AddPlot("Label", "mesh1")
    L = CreateLabelAttributes()
    L.restrictNumberOfLabels = 0
    L.drawLabelsFacing = L.FrontAndBack
    L.depthTestMode = L.LABEL_DT_AUTO
    SetPlotOptions(L)
    DrawPlots()
    ResetView()
    v.viewNormal = (-0.735192, 0.371514, 0.566984)
    v.focus = (0, 0, 0)
    v.viewUp = (0.2695, 0.927683, -0.258407)
    v.viewAngle = 30
    v.parallelScale = 17.3205
    v.nearPlane = -34.641
    v.farPlane = 34.641
    v.imagePan = (0, 0)
    v.imageZoom = 1.60959
    v.perspective = 1
    v.eyeAngle = 2
    v.centerOfRotationSet = 0
    v.centerOfRotation = (0, 0, 0)
    SetView3D(v)
    SaveTestImage("label_8_03")

    v1 = View3DAttributes()
    v1.viewNormal = (0, 0, 1)
    v1.focus = (0, 0, 0)
    v1.viewUp = (0, 1, 0)
    v1.viewAngle = 30
    v1.parallelScale = 17.3205
    v1.nearPlane = -34.641
    v1.farPlane = 34.641
    v1.imagePan = (0, 0)
    v1.imageZoom = 5.06081
    v1.perspective = 1
    v1.eyeAngle = 2
    v1.centerOfRotationSet = 0
    v1.centerOfRotation = (0, 0, 0)
    SetView3D(v1)
    SaveTestImage("label_8_04")

    # Turn on node labels
    L.showNodes = 1
    SetPlotOptions(L)
    SaveTestImage("label_8_05")

    # Label a variable that would normally have labels that protrude into
    # the dataset
    ChangeActivePlotsVar("speed")
    ResetView()
    SaveTestImage("label_8_06")

    SetView3D(v)
    SaveTestImage("label_8_07")
    DeleteAllPlots()

    #
    # Try labelling a 3D AMR dataset
    #
    OpenDatabase(data_path("samrai_test_data/sil_changes/dumps.visit"))

    AddPlot("Pseudocolor", "Primitive Var _number_0")
    AddPlot("Mesh", "amr_mesh")
    AddPlot("Label", "levels")
    L = CreateLabelAttributes()
    L.showNodes = 1
    L.showCells = 0
    L.restrictNumberOfLabels = 0
    L.depthTestMode = L.LABEL_DT_NEVER
    SetPlotOptions(L)
    DrawPlots()
    v2 = View3DAttributes()
    v2.viewNormal = (-0.643521, -0.624962, -0.441931)
    v2.focus = (15, 10, 10)
    v2.viewUp = (0.320552, 0.304253, -0.897038)
    v2.viewAngle = 30
    v2.parallelScale = 20.6155
    v2.nearPlane = -41.2311
    v2.farPlane = 41.2311
    v2.imagePan = (-0.0412674, 0.141248)
    v2.imageZoom = 1.871
    v2.perspective = 1
    v2.eyeAngle = 2
    v2.centerOfRotationSet = 0
    v2.centerOfRotation = (15, 10, 10)
    SetView3D(v2)
    SaveTestImage("label_8_08")

    # Turn on zbuffering
    L.depthTestMode = L.LABEL_DT_AUTO
    SetPlotOptions(L)
    SaveTestImage("label_8_09")

    # Restrict the number of labels
    L.restrictNumberOfLabels = 1
    L.numberOfLabels = 900
    L.depthTestMode = L.LABEL_DT_NEVER
    SetPlotOptions(L)
    SaveTestImage("label_8_10")

    # Turn on zbuffering
    L.depthTestMode = L.LABEL_DT_AUTO
    SetPlotOptions(L)
    SaveTestImage("label_8_11")
    DeleteAllPlots()

def TestSlicedVectors():
    TestSection("Labelling sliced vectors")
    OpenDatabase(silo_data_path("noise.silo"))

    AddPlot("Mesh", "Mesh")
    AddPlot("Label", "grad")
    L = CreateLabelAttributes()
    L.depthTestMode = L.LABEL_DT_NEVER
    SetPlotOptions(L)
    SetActivePlots((0,1))
    AddOperator("Slice")
    DrawPlots()

    v = View2DAttributes()
    v.windowCoords = (-0.370383, 0.566874, -0.275836, 0.66177)
    v.viewportCoords = (0.2, 0.95, 0.15, 0.95)
    v.fullFrameActivationMode = v.Off  # On, Off, Auto
    v.fullFrameAutoThreshold = 100
    SetView2D(v)
    SaveTestImage("label_9_00")

    AddPlot("Vector", "grad")
    vec = VectorAttributes()
    vec.useStride = 1
    vec.scale = 0.5
    SetPlotOptions(vec)
    AddOperator("Slice")
    SetActivePlots((0,1,2))
    s = SliceAttributes()
    s.project2d = 0
    SetOperatorOptions(s)
    DrawPlots()
    v = View3DAttributes()
    v.viewNormal = (-0.332304, 0.933436, 0.135169)
    v.focus = (0, 0, 0)
    v.viewUp = (-0.353747, 0.00950422, -0.935293)
    v.viewAngle = 30
    v.parallelScale = 14.1421
    v.nearPlane = -28.2843
    v.farPlane = 28.2843
    v.imagePan = (0, 0)
    v.imageZoom = 17.3567
    v.perspective = 1
    v.eyeAngle = 2
    v.centerOfRotationSet = 0
    v.centerOfRotation = (0, 0, 0)
    SetView3D(v)
    SaveTestImage("label_9_01")

    # Test a case where having the vector be an expression was causing
    # VisIt to mess up.
    DeleteAllPlots()
    OpenDatabase(silo_data_path("rect3d.silo"))

    AddPlot("Mesh", "quadmesh3d")
    AddPlot("Label", "vel")
    L = LabelAttributes()
    L.textFont1.scale = 6
    L.textFont1.color = (255,0,0,255)
    L.textFont1.useForegroundColor = 0
    SetPlotOptions(L)
    SetActivePlots((0,1))
    AddOperator("Slice")
    s = SliceAttributes()
    s.originType = s.Intercept
    s.originIntercept = 0
    s.axisType = s.YAxis
    s.project2d = 1
    SetOperatorOptions(s)
    DrawPlots()
    v = View2DAttributes()
    v.windowCoords = (0.0476715, 0.155784, 0.874164, 0.991825)
    v.viewportCoords = (0.2, 0.95, 0.15, 0.95)
    v.fullFrameActivationMode = v.Off  # On, Off, Auto
    v.fullFrameAutoThreshold = 100
    SetView2D(v)
    SaveTestImage("label_9_02")

def TestRectilinearLogicalDisplay():
    TestSection("Test 3D zooming and logical mesh display")
    DeleteAllPlots()

    OpenDatabase(silo_data_path("noise.silo"))

    AddPlot("Pseudocolor", "hardyglobal")
    AddPlot("Mesh", "Mesh")
    AddPlot("Label", "Mesh")
    L = CreateLabelAttributes()
    SetPlotOptions(L)
    DrawPlots()

    # Also zoom in using some views obtained from rubber-band style
    # views that would have made the labels migrate from their
    # correct locations in older versions of VisIt.
    v = View3DAttributes()
    v.viewNormal = (-0.566084, -0.288713, 0.772135)
    v.focus = (0, 0, 0)
    v.viewUp = (-0.357175, 0.930078, 0.0859103)
    v.viewAngle = 30
    v.parallelScale = 17.3205
    v.nearPlane = -34.641
    v.farPlane = 34.641
    v.imagePan = (0.104981, 0.174394)
    v.imageZoom = 12.8916
    v.perspective = 1
    v.eyeAngle = 2
    v.centerOfRotationSet = 0
    v.centerOfRotation = (0, 0, 0)
    SetView3D(v)
    SaveTestImage("label_10_00")

    # Make it be displayed using index style numbers.
    L.labelDisplayFormat = L.Index
    SetPlotOptions(L)
    SaveTestImage("label_10_01")

    # Make sure the labels are in the right place when we tell VisIt
    # to draw them all instead of binning.
    L.restrictNumberOfLabels = 0
    SetPlotOptions(L)
    SaveTestImage("label_10_02")

    # Try a nodal variable.
    ChangeActivePlotsVar("hardyglobal")
    SaveTestImage("label_10_03")

    # Try a 2D rectilinear mesh
    DeleteAllPlots()
    AddPlot("Pseudocolor", "hgslice")
    AddPlot("Mesh", "Mesh2D")
    AddPlot("Label", "Mesh2D")
    L = CreateLabelAttributes()
    SetPlotOptions(L)
    DrawPlots()

    v1 = GetView2D()
    v1.windowCoords = (-7.52178, -5.09684, -8.8535, -6.43779)
    v1.viewportCoords = (0.2, 0.95, 0.15, 0.95)
    SetView2D(v1)
    SaveTestImage("label_10_04")

    # Try a 3D curvilinear mesh
    DeleteAllPlots()
    OpenDatabase(silo_data_path("curv3d.silo"))

    AddPlot("Mesh", "curvmesh3d")
    m = MeshAttributes()
    m.opaqueMode = m.On
    SetPlotOptions(m)
    AddPlot("Label", "curvmesh3d")
    L = CreateLabelAttributes()
    SetPlotOptions(L)
    DrawPlots()
    v2 = GetView3D()
    v2.viewNormal = (0.405434, 0.494827, 0.768615)
    v2.focus = (0, 2.5, 15)
    v2.viewUp = (-0.296176, 0.866572, -0.401662)
    v2.viewAngle = 30
    v2.parallelScale = 16.0078
    v2.nearPlane = -32.0156
    v2.farPlane = 32.0156
    v2.imagePan = (0.129303, 0.36944)
    v2.imageZoom = 43.2454
    v2.perspective = 1
    v2.eyeAngle = 2
    v2.centerOfRotationSet = 0
    v2.centerOfRotation = (0, 2.5, 15)
    SetView3D(v2)
    SaveTestImage("label_10_05")

    ChangeActivePlotsVar("u")
    SaveTestImage("label_10_06")
    DeleteAllPlots()

def TestMixedVariables():
    TestSection("Test datasets with mixed variables")
    DeleteAllPlots()

    ma = GetMaterialAttributes()
    ma.forceMIR = 1
    SetMaterialAttributes(ma)

    OpenDatabase(silo_data_path("specmix_ucd.silo"))

    AddPlot("Pseudocolor", "d")
    AddPlot("Mesh", "Mesh")
    AddPlot("Label", "d")
    L = CreateLabelAttributes()
    SetPlotOptions(L)
    DrawPlots()

    View2DAtts = View2DAttributes()
    View2DAtts.windowCoords = (-10.9988, -8.83259, 1.01139, 3.18029)
    View2DAtts.viewportCoords = (0.2, 0.95, 0.15, 0.95)
    SetView2D(View2DAtts)

    SaveTestImage("label_11_00")

    View2DAtts = View2DAttributes()
    View2DAtts.windowCoords = (0.474811, 3.09596, 1.20289, 3.82726)
    View2DAtts.viewportCoords = (0.2, 0.95, 0.15, 0.95)
    SetView2D(View2DAtts)

    SaveTestImage("label_11_01")

    DeleteAllPlots()

def main():
    TestGeneralFeatures()
    TestCurvilinear2D()
    TestRectilinear2D()
    TestUnstructured2D()
    TestSlice()
    TestLabeledVTK()
    TestLabellingSubsets()
    TestLabellingTensors()
    TestLabelling3D()
    TestSlicedVectors()
    TestRectilinearLogicalDisplay()
    TestMixedVariables()

# Run all of the tests
main()

# Exit the test
Exit()