Utworzyłem przycisk dodatku Python, który pomaga przyspieszyć przepływ pracy moich współpracowników, kopiując jeden atrybut klasy obiektów do drugiego. Używa funkcji arcpy.UpdateCursor do aktualizacji wiersza w docelowej klasie obiektów. Jak już istnieje, ten skrypt przycisku można uruchomić niezależnie od trybu edycji. Oczywiście, gdy jest uruchamiany w sesji edycji, użytkownik może zatrzymać edycję i nie zapisywać zmian, ale nie dzieje się tak, gdy skrypt działa poza sesją edycji.
Jak mogę dodać skrypt do skryptu, który zatrzyma działanie skryptu, jeśli ArcMap nie jest aktualnie w sesji edycji?
Dotyczy to ArcMap 10 i 10.1
Chcę również skontaktować się z innymi użytkownikami ArcMap, aby sprawdzić, czy aktualizacje tabel nie są normalnie dozwolone bez udziału w sesji edycji.
Jak ten skrypt działa poza sesją edycji?
Ten skrypt wywołuje również inne pytanie dotyczące pozornie nieoczekiwanej kolejności selekcji, którą wykonuje ArcMap, która akurat działa dla mnie, gdy aktualizuję tabelę 2. klasy obiektów z listy, ale to na inny dzień.
Oto skrypt, który działa teraz (bez żadnej implementacji edytora 10.1):
Jak dodać czek, aby upewnić się, że użytkownik jest w sesji edycji?
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