Проверка – все,что происходит до нажатия кнопки OK. При создании собственных инструментов проверка позволяет провести настройку реакции параметров, а также их взаимодействия со своими значениями и друг с другом. Проверка производится при помощи блока кода Python, контролирующего поведение инструмента.
Подробнее о проверке значений вы можете узнать в разделе Понятие проверки в инструментах-скриптах.
В наборе инструментов Python каждый параметр инструмента имеет связанный с ним объект Parameter со свойствами и методами, которые могут использоваться для проверки параметров инструмента. В наборе инструментов Python параметры определяются методом getParameterInfo класса инструмента. Поведение этих параметров и способ их взаимодействия друг с другом и входными данными проверяется в соответствии с методом updateParameters класса инструментов.
Доступ к параметрам инструмента
Объекты 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, если инструмент был проверен внутри Модели и его входное значение является выходным значением другого инструмента данной модели. |
Свойства
Имя свойства | Чтение/запись | Значения | Описание |
---|---|---|---|
name | Только для чтения | Строковое | Имя параметра |
direction | Только для чтения | String: "Input", "Output" | Входное/выходное направление параметра. |
datatype | Только для чтения | Строковое | Список типов данных параметров приведен в разделе Определение типов данных параметров в наборах инструментов Python. |
parameterType | Только для чтения | String: "Required" (Обязательный), "Optional" (Дополнительный), "Derived" (Производный) | Тип параметра. |
parameterDependencies | Чтение/запись | Список Python | Список индексов каждого зависимого параметра. |
value | Чтение/запись | Объект Value (Значение) | Значение параметра. |
defaultEnvironmentName | Только для чтения | Строковое | Значение параметра среды по умолчанию. |
enabled | Чтение/запись | Булево | False, если параметр недоступен. |
altered | Только для чтения | Булево | True (Истина), если пользователь изменил значение. |
hasBeenValidated | Только для чтения | Булево | True, если параметр был проверен внутренней процедурой проверки. |
category | Чтение/запись | Строковое | Категория параметра. |
schema | Только для чтения | Объект Schema | Схема выходного набора данных. |
filter | Только для чтения | Объект Filter | Фильтр, который применяется к значениям параметра. |
symbology | Чтение/запись | Строковое | Путь к файлу слоя (.lyr), используемому для отображения выходных данных. |
message | Только для чтения | Строковое | Сообщение, показываемое пользователю. См. методы SetErrorMessage и SetWarningMessage выше. |
parameterDependencies
Как правило, вы устанавливаете набор зависимостей параметра для использования объектом Schema. Существуют два случая, когда зависимость уже может быть установлена в методе getParameterInfo инструмента.
- Для параметра выходного набора данных, тип которого Производный (Derived), зависимостью является индекс параметра, из которого извлекаются выходные данные.
- Для определенных типов входных данных, зависимостью является индекс параметра, содержащий информацию, используемую элементом управления, как показано в таблице ниже.
Тип входных данных | Зависимый тип данных | Описание |
---|---|---|
Поле или выражение SQL | Таблица | Таблица, содержащая поля. |
Элемент INFO или выражение INFO | Таблица INFO | Таблица INFO, содержащая элементы. |
Класс объектов покрытия | Покрытие | Покрытие, содержащее пространственные объекты. |
Единицы площади и длины | Набор геоданных | Географический набор данных, используемый для определения единиц измерения по умолчанию. |
Система координат | Рабочая область | Рабочая область, использованная для определения системы координат по умолчанию. |
Настройки иерархии Network Analyst | Набор сетевых данных | Набор сетевых данных, содержащий информацию об иерархии. |
Таблица геостатистических значений | Геостатистический слой | Слой сетевого анализа, содержащий таблицы. |
Зависимости обычно устанавливаются в методе 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
Свойство value параметра возвращает объект, кроме случая, когда параметр не заполнен, в этом случае value возвращает значение None. Чтобы предотвратить ситуацию, когда параметр не заполнен, используйте проверку if перед использованием его значения.
Фрагмент кода ниже тестирует, является ли значение идентичным строке "лучить Пространственные веса из Файлов ("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: # check that parameter has a value
if parameters[3].value == "Get Spatial Weights From File":
parameters[8].enabled = True
else:
parameters[8].enabled = False
Объект Значение (Value) не поддерживает операции со строками, если вам необходимо работать со строкой или обрабатывать строки, используйте свойство value объекта Значение (Value). Пример кода использует метод os.path.dirname, чтобы вернуть директорию для набора данных.
if parameters[0].value:
workspace = os.path.dirname(parameters[0].value.value)
altered
altered равно true, если изменено значение параметра, например, путем ввода выходного пути. Если параметр был изменен, то он остается измененным, пока пользователь не очистит (не сотрет) значение, в этом случае оно вернется к изначальному неизмененному значению. Изменение значения программным способом с проверкой кода будет влиять на измененный статус. То есть, если вы установите значение для параметра, измененный статус параметра будет обновляться.
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 равным True для каждого параметра.
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