4 votos

¿Flash más de una característica en ArcMap usando ArcObjects y C#?

¿Cómo se pueden mostrar muchas características al mismo tiempo en ArcMap utilizando la codificación C#?

Actualmente llamo a esta función en un bucle,

private void FlashFeature(IActiveView _activeView, IFeature _feature)
{
    IActiveView activeView = _activeView;
    IFeatureIdentifyObj featIdentify = new FeatureIdentifyObject();
    featIdentify.Feature = _feature;
    IIdentifyObj identify = featIdentify as IIdentifyObj;
    identify.Flash(activeView.ScreenDisplay);
}

pero desgraciadamente parpadea una característica a la vez, y mientras el parpadeo está ocurriendo mantiene el proceso. Como resultado de esto, parpadea alrededor de 2 características en un segundo, en lugar de todos a la vez. También quiero flash thous características sin cambiar mi selección de características actual en el mapa, si posable. La herramienta por defecto ArcMap Buscar (forma o lo que sea) puede hacerlo, y estoy tratando de encontrar una manera de implementar que en mi herramienta.

0 votos

Quité mi respuesta tantas estupideces en esa clase que decidí dejarla. Uno de los problemas que tenía era que, cuando parpadeaba geometrías coincidentes, sus símbolos se anulaban entre sí (debido a la operación de rasterización esriROPNotXOrPen). Así que parecía que no hacía nada ( me tuvo perplejo un buen rato ). Además, he encontrado esto: help.arcgis.com/es/sdk/10.0/arcobjects_net/componenthelp/ que creo que usé cuando construí mi clase. Podría ser mejor empezar con él y ajustarlo para manejar múltiples geoms.

5voto

auramo Puntos 161

Por favor, vea mi rutina flash personalizada en la respuesta a esta pregunta: Comando ESRI Flash en código personalizado

Creo que esto te servirá, ya que acepta GeometryBags junto con las geometrías Polygon, Polyline, Point y Multipoint. No une las geometrías sino que dibuja cada una individualmente.

También puede intentar añadir las geometrías a una matriz y utilizar IHookActions.DoActionOnMultiple como en este muestra .

0 votos

He probado tu primera solución y funciona muy bien. De hecho, la respuesta de "Jay Cummins" (que eliminó) también funcionaba, pero me olvidé de alejar el zoom para comprobar si se dibujaba en otro lugar (lo que está ocurriendo en este caso también). Probablemente me falta alguna SpatialReference en alguna parte. ¡Sobre el parpadeo - es hecho, funciona como un encanto!

0 votos

Es bueno saberlo. Si no está en la pantalla, obviamente no parpadeará, pero la herramienta de identificación incorporada hace un ingenioso efecto de retícula para que puedas ver que "algo" sucede aunque esté fuera de la pantalla. Todavía no he descubierto cómo replicar eso.

2voto

Michael La Voie Puntos 56

El método que utilicé en uno de mis complementos fue poner todas las características en un GeometryBag y utilizar ITopologicalOperator::ConstructUnion para fusionarlo en una sola geometría. Pasé esta geometría al fragmento de FlashGeometry.

Así es como lo hice (en VB.NET). En mi caso, estaba usando un IQueryFilter para hacer la selección de características (ya sea polígonos o polilíneas) para flashear

    Dim pFCursor As ESRI.ArcGIS.Geodatabase.IFeatureCursor
    Dim pFeature As ESRI.ArcGIS.Geodatabase.IFeature
    Dim pGeometry As ESRI.ArcGIS.Geometry.IGeometry
    Dim pGeometryBag As ESRI.ArcGIS.Geometry.IGeometryCollection = New ESRI.ArcGIS.Geometry.GeometryBag
    Dim pPolygon As ESRI.ArcGIS.Geometry.IPolygon
    Dim pPolyline As ESRI.ArcGIS.Geometry.IPolyline
    Dim pQFilter As New ESRI.ArcGIS.Geodatabase.QueryFilter
    Dim pRgbColor As New ESRI.ArcGIS.Display.RgbColor
    Dim pTopoOp As ESRI.ArcGIS.Geometry.ITopologicalOperator4

    Using releaser As New ESRI.ArcGIS.ADF.ComReleaser
       releaser.ManageLifetime(pFCursor)

       pQFilter.WhereClause = [String].Format("{0} in ({1})", pFClass.OIDFieldName, sender.Rows(e.RowIndex).Cells("colAdjacentOIDs").value)
       pFCursor = pFClass.Search(pQFilter, True)
       pFeature = pFCursor.NextFeature

       Do Until pFeature Is Nothing
           pGeometryBag.AddGeometry(pFeature.ShapeCopy)
           pFeature = pFCursor.NextFeature
       Loop

       Select Case pFClass.ShapeType
           Case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon
                pTopoOp = New ESRI.ArcGIS.Geometry.Polygon
                pTopoOp.ConstructUnion(pGeometryBag)
                pPolygon = pTopoOp
                pGeometry = pPolygon
           Case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline
                pTopoOp = New ESRI.ArcGIS.Geometry.Polyline
                pTopoOp.ConstructUnion(pGeometryBag)
                pPolyline = pTopoOp
                pGeometry = pPolyline
       End Select

       pRgbColor.Red = 255

       FlashGeometry(pGeometry, pRgbColor, My.ArcMap.Document.ActiveView.ScreenDisplay, 500)
   End Using

