Программирование для класса ToolValidator

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

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

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

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

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

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

import arcpy
params = arcpy.GetParameterInfo()

Более подробно о настройке символов в скриптах

Порядок параметров

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

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

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

Методы

Имя метода

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

setErrorMessage(message:string)

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

setWarningMessage(message:string)

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

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

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

clearMessage()

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

hasError()

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

hasWarning()

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

isInputValueDerived()

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

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

Свойства

Имя свойства

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

Значение(я)

Описание

название

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

Строка

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

direction – направление

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

Строка: "Input" ("Ввод"), "Output" ("Вывод")

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

datatype

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

Строка

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

parameterType

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

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

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

parameterDependencies

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

Список Python

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

value – значение

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

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

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

defaultEnvironmentName

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

Строка

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

enabled

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

Булево

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

altered

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

Булево

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

hasBeenValidated

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

Булево

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

категория

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

Строка

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

schema

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

Объект Схема геообработки (GP Schema)

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

фильтр

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

Объект Фильтр геообработки (GP Filter)

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

условные обозначения

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

String (Строка)

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

message (сообщение)

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

String (Строка)

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

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

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

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

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

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

parameterDependencies

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

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

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

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

Описание

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

Таблица

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

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

Таблица INFO

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

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

Покрытие

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

значение (value)

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

