Настройка поведения инструмента в наборе инструментов Python

Проверка – все,что происходит до нажатия кнопки OK в инструменте. При создании собственных инструментов проверка позволяет провести настройку реакции параметров, а также их взаимодействия со своими значениями и друг с другом. Проверка производится при помощи блока кода Python, контролирующего поведение инструмента.

Подробнее о проверке значений вы можете узнать в разделе Понятие проверки в инструментах-скриптах.

В наборе инструментов Python каждый параметр инструмента имеет связанный с ним объект Parameter (Параметр), имеющий необходимые для осуществления проверки свойства и методы. В наборе инструментов Python параметры устанавливаются с помощью метода класса инструмента getParameterInfo. Поведение этих параметров и характер их взаимодействия друг с другом и входными данными проверяется в соответствии с методом updateParameters в классе инструмента.

Обновление схемы в наборе инструментовПоведение лицензии в наборе инструментов Python

Доступ к параметрам инструмента

ОбъектыParameter составляют основу определения и взаимодействия параметров в наборе инструментов Python. Обычной практикой является создание списка параметров в методе класса инструмента getParameterInfo, как показано в расположенном ниже программном коде.

def getParameterInfo(self):
    #Define parameter definitions

    # First parameter
    param0 = arcpy.Parameter(
        displayName="Input Features",
        name="in_features",
        datatype="GPFeatureLayer",
        parameterType="Required",
        direction="Input")

    return [param0]

Дополнительная информация приведена в разделе Определение параметров в наборе инструментов Python.

Объект Параметр

Методы

Имя метода

Описание использования

setErrorMessage(message:string)

Отмечает параметр, как имеющий ошибку (красный Х), с добавленным сообщением. Инструменты не выполняются, если один из параметров имеет ошибку.

setWarningMessage(message:string)

Отмечает параметр, как имеющий предупреждение (желтый треугольник), с добавленным сообщением. В отличие от ошибок, инструменты с предупреждениями выполняются.

setIDMessage(messageType: string, messageID: string, {AddArgument1}, {AddArgument2})

Позволяет вам задать системное сообщение. Аргументы такие же, как у функции AddIDMessage.

clearMessage()

Очищает любой текст сообщения и устанавливает статус на информативность (не ошибка и не предупреждение).

hasError()

Возвращает значение true, если параметр содержит ошибку.

hasWarning()

Возвращает значение true, если параметр содержит предупреждение.

isInputValueDerived()

Возвращает значение true, если инструмент был проверен внутри Модели и его входное значение является выходным значением другого инструмента данной модели.

Методы объекта Параметр (Parameter)

Свойства

Имя свойства

Чтение/Запись

Значения

Описание

name

Только для чтения

Строка

Имя параметра

direction

Только для чтения

Строка: "Input", "Output"

Входное/выходное направление параметра.

datatype

Только для чтения

Строка

Список типов данных параметров приведен в разделе Определение типов данных параметров в наборе инструментов Python.

parameterType

Только для чтения

Строка: "Required" (Обязательный), "Optional" (Дополнительный), "Derived" (Производный)

Тип параметра.

parameterDependencies

Чтение/запись

Список Python

Список индексов каждого зависимого параметра.

value

Чтение/запись

Объект Value (Значение)

Значение параметра.

defaultEnvironmentName

Только для чтения

Строка

Значение параметра среды по умолчанию.

enabled

Чтение/запись

Логический

False (Ложь), если параметр недоступен.

altered

Только для чтения

Логический

True (Истина), если пользователь изменил значение.

hasBeenValidated

Только для чтения

Логический

True (Истина), если параметр был проверен внутренней процедурой проверки.

категория (category)

Чтение/запись

Строка

Категория параметра.

schema

Только для чтения

Объект Схема

Схема выходного набора данных.

filter

Только для чтения

Объект Filter

Фильтр, который применяется к значениям параметра.

символ(symbology)

Чтение/запись

Строка

Путь к файлу слоя (.lyr), используемый для отображения выходных данных.

message

Только для чтения

Строка

Сообщение, показываемое пользователю. См. SetErrorMessage и SetWarningMessage выше.

Свойства объекта Параметр

parameterDependencies

