6 votos

¿ArcMap/ArcObjects - gráficos en la pantalla de dibujo: explicación o tutorial para dibujar/actualización/PartialRefresh métodos?

Me encuentro a mí mismo que lamentablemente carecen de la comprensión de cuándo, por qué y cómo (de qué tipo) para hacer el sorteo de la pantalla/actualizar/parcial de actualización. Por ejemplo, en una secuencia de comandos de Python independiente fuera de la aplicación de los límites, tengo una función que está intentando dibujar los elementos gráficos en la vista de datos. Específicamente, los elementos serán un objeto TextElement en la parte superior de un RectangleElement. La función de las cargas de los dos elementos en una GroupElement, que a su vez se agrega a la ActiveView del GraphicsContainer para dibujar en la pantalla. (Como lo que puedo decir que los elementos gráficos son válidas.) Me alegro mucho de no entender lo que atraen a los/Actualizar/ParitalRefresh métodos para poner donde. Si alguien puede dar a punto para una buena explicación o tutorial acerca de la pantalla de dibujo/refrescante, yo estaría muy agradecido. A continuación es un poco de código seleccionado de mi función. Tengo un PartialRefresh en la última línea, pero no sé si eso es correcto o no.

pGroupElement = NewObj(esriCarto.GroupElement, esriCarto.IGroupElement3)
pTextElement = NewObj(esriCarto.TextElement, esriCarto.ITextElement)
pRectElement = NewObj(esriCarto.RectangleElement, esriCarto.IElement)
.
.
(configure TextElement)  [tedious code removed]
.
.
(configure RectElement)
.
.
ptxtElem = CType(pTextElement, esriCarto.IElement)

pGroupElement.AddElement(ptxtElem)
pGroupElement.AddElement(pRectElement)

pContainer = mxDoc.ActiveView.GraphicsContainer

pGrpElem = CType(pGroupElement, esriCarto.IElement)

pContainer.AddElement(pGrpElem, 0)

mxDoc.ActiveView.PartialRefresh(esriCarto.esriViewGraphics, None, None)

Añadido: Así, es la creación de objetos con el siguiente código - como yo lo hago ahora - no la creación de ellos en el proceso?

def NewObj(MyClass, MyInterface):
    """Creates a new comtypes POINTER object where\n\
    MyClass is the class to be instantiated,\n\
    MyInterface is the interface to be assigned"""
    from comtypes.client import CreateObject
    try:
        ptr = CreateObject(MyClass, interface=MyInterface)
        return ptr
    except:
        return None

Si no, deduzco que debo utilizar IObjectFactory. Suponiendo que mi actual objetos que no están en proceso, debo decir que no he visto ningún gran impacto en el rendimiento, pero supongo que sólo estoy preguntando por problemas obligando a un montón de llamadas entre procesos.

Gracias a todos por la ayuda. Yo experimento cuando tengo la oportunidad y hacerle saber los resultados.

7voto

saint_groceon Puntos 2696

Si usted está "en una secuencia de comandos de Python independiente fuera de la aplicación del límite" creo que voy a necesitar para el uso IObjectFactory. Consulte la página 13 de http://www.pierssen.com/arcgis/upload/misc/python_arcobjects.pdf

Actualización También, si usted está tratando de actualización de la pantalla a través de un proceso de límite, puede que tenga que enviar algo más de los mensajes de windows para forzar una actualización. He aquí una buena explicación.

6voto

Nathan Bedford Puntos 3157

Así, a la luz de los consejos de Kirk enlace (ArcMap Automatización: el Hombre el Mensaje de Bombas!) y el conocimiento de que IObjectFactory debe ser utilizado el escenario, aquí está mi tomar en Python aplicación de la discutidos solución.

Para reiterar, el problema es que las llamadas RPC, que viene de un proceso diferente (python) que podría conseguir que se estancó en ArcMap. La idea general que se describe en el artículo antes mencionado es que por paliza de ArcMap bucle de mensajes con WM_NULL mensajes, lo fuerzan a procesar sus llamadas RPC así.

Yo no soy versado en Python, de hecho, esto podría ser sólo mi quinta pieza de código en Python o así, si la memoria no sirve. Si alguien quiere mejorar/corregir de alguna manera, vaya por delante. Me encontré en Python 2.6.5.

import ctypes
import threading

class EsriAppMessageHelper(threading.Thread):
    def __init__(self, windowHandle):
        threading.Thread.__init__(self)
        self.running = True
        self.windowHandle = windowHandle

    def stop(self):
        self.running = False

    def run(self):
        while self.running:
            ctypes.windll.user32.SendMessageA(self.windowHandle, 0, 0, 0)
            #print 'WM_NULL to window %d sent' % self.windowHandle

    def __enter__(self):
        self.start()

    def __exit__(self, type, value, traceback):
        self.stop()

Básicamente, es un hilo que envía WM_NULL (0) mensajes a la ventana dada. El __enter__ y __exit__ funciones de soporte de Python with declaración. He aquí cómo se utiliza (el de ArcObjects relacionados con las funciones son tomadas de este post en un tema diferente):

# Get the ArcMap's IApplication reference.
# We're in a different process than ArcMap's, so it gets resolved using IAppROT.
app = GetApp()

# WM_NULL messages will be sent from another thread while
# this block is executing
with EsriAppMessageHelper(app.hWnd):

    objectFactory = CType(app, esriFramework.IObjectFactory) # use IObjectFactory
    mxDoc = CType(app.Document, esriArcMapUI.IMxDocument)
    graphicsContainer = mxDoc.ActiveView.GraphicsContainer

    textElement = CType(objectFactory.Create("esriCarto.TextElement"), esriCarto.ITextElement)

    # initialize the symbols and elements, assign their geometries
    # etc...

    graphicsContainer.AddElement(element, 0)
    mxDoc.ActiveView.PartialRefresh(esriCarto.esriViewGraphics, None, None)

# At this point, we're out of the WITH block.
# The separate thread is stopped and no more WM_NULL messages are being sent.
print "DONE"

Probarlo. Yo no podía plenamente prueba con mi ArcMap 10 la instalación debido a que no he tenido problemas con la vista activa antes de actualizar (es ejecutada inmediatamente y la actualización fue exitosa), pero la WM_NULL mensajes se envían.

3voto

auramo Puntos 161

Ha sido un tiempo desde que he hecho algo como esto, pero, si los elementos se encuentran en el diseño de la página en lugar de dentro de un marco de datos, que son manejados de manera diferente. Consulte Trabajar con PageLayout elementos y Trabajar con los elementos del mapa

Ver también Cómo volver a dibujar la pantalla

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