4 votos

Mostrar el progreso i de ArcGIS Engine 10 aplicación

Me gustaría añadir un indicador de progreso para nuestro ArcGIS Engine aplicación. Como una barra de progreso en la barra de estado para mostrar cuando el MapControl está ocupada recibiendo o el dibujo del mapa. He estado tratando de encontrar recursos en la documentación sobre cómo hacer esto, pero todos los recursos que me parece es que apunta a la MxStatusBar que es sólo en el ArcGIS Desktop. ¿Alguien sabe que eventos que se debe utilizar para crear mi propio indicador de progreso?

Actualización: Es independiente de ArcGIS Engine Aplicación. Construido en VB.Net el uso de formularios windows forms. Hemos creado la gráfica de la animación para nuestro indicador de ocupado. Así que podemos iniciar y detener la animación cuando no hay progreso. Este fue creado utilizando un cuadro de diálogo que se ejecuta en su propio hilo porque el MapControl bloque el nuevo trazado de la forma durante el sorteo de la fase. Hemos probado a conectar el indicador de ocupado a AxMapControl1_OnBeforeScreenDraw y AxMapControl1_OnAfterScreenDraw eventos. Pero estos eventos son lanzados incluso cuando el mapa se actualiza,para.ex. cuando un cuadro de diálogo que se arrastra sobre el mapa.

También hemos tratado de forma manual mediante la IMapControlEvents2 y da el mismo resultado.

Hemos intentado agregar el IDisplayEvent pero sólo activar en el arranque, no cuando nos panorámica y zoom en el mapa. Aquí está el código que he utilizado para la prueba de los hechos:

'Declarations:

 Private m_ActiveViewEventsAfterDraw As ESRI.ArcGIS.Carto.IActiveViewEvents_AfterDrawEventHandler
    Private m_DisplayEventsDisplayStarted As ESRI.ArcGIS.Display.IDisplayEvents_DisplayStartedEventHandler
    Private m_DisplayEventsDisplayFinished As ESRI.ArcGIS.Display.IDisplayEvents_DisplayFinishedEventHandler
    Private m_MapControlEventsOnAfterScreenDraw As ESRI.ArcGIS.Controls.IMapControlEvents2_OnAfterScreenDrawEventHandler
    Private m_MapControlEventsOnBeforeScreenDraw As ESRI.ArcGIS.Controls.IMapControlEvents2_OnBeforeScreenDrawEventHandler

'Form_Load

Dim mapControl As IMapControl4 = DirectCast(axMapControl1.Object, IMapControl4)
        Dim map As IMap = DirectCast(axMapControl1.ActiveView, IMap)
        m_ActiveViewEventsAfterDraw = New ESRI.ArcGIS.Carto.IActiveViewEvents_AfterDrawEventHandler(AddressOf OnActiveViewEventsAfterDraw)
        AddHandler CType(map, ESRI.ArcGIS.Carto.IActiveViewEvents_Event).AfterDraw, m_ActiveViewEventsAfterDraw
m_DisplayEventsDisplayStarted = New ESRI.ArcGIS.Display.IDisplayEvents_DisplayStartedEventHandler(AddressOf OnDisplayStarted)
        AddHandler CType(axMapControl1.ActiveView.ScreenDisplay, ESRI.ArcGIS.Display.IDisplayEvents_Event).DisplayStarted, m_DisplayEventsDisplayStarted

        m_DisplayEventsDisplayFinished = New ESRI.ArcGIS.Display.IDisplayEvents_DisplayFinishedEventHandler(AddressOf OnDisplayFinished)
        AddHandler CType(axMapControl1.ActiveView.ScreenDisplay, ESRI.ArcGIS.Display.IDisplayEvents_Event).DisplayFinished, m_DisplayEventsDisplayFinished
        m_MapControlEventsOnAfterScreenDraw = New ESRI.ArcGIS.Controls.IMapControlEvents2_OnAfterScreenDrawEventHandler(AddressOf OnAfterScreenDraw)
        AddHandler CType(axMapControl1.Object, ESRI.ArcGIS.Controls.IMapControlEvents2_Event).OnAfterScreenDraw, m_MapControlEventsOnAfterScreenDraw
        m_MapControlEventsOnBeforeScreenDraw = New ESRI.ArcGIS.Controls.IMapControlEvents2_OnBeforeScreenDrawEventHandler(AddressOf OnBeforeScreenDraw)
        AddHandler CType(axMapControl1.Object, ESRI.ArcGIS.Controls.IMapControlEvents2_Event).OnBeforeScreenDraw, m_MapControlEventsOnBeforeScreenDraw