Не устанавливайте значение параметра обновитьСообщения (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 self.params[3].value == "Get Spatial Weights From File":
  self.params[8].enabled = True
else:
  self.params[8].enabled = False

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

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

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

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

При использовании метода геообработки Описать (Describe()) в классе ИнструментПроверки (ToolValidator), никогда не используйте строковое представление значения.

Некорректно (использовалась функцияstr):

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

Корректно: (str не использовалась)

desc = arcpy.Describe(self.params[0].value)

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

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

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

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

fc = self.params[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 self.params[2].altered:
      self.params[2].value = "POINT"

hasBeenValidated

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

Проверено (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).
# 
import string
if self.params[0].value and not self.params[0].hasBeenValidated:
  if not self.params[6].altered: 
    extent = arcpy.Describe(self.params[0].value).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) связывает файл слоя (.lyr) с выходным параметром.

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

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

объект schema (схема)

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

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

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

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

Имя свойства

Значение(я)

тип (type)

Строка: "Объект", "Таблица", "Растр" , "Контейнер" (для рабочих областей и наборов данных объектов) (Свойство доступно только для чтения)

clone (клон)

Булево

правилоТипОбъекта (featureTypeRule)

Строка: "КакОпределено", "ПерваяЗависимость"

типОбъекта (featureType)

Строка: "Простой", "Аннотация", "Размерность"

geometryTypeRule

Строка: "Неизвестный", "ПерваяЗависимость", "Mин", "Maкс", "КакОпределено"

Тип Геометрии (geometryType)

Строка "Точка", "Мультиточка", "Полилиния", "Полигон"

ЭкстентПравило (extentRule)

Строка: "КакОпределено", "ПерваяЗависимость", "Пересечение", "Объединение", "Среда"

экстент (extent)

Объект Экстент

Правило поля (fieldsRule)

Строка: "Нет", "ПерваяЗависимость", "ПерваяЗависимостьFIDs", "Все", "ВсеNoFIDs", "ВсеFIDsТолько"

дополнительныеПоля (additionalFields)

Список объектов поля Python

ПравилоРазмерЯчейки (cellSizeRule)

Строка: "КакОпределено", "ПерваяЗависимость", "Mин", "Maкс", "Среда"

размерячейки (сellsize)

Двойная точностьи

ПравилоРастра (rasterRule)

Строка: "ПерваяЗависимость", "Mин", "Maкс", "Целое", "Плавающее"

правилоРастровогоФормата (rasterFormatRule)

Строка: "Img", "Грид"

additionalChildren

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

Свойства объекта Схема (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)

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

clone (клон)

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

  • Если значением parameter.parameterType является Производный ("Derived"), то будет сделана точная копия. Это поведение инструмента Добавить поле (Add Field).
  • Если значением parameter.parameterType является Обязательный ("Required"), то также будет сделана точная копия, но путь к каталогу, содержащему набор данных, будет изменен. Пути каталога состоят из двух частей: рабочая область и базовое имя. Например:

    E:/Data/TestData/netcity.gdb/infrastructure/roads

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

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

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

Пример 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

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

Значение

Описание

"КакОпределено"

Тип объекта будет определен с помощью свойства ТипОбъекта (featureType).

"ПерваяЗависимость"

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

значения featureTypeRule

ТипОбъекта (featureType)

Когда значением featureTypeRule является КакОпределено ("AsSpecified"), то значение ТипОбъекта (featureType) используется для определения типа объекта для выходных объектов.

Значение

Описание

"Простой"

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

"Аннотация"

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

"Размерность"

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

Значения ТипОбъекта (featureType)

ПравилоТипаГеометрии (geometryTypeRule)

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

Значение

Описание

"Неизвестный"

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

"ПеоваяЗависимость"

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

"Mин", "Maкс"

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

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

"КакОпределено"

Тип геометрии будет определен с помощью значения свойства ТипГеометрии (geometryType).

значения ПравилоТипаГеометрии (geometryTypeRule)

ТипГеометрии (geometryType)

Установите его на тип геометрии для использования ("Точка", "Мультиточка", "Полилиния", или "Полигон"), в случае если значением ПравилоТипаГеометрии (geometryTypeRule) является КакОпределено ("AsSpecified").

extentRule

Значение

Описание

"КакОпределено"

Выходной экстент будет определен свойством extent.

"ПерваяЗависимость"

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

"Пересечение"

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

"Объединение"

Выходной экстент будет геометрическим объединением всех зависимых параметров.

"Среда"

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

Значения 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". Вы можете также задать экстент с помощью строки с разделителем пробелы, или объекта списка Python с четырьмя значениями. Нужная последовательность: xmin, ymin, xmax, ymax.

Пример

self.params[2].schema.extentRule = "AsSpecified"
self.params[2].schema.extent = "123.32 435.8 987.3 567.9"

или используя список Python

xmin = 123.32
ymin = 435.8
xmax = 987.3
ext = [xmin, ymin, xmax, 567.9]
self.params[2].schema.extent = ext

fieldsRule

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

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

Значение

Описание

"Нет"

Никакие поля не выводятся, кроме поля, содержащего ID объекта.

"ПерваяЗависимость"

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

"ПерваяЗависимостьFIDs"

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

"Все"

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

"ВсеNoFIDs"

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

"ВсеFIDsOnly"

Все поля, содержащие ObjectID, записаны в выходной класс объектов. Больше ни одно поле из входного класса не будет записано в выходной.

Значения fieldsRule

Пример инструмента Вырезать(Сlip), использующего правило ПравилоПолей (feldsRule) с ПерваяЗависимость ("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

дополнительныеПоля (аdditionalFields)

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

Просмотреть пример использования ДополнительныеПоля (AdditionalFields)

ПравилаРазмераЯчейки (сellSizeRule)

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

Значение

Описание

"КакОпределено"

Выходной размер ячейки будет определен свойством размерЯчейки (сellSize).

"ПерваяЗависимость"

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

"Mин", "Maкс"

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

"Среда"

Выходной размер ячейки будет вычислен на основе настроек параметров средыразмер ячейки (cellsize).

Значения ПравилаРазмераЯчейки (cellSizeRule)

размер ячейки (cellSize)

Установите его на тот размер ячейки, который вы хотите использовать, если значением ПравилоРазмераЯчейки (сellSizeRule) является КакОпределено ("AsSpecified").

ПравилоРастра (rasterRule)

Данный параметр определяет тип данных выходного растра - целочисленный или число с плавающей точкой.

Значение

Описание

"ПерваяЗависимость"

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

"Mин", "Maкс"

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

"Целочисленный"

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

"Плавающий"

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

Значения ПравилоРастра (rasterRule)

ПравилоФорматаРастра (rasterFormatRule)

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

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

additionalChildren

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

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

Форма

Описание

Объект значение (value)

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

Объект списка Python в форме [тип (type), имя (name), поля, экстент, пространственная привязка (fields, extent, spatial reference)]

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

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

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

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

Аргумент

Тип

Описание

тип (type)

необходимые данные

Одно из следующих значений: Точка ("Point"), Мультиточка ("Multipoint"), Полилиния ("Polyline"), Полигон ("Polygon"), Таблица ("Table"), Растр ("Raster"), Аннотация ("Annotation"), Размерность ("Dimension")

название

необходимые данные

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

поля

опционально

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

экстент (еxtent)

опционально

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

пространственная привязка (spatial reference)

опционально

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

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

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

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

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

Свойства

0

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

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

1

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

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

2

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

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

3

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

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

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

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

Модель, используемая для просмотра результатов оценки

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

class ToolValidator:
  def __init__(self):
     import arcpy 
     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 Python 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

class ToolValidator:
  def __init__(self):
     import arcpy 
     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 (фильтр) позволяет указать варианты значений параметра, доступные пользователю. Например, можно установить фильтр поля, ограничивающий варианты только текстовыми полями. Фильтр выполняет три задания:

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

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

Тип фильтра

Значения

СписокЗначений

Список строковых или числовых значений. Используется с типами данных Строковый (String), Длинное целое (Long), Двлйная точность (Double) и Булево (Boolean).

Диапазон

Минимальное и максимальное значение. Используется с типами данных Long (Длинное целое) и Double (Вещественное с двойной точностью).

Класс объектов

Список допустимых типов классов объектов, определенных значениями Точка ("Point"), Мультиточка ("Multipoint"), Полилиния ("Polyline"), Полигон ("Polygon"), Мультипатч ("MultiPatch"), Сфера ("Sphere"), Аннотация ("Annotation"), Размерность ("Dimension"). В фильтре можно задать несколько значений.

Файл

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

Поле

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

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

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

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

Свойства

Свойство

Описание

тип (type)

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

список

Список Python, содержащий значения для фильтра. Если вы не хотите фильтровать значения, установите свойство списка на пустой список (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

В примере, приведенном выше, вы можете также легко задать список значений на закладке Параметры (Parameters) диалогового окна Свойства для инструмента. Фактически, если вы установите список значений на что-то другое (например, "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

Диапазон

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

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

Установка типа фильтра для параметров long (длинное целое) и double (с двойной точностью)

Для параметров Long (Длинное целое) и Double (С двойной точностью), фильтром по умолчанию является ValueList (СписокЗначений). Если вы хотите использовать Фильтр диапазона (Range filter), установите тип фильтра в установитьПараметры (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]

Вы можете задать тип фильтра только для параметров Long (Длинное целое) и Double (С двойной точностью).

Класс объектов

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

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].value:
      desc = arcpy.Describe(self.params[0].value)
      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 == "point" or \
           feature_type == "multipoint":
        self.params[1].filter.list = ["polyline"]

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

Файл

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

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)

Целочисленный

Плавающий

Единичный

Текст

Строка

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

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

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].value and not self.params[1].altered:
    self.params[1].value = ""
    desc = arcpy.Describe(self.params[0].value)
    fields = desc.fields

    # Set default to the first field that matches our 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")

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

Локальная База Данных ("LocalDatabase")

Персональная или файловая база геоданных

Удаленная База Данных ("RemoteDatabase")

Подключение базы данных ArcSDE

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

9/10/2013