ArcObjects Library Reference

Draw Globe Layers in Correct Order Snippet

Get and set globe layer drawing order to draw properly.

[C#]

///<summary>Get and set globe layer drawing order to draw properly.</summary>
/// 
///<param name="globe">An IGlobe interface</param>
///  
///<remarks></remarks>
public void DrawGlobeLayersInCorrectOrder(ESRI.ArcGIS.GlobeCore.IGlobe globe)
{
  ESRI.ArcGIS.GlobeCore.IGlobeDisplay globeDisplay = globe.GlobeDisplay;
  ESRI.ArcGIS.GlobeCore.IGlobeDrawingOrder globeDrawingOrder = (ESRI.ArcGIS.GlobeCore.IGlobeDrawingOrder)globe; // Explicit Cast

  // Get the current draw order - this includes draped, floating and elevation
  ESRI.ArcGIS.Carto.IEnumLayer enumLayer = globeDrawingOrder.OrderedLayers;

  // Need to separate BaseLayers from Floating
  // Syntax:
  // IEnumLayer variable = object.get_GlobeLayers(pUID, bRecursive, bInBaseGlobe, bSortedByDrawingPriority)
  ESRI.ArcGIS.Carto.IEnumLayer baseLayers = globe.get_GlobeLayers(null, true, true, true);
  ESRI.ArcGIS.Carto.IEnumLayer floatingLayers = globe.get_GlobeLayers(null, false, false, true);

  // weed out elevation layers from the ordered list...
  // note: elevation layers are always on top of the ordered list
  // The ordered list for baselayers is:
  // (Top down)
  // Elevation0
  // Elevation1
  // Draped0
  // Draped1
  ESRI.ArcGIS.GlobeCore.IGlobeLayerProperties globeLayerProperties; // note: it is not set to anything here but used later in the while loop
  ESRI.ArcGIS.GlobeCore.IGlobeDisplayLayers globeDisplayLayers = (ESRI.ArcGIS.GlobeCore.IGlobeDisplayLayers)globeDisplay; // Explicit cast

  // Create ArrayLists
  System.Collections.ArrayList DrapedLayers = new System.Collections.ArrayList();
  System.Collections.ArrayList ElevationLayers = new System.Collections.ArrayList();

  // Store the separate draw order (elevation and draped) into ArrayLists
  ESRI.ArcGIS.Carto.ILayer layer = baseLayers.Next();
  while (layer != null)
  {
    globeLayerProperties = globeDisplayLayers.FindGlobeProperties(layer); // globeLayerProperties is finally set to something
    if (globeLayerProperties.Type != ESRI.ArcGIS.GlobeCore.esriGlobeDataType.esriGlobeDataElevation)
    {
      DrapedLayers.Add(layer);
    }
    else if (globeLayerProperties.Type == ESRI.ArcGIS.GlobeCore.esriGlobeDataType.esriGlobeDataElevation)
    {
      ElevationLayers.Add(layer);
    }

    //Get the next layer
    layer = baseLayers.Next();
  }

  // To get the layers from the ArrayLists - cast individual elements to ILayer
  // For example getting the first layer in the list:
  ESRI.ArcGIS.Carto.ILayer theDrapedLayer = (ESRI.ArcGIS.Carto.ILayer)DrapedLayers[0]; // Explicit cast

  // Changing the drawing order - use methods available on ESRI.ArcGIS.GlobeCore.IGlobeDrawingOrder
  // for example to move a layer backward
  globeDrawingOrder.MoveBackward(theDrapedLayer);
  globeDisplay.RefreshViewers();

  // Get the floating layers
  ESRI.ArcGIS.Carto.ILayer theFloatingLayer = floatingLayers.Next();
  while (theFloatingLayer != null)
  {
    // code to work with theFloatingLayer
    theFloatingLayer = floatingLayers.Next();
  }
}
[Visual Basic .NET]

'''<summary>Get and set globe layer drawing order to draw properly.</summary>
''' 
'''<param name="globe">An IGlobe interface</param>
'''  
'''<remarks></remarks>
Public Sub DrawGlobeLayersInCorrectOrder(ByVal globe As ESRI.ArcGIS.GlobeCore.IGlobe)

  Dim globeDisplay As ESRI.ArcGIS.GlobeCore.IGlobeDisplay = globe.GlobeDisplay
  Dim globeDrawingOrder As ESRI.ArcGIS.GlobeCore.IGlobeDrawingOrder = CType(globe, ESRI.ArcGIS.GlobeCore.IGlobeDrawingOrder) ' Explicit Cast

  ' Get the current draw order - this includes draped, floating and elevation
  Dim enumLayer As ESRI.ArcGIS.Carto.IEnumLayer = globeDrawingOrder.OrderedLayers

  ' Need to separate BaseLayers from Floating
  ' Syntax:
  ' IEnumLayer variable = object.GlobeLayers(pUID, bRecursive, bInBaseGlobe, bSortedByDrawingPriority)
  Dim baseLayers As ESRI.ArcGIS.Carto.IEnumLayer = globe.GlobeLayers(Nothing, True, True, True)
  Dim floatingLayers As ESRI.ArcGIS.Carto.IEnumLayer = globe.GlobeLayers(Nothing, False, False, True)

  ' weed out elevation layers from the ordered list...
  ' note: elevation layers are always on top of the ordered list
  ' The ordered list for baselayers is:
  ' (Top down)
  ' Elevation0
  ' Elevation1
  ' Draped0
  ' Draped1
  Dim globeLayerProperties As ESRI.ArcGIS.GlobeCore.IGlobeLayerProperties ' note: it is not set to anything here but used later in the while loop
  Dim globeDisplayLayers As ESRI.ArcGIS.GlobeCore.IGlobeDisplayLayers = CType(globeDisplay, ESRI.ArcGIS.GlobeCore.IGlobeDisplayLayers) ' Explicit Cast

  ' Create ArrayLists
  Dim DrapedLayers As System.Collections.ArrayList = New System.Collections.ArrayList
  Dim ElevationLayers As System.Collections.ArrayList = New System.Collections.ArrayList

  ' Store the separate draw order (elevation and draped) into ArrayLists
  Dim layer As ESRI.ArcGIS.Carto.ILayer = baseLayers.Next
  While Not (layer Is Nothing)
   globeLayerProperties = globeDisplayLayers.FindGlobeProperties(layer) 'globeLayerProperties is finally set to something
   If Not (globeLayerProperties.Type = ESRI.ArcGIS.GlobeCore.esriGlobeDataType.esriGlobeDataElevation) Then
    DrapedLayers.Add(layer)
   Else
    If globeLayerProperties.Type = ESRI.ArcGIS.GlobeCore.esriGlobeDataType.esriGlobeDataElevation Then
     ElevationLayers.Add(layer)
    End If
   End If
   layer = baseLayers.Next
  End While

  ' To get the layers from the ArrayLists - cast individual elements to ILayer
  ' For example getting the first layer in the list:
  Dim theDrapedLayer As ESRI.ArcGIS.Carto.ILayer = CType(DrapedLayers(0), ESRI.ArcGIS.Carto.ILayer) ' Explicit Cast

  ' Changing the drawing order - use methods available on ESRI.ArcGIS.GlobeCore.IGlobeDrawingOrder
  ' for example to move a layer backward
  globeDrawingOrder.MoveBackward(theDrapedLayer)
  globeDisplay.RefreshViewers()

  ' Get the floating layers
  Dim theFloatingLayer As ESRI.ArcGIS.Carto.ILayer = floatingLayers.Next
  While Not (theFloatingLayer Is Nothing)
   ' code to work with theFloatingLayer
   theFloatingLayer = floatingLayers.Next
  End While

End Sub


Additional Requirements
  • The code in this document requires the following References added to the Visual Studio project:
  • ESRI.ArcGIS.3DAnalyst
  • ESRI.ArcGIS.Carto
  • ESRI.ArcGIS.GlobeCore
  • ESRI.ArcGIS.System