Saya telah membuat tombol tambah Python yang membantu mempercepat alur kerja rekan kerja saya dengan menyalin satu atribut kelas fitur ke atribut lainnya. Ini menggunakan fungsi arcpy.UpdateCursor untuk memperbarui baris di kelas fitur target. Seperti yang ada sekarang, skrip tombol ini dapat dijalankan terlepas dari mode pengeditan. Jelas ketika dijalankan dalam sesi edit, pengguna dapat memilih untuk berhenti mengedit dan tidak menyimpan perubahan, tetapi ini tidak terjadi ketika skrip berjalan di luar sesi edit.
Bagaimana saya bisa menambahkan tanda centang pada skrip yang akan menghentikan skrip agar tidak berjalan jika ArcMap saat ini tidak dalam sesi edit?
Ini menyangkut ArcMap 10 & 10.1
Saya juga ingin memeriksa dengan pengguna ArcMap lain untuk memverifikasi bahwa pembaruan tabel biasanya tidak diizinkan tanpa berada dalam sesi edit.
Jadi bagaimana skrip ini berjalan di luar sesi edit?
Script ini juga memunculkan pertanyaan lain tentang urutan seleksi ArcMap yang tampaknya kebetulan bekerja untuk saya ketika saya memperbarui tabel kelas fitur 2 dari daftar, tapi itu untuk hari lain.
Inilah skrip yang berfungsi sekarang (tanpa implementasi editor 10.1):
Bagaimana cara menambahkan cek untuk memastikan pengguna dalam sesi edit?
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
Jawaban:
Berikut adalah fungsi generik berdasarkan posting ini.
Mungkin ini sedikit lebih kludgy daripada solusi ArcObjects, tapi sepertinya jauh lebih mudah! Sederhana lebih baik daripada kompleks. Kecuali kalau tidak.
Contoh penggunaan:
kode:
sumber
Solusi saya untuk masalah ini adalah menggunakan ekstensi yang tersedia untuk Arcpy Addin Toolbar. Saya menambahkan ekstensi yang mendengarkan sesi edit untuk memulai atau mengakhiri. Saya memiliki semua tombol di bilah yang disetel ke: self.enable = False "untuk memulai dan kemudian tombol-tombol ini kemudian diaktifkan atau dinonaktifkan dengan memulai atau menghentikan sesi edit.
sumber
Saya memposting jawaban lain karena saya telah mempelajari metode baru untuk memeriksa status Editor di ArcMap menggunakan ArcObjects dan Python bersama-sama. Jawaban saya meminjam sangat banyak dari pekerjaan yang dilakukan oleh Mark Cederholm sebagaimana dirujuk dalam posting ini: Bagaimana cara mengakses ArcObjects dari Python? , dan contoh kode yang diberikan oleh Matt Wilkie dalam file "Snippits.py". Anda harus mengikuti instruksi yang disediakan di jawaban pertama untuk mengunduh dan menginstal comtypes dan kemudian mendapatkan salinan skrip Snippets.py. Saya memposting salinan fungsi penting dari skrip di bawah ini.
Ketika fungsi ArcMap_GetEditSessionStatus () dipanggil, ia akan memeriksa keadaan Editor saat ini di ArcMap dan mengembalikan true atau false. Ini memungkinkan saya memeriksa apakah pengguna siap untuk menggunakan alat saya atau apakah mereka perlu diminta untuk memulai sesi edit. Kelemahan dari metode ini adalah persyaratan untuk menginstal comtypes sebelum ArcObjects dapat digunakan dengan Python, jadi berbagi alat yang memerlukan paket ini di lingkungan kantor multi-pengguna mungkin tidak dimungkinkan. Dengan pengalaman terbatas saya, saya tidak yakin bagaimana menggabungkan semuanya agar mudah dibagikan sebagai tambahan alat Esri Python. Saran untuk bagaimana melakukan ini akan sangat dihargai.
sumber
Desktop.pth
file mereka untuk memasukkan path lengkap ke share jaringan, sehingga semua orang dapat secara otomatis mengimpor semuanya.Bagaimana dengan menggunakan modul akses data ? Sepertinya Anda dapat memulai sesi edit dengan modul ini.
Beberapa peringatan:
with
pernyataan. Ini adalah paradigma yang bagus untuk diterapkan karena menangani potensi pengecualian dengan baik.try / except
pernyataan.sumber
Jadi ini adalah bagaimana saya memperbaiki masalah saya karena tidak dapat mengontrol apakah seseorang menggunakan alat saya dalam sesi edit atau tidak:
Skrip berfungsi karena mencoba membuat UpdateCursor pada layer yang memiliki UpdateCursor lain di skrip. Ini melanggar perilaku modul akses data. Menurut halaman Sumber Daya ESRI di arcpy.da.UpdateCursor:
"Membuka penyisipan dan / atau memperbarui operasi secara bersamaan pada ruang kerja yang sama menggunakan kursor berbeda memerlukan dimulainya sesi edit."
Saya tidak senang dengan solusi ini karena ini lebih merupakan hack daripada apa yang saya bayangkan adalah skrip arcpy yang tepat. Ide yang lebih baik?
sumber