'Methods


Private Sub OnAfterScreenDraw(ByVal hDc As Integer)

   Console.WriteLine("OnAfterScreenDraw")
End Sub


    Private Sub OnBeforeScreenDraw(ByVal hDc As Integer)
        Console.WriteLine("OnBeforeScreenDraw")
    End Sub

    Private Sub OnActiveViewEventsAfterDraw(ByVal Display As ESRI.ArcGIS.Display.IDisplay, ByVal phase As ESRI.ArcGIS.Carto.esriViewDrawPhase)
        Console.WriteLine("AfterDraw")
    End Sub

Private IntDisplayStarted As Integer
    Private Sub OnDisplayStarted(ByVal Display As IDisplay)
        IntDisplayStarted = IntDisplayStarted + 1
        Console.WriteLine("OnDisplayStarted " & IntDisplayStarted)
    End Sub

    Private IntDisplayFinished As Integer
    Private Sub OnDisplayFinished(ByVal Display As IDisplay)
        IntDisplayFinished = IntDisplayFinished + 1
        Console.WriteLine("OnDisplayFinished " & IntDisplayFinished)
    End Sub

También han intentado utilizar la ILayerStatus por la aplicación de la IStepProgressor de devolución de llamada en el MapServerLayer, pero también fue una decepción, es activa después de que la imagen ha sido traída desde el servidor.

¿Alguien sabe si hay un evento que podemos utilizar que sólo consigue que se desencadena cuando el Mapa es la obtención de datos, su origen de datos?

2voto

saint_groceon Puntos 2696

El siguiente código funciona para mí. Si se carga un nuevo mapa, tendrás que volver a conectar sus eventos. Tal vez intente empezar a animar cuando IDisplayEvents.Inicio de incendios (y IViewRefresh.El dibujo es la verdad). A continuación, detenga la animación de cuando IActiveViewEvents.AfterDraw incendios con drawPhase == esriViewDrawPhase.esriViewForeground.

private IDisplayEvents_Event m_dispevt;
private IActiveViewEvents_Event m_avEvt;
private int m_lastTick;
private void WireEvents(IMap map)
{
    Debug.Print("wiring");
    m_dispevt = ((IActiveView)map).ScreenDisplay as IDisplayEvents_Event;
    m_dispevt.DisplayStarted += new IDisplayEvents_DisplayStartedEventHandler(MainForm_DisplayStarted);
    m_dispevt.DisplayFinished += new IDisplayEvents_DisplayFinishedEventHandler(MainForm_DisplayFinished);
    m_dispevt.DisplayInvalidated += new IDisplayEvents_DisplayInvalidatedEventHandler(MainForm_DisplayInvalidated);
    m_dispevt.DisplayScrolled += new IDisplayEvents_DisplayScrolledEventHandler(MainForm_DisplayScrolled);
    m_avEvt = (IActiveViewEvents_Event)map;
    m_avEvt.AfterDraw += new IActiveViewEvents_AfterDrawEventHandler(m_avEvt_AfterDraw);
    m_avEvt.AfterItemDraw += new IActiveViewEvents_AfterItemDrawEventHandler(m_avEvt_AfterItemDraw);
}

void m_avEvt_AfterItemDraw(short Index, IDisplay Display, esriDrawPhase phase)
{
    Debug.Print("afteritemdraw {0} {1}", Index, phase);
}

