This document is archived and information here might be outdated.  Recommended version.


Draw Globe Layers in Correct Order Snippet (ArcObjects .NET 10.4 SDK)
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