Creé un botón de complemento de Python que ayuda a acelerar el flujo de trabajo de mis compañeros de trabajo al copiar un atributo de clase de entidad en otro. Utiliza la función arcpy.UpdateCursor para actualizar una fila en la clase de entidad de destino. Tal como existe ahora, este script de botón se puede ejecutar independientemente del modo de edición. Obviamente, cuando se ejecuta en una sesión de edición, el usuario puede optar por detener la edición y no guardar los cambios, pero este no es el caso cuando el script se ejecuta fuera de una sesión de edición.
¿Cómo puedo agregar una comprobación al script que detendrá el script si ArcMap no está actualmente en una sesión de edición?
Esto concierne a ArcMap 10 y 10.1
También quiero consultar con otros usuarios de ArcMap para verificar que las actualizaciones de las tablas normalmente no están permitidas sin estar en una sesión de edición.
Entonces, ¿cómo se ejecuta este script fuera de una sesión de edición?
Esta secuencia de comandos también plantea otra pregunta sobre el orden de selección aparentemente fortuito que realiza ArcMap que simplemente funciona para mí cuando actualizo la segunda tabla de clase de entidad de una lista, pero eso es para otro día.
Aquí está el script tal como funciona ahora (sin ninguna implementación del editor 10.1):
¿Cómo agregar un cheque para asegurar que el usuario esté en una sesión de edición?
def onClick(self):
#Reference mxd
mxd = arcpy.mapping.MapDocument("CURRENT")
#Reference the main Data frame
mm = arcpy.mapping.ListDataFrames(mxd, "MainMap")[0]
#Reference the Water System Valve feature class
waterValves = arcpy.mapping.ListLayers(mxd, "Water System Valve", mm)[0]
#Reference the fire hydrant feature class
fireHydrants = arcpy.mapping.ListLayers(mxd, "Water Hydrant", mm)[0]
#Use the extent of the main DF to select all valves in the current view
dfAsFeature = arcpy.Polygon(arcpy.Array([mm.extent.lowerLeft, mm.extent.lowerRight, mm.extent.upperRight, mm.extent.upperLeft]), mm.spatialReference)
arcpy.SelectLayerByLocation_management(waterValves, "WITHIN", dfAsFeature,"", "NEW_SELECTION")
arcpy.SelectLayerByAttribute_management(waterValves, "SUBSET_SELECTION", "LOCATIONID IS NULL")
fields = ["LOCATIONID"]
row, rows = None, None
rows = arcpy.UpdateCursor(waterValves,fields)
row = rows.next()
valveList = []
append = valveList.append
#Loop through the valves table to update LocationID
while row:
builder = str(row.QSNO)+"-"+ str(row.VALVESEQNO)
row.setValue("LOCATIONID", builder)
append(builder)
rows.updateRow(row)
row = rows.next()
del row, rows
#New selection for fire hydrants
arcpy.SelectLayerByLocation_management(fireHydrants, "WITHIN", dfAsFeature,"", "NEW_SELECTION")
arcpy.SelectLayerByAttribute_management(fireHydrants, "SUBSET_SELECTION", "LOCATIONID IS NULL")
row, rows = None, None
rows = arcpy.UpdateCursor(fireHydrants,fields)
row = rows.next()
#Loop through fire hydrant table to update LocationID
while row:
for locID in valveList:
construct = str(locID) + "-FH"
#print construct
row.setValue("LOCATIONID", construct)
rows.updateRow(row)
row = rows.next()
del row, rows, valveList, mxd
Respuestas:
Aquí hay una función genérica basada en esta publicación.
Tal vez esto sea un poco más complejo que la solución ArcObjects, ¡pero seguro que parece mucho menos complicado! Simple es mejor que complejo. Excepto cuando no lo es.
Ejemplo de uso:
código:
fuente
Mi solución a este problema fue usar las extensiones disponibles para la barra de herramientas Arcpy Addin. Agregué una extensión que escucha una sesión de edición para comenzar o finalizar. Tengo todos mis botones en la barra configurados en: self.enable = False "para comenzar y luego estos botones se habilitan o deshabilitan al iniciar o detener una sesión de edición.
fuente
Estoy publicando otra respuesta porque aprendí un nuevo método para verificar el estado del Editor en ArcMap usando ArcObjects y Python juntos. Mi respuesta se basa en gran medida en el trabajo realizado por Mark Cederholm como se menciona en esta publicación: ¿Cómo accedo a ArcObjects desde Python? y ejemplos de código proporcionados por Matt Wilkie en su archivo "Snippits.py". Deberá seguir las instrucciones proporcionadas en la primera respuesta para descargar e instalar comtypes y luego obtener una copia del script Snippets.py. Estoy publicando una copia de las funciones esenciales de ese script a continuación.
Cuando se llama a la función ArcMap_GetEditSessionStatus (), verificará el estado actual del Editor en ArcMap y devolverá verdadero o falso. Esto me permite verificar si un usuario está preparado para usar mi herramienta o si necesita que se le solicite que inicie una sesión de edición. La desventaja de este método es el requisito de instalar comtypes antes de que ArcObjects pueda usarse en Python, por lo que podría no ser posible compartir una herramienta que requiera este paquete en un entorno de oficina multiusuario. Con mi experiencia limitada, no estoy seguro de cómo agruparlo todo para compartirlo fácilmente como un complemento de la herramienta Esri Python. Se agradecerán sugerencias sobre cómo hacer esto.
fuente
Desktop.pth
archivo para incluir la ruta completa al recurso compartido de red, para que todos puedan importar automáticamente todo.¿Qué tal usar el módulo de acceso a datos ? Parece que puede comenzar una sesión de edición con este módulo.
Algunas advertencias:
with
declaración. Este es un gran paradigma para implementar, ya que maneja bien las posibles excepciones.try / except
declaración.fuente
Así es como solucioné mi problema de no poder controlar si alguien que usaba mi herramienta estaba en una sesión de edición o no:
El script funciona porque intenta crear un UpdateCursor en una capa que tiene otro UpdateCursor más adelante en el script. Esto viola el comportamiento del módulo de acceso a datos. De acuerdo con la página de recursos de ESRI en arcpy.da.UpdateCursor:
"Abrir operaciones simultáneas de inserción y / o actualización en el mismo espacio de trabajo utilizando diferentes cursores requiere el inicio de una sesión de edición".
No estoy contento con esta solución porque es más un truco de lo que imagino es un script de arcpy adecuado. ¿Mejores ideas para alguien?
fuente