Как правило, вы устанавливаете набор зависимостей параметра для использования объектом Schema. Существуют два случая, когда зависимость уже может быть установлена в методе getParameterInfo инструмента.

  • Для параметра выходного набора данных, тип которого Производный (Derived), зависимостью является индекс параметра, из которого извлекаются выходные данные.
  • Для определенных типов входных данных, зависимостью является индекс параметра, содержащий информацию, используемую элементом управления, как показано в таблице ниже.

Тип входных данных

Зависимый тип данных

Описание

Поле или выражение SQL

Таблица

Таблица, содержащая поля.

Элемент INFO или выражение INFO

Таблица INFO

Таблица INFO, содержащая элементы.

Класс пространственных объектов покрытия

Покрытие

Покрытие, содержащее пространственные объекты.

Единицы площади и длины

Набор геоданных (GeoDataset)

Географический набор данных, используемый для определения единиц измерения по умолчанию.

Система координат

Рабочая область (Workspace)

Рабочая область, использованная для определения системы координат по умолчанию.

Настройки иерархии Network Analyst

Набор сетевых данных (Network Dataset)

Набор сетевых данных, содержащий информацию об иерархии.

Таблица геостатистических значений

Геостатистический слой

Слой сетевого анализа, содержащий таблицы.

Полученный из типов данных

Зависимость обычно устанавливается в методе getParameterInfo:

def getParameterInfo(self):
    #Define parameter definitions

    # First parameter
    param0 = arcpy.Parameter(
        displayName="Input Features",
        name="in_features",
        datatype="GPFeatureLayer",
        parameterType="Required",
        direction="Input")

    # Second parameter
    param1 = arcpy.Parameter(
        displayName="Sinuosity Field",
        name="sinuosity_field",
        datatype="Field",
        parameterType="Optional",
        direction="Input")
    param1.value = "sinuosity"

    # Third parameter
    param2 = arcpy.Parameter(
        displayName="Output Features",
        name="out_features",
        datatype="GPFeatureLayer",
        parameterType="Derived",
        direction="Output")
    param2.parameterDependencies = [param0.name]
    param2.schema.clone = True

    params = [param0, param1, param2]

    return params

value

Это значение параметра, которое ввел пользователь, или которое было задано вами программно. Вы можете установить значение в методе getParameterInfo, и в этом случае оно выступит в качестве начального значения параметра по умолчанию. Вы также можете установить значение в updateParameters в ответ на ввод значения пользователем, как показано ниже.

def updateParameters(self, parameters):
    # Set the default distance threshold to 1/100 of the larger of the width
    #  or height of the extent of the input features.  Do not set if there is no 
    #  input dataset yet, or the user has set a specific distance (Altered is true).
    #
    if parameters[0].value:
        if not parameters[6].altered:
            extent = arcpy.Describe(parameters[0].value).extent
        if extent.width > extent.height:
            parameters[6].value = extent.width / 100
        else:
            parameters[6].value = extent.height / 100

    return
ПримечаниеПримечание:

Список параметров начинается с нуля, поэтому первый параметр идет на нулевом месте в списке. Для обращения к третьему параметру необходимо использовать parameters[2].

Не устанавливайте значение параметра updateMessages, пока оно не будет проверено внутренней подпрограммой.

Значение - это объект, который имеет строковое представление. Фрагмент кода ниже тестирует, является ли значение идентичным строке "лучить Пространственные веса из Файлов ("Get Spatial Weights From File"). Данный тест работает, поскольку тип данных параметра является строковым.

# If the option to use a weights file is selected, enable the 
#   parameter for specifying the file, otherwise disable it
#
if parameters[3].value == "Get Spatial Weights From File":
    parameters[8].enabled = True
else:
    parameters[8].enabled = False

Тест в коде, показанном выше, не будет работать, если тип данных параметра будет классом объектов, или любым значением, представляющим набор данных. Значения, которые представляют данные на диске, такие как классы объектов и растры, необходимо конвертировать в строковые, перед выполнением строковых операций. Встроенная функция Python - str - конвертирует объекты значений в строке, как показано далее:

if str(parameters[0].value) == "E:/data/example.gdb/roads":

Вам нужно использовать функцию str только для значений с типом данных, представляющим наборы данных. Для этих типов значений функция str возвращает путь к каталогу, содержащему набор данных. Вам не нужно использовать данную функцию для других типов данных, таких как long или линейные единицы измерения, поскольку эти типы данных не представляют собой наборы данных, и автоматически конвертируются в строки.

