Создание надстройки ArcMap (button)

ArcGIS 8.x,9.x,10.x (Arcview, ArcEditor, Arcinfo).
Ответить
Anton0310
Новоприбывший
Сообщения: 5
Зарегистрирован: 03 сен 2017, 16:24
Репутация: 1
Откуда: Откуда

Создание надстройки ArcMap (button)

Сообщение Anton0310 » 03 сен 2017, 16:34

Всем Добрый день!

Недавно начал изучать Python и параллельно Arcpy. Написал первый скрипт, который автоматически создает новые строчки в таблицах и переносит данные из ячейки в ячейку. Поместил его в кнопку. Скрипт работает и делает все правильно. Только вот после выполнения скрипта не могу вручную изменить значение ни в одной ячейки. Он изменять дает, но после перехода в другую ячейку возвращает ее к начальному значению. В интернете перерыл всё, но ответа так и не нашел. Скорее всего нужно в конце добавлять какой то параметр в работу скрипта или работу кнопки. Может если кто то сталкивался, помогите.

Код: Выделить всё

import arcpy
import pythonaddins

class PipeLine(object):
    """Implementation for MOG_addin.PL1 (Button)"""
    def __init__(self):
        self.enabled = True
        self.checked = False
    def onClick(self): 
        def new_field(table):
            newRow = arcpy.da.InsertCursor(table, ["OBJECTID"])
            for row in range(1):
                a = newRow.insertRow([0])
                b = arcpy.SelectLayerByAttribute_management(table, "NEW_SELECTION", '"OBJECTID" = %i' % a)
                del a
                del b
            del newRow
            
		
#Копируему GlobalID и вставляем его в текстовое поле другой таблицы
        def copypast_glid(table1, table2, field_str):
            glid = arcpy.UpdateCursor(table1)
            for x in glid:
                a1 = x.getValue(str("GlobalID"))
            iii = arcpy.UpdateCursor(table2)
            for p in iii:
                p.setValue(field_str, a1)
                iii.updateRow(p)
                del a1
            del iii, glid
            

#Вставляем GlobalID в нужное поле и корректируем строковое поле
        def past_guid(table, field1, field2, field3):
            with arcpy.da.UpdateCursor(table, [field1, field2, field3]) as cursor:
                for row in cursor:
                    row[1] = row[0]
                    if field1 == "ITD_LINK":
                        row[0] = str("http://gis.map.mosoblgaz.ru/ea/supr.php?fn=" + str(row[2]))
                    else:
                        row[0] = str("http://gis.map.mosoblgaz.ru/ea/supr.php?fn=" + str(row[2]) + "&book=1")
                    cursor.updateRow(row)
            del cursor
			
#Заполняем поля
        def past_info(table1, table2, field1, field2):
            atr = arcpy.UpdateCursor(table1)
            for m in atr:
                atr1 = m.getValue(field1)
            atr11 = arcpy.UpdateCursor(table2)
            for p1 in atr11:
                p1.setValue(field2, atr1)
                atr11.updateRow(p1)
                del atr1
            del atr, atr11
            

#Заполняем атрибуты в таблице PIPELINE
        new_field("PIPELINE")
        copypast_glid("PIPELINE", u'Сегмент НД', "Ssilka_na_skan")
        past_guid(u'Сегмент НД', "Ssilka_na_skan", "Pipe_id", "SCAN_NUMBER")
        past_info(u'Сегмент НД', "PIPELINE", "DEPART_ID", "DEPART_ID")
        past_info(u'Сегмент НД', "PIPELINE", "ITD_NAME", "ITD_NAME")
        past_info(u'Сегмент НД', "PIPELINE", "ITD_NUMBER", "ITD_NUMBER")
        past_info(u'Сегмент НД', "PIPELINE", "ITD_LINK", "ITD_LINK")
        past_info(u'Сегмент НД', "PIPELINE", "ITD_DATA", "ITD_DATA")
        past_info(u'Сегмент НД', "PIPELINE", "ITD_DATA", "ITD_DATA")
        past_info(u'Сегмент НД', "PIPELINE", "MK_NUMBER", "MK_NUMBER")
        past_info(u'Сегмент НД', "PIPELINE", "Naimenovanie_pipeline", "Naimenovanie_GP_2")
        past_info(u'Сегмент НД', "PIPELINE", "Filial", "Filial")