void m_avEvt_AfterDraw(IDisplay Display, esriViewDrawPhase phase)
{
    if(phase == esriViewDrawPhase.esriViewForeground)
        Debug.Print("foreground finished afterdraw {0} {1} msecs", phase, Environment.TickCount - m_lastTick);
    if (phase == esriViewDrawPhase.esriViewBackground)
        m_lastTick = Environment.TickCount;
}

void MainForm_DisplayScrolled(IDisplay Display, int deltaX, int deltaY)
{
    Debug.Print("scrolled");
}

void MainForm_DisplayInvalidated(IDisplay Display, ESRI.ArcGIS.Geometry.IEnvelope rect, bool erase, short cacheID)
{
    Debug.Print("invalidated");
}

void MainForm_DisplayFinished(IDisplay Display)
{
    Debug.Print("finished");
}

void MainForm_DisplayStarted(IDisplay Display)
{
    Debug.Print("started {0}", ((IViewRefresh)axMapControl1.Map).Drawing);
}

1voto

Ian Robinson Puntos 8666

Si su ArcEngine código se ejecuta dentro de una aplicación de ArcGIS Desktop, entonces el MxStatusBar (o IStatusBar interfaz) parece apropiada. En ese caso, consulte a IStatusBar.ProgressBar. (ArcEngine también ofrece cuadros de diálogo de progreso — IProgressDialog2 — pero eso es un completo cuadro de diálogo de la ventana y, al parecer, no lo que usted está después.)

Si el código se ejecuta fuera de cualquier aplicación ArcGIS, es decir. tiene su propia interfaz gráfica de usuario, lo más probable es que tenga que comprobar la funcionalidad correspondiente con su plataforma, interfaz gráfica de usuario (framework de Formularios Windows forms o WPF .NET; MFC, wxWidgets para C++, Swing / AWT / lo que sea para Java, etc.).

Los Formularios Windows forms GUIs, echa un vistazo a la System.Windows.Forms.StatusBar de la clase.

1voto

Isaac Solomon Puntos 16554

Terminó con este código:

 'The event handler
    Private m_ActiveViewEventsAfterDraw As ESRI.ArcGIS.Carto.IActiveViewEvents_AfterDrawEventHandler

    'Is needed to stop "COM object that has been separated from its underlying RCW cannot be used" from occuring
    Private m_ActiveViewEvents As ESRI.ArcGIS.Carto.IActiveViewEvents_Event

    Private m_lastTick As Integer
    Private Sub OnActiveViewEventsAfterDraw(ByVal Display As ESRI.ArcGIS.Display.IDisplay, ByVal phase As ESRI.ArcGIS.Carto.esriViewDrawPhase)

        'Occurs after the layer is drawn
        If phase = esriViewDrawPhase.esriViewGeography Then
            Console.WriteLine("geography finished afterdraw {0} {1} msecs", phase, Environment.TickCount - m_lastTick)
        End If

        'Occurs before the layer is requested
        If phase = esriViewDrawPhase.esriViewBackground Then
            m_lastTick = Environment.TickCount
            Console.WriteLine("background finished")
        End If
    End Sub

    'wire the event handler
    Private Sub WireEventHandler()

        m_ActiveViewEvents = CType(CType(axMapControl1.Object, IMapControl2).ActiveView.FocusMap, ESRI.ArcGIS.Carto.IActiveViewEvents_Event)
        m_ActiveViewEventsAfterDraw = New ESRI.ArcGIS.Carto.IActiveViewEvents_AfterDrawEventHandler(AddressOf OnActiveViewEventsAfterDraw)
        AddHandler m_ActiveViewEvents.AfterDraw, m_ActiveViewEventsAfterDraw

    End Sub

Para iniciar el indicador de progreso en esriViewDrawPhase.esriViewBackground y parada en la esriViewDrawPhase.esriViewGeography parece hacer el truco. De referencia para el Sorteo del orden y un COM problema tengo cuando las pruebas de los controladores de eventos "objeto COM que se ha separado de su RCW subyacente no se puede utilizar"

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X