4 votos

Problemas Refrescante Ver en el Editor de código de Extensión

Me parece que no puede encontrar a nadie con este problema, pero tengo la esperanza de que tal vez me estoy perdiendo algo obvio!

Estoy escribiendo una Extensión del Editor de agregar-en el uso de VB.net para ArcMap 10. La capa característica estoy de representación es de un SDE conjunto de datos.

Una vez que el usuario inicia la edición, yo uso un valor único de renderizado características de la pantalla, omitiendo algunos (que quiere el cliente de las características que se han clasificado como "inactivo" a desaparecer - sin ser eliminados - y a mi entender es que una consulta de definición de no trabajar en una sesión de edición, así que he modificado la simbología de lugar).

Después me puse el procesador, yo desea que la pantalla de actualización para mostrar la nueva simbología. Sin Embargo, ActiveView.Actualizar, ActiveView.PartialRefresh, y ScreenDisplay.Invalidar no funcionará. No hay ningún error, pero la pantalla no se actualiza. Me han dado un paso a través del uso del depurador y confirmó que el programa de ejecución no llegar a esas líneas, pero después de 'ejecutar' esas líneas no pasa nada. El TOC se actualiza correctamente, pero la vista no. Yo manualmente, haga clic en el botón actualizar y se actualiza bien, pero me parece que no puede hacer es trabajar mediante programación.

He tratado de fuerza bruta mediante ActiveView.Desactivar seguido por ActiveView.Activar, y esto causa una actualización de la pantalla, pero luego cuando intento dibujar el punto, el puntero del ratón y el símbolo de marcador que indica el potencial de ubicación del nuevo punto de que son compensados por alrededor de 4 pulgadas.

Estoy completamente perdida aquí. Alguna idea?

He incluido un exerpt de mi código de abajo (esto se hace de manera casi idéntica para 4 capas de entidades, por lo que normalmente el select case tendría 3 entradas más, pero me simplificado para este post). Gracias!!

    'define the colors to use in the renderers
    Dim pOutlineColor As New ESRI.ArcGIS.Display.RgbColor
    Dim pStructureColor As New ESRI.ArcGIS.Display.RgbColor

    'make the structure outline color black
    pOutlineColor.Red = 0
    pOutlineColor.Blue = 0
    pOutlineColor.Green = 0

