あるフィーチャクラス属性を別の属性クラスにコピーすることで、同僚のワークフローをスピードアップするのに役立つPythonアドインボタンを作成しました。これは、arcpy.UpdateCursor関数を使用して、ターゲットフィーチャクラスの行を更新します。現在存在するため、このボタンスクリプトは編集モードに関係なく実行できます。明らかに編集セッションで実行する場合、ユーザーは編集を停止して変更を保存しないことを選択できますが、スクリプトが編集セッション外で実行される場合はそうではありません。
ArcMapが現在編集セッションにない場合にスクリプトの実行を停止するチェックをスクリプトに追加するにはどうすればよいですか?
これは、ArcMap 10および10.1に関係します。
また、他のArcMapユーザーに確認して、編集セッションに参加しない限り、テーブルの更新が通常許可されないことを確認したいと思います。
では、このスクリプトは編集セッションの外でどのように実行されるのでしょうか。
このスクリプトは、リストから2番目のフィーチャクラステーブルを更新したときに、たまたま機能するArcMapが実行する一見偶然のような選択順序に関する別の質問も表示しますが、それは別の日です。
これが現在動作するスクリプトです(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