ВниманиеВнимание:

При работе с функцией Describe в updateParameters никогда не используйте символьное представление значения.

Неправильно

desc = arcpy.Describe(str(parameters[0].value))

Правильно

desc = arcpy.Describe(parameters[0].value)

Вы не должны использовать строковые представления для наборов данных (что даст путь к каталогу с набором данных), поскольку набор данных может не существовать - он может быть переменной модели, а модель необходимо запустить перед тем, как набор данных будет создан на диске. Если вы используете строковое представление для набора данных, Описать (Describe) может выдать ошибку, поскольку данный набор данных может еще не существовать на диске.

ВниманиеВнимание:

Не используйте функции ArcPy, берущие путь к каталогу, такие как ListFields, в методах проверки. Набор данных может не существовать, когда проверка инструмента осуществляется в ModelBuilder, и метод может дать сбой. (В случае с Список Полей (ListFields), можно использовать свойство Описать (Describe) объекта поля (fields) .)

Когда вы тестируете строки на идентичность, то необходимо использовать сравнения, нечувствительные к регистру. Код, приведенный ниже, показывает использование функции Python lower для получения типа геометрии класса объектов строчными буквами и сравнения двух строк из строчных букв. (Или вы можете использовать функцию upper для сравнения строк из прописных букв.)

fc = parameters[0].value
shapetype = arcpy.Describe(fc).shapeType.lower()
if shapetype in ["point", "multipoint"]:

altered

altered возвращает исходное значение, если пользователь изменил значение параметра - например, вводом пути к выходным данным. Если параметр был изменен, то он остается измененным, пока пользователь не очистит (не сотрет) значение, в этом случае оно вернется к изначальному неизмененному значению. Изменение значения программным способом с проверкой кода не повлияет на измененный статус. То есть, если вы установите значение для параметра, измененный статус параметра не изменится.

altered используется, чтобы определить, можете ли вы изменить значение параметра. Например, предположим, что у инструмента есть параметр класс объектов и параметр ключевое слово. Если класс объектов содержит точки или полигоны, то ключевыми словами будут Красный (RED), Зеленый (GREEN), и Синий (BLUE), а если линии - то Оранжевый (ORANGE), Желтый (YELLOW), Фиолетовый (PURPLE), и Белый (WHITE).

Предположим, пользователь вводит точечный класс объектов. Если параметр ключевое слово не изменен, вы устанавливаете значение на RED, поскольку оно является значением по умолчанию.

Если вводится линейный класс объектов, вы устанавливаете значение на ORANGE, поскольку параметр ключевое слово не изменен.

Однако, если параметр ключевое слово был изменен пользователем (например, ключевое слово установлено на GREEN), вы не должны менять обратно ключевое слово - пользователь сделал свой выбор (GREEN) и вы не знаете его целей, он мог поменять класс объектов и тогда GREEN будет корректным значением, или он мог поменять ключевое слово (на PURPLE, например). Поскольку GREEN не входит в набор ключевых слов, которые вы создали для линий, внутренняя проверка установит на параметре отметку ошибки. У пользователя будет два варианта действий - изменить входной класс объектов или изменить ключевое слово.

if not parameters[2].altered:
    parameters[2].value = "POINT"

hasBeenValidated

Свойство hasBeenValidated имеет значение false, если значение параметра было изменено пользователем с момента последнего вызова метода updateParameters и внутренней проверки. После вызова внутренней процедуры проверки, процедура геообработки автоматически устанавливает для Проверено (hasBeenValidated) исходное значение для каждого параметра.

hasBeenValidated используется для определения, изменял ли пользователь значение с момента последнего запуска updateParameters. Эта информация необходима при решении вопроса о необходимости проверки параметра.

def updateParameters(self, parameters):
    # Set the default distance threshold to 1/100 of the larger of the width
    #  or height of the extent of the input features.  Do not set if there is no 
    #  input dataset yet, or the user has set a specific distance (Altered is true).
    #
    if parameters[0].value:
        if not parameters[6].altered:
            extent = arcpy.Describe(parameters[0].value).extent
        if extent.width > extent.height:
            parameters[6].value = extent.width / 100
        else:
            parameters[6].value = extent.height / 100

    return

Связанные темы

9/10/2013