'make the structure center color macaw green
    pStructureColor.Red = 152
    pStructureColor.Blue = 0
    pStructureColor.Green = 230

    'create the symbols
    Dim pStructureSymbol As New ESRI.ArcGIS.Display.SimpleMarkerSymbol

    'construct the structures symbol
    pStructureSymbol.Style = ESRI.ArcGIS.Display.esriSimpleMarkerStyle.esriSMSCircle
    pStructureSymbol.Size = 4
    pStructureSymbol.Outline = True
    pStructureSymbol.OutlineSize = 1
    pStructureSymbol.OutlineColor = pOutlineColor
    pStructureSymbol.Color = pStructureColor

    'define renderers
    Dim pStructureRenderer As New ESRI.ArcGIS.Carto.UniqueValueRenderer

    'set the fields used in the renderers - we'll just have one, the 'Active' field
    'set usedefaultsymbol to false so that inactive features  
    'will not draw (i.e., if Active <> 1 or Null)
    'structures renderer
    With pStructureRenderer
        .FieldCount = 1
        .Field(0) = "Active"
        .UseDefaultSymbol = False
        'add "1" to the value list for the renderer - i.e., display "1" values using pStructureSymbol
        .AddValue("1", "Active", pStructureSymbol)
        .Label("1") = "Active"
        'add "<Null>" to the value list for the renderer using the same symbology as "1"
        .AddReferenceValue("<Null>", "1")
        'tell it we're using our own custom style
        .ColorScheme = "Custom"
        'tell it the field type for the 'Active' field is not a string (it's an integer)
        .FieldType(0) = False
    End With        


    Dim pLayer As ESRI.ArcGIS.Carto.ILayer
    Dim pFeatureLayer As ESRI.ArcGIS.Carto.IFeatureLayer2
    Dim pGeoFeatureLayerStructures As ESRI.ArcGIS.Carto.IGeoFeatureLayer

    'this makes the layer properties symbology tab show
    'the correct interface.
    Dim pPropertyPage As ESRI.ArcGIS.CartoUI.IRendererPropertyPage
    pPropertyPage = New ESRI.ArcGIS.CartoUI.UniqueValuePropertyPage

    Do Until pLayer Is Nothing
        If TypeOf (pLayer) Is ESRI.ArcGIS.Carto.IFeatureLayer2 Then
            pFeatureLayer = pLayer
            If pFeatureLayer.FeatureClass.FindField("Active") > 0 Then 'only set the renderer if there is an 'active' field in the layer
                Select Case pFeatureLayer.FeatureClass.AliasName
                    Case strStructuresLayerName
                        pGeoFeatureLayerStructures = pFeatureLayer
                        pGeoFeatureLayerStructures.Renderer = pStructureRenderer
                        pGeoFeatureLayerStructures.DisplayField = "Active"
                        pGeoFeatureLayerStructures.RendererPropertyPageClassID = pPropertyPage.ClassID

                End Select
            End If
            pFeatureLayer = Nothing
        End If
        pLayer = pEnumLayers.Next
    Loop
    My.Document.ActiveView.ContentsChanged()
    My.Document.UpdateContents()       

    My.Document.ActiveView.Refresh() 'this does nothing

    'This also does nothing:
    'My.Document.ActiveView.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewAll, Nothing, pActiveView.Extent)

    'This also does nothing:
    'My.ThisApplication.Display.Invalidate(My.Document.ActiveView.Extent, False, ESRI.ArcGIS.Display.esriScreenCache.esriNoScreenCache)

    'this makes the screen go blank:
    'Dim pMaps As ESRI.ArcGIS.Carto.IMaps
    'pMaps = My.Document.Maps
    'My.Document.ActiveView = My.Document.PageLayout
    'My.Document.ActiveView = pMaps.Item(0)
    'My.Document.ActiveView.Refresh()

    'this makes the cursor and the point to be drawn offset by about 4 inches:
    'Dim pActiveView As ESRI.ArcGIS.Carto.IActiveView
    'pActiveView = My.Document.FocusMap
    'pActiveView.Deactivate()
    'pActiveView.Activate(My.ThisApplication.Display.hWnd)

5voto

CodeSlave Puntos 7133

Usted puede ser que necesite para hacer referencia a la vista activa de la ArcMap documento a través de iMXDocument. Intente esto:

dim m_focusMap As ESRI.ArcGIS.Carto.IActiveView
Dim mxDoc As ESRI.ArcGIS.ArcMapUI.IMxDocument = My.ArcMap.Document
m_focusMap = TryCast(mxDoc.FocusMap, ESRI.ArcGIS.Carto.IActiveView)
m_focusMap.Refresh()

0voto

Christian Specht Puntos 213

Me he encontrado un lugar extraño solución, así que pensé que debería post en caso de que alguien más tiene este problema en el futuro.

Como lo que puedo decir, este problema se produce porque yo estaba tratando de actualizar la vista como parte de mi OnStartEditing manejo de eventos (esto parece ser un error, y me he informado a la señora que estaba trabajando en ESRI apoyo en este tema). En mi editor de extensión, el OnStartup cable de la OnStartEditing evento, y la OnStartEditing evento intentado crear el renderizador y actualizar la vista.

Decidí que en vez de inmediatamente la habilitación de las capacidades de mi extensión cuando la sesión de edición que comienza, yo quería tener el usuario haga clic en un botón para activar las capacidades. Voy a saltar toda mi razonamiento en que, como irrelevante para el tema en cuestión.

Lo que es relevante es que me mudé a la llamada a la rutina de representación (CreateRenderer) (con el código que publicaste anteriormente) de la OnStartEditing evento y EN mi nuevo evento de clic de botón. Así, el nuevo flujo es algo como esto:

En Inicio --> Habilitar el nuevo botón personalizado, Alambre OnStartEditing y OnStopEditing

Botón personalizado haga clic en --> ejecutar CreateRenderer subrutina

Y voila! De repente la pantalla de mi realidad refresca. Quiero destacar que he cambiado NADA en el CreateRenderer subrutina - me acabo de mudar a la llamada de la OnStartEditing Evento y en el nuevo evento de clic de botón.

Si me escuchan desde ESRI sobre este tema voy a publicar cualquier información adicional relevante.

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