Public Sub FlashGeometry(ByVal geometry As ESRI.ArcGIS.Geometry.IGeometry, ByVal color As ESRI.ArcGIS.Display.IRgbColor, ByVal display As ESRI.ArcGIS.Display.IDisplay, ByVal delay As System.Int32)

    If geometry Is Nothing OrElse color Is Nothing OrElse display Is Nothing Then
        Return
    End If

    display.StartDrawing(display.hDC, CShort(ESRI.ArcGIS.Display.esriScreenCache.esriNoScreenCache))

    Select Case geometry.GeometryType
        Case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon

            'Set the flash geometry's symbol.
            Dim simpleFillSymbol As ESRI.ArcGIS.Display.ISimpleFillSymbol = New ESRI.ArcGIS.Display.SimpleFillSymbolClass
            simpleFillSymbol.Color = color
            Dim symbol As ESRI.ArcGIS.Display.ISymbol = TryCast(simpleFillSymbol, ESRI.ArcGIS.Display.ISymbol) ' Dynamic Cast
            symbol.ROP2 = ESRI.ArcGIS.Display.esriRasterOpCode.esriROPNotXOrPen

            'Flash the input polygon geometry.
            display.SetSymbol(symbol)
            display.DrawPolygon(geometry)
            System.Threading.Thread.Sleep(delay)
            display.DrawPolygon(geometry)
            Exit Select

        Case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline

            'Set the flash geometry's symbol.
            Dim simpleLineSymbol As ESRI.ArcGIS.Display.ISimpleLineSymbol = New ESRI.ArcGIS.Display.SimpleLineSymbolClass
            simpleLineSymbol.Width = 4
            simpleLineSymbol.Color = color
            Dim symbol As ESRI.ArcGIS.Display.ISymbol = TryCast(simpleLineSymbol, ESRI.ArcGIS.Display.ISymbol) ' Dynamic Cast
            symbol.ROP2 = ESRI.ArcGIS.Display.esriRasterOpCode.esriROPNotXOrPen

            'Flash the input polyline geometry.
            display.SetSymbol(symbol)
            display.DrawPolyline(geometry)
            System.Threading.Thread.Sleep(delay)
            display.DrawPolyline(geometry)
            Exit Select

        Case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint

            'Set the flash geometry's symbol.
            Dim simpleMarkerSymbol As ESRI.ArcGIS.Display.ISimpleMarkerSymbol = New ESRI.ArcGIS.Display.SimpleMarkerSymbolClass
            simpleMarkerSymbol.Style = ESRI.ArcGIS.Display.esriSimpleMarkerStyle.esriSMSCircle
            simpleMarkerSymbol.Size = 12
            simpleMarkerSymbol.Color = color
            Dim symbol As ESRI.ArcGIS.Display.ISymbol = TryCast(simpleMarkerSymbol, ESRI.ArcGIS.Display.ISymbol) ' Dynamic Cast
            symbol.ROP2 = ESRI.ArcGIS.Display.esriRasterOpCode.esriROPNotXOrPen

            'Flash the input point geometry.
            display.SetSymbol(symbol)
            display.DrawPoint(geometry)
            System.Threading.Thread.Sleep(delay)
            display.DrawPoint(geometry)
            Exit Select

        Case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryMultipoint

            'Set the flash geometry's symbol.
            Dim simpleMarkerSymbol As ESRI.ArcGIS.Display.ISimpleMarkerSymbol = New ESRI.ArcGIS.Display.SimpleMarkerSymbolClass
            simpleMarkerSymbol.Style = ESRI.ArcGIS.Display.esriSimpleMarkerStyle.esriSMSCircle
            simpleMarkerSymbol.Size = 12
            simpleMarkerSymbol.Color = color
            Dim symbol As ESRI.ArcGIS.Display.ISymbol = TryCast(simpleMarkerSymbol, ESRI.ArcGIS.Display.ISymbol) ' Dynamic Cast
            symbol.ROP2 = ESRI.ArcGIS.Display.esriRasterOpCode.esriROPNotXOrPen

            'Flash the input multipoint geometry.
            display.SetSymbol(symbol)
            display.DrawMultipoint(geometry)
            System.Threading.Thread.Sleep(delay)
            display.DrawMultipoint(geometry)
            Exit Select

    End Select

    display.FinishDrawing()

End Sub

0 votos

Ya estaba considerando esto, y tu sugerencia parece una solución válida si se trata de un tipo de geometrías. El inconveniente es que no puede funcionar con diferentes tipos de geometrías porque no se pueden fusionar puntos, polilíneas y polígonos en una sola geometría... ¿o sí? En el peor de los casos puedo flashearlos en orden - primero puntos, luego polilíneas, etc. Mañana volveré a exponer mis resultados sobre este asunto.

0 votos

Al final me quedé con la respuesta de blah238. Ya que es más viable en mi caso.

0 votos

¿Qué es FlashGeometry(....) en el código anterior?

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