#Заполняем поля в таблице Gas_adress
        new_field("Gas_adress")
        copypast_glid("PIPELINE", "Gas_adress", "URL_ssilka")
        past_guid("Gas_adress", "URL_ssilka", "Gazoprovod", "No_op_No_ITD")
        #past_info("PIPELINE", "Gas_adress", "Filial", "Filial")
        #past_info("PIPELINE", "Gas_adress", "DEPART_ID", "RES")
        past_info("PIPELINE", "Gas_adress", "ITD_NAME", "Adress_ITD")
        past_info("PIPELINE", "Gas_adress", "ITD_LINK", "URL_ssilka")

#Заполняем поля в таблице Gas_segment_VS
        new_field("Gas_segment_VS")
        copypast_glid("Gas_adress", "Gas_segment_VS", "URL_ssilka")
        past_guid("Gas_segment_VS", "URL_ssilka", "Gas_Adress_TORO", "No_OP_No_ITD_No_inventar")
        past_info(u'Сегмент НД', "Gas_segment_VS", "INV_NO", "No_inventar")
        past_info(u'Сегмент НД', "Gas_segment_VS", "PRIMECHANIE", "Primechanie")
        #past_info(u'Сегмент НД', "Gas_segment_VS", "BALANCE", "Balance")
        past_info("PIPELINE", "Gas_segment_VS", "ITD_LINK", "URL_ssilka")

#Заполняем поля в таблице Gas_technic
        new_field("Gas_technic")
        copypast_glid("Gas_segment_VS", "Gas_technic", "URL_ssilka")
        past_guid("Gas_technic", "URL_ssilka", "Gas_Segment_TORO", "Characteristics")
        #past_info(u'Сегмент НД', "Gas_technic", "PRESSURE_TYPE", "Kategoria_davlenia")
        #past_info(u'Сегмент НД', "Gas_technic", "SG_LAYING", "Sposob_prokladki")
        #past_info(u'Сегмент НД', "Gas_technic", "MATERIAL", "Material")
        #past_info(u'Сегмент НД', "Gas_technic", "SG_DIAM_CND", "Diametr")
        past_info("PIPELINE", "Gas_technic", "ITD_LINK", "URL_ssilka")

        pass

wladfm
Участник
Сообщения: 69
Зарегистрирован: 04 июл 2016, 16:02
Репутация: 8

Re: Создание надстройки ArcMap (button)

Сообщение wladfm » 04 сен 2017, 10:23

а во что добавляете? шейп или бд?
я по питону не сильно помогу, но для .net необходимо записать строку - метод .Store()

5Nap
Участник
Сообщения: 85
Зарегистрирован: 21 ноя 2010, 17:36
Репутация: 31

Re: Создание надстройки ArcMap (button)

Сообщение 5Nap » 05 сен 2017, 09:49

Anton0310, по факту, оно вообще работать не должно. Из ошибок у вас как минимум создание двух UpdateCursor без создания объекта Editor.
Я бы предложил:
(1) поменять ненужные UpdateCursor на SearchCursor там где вы только считываете строки,
(2) использовать конструкцию

Код: Выделить всё

with arcpy.da.UpdateCursor(...) as cur:
    for row in cur:
        ...
При таком раскладе курсор будет удаляться всегда. del cursor в некоторых случаях может не срабатывать (например, если у вас скрипт по кнопке выполнен с ошибкой).
Скорее всего, если поправить эти два момента, проблема с "необновлением" решится автоматически.

Anton0310
Новоприбывший
Сообщения: 5
Зарегистрирован: 03 сен 2017, 16:24
Репутация: 1
Откуда: Откуда

Re: Создание надстройки ArcMap (button)

Сообщение Anton0310 » 05 сен 2017, 10:02

Спасибо большое! Сделал как вы сказали, теперь все отлично работает!

Ответить

Вернуться в «ArcGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей