Criei um botão de suplemento Python que ajuda a acelerar o fluxo de trabalho de meus colegas de trabalho, copiando um atributo de classe de recurso para outro. Ele usa a função arcpy.UpdateCursor para atualizar uma linha na classe de recurso de destino. Como existe agora, esse script de botão pode ser executado independentemente do modo de edição. Obviamente, quando executado em uma sessão de edição, o usuário pode optar por interromper a edição e não salvar as alterações, mas esse não é o caso quando o script é executado fora de uma sessão de edição.
Como posso adicionar uma verificação ao script que interromperá a execução do script se o ArcMap não estiver atualmente em uma sessão de edição?
Isso diz respeito ao ArcMap 10 e 10.1
Também quero verificar com outros usuários do ArcMap para verificar se as atualizações das tabelas normalmente não são permitidas sem estar em uma sessão de edição.
Então, como esse script está sendo executado fora de uma sessão de edição?
Esse script também traz outra pergunta sobre a ordem de seleção aparentemente aleatória que o ArcMap executa que só funciona para mim quando eu atualizo a 2ª tabela de classes de recursos de uma lista, mas isso é para outro dia.
Aqui está o script como funciona agora (sem nenhuma implementação do editor 10.1):
Como adicionar uma verificação para garantir que o usuário esteja em uma sessão de edição?
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
Respostas:
Aqui está uma função genérica baseada neste post.
Talvez isso seja um pouco mais complicado do que a solução ArcObjects, mas com certeza parece muito menos aborrecimento! Simples é melhor que complexo. Exceto quando não é.
Exemplo de uso:
código:
fonte
Minha solução para esse problema foi usar as extensões disponíveis para a barra de ferramentas do Arcpy Addin. Adicionei uma extensão que escuta que uma sessão de edição comece ou termine. Eu tenho todos os meus botões na barra configurados para: self.enable = False "para começar e, em seguida, esses botões são ativados ou desativados ao iniciar ou parar uma sessão de edição.
fonte
Estou postando outra resposta porque aprendi um novo método para verificar o status do Editor no ArcMap usando ArcObjects e Python juntos. Minha resposta empresta muito do trabalho realizado por Mark Cederholm, conforme mencionado neste post: Como acesso o ArcObjects a partir do Python? e exemplos de código fornecidos por Matt Wilkie em seu arquivo "Snippits.py". Você precisará seguir as instruções fornecidas na primeira resposta para baixar e instalar comtypes e, em seguida, obter uma cópia do script Snippets.py. Estou postando uma cópia das funções essenciais desse script abaixo.
Quando a função ArcMap_GetEditSessionStatus () é chamada, ela verifica o estado atual do Editor no ArcMap e retorna verdadeiro ou falso. Isso permite verificar se um usuário está preparado para usar minha ferramenta ou se ele precisa ser solicitado a iniciar uma sessão de edição. A desvantagem desse método é o requisito para instalar comtypes antes que o ArcObjects possa ser usado no Python, portanto, talvez não seja possível compartilhar uma ferramenta que exija esse pacote em um ambiente de escritório para vários usuários. Com minha experiência limitada, não tenho certeza de como agrupar tudo para facilitar o compartilhamento como um complemento da ferramenta Esri Python. Sugestões de como fazer isso seriam apreciadas.
fonte
Desktop.pth
arquivo para incluir o caminho completo para o compartilhamento de rede, para que todos possam importar tudo automaticamente.Que tal usar o módulo de acesso a dados ? Parece que você pode iniciar uma sessão de edição com este módulo.
Algumas advertências:
with
instrução Esse é um ótimo paradigma a ser implementado, pois lida bem com possíveis exceções.try / except
instrução.fonte
Foi assim que resolvi o problema de não poder controlar se alguém que usava minha ferramenta estava ou não em uma sessão de edição:
O script funciona porque tenta criar um UpdateCursor em uma camada que possui outro UpdateCursor posteriormente no script. Isso viola o comportamento do módulo de acesso a dados. De acordo com a página Recursos da ESRI em arcpy.da.UpdateCursor:
"Abrir operações de inserção e / ou atualização simultâneas no mesmo espaço de trabalho usando cursores diferentes requer o início de uma sessão de edição."
Não estou feliz com esta solução porque é mais um truque do que imagino ser um script arcpy adequado. Idéias melhores para alguém?
fonte