Я создал кнопку надстройки Python, которая помогает ускорить рабочий процесс моего коллеги путем копирования одного атрибута класса объектов в другой. Он использует функцию arcpy.UpdateCursor для обновления строки в целевом классе объектов. Так как он существует сейчас, этот скрипт кнопки можно запускать независимо от режима редактирования. Очевидно, что при запуске в сеансе редактирования пользователь может выбрать остановку редактирования и не сохранять изменения, но это не тот случай, когда скрипт выполняется вне сеанса редактирования.
Как я могу добавить в скрипт проверку, которая остановит его выполнение, если ArcMap в данный момент не находится в сеансе редактирования?
Это касается ArcMap 10 & 10.1
Я также хочу проверить у других пользователей ArcMap, что обновления таблиц обычно не допускаются без участия в сеансе редактирования.
Так как же этот скрипт работает вне сеанса редактирования?
Этот сценарий также поднимает еще один вопрос о, казалось бы, случайном порядке выбора, который выполняет ArcMap, и он мне подходит, когда я обновляю 2-ю таблицу классов объектов из списка, но это на другой день.
Вот скрипт, как он работает сейчас (без какой-либо реализации редактора 10.1):
Как добавить проверку, чтобы убедиться, что пользователь находится в сеансе редактирования?
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
Ответы:
Вот общая функция, основанная на этом посте.
Может быть, это немного сложнее, чем решение ArcObjects, но, похоже, намного меньше хлопот! Простое лучше, чем сложное. За исключением случаев, когда это не так.
Пример использования:
код:
источник
Моим решением этой проблемы было использование расширений, доступных для панели инструментов Arcpy Addin. Я добавил расширение, которое прослушивает сеанс редактирования, чтобы начать или закончить. У меня все мои кнопки на панели установлены для: self.enable = False "для начала, а затем эти кнопки либо включаются, либо отключаются при запуске или остановке сеанса редактирования.
источник
Я публикую еще один ответ, потому что я узнал новый метод проверки статуса Редактора в ArcMap с использованием ArcObjects и Python вместе. Мой ответ во многом заимствован из работы, проделанной Марком Седерхольмом, о которой говорится в этом посте: Как получить доступ к ArcObjects из Python? и примеры кода, предоставленные Мэттом Вилки в его файле «Snippits.py». Вам нужно будет следовать инструкциям, приведенным в первом ответе, чтобы загрузить и установить комтипы, а затем получить копию сценария Snippets.py. Я публикую копию основных функций из этого скрипта ниже.
Когда вызывается функция ArcMap_GetEditSessionStatus (), она проверяет текущее состояние редактора в ArcMap и возвращает значение true или false. Это позволяет мне проверить, готов ли пользователь использовать мой инструмент или ему нужно предложить начать сеанс редактирования. Недостатком этого метода является требование устанавливать комтипы перед использованием ArcObjects в Python, поэтому совместное использование инструмента, для которого требуется этот пакет, в многопользовательской офисной среде может оказаться невозможным. Имея свой ограниченный опыт, я не уверен, как объединить все это для удобного совместного использования в качестве надстройки инструмента Esri Python. Предложения о том, как это сделать, будут оценены.
источник
Desktop.pth
файл, чтобы включить полный путь к общему сетевому ресурсу, чтобы каждый мог автоматически импортировать все.Как насчет использования модуля доступа к данным ? Похоже, вы можете начать сеанс редактирования с этим модулем.
Несколько предостережений:
with
оператора. Это отличная парадигма для реализации, поскольку она хорошо обрабатывает потенциальные исключения.try / except
выражении.источник
Вот как я исправил проблему, связанную с невозможностью контролировать, был ли кто-то, использующий мой инструмент, в сеансе редактирования или нет:
Сценарий работает, потому что он пытается создать UpdateCursor на слое, у которого есть другой UpdateCursor позже в сценарии. Это нарушает поведение модуля доступа к данным. Согласно странице ресурсов ESRI на arcpy.da.UpdateCursor:
«Открытие одновременных операций вставки и / или обновления в одной рабочей области с использованием разных курсоров требует начала сеанса редактирования».
Я не доволен этим решением, потому что это скорее хак, чем то, что я представляю себе, как надлежащий arcpy сценарий. У кого есть идеи получше?
источник