Класс ToolValidator

Для общего обзора класса ToolValidator и использования методов параметров, см. раздел Настройка поведения инструмента-скрипта.

Объект Parameter

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

Каждый параметр инструмента имеет связанный с ним объект параметра, у которого есть свойства и методы для проверки корректности параметров инструмента. Параметры содержатся в списке . Обычной практикой является создание списка параметров в классе ToolValidator метода __init__, как показано в приведенном ниже программном коде.

def __init__(self):
    self.params = arcpy.GetParameterInfo()

Вы также можете управлять параметрами в своем скрипте (как альтернатива классу ToolValidator), как показано ниже. Единственная причина для доступа к списку параметров внутри скрипта – это задание свойства symbology.

params = arcpy.GetParameterInfo()

Порядок следования параметров

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

Параметры и их порядок
Примечание:

Список параметров начинается с нуля, поэтому первый параметр идет на нулевом месте в списке. Для доступа к третьему параметру вам нужно ввести p3 = self.params[2].

Методы

Имя методаОписание использования

setErrorMessage(message)

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

setWarningMessage(message)

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

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

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

clearMessage()

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

hasError()

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

hasWarning()

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

isInputValueDerived()

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

Методы объекта Parameter

Свойства

Имя свойстваЧтение/ЗаписьЗначениеОписание

name

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

Строка

Имя параметра, заданное на вкладке Параметры в свойствах инструмента.

direction

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

Строка

  • Input
  • Output

Направление параметра Вход или Выход, заданное на вкладке Параметры в свойствах инструмента.

datatype

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

Строка

Тип данных, заданный на вкладке Параметры в свойствах инструмента.

parameterType

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

Строка

  • Required
  • Optional
  • Derived

Тип параметра, заданный на вкладке Параметры в свойствах инструмента.

parameterDependencies

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

Список

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

value

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

Объект Value

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

defaultEnvironmentName

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

Строка

Настройка переменной среды по умолчанию, как задано на вкладке Параметры в свойствах инструмента.

enabled

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

Boolean

Указывает, является ли параметр недоступным

altered

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

Boolean

Указывает, изменил ли пользователь значение.

hasBeenValidated

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

Boolean

Определяет, были ли параметр проверен программой внутренней проверки.

category

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

Строка

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

schema

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

Объект Schema

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

filter

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

Объект Filter

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

filters

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

Список объектов Filter

Фильтры, которые будут применены к столбцам в параметре таблицы значений или к нескольким типам данных в составном параметре. Дополнительные сведения см. в справке по объекту Parameter.

symbology

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

Строка

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

message

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

Строка

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

Свойства объекта Parameter

Хотя многие свойства объекта Parameter доступны для чтения и записи, большинство из них можно задать или изменить только при первоначальном создании или изменении объекта. Некоторые свойства, включая name, displayName, datatype, direction и parameterType, устанавливают характеристики инструмента и не могут быть изменены во время проверки (например, updateMessages и updateParameters).

Некоторые примеры кодов показаны ниже. Для получения других примеров кодов, см. раздел Настройка поведения инструмента-скрипта.

Сравнение свойств ToolValidator со свойствами инструментов-скриптов

Можно задать значение параметра по умолчанию, фильтр, символ и зависимости на вкладке Параметры в диалоговом окне свойств инструмента-скрипта и в классе ToolValidator.

Свойства, которые вы установите в классе ToolValidator, всегда будут заменять собой те значения, которые были заданы в диалоговом окне свойств инструмента-скрипта, и обычно предоставляют дополнительные возможности настройки. Например, если вы установили значение по умолчанию для параметра равным "BLUE" в диалоговом окне свойств инструмента-скрипта, и переустановили его на "RED" в initializeParameters, значением по умолчанию станет "RED". Как только был вызван метод initializeParameters, диалоговое окно свойств инструмента-скрипта будет отображать "RED" в качестве значения по умолчанию. Если вы (или ваши пользователи) попадете в ситуацию, когда сделанные изменения для одного из этих четырех свойств параметра в диалоговом окне свойств скрипта не сохраняются, это может быть связано с тем, что свойство было переопределено в классе ToolValidator.

parameterDependencies

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

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

Тип данных параметраТип данных зависимого параметра

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

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

Например, можно использовать тип данных Векторный слой, Растровый слой, Набор объектов или Набор записей.

Поле

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

Например, можно использовать тип данных Вид таблицы, Векторный слой, Растровый слой, Набор объектов или Набор записей.

Сопоставление полей

Набор полей в одной или более входных таблицах.

Например, можно использовать тип данных Вид таблицы, Векторный слой, Растровый слой, Набор объектов или Набор записей.

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

Таблица наборов данных и полей, используемых в инструментах Geostatistical Analyst.

Используйте тип данных Геостатистический слой.

Линейные единицы измерения

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

Например, можно использовать тип данных Векторный слой, Растровый слой, Набор объектов или Набор записей.

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

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

Используйте тип данных Набор сетевых данных.

Режим передвижения по сети

Список режимов передвижения.

Используйте тип данных Источник сетевых данных, Набор сетевых данных или Слой набора сетевых данных.

Выражение SQL

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

Например, можно использовать тип данных Вид таблицы, Векторный слой, Растровый слой, Набор объектов или Набор записей.

Типы данных для свойстваЗависимость

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


def initializeParameters(self):
    # Set the dependencies for the output and its schema properties
    self.params[2].parameterDependencies = [0, 1]

parameterType

Свойство parameterType может быть обязательным, необязательным и производным.

  • Обязательное — значение необходимо для запуска инструмента.
  • Необязательное — значение не является необходимым для запуска инструмента.
  • Производное — выходное значение, которое не указано в качестве входного параметра. Производные параметры всегда являются выходными параметрами.

При проверке значение parameterType не может быть динамически изменено. Однако это может быть необходимо для параметра, чтобы он вел себя как обязательный или дополнительный в зависимости от других настроек параметра В этом случае установите параметр как дополнительный. Затем в методе проверки updateMessages используйте метод Parameter setIDMessage с идентификатором сообщения 530 или 735. Использование идентификатора сообщения 530 или 735 приводит к тому, что необязательный параметр ведет себя как обязательный параметр.


# Force a parameter to be required using setIDMessage, if the preceding 
# parameter does not have a value.
if not self.params[4].valueAsText:
    self.params[5].setIDMessage('ERROR', 735)

value

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


def updateParameters(self):
    # 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 self.params[0].valueAsText:
        if not self.params[6].altered:
            extent = arcpy.Describe(self.params[0]).extent
        if extent.width > extent.height:
            self.params[6].value = extent.width / 100
        else:
            self.params[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 self.params[3].value:  # check that parameter has a value
    if self.params[3].value == "Get Spatial Weights From File":
        self.params[8].enabled = True
    else:
        self.params[8].enabled = False

Поскольку объект Value не поддерживает манипуляции со строками, используйте свойство значения объекта Value всякий раз, когда требуется обработать или проанализировать строку. Пример кода ниже использует метод os.path.dirname, чтобы вернуть директорию для набора данных.


if self.params[0].value:
    workspace = os.path.dirname(self.params[0].value.value)
Внимание:

За исключением метода Describe, не используйте для проверки методы, берущие путь к каталогу, такие как ListFields. Набор данных может не существовать, когда проверка инструмента осуществляется в ModelBuilder, и метод может дать сбой или выдать непредсказуемый результат.

Describe можно использовать для объекта Parameter вместо использования свойства value параметра. Использование свойства value возможно, но оно будет работать медленнее при работе со входными слоями.

В конкретном случае метода ListFields, Describe свойство объекта fields предоставит эквивалентную информацию.

Внимание:

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

altered

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

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

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

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

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

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

hasBeenValidated

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

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


# 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 if the input features have already been validated,
#  or the user has set a specific distance (Altered is true).
if self.params[0].valueAsText and not self.params[0].hasBeenValidated:
    if not self.params[6].altered: 
        extent = arcpy.Describe(self.params[0]).extent
        width = extent.width
        height = extent.height
        if width > height:
            self.params[6].value = width / 100
        else:
            self.params[6].value = height / 100

category

Параметры могут быть сгруппированы в категории на панели Геообработка, чтобы минимизировать размер параметров, или в связанные с группой параметры, которые будут редко использоваться. Несколько инструментов Расширение ArcGIS Network Analyst используют категории как показано ниже.

Категории параметров

Поскольку вы можете задать категорию только один раз, задайте ее в initializeParameters. Задание категорий в updateParameters не даст никакого эффекта. Код, приведенный ниже, показывает размещение параметров 4 и 5 в категории Options, и параметров 6 и 7 в категории Advanced.

def initializeParameters(self):
    self.params[4].category = "Options"
    self.params[5].category = "Options"
    self.params[6].category = "Advanced"
    self.params[7].category = "Advanced"

Категории всегда идут после параметров, не помещенных в категорию. Не распределяйте обязательные параметры по категориям, поскольку пользователь может не увидеть их на панели Геообработка.

symbology

Свойство symbology связывает файл слоя (.lyrx) с выходным параметром.

params[2].symbology = "E:/tools/extraction/ToolData/ClassByDist.lyrx"

Более подробно о выходных символах

schema object

У каждого выходного параметра следующих типов: класс пространственных объектов, таблица, растр или рабочая область – есть объект схемы. Только у выходных классов пространственных объектов, таблиц, растров и рабочих областей есть объект схемы; у других типов его нет. Объект схемы создается автоматически процессом геообработки. К схеме осуществляется доступ через объект 'параметр', и устанавливаются правила для описания выходных данных инструмента. После установки правил схемы и в качестве выходного результата класса ToolValidator, код внутренней проверки геообработки анализирует эти правила и обновляет описание выходных данных.

Для проверки, настройка заключается в следующем:

  1. Во время первого открытия инструмента на панели Геообработка вызывается initializeParameters. Для описания выходных данных устанавливаются статические правила (правила, которые не изменяются вводимыми пользователем данными). На этом этапе не создается описания на выходе, так как пользователь не указал значения ни для одного из параметров (если вы не задали значений по умолчанию).
  2. Как только пользователь начинает как-либо работать с инструментом на панели Геообработка, происходит вызов updateParameters.
  3. updateParameters может изменить объект схемы с учетом динамического поведения, которое нельзя установить с помощью параметрических зависимостей (например, добавление нового поля с помощью Добавить поле).
  4. После возврата из updateParameters запускаются подпрограммы внутренней проверки, а правила, найденные в объекте схемы, применяются для обновления описания выходных данных.
  5. Затем происходит вызов updateMessages. Вы можете изучить предупреждения и сообщения об ошибках, которые выводятся внутренней процедурой оценки, и изменить их или добавить пользовательские предупреждения или сообщения об ошибках.

Все свойства schema доступны для чтения и записи, за исключением type, которое доступно только для чтения.

Имя свойстваЗначение

type

String: "Feature", "Table", "Raster" , "Container" (для рабочих областей и наборов данных объектов)

clone

Boolean

featureTypeRule

String: "AsSpecified", "FirstDependency"

featureType

String: "Simple", "Annotation", "Dimension"

geometryTypeRule

String: "Unknown", "FirstDependency", "Min", "Max", "AsSpecified"

geometryType

String: "Point", "Multipoint", "Polyline", "Polygon"

extentRule

String: "AsSpecified", "FirstDependency", "Intersection", "Union", "Environment"

extent

Объект Extent

fieldsRule

String: "None", "FirstDependency", "FirstDependencyFIDs", "All", "AllNoFIDs", "AllFIDsOnly"

additionalFields

Список объектов Field

cellSizeRule

String: "AsSpecified", "FirstDependency", "Min", "Max", "Environment"

cellSize

Double

rasterRule

String: "FirstDependency", "Min", "Max", "Integer", "Float"

rasterFormatRule

String: "Img", "Grid"

additionalChildren

Список наборов данных для добавления в схему рабочей области

Свойства объекта Схема (Schema)

Используйте FirstDependency

Некоторые из правил могут быть установлены на "FirstDependency", что означает, что будет использовано значение первого параметра, найденного в наборе массива зависимостей параметров, заданного с помощью parameter.parameterDependencies. В примере кода, приведенном ниже, параметр 2 имеет два зависимых параметра, 0 и 1, и первой зависимостью является параметр 0.


# Set the dependencies for the output and its schema properties
self.params[2].parameterDependencies = [0, 1]

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

тип

Свойство type доступно только для чтения, и устанавливается процессом геообработки.

clone

При истинном значении процедура геообработки создаст точную копию (клон) описания в первом зависимом параметре. Значение по умолчанию – false. Обычно вы устанавливаете параметр clone равным True (истина) в методе initializeParameters. Если первый зависимый параметр является многозначным (список значений), клонируется первое значение в многозначном списке значений.

  • Если parameter.parameterType равен "Производный", будет создана точная копия. Это было поведение инструмента Добавить поле.
  • Если значением parameter.parameterType является "Обязательный", то будет создана точная копия, но путь к каталогу, содержащему набор данных, будет изменен. Пути каталога состоят из двух частей: рабочая область и базовое имя, например E:/Data/TestData/netcity.gdb/infrastructure/roads.

    • Рабочая область = E:/Data/TestData/netcity.gdb/infrastructure
    • Исходное имя = roads
    Правила, используемые для создания новых выходных имен, следующие:
    • Базовое имя является тем же, что и базовое имя для первого входного параметра, содержащего набор данных (не первой зависимости, но первого параметра), с добавленным именем инструмента-скрипта (например, roads_MyTool).
    • Рабочей области присвоены настройки параметров среды временной рабочей области. Если она пустая, то используются настройки параметров среды текущей рабочей области. Если она также пуста, то используется рабочая область первого входного параметра, содержащего набор данных. Если рабочая область установлена только на чтение, то используется системная временная директория.

После установки clone на true все методы, основанные на правилах, такие как featureTypeRule, geometryTypeRule и extentRule, устанавливаются на значение "FirstDependency".

Два примера кода ниже выполняют одинаковую работу. Оба примера основаны на том, как инструмент Вырезать создает выходную схему.

Пример 1: Явная установка всех правил

def initializeParameters(self):
    # Set the dependencies for the output and its schema properties
    #  The two input parameters are feature classes.
    self.params[2].parameterDependencies = [0, 1]

    # Feature type, geometry type, and fields all come from the first 
    #  dependency (parameter 0), the input features
    self.params[2].schema.featureTypeRule = "FirstDependency"
    self.params[2].schema.geometryTypeRule = "FirstDependency"
    self.params[2].schema.fieldsRule = "FirstDependency"

    # The extent of the output is the intersection of the input features 
    #  and the clip features (parameter 1)
    self.params[2].schema.extentRule = "Intersection"

    return
Пример 2: Использование clone для установки правил на FirstDependency и дальнейшее переопределение правила экстента

def initializeParameters(self):
    # Set the dependencies for the output and its schema properties
    #  The two input parameters are feature classes.
    self.params[2].parameterDependencies = [0, 1]
    self.params[2].schema.clone = True
    return
    
def updateParameters(self):
    # The only property of the clone that changes is that the extent 
    #  of the output is the intersection of the input features 
    #  and the clip features (parameter 1)
    self.params[2].schema.extentRule = "Intersection"
    return

featureTypeRule

Этот параметр определяет тип объекта выходного класса объектов. Это правило не влияет на выходные растровые данные или таблицы.

ЗначениеОписание

"AsSpecified"

Тип объекта будет определяться свойством featureType.

"FirstDependency"

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

Значения featureTypeRule

featureType

Если значением featureTypeRule является "AsSpecified", то значение в featureType используется для указания типа объекта выходных данных.

ЗначениеОписание

"Simple"

Выходные данные будут содержать простые объекты. Тип геометрии объектов указывается с помощью geometryTypeRule.

"Annotation"

Выходные данные будут содержать объекты аннотаций.

"Dimension"

Выходные данные будут содержать объекты размеров.

Значения featureType

geometryTypeRule

Этот параметр определяет тип геометрии (например, точка или полигон) выходного класса объектов.

ЗначениеОписание

"Unknown"

Это установка по умолчанию. Обычно вы должны иметь возможность определить тип геометрии в updateParameters на основе значений других параметров. Вам только нужно установить правило на "Unknown", если у вас нет достаточной информации для определения типа геометрии.

"FirstDependency"

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

"Min", "Max"

Проверяются геометрии всех зависимых параметров и устанавливается тип выходной геометрии на минимальный или максимальный найденный тип. "Min" и "Max" пределяются следующим образом:

  • Точка или мультиточка = 0
  • Полилиния = 1
  • Полигон = 2
Например, если зависимые параметры являются точечным или полигональным классом объектов, минимальным будет точка, и максимальным – полигон.

"AsSpecified"

Тип геометрии будет определен значением свойства geometryType.

Значения geometryTypeRule

geometryType

Установите это значение для типа геометрии ("Point", "Multipoint", "Polyline" или "Polygon") когда geometryTypeRule равно "AsSpecified".

extentRule

ЗначениеОписание

"AsSpecified"

Выходной экстент будет указан в свойстве extent.

"FirstDependency"

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

"Intersection"

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

"Union"

Выходным экстентом будет геометрическое объединение всех влияющих параметров.

"Environment"

Выходной экстент будет вычислен на основе настроек Параметров среды экстента.

Значения extentRule

Пример


# The extent of the output is the intersection of the input features 
#  and the clip features (the dependent parameters)
self.params[2].schema.extentRule = "Intersection"

extent

Установите это для экстента, когда extentRule является "AsSpecified". Можно задать экстент в виде строки, разделенной пробелами, или списка с четырьмя значениями. Последовательность такова: xmin, ymin, xmax, ymax.

Пример

self.params[2].schema.extentRule = "AsSpecified"

self.params[2].schema.extent = "123.32 435.8 987.3 567.9"
# Alternatively use a list, as follows:
# self.params[2].schema.extent = [123.32, 435.8, 987.3, 567.9]

fieldsRule

fieldsRule определяет, какие поля будут у выходного класса объектов или таблицы.

В таблице, приведенной ниже, FID означает Feature ID, но реально связано с полем ObjectID в каждом классе объектов или таблице.

ЗначениеОписание

"None"

Никакие поля, кроме ObjectID, выводиться не будут.

"FirstDependency"

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

"FirstDependencyFIDs"

Только ObjectID первого зависимого входного параметра будет записан в выходные данные.

"All"

Выводятся все поля в списке зависимых параметров.

"AllNoFIDs"

Все поля, кроме поля ObjectID, будут записаны в выходной файл.

"AllFIDsOnly"

Выводятся все поля ObjectID, но другие поля из входных параметров не записываются.

Значения fieldsRule

Ниже приведен пример инструмента Вырезать, использующего fieldsRule из "FirstDependency":


  def initializeParameters(self):
    # Set the dependencies for the output and its schema properties
    #  The two input parameters are feature classes.
    self.params[2].parameterDependencies = [0, 1]

    # Feature type, geometry type, and fields all come from the first 
    #  dependency (parameter 0), the input features
    self.params[2].schema.featureTypeRule = "FirstDependency"
    self.params[2].schema.geometryTypeRule = "FirstDependency"
    self.params[2].schema.fieldsRule = "FirstDependency"

    # The extent of the output is the intersection of the input features 
    #  and the clip features (parameter 1)
    self.params[2].schema.extentRule = "Intersection"

    return

additionalFields

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

cellSizeRule

Это определяет размер ячейки выходных растров или гридов.

ЗначениеОписание

"AsSpecified"

Размер выходной ячейки указан в свойстве cellSize.

"FirstDependency"

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

"Min", "Max"

"Min" означает, что размер выходной ячейки является наименьшим размером ячейки у зависимых параметров. "Max" означает, что берется наибольший размер ячейки у зависимых параметров.

"Environment"

Размер выходной ячейки рассчитывается на основе параметра среды Размер ячейки.

Значения cellSizeRule

cellSize

Установите для него значение размера ячейки, которое будет использоваться, когда cellSizeRule равно "AsSpecified".

rasterRule

Определяет тип данных (integer или float) в выходных растровых данных.

ЗначениеОписание

"FirstDependency"

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

"Min", "Max"

Целое число считается меньшим, чем число с плавающей точкой. Например, если есть два зависимых параметра, один содержит целочисленные значения, а второй – числа с плавающей точкой, "Min" выдаст выходные значения как целочисленные, а "Max" – как числа с плавающей точкой.

"Integer"

Выходной растр содержит целочисленные значения.

"Float"

Выходной растр содержит значения – числа с плавающей точкой.

Значения rasterRule

rasterFormatRule

Это определяет формат выходного растра: "Grid" или "Img". По умолчанию значением является "Img", это формат ERDAS IMAGINE. "Grid" - это формат Esri.

additionalChildren

Рабочая область является контейнером для наборов данных (объектов, таблиц и растров). Эти наборы данных являются дочерними для рабочей области (вы можете считать рабочую область родителем по отношению к ним). Если инструмент добавляет набор данных к новой или существующей рабочей области, вы можете обновить описание рабочей области, добавив описания дочерних объектов. Например, вы можете использовать инструмент, который получает список классов объектов (многозначный элемент), обновляет их некоторым способом, и затем записывает измененные классы объектов в существующую рабочую область. Если инструмент используется в ModelBuilder, рабочая область является выходным результатом инструмента, и вы можете использовать эту рабочую область в качестве входного параметра для инструмента Выбрать данные. ВыбратьДанные позволяет вам выбрать дочерний набор данных из контейнера и использовать его, как входной параметр для другого инструмента.

Входной параметр для additionalChildren – это одно или более описаний дочерних элементов. Существует две формы описания дочерних элементов:

ФормаОписание

Объект value

Значение класс объектов, таблица, растр, объект-размер или объект аннотации, как результат свойства value.

Объект списка в форме [type, name, fields, extent, spatial reference]

Список, содержащий добавляемое описание к дочерним элементам Необходимы только первые два элемента списка, type и name. Остальные аргументы являются необязательными.

Список участников для additionalChildren

При добавлении более одного дочернего элемента предоставьте список описаний дочерних элементов. Если вы добавляете дочерний элемент в форму списка, создайте список списков для additionalChildren.

Форма списка имеет 5 аргументов, как описано в следующей таблице.

АргументТипОписание

type

Обязательный

Одно из следующих значений: "Point", "Multipoint", "Polyline", "Polygon", "Table", "Raster", "Annotation", "Dimension"

name

Обязательный

Название набора данных. Это может быть базовое имя набора данных (streets) или полный путь к каталогу (E:\mydata\test.gdb\infrastructure\streets). Если предоставлен полный путь к каталогу, игнорируется все, кроме базового имени ("улицы (streets)").

fields

Дополнительный

Список объектов поля. Содержит поля, принадлежащие дочернему элементу, если они известны.

extent

Дополнительный

Строка или список , содержащие пространственный экстент для дочернего элемента.

spatial reference

Дополнительный

Объект пространственной привязки.

Содержание списка дочерних элементов

Данные аргументы должны быть приведены в указанном порядке. Чтобы пропустить необязательный аргумент, используйте None или '#'.

Ниже приведены примеры задания схемы рабочей области. Эти примеры основаны на инструменте-скрипте, который имеет следующие аргументы:

Индекс параметраИмя параметраСвойство

0

Входной класс пространственных объектов

Класс объектов – входной.

1

Входная таблица

Таблица – входная.

2

Входная рабочая область

Рабочая область – входная (существующая рабочая область, содержащая результаты применения инструмента).

3

Извлеченная рабочая область

Рабочая область – Извлеченный выходной результат, полученный из Входной рабочей области. Схема данной рабочей области была изменена, чтобы содержать дополнительные дочерние элементы.

Параметры инструмента в примере

Инструмент получает входные класс объектов и таблицу, копирует оба элемента в рабочую область, добавляет новое поле в класс объектов и создает класс полигональных объектов в рабочей области. (Фактическая работа инструмента не важна, поскольку она служит только для иллюстрации настройки схемы рабочей области.) Приведенные ниже примеры кода основываются друг на друге, начиная с простого использования additionalChildren.

В initializeParameters выходная рабочая область клонируется из зависимого параметра (parameter 2). Эта зависимость задана в свойствах инструмента, но может быть также установлена в initializeParameters для предотвращения случайного удаления зависимости из свойств инструмента.

class ToolValidator:
    def __init__(self):
        self.params = arcpy.GetParameterInfo()

    def initializeParameters(self):
        self.params[3].parameterDependencies = [2]  # input workspace
        self.params[3].schema.clone = True  # Copy all existing contents to output
        return
Пример: Скопируйте два входных элемента (без изменений) в выходную рабочую область

def updateParameters(self):
    inFC = self.params[0].value  # input feature class
    inTable = self.params[1].value  # input table
    inWS = self.params[2].value  # input workspace
    if inFC and inTable and inWS:
        self.params[3].schema.additionalChildren = [inFC, inTable]
    return
Пример: Инструмент создает класс полигональных объектов.

Единственные известные свойства для этого нового класса объектов (при проверке) – это имя ("SummaryPolygon") и тип ("polygon").


children = []  # New empty list
children.append(inFC)
children.append(inTable)
children.append(["polygon", "SummaryPolygon"])
self.params[3].schema.additionalChildren = children
Пример: Добавьте поле во входной класс объектов

# Create a field object with the name "Category" and type "Long".
newField = arcpy.Field()
newField.name = "Category"
newField.type = "Long"

# Describe the input feature class in order to get its list of fields. The 9.3
# version of the geoprocessing object returns fields in a list, unlike previous 
# versions, which returned fields in an enumerator.
desc = arcpy.Describe(inFC)
fieldList = desc.fields

# Add the new field to the list
fieldList.append(newField)

# Create a new child based on the input feature class, but with the 
# additional field added.
newChild = [desc.shapeType, desc.catalogPath, fieldList,
            desc.extent, desc.spatialReference]

# Now create our list of children and add to the schema.
children = []
children.append(newChild)
children.append(inTable)
children.append(["polygon", "SummaryPolygon"])
self.params[3].schema.additionalChildren = children

Чтобы создать поля для класса SummaryPolygon (новый полигональный класс объектов), создайте список объектов полей по образцу, приведенному в примере выше.

Пример: Ввод множества значений

В этом примере, первый параметр является объектом со множеством значений из классов объектов. Каждый класс объектов из множественного объекта копируется в извлеченную рабочую область. Новое поле ProjectID добавляется к каждому из скопированных классов объектов.


# 0 - input features (multivalue)
# 1 - input workspace
# 2 - derived workspace

import arcpy 

class ToolValidator:
    def __init__(self):
        self.params = arcpy.GetParameterInfo()

    def initializeParameters(self):
        self.params[2].parameterDependencies = [1]
        self.params[2].schema.clone = True
        return

    def updateParameters(self):
        inVT = self.params[0].value  # multivalue ValueTable
        inWS = self.params[1].value  # WorkSpace

        # Add each feature class to the output workspace. In addition,
        # add a new field "ProjectID" to each feature class.
        if inVT and inWS:
            rowCount = inVT.rowCount  # Number of rows in the MultiValue table
            children = []
            newField = arcpy.Field()
            newField.name = "ProjectID"
            newField.type = "Long"
            for row in range(0, rowCount):
                value = inVT.getValue(row, 0)
                if value:
                    d = arcpy.Describe(value)
                    fieldList = d.fields

                    # Note -- not checking if field already exists
                    fieldList.append(newField)

                    # Create new child with additional ProjectID field and
                    # add child to list of children.
                    child = [d.shapeType, d.catalogPath, fieldList]
                    children.append(child)            
                      
            self.params[2].schema.additionalChildren = children
        return

    def updateMessages(self):
        return

Объект Filter

Объект Filter позволяет указать варианты значений параметра, доступные пользователю. Например, можно установить фильтр поля, ограничивающий варианты текстовыми полями. Фильтр выполняет три задания:

  • Фильтр только представляет возможного пользователя с доступными вариантами выбора при обзоре данных. Если вы установите фильтр на точечный класс объектов, только точечные классы объектов будут показаны при обзоре данных пользователем. Если вы установите фильтр на текстовые поля, ниспадающий список полей покажет только текстовые поля.
  • Если пользователь вводит значение параметра (вместо выбора значения из списка или обзора файлов), значение будет проверено фильтром. Если пользователь вводит некорректное значение (например, числовое поле вместо текстового поля), выводится предупреждение или ошибка.
  • Поскольку значения проверяются фильтром с помощью внутренней проверки, вам не придется программировать пользовательскую проверку в классе ToolValidator.

Есть два способа их определения фильтров:

  • На вкладке Параметры диалогового окна свойств инструмента, выберите параметр, затем щелкните ячейку рядом с Фильтром и выберите тип фильтра из ниспадающего списка. После того, как вы выбрали тип фильтра, появится диалоговое окно, где вы сможете задать значения для фильтра.
  • Вы можете задать значения программно в классе ToolValidator (примеры приведены ниже). Это предоставляет ряд возможностей настройки, которые невозможно использовать в диалоговом окне свойств инструмента, включая задание динамических фильтров на основе значений других параметров, фильтров для составных типов данных и нескольких типов фильтров для одного и того же параметра. Геообработка автоматически создает фильтры для параметров, имеющих тип string, long, double, класс пространственных объектов, файл, поле и рабочая область. Если вы не хотите выбрать фильтр в диалоговом окне свойств инструмента, все равно существует фильтр, который связан с параметром – просто он является пустым. Пустой фильтр равнозначен отсутствию фильтра. Добавляя значения в пустой фильтр, вы активизируйте фильтр, и варианты, из которых может выбирать пользователь, ограничены установками фильтра.

Есть семь видов фильтров, как показано в таблице ниже:

Тип фильтраЗначение

ValueList

Список строковых или числовых значений, которые используются с типами данных String, Long, Double, Boolean, Linear Unit, Areal Unit и Time Unit.

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

Для фильтров Linear Unit, Area Unit и Time Unit ValueList укажите список строк ключевых слов единиц измерения, и только значения, использующие эти единицы, будут считаться допустимыми и отображаться в раскрывающемся списке единиц измерения в диалоговом окне инструмента.

Диапазон

Минимальное и максимальное значение используется с типами данных Long, Double, Linear Unit, Areal Unit и Time Unit.

Для фильтров Long и Double предоставляется список с двумя элементами: значение минимума и значение максимума. Только числа между минимальным и максимальным будут считаться допустимыми.

Для фильтров Linear Unit, Areal Unit и Time Unit Range укажите список с двумя элементами: минимальное и максимальное значение, включая единицу измерения. Например, ["1 Meters", "100 Meters"].

FeatureClass

Список допустимых типов классов объектов, определенных значениями "Point", "Multipoint", "Polyline", "Polygon", "MultiPatch", "Annotation" и "Dimension". В фильтре можно задать несколько значений.

Файл

Список суффиксов файлов, например, ".txt" или ".xml".

Поле

Список допустимых типов полей, определенных значениями "Short", "Long", "Single", "Double", "Text", "Date", "OID", "Geometry", "Blob", "Raster", "GUID", "GlobalID" и "XML". В фильтре можно задать несколько значений.

Рабочая область

Список допустимых типов рабочей области, определенных значениями "FileSystem", "LocalDatabase" и "RemoteDatabase". Может быть задано более одного значения.

Тип единиц измерения режима передвижения

Список допустимых атрибутов импеданса режима движения: "Time", "Distance" и "Other".

Тип и значения фильтра

Свойства

СвойствоОписание

type

Тип фильтра (Список значений (Value List), Диапазон (Range), Класс объектов (Feature Class), Файл (File), Поле (Field), и Рабочая область (Workspace)). Вы можете задать тип фильтра при работе с параметрами Long, Double, Linear Unit, Areal Unit и Time Unit (см. примечание ниже). Для других типов параметров существует только один корректный тип фильтра, поэтому задание типа для этих параметров игнорируется. Если вы не хотите фильтровать значения, установите свойство списка на пустой список (empty list).

list

Список значений для фильтра. Если вы не хотите фильтровать значения, установите свойство списка на пустой список (empty list).

Свойства filter

ValueList

ValueList для строковых параметров

Для строкового параметра список может состоять из любого количества строк. Ниже приведен пример настройки списка строковых значений в процедуре initializeParameters. У параметра существуют две возможности: "NEW_FORMAT" и "OLD_FORMAT".


  def initializeParameters(self):
    # Set the fixed list of "file format type" parameter choices and its
    # default value.
    self.params[1].filter.list = ["OLD_FORMAT", "NEW_FORMAT"]
    self.params[1].value = "OLD_FORMAT"
    return

В приведенном выше примере вы можете также задать список значений на вкладке Параметр в диалоговом окне свойств. Если вы установите список значений на что-то другое (например, "OLD" и "NEW") в свойствах инструмента, эти значения будут заменены на "OLD_FORMAT" и "NEW_FORMAT" при вызове initializeParameters. То же верно для значения по умолчанию – оно может быть установлено в диалоговом окне Свойств инструмента, и затем переустановлено в ToolValidator.

Примечание:

Список значений, которые вы задаете в ToolValidator, заменяет значения, установленные в диалоговом окне Свойства инструмента. Это позволяет вам обновлять значения, основанные на других параметрах.

Продолжая работу с данным примером, следующий код отображает процедуру updateParameters, изменяющую список значений в другом параметре в зависимости от того, выбрал ли пользователь вариант "OLD_FORMAT" или "NEW_FORMAT":

def updateParameters(self):
    # Update the value list filter of the "feature type in file" parameter 
    # depending on the "file format type" parameter.
    if self.params[1].value.upper() == "OLD_FORMAT":
        self.params[2].filter.list = ["POINT", "LINE", "POLYGON"]
    elif self.params[1].value.upper() == "NEW_FORMAT":
        self.params[2].filter.list = ["POINT", "LINE", "POLYGON", 
                                      "POINT_WITH_ANNO", 
                                      "LINE_WITH_ANNO", 
                                      "POLYGON_WITH_ANNO"]

    # Provide default value for "feature type in file" parameter.
    if not self.params[2].altered:
        self.params[2].value = "POINT"

ValueList для параметров с типами данных Long и Double

Параметр Long или Double может иметь список числовых значений. Пользователь может или выбрать значение из списка, или ввести значение, также из списка.

# Set filter for a Long parameter
self.params[7].filter.list = [10, 20, 30, 40, 50]

# Set filter for a Double parameter
self.params[8].filter.list = [10.0, 12.5, 15.0]

ValueList для логических параметров

Для Булева параметра существует два значения: истинный (true) и ложный (false). Истинное значение (true) всегда идет в списке первым.

def initializeParameters(self):
    # Set the Boolean choice for including or excluding angles.
    self.params[6].filter.list = ["ANGLE", "NO_ANGLE"]

    # Set the default value to false (no angle).
    self.params[6].value = "NO_ANGLE"
    return

def updateParameters(self):
    # Enable angle format parameter if user wants angles.
    if self.params[6].value.upper() == "ANGLE":
        self.params[7].enabled = True

ValueList для параметров Linear Unit, Areal Unit и Time Unit

В парамере Linear Unit, Areal Unit и Time Unit может быть список единиц измерения. Пользователь может или выбрать из списка или ввести единицы измерения.

# Set filter for linear unit parameters
self.params[5].filter.type = "ValueList"
self.params[5].filter.list = ["Meters", "Kilometers"]

# Set filter for areal unit parameters
self.params[6].filter.type = "ValueList"
self.params[6].filter.list = ["Hectares", "SquareKilometers", "SquareMeters"]

# Set filter for time unit parameters
self.params[7].filter.type = "ValueList"
self.params[7].filter.list = ["Hours", "Days"]

Диапазон

Для параметра Long, Double, Linear Unit, Areal Unit и Time Unit может быть фильтр диапазона. У фильтров диапазона два значения: минимум и максимум. Первым в списке идет минимальное значение. Диапазон является инклюзивным, то есть в него входят минимальное и максимальное значения.

Диапазон для параметров Long и Double

Параметр Long или Double может содержать список числовых значений.

def initializeParameters(self):
    # Utility values must be between -10 and 10.
    self.params[7].filter.list = [-10, 10]

Диапазон для параметров Linear Unit, Areal Unit и Time Unit

В парамере Linear Unit, Areal Unit и Time Unit может быть диапазон допустимых значений. Пользователь может задать любую единицу измерения, и она будет автоматически преобразована для сравнения с единицей минимума и максимума фильтра диапазона.

# Set filter for linear unit parameters
self.params[5].filter.type = "Range"
self.params[5].filter.list = ["1 Meters", "10 Meters"]

# Set filter for areal unit parameters
self.params[6].filter.type = "Range"
self.params[6].filter.list = ["1 Acres", "10 Acres"]

# Set filter for time unit parameters
self.params[7].filter.type = "Range"
self.params[7].filter.list = ["1 Hours", "24 Hours"]

Задайте тип фильтра для параметров Long, Double, Linear Unit, Areal Unit и Time Unit

Для параметров Long, Double, Linear Unit, Areal Unit и Time Unit тип фильтра по умолчанию - ValueList. Если вы хотите использовать Фильтр диапазона, установите тип фильтра в initializeParameters, как показано ниже:

def initializeParameters(self):
  # Set the 'score' value parameters to a range filter
  self.params[7].filter.type = "Range"
  self.params[7].filter.list = [-10, 10]
# Set both filter types for a single Linear Unit parameter
self.params[5].filter.type = "Range"
self.params[5].filter.list = ["0 Meters", "10000 Meters"]
self.params[5].filter.type = "ValueList"
self.params[5].filter.list = ["Meters", "Kilometers", "Feet", "Miles", "Yards"]

Вы можете задать только тип фильтра для параметров Long, Double, Linear Unit, Areal Unit и Time Unit.

FeatureClass

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

  def updateParameters(self):
    # Set the input feature type of the second parameter based
    # on the feature type of the first parameter.
    if self.params[0].valueAsText:
        desc = arcpy.Describe(self.params[0])
        feature_type = desc.shapeType.lower()

        if feature_type == "polygon":
            self.params[1].filter.list = ["point", "multipoint"]

        elif feature_type == "polyline":
            self.params[1].filter.list = ["polygon"]
      
        elif feature_type in ["point", "multipoint"]:
            self.params[1].filter.list = ["polyline"]

        else:
            self.params[1].filter.list = []
      
    return

Файл

Фильтр файлов содержит список допустимых суффиксов файлов, таких как .txt (простой текстовый файл) и .csv (значения, разделенные запятыми). Можно использовать любое расширение. Совсем не обязательно, чтобы приложение ArcGIS распознавало расширение. Расширение может иметь любую длину и не должно содержать точек. На примере, приведенном ниже, показано задание фильтра для входного параметра Файл.

def initializeParameters(self):
    # Set the input file type to our recognized options file suffixes.
    self.params[0].filter.list = ["opt56", "opt57", "globalopt"]
    return

Поле

Фильтр поля определяет допустимые типы полей. Значения могут быть "Short", "Long", "Float", "Single", "Double", "Text", "Date", "OID", "Geometry", "Blob", "Raster", "GUID", "GlobalID" и "XML".

Отображаемое имя и внутреннее имя

Четыре типа поля, которые имеют внутреннее имя, показаны в таблице ниже:

Отображаемое имяВнутреннее имя

Short

SmallInteger

Long

Integer

Float

Single

Текст

String

Псевдонимы фильтра поля

При определении фильтра поля, вы можете использовать как отображаемое, так и внутреннее имя; то есть следующие две строки кода эквивалентны:

self.params[1].filter.list = ["Short", "Long", "Float", "Text"]
self.params[1].filter.list = ["SmallInteger", "Integer", "Single", "String"]

Если вы предоставляете отображаемое имя, например "short", оно конвертируется и добавляется в фильтр как "SmallInteger" Скорее всего, вы не будете обращаться к значениям в фильтре поля, но если вам придется это делать, учитывайте, что там хранится внутреннее имя. Фрагмент кода, приведенный ниже, показывает, как это вычислить:

self.params[1].filter.list = ["Short", "Long"]

if self.params[1].filter.list[0].lower() == "SmallInteger":
    # do something

Задание значения поля по умолчанию

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


def initializeParameters(self):
    self.params[1].filter.list = ["Short", "Long", "Float", "Double"]
    return

def updateParameters(self):
    if self.params[0].valueAsText and not self.params[1].altered:
        self.params[1].value = ""
        desc = arcpy.Describe(self.params[0])
        fields = desc.fields

        # Set default to the first field that matches your filter.
        for field in fields:
            fType = field.type.lower()
            if fType in ["SmallInteger", "Integer", "Single", "Double"]:
                self.params[1].value = field.name
                break
    return
Внимание:

Не используйте функцию ListFields в ToolValidator. Вместо этого, используйте функцию Describe, как проиллюстрировано выше.

Рабочая область

В фильтре рабочей области указываются типы допустимых рабочих областей на входе. Существует три значения:

Фильтр рабочей областиОписание

FileSystem

Системная папка, используемая для хранения шейп-файлов и сеток

LocalDatabase

Файловая база геоданных

RemoteDatabase

Подключение многопользовательской базы геоданных

Связанные разделы