Для общего обзора класса ToolValidator и использования методов параметров, см. Настройка поведения инструмента-скрипта.
Объект Параметр
Доступ к параметрам инструмента
Каждый параметр инструмента имеет связанный с ним объект параметра, у которого есть свойства и методы для проверки корректности параметров инструмента. Параметры содержатся в списке Python. Обычной практикой является создание списка параметров в классе ToolValidator метода __init__, как показано в приведенном ниже программном коде.
def __init__(self):
import arcpy
self.params = arcpy.GetParameterInfo()
Вы также можете управлять параметрами в своем скрипте (как альтернатива классу ToolValidator), как показано ниже. Единственная причина получать доступ к списку параметров внутри скрипта – это задание свойства symbology.
import arcpy
params = arcpy.GetParameterInfo()
Порядок параметров
Параметры инструмента и их порядок описаны на вкладке Параметры в свойствах инструмента, как показано ниже.
Методы
Имя метода | Описание использования |
---|---|
setErrorMessage(message:string) | Отмечает параметр, как имеющий ошибку (красный Х), с добавленным сообщением. Инструменты не выполняются, если один из параметров имеет ошибку. |
setWarningMessage(message:string) | Отмечает параметр, как имеющий предупреждение (желтый треугольник), с добавленным сообщением. В отличие от ошибок, инструменты с предупреждениями выполняются. |
setIDMessage(messageType: string, messageID: string, {AddArgument1}, {AddArgument2}) | Позволяет вам задать системное сообщение. Аргументы такие же, как у функции AddIDMessage. |
clearMessage() | Очищает любой текст сообщения и устанавливает статус на информативность (не ошибка и не предупреждение). |
hasError() | Возвращает значение true, если параметр содержит ошибку. |
hasWarning() | Возвращает значение true, если параметр содержит предупреждение. |
isInputValueDerived() | Возвращает значение true, если инструмент был проверен внутри Модели и его входное значение является выходным значением другого инструмента данной модели. |
Свойства
Имя свойства | Чтение/Запись | Значения | Описание |
---|---|---|---|
name | Только для чтения | String | Имя параметра, как задано на вкладке Параметры в свойствах инструмента. |
direction | Только для чтения | String: "Input", "Output" | Направление параметра Входной/Выходной, как задано на вкладке Параметры в свойствах инструмента. |
datatype | Только для чтения | String | Тип данных, как задано на вкладке Параметры в свойствах инструмента. |
parameterType | Только для чтения | String: "Required" (Обязательный), "Optional" (Дополнительный), "Derived" (Производный) | Тип, как задано на вкладке Параметры в свойствах инструмента. |
Чтение/запись | Список Python | Список индексов каждого зависимого параметра. | |
Чтение/запись | Объект Value (Значение) | Значение параметра. | |
defaultEnvironmentName | Только для чтения | String | Настройка переменной среды по умолчанию, как задано на вкладке Параметры в свойствах инструмента. |
enabled | Чтение/запись | Boolean | False (Ложь), если параметр недоступен для выбора (недоступный). |
Только для чтения | Boolean | True (Истина), если пользователь изменил значение. | |
Только для чтения | Boolean | True, если параметр был проверен внутренней процедурой проверки. | |
Чтение/запись | String | Категория параметра. | |
Только для чтения | Объект Схема геообработки (GP Schema) | Схема выходного набора данных. | |
Только для чтения | Объект Фильтр геообработки (GP Filter) | Фильтр, который применяется к значениям параметра. | |
Чтение/запись | String | Путь к файлу слоя (.lyr), используемый для отображения выходных данных. | |
message | Только для чтения | String | Сообщение, показываемое пользователю. См. методы SetErrorMessage и SetWarningMessage выше. |
Некоторые примеры кодов показаны ниже. Для получения других примеров кодов, см. раздел Настройка поведения инструмента-скрипта.
Сравнение свойств ToolValidator со свойствами инструментов-скриптов
Значение параметра по умолчанию, фильтр, символ и зависимости могут быть заданы как на вкладке Параметры в диалоговом окне свойств инструмента-скрипта, так и в классе ToolValidator.
Свойства, которые вы установите в классе ToolValidator, всегда будут заменять собой те значения, которые были заданы в диалоговом окне свойств инструмента-скрипта. Например, если вы установили значение по умолчанию для параметра равным "BLUE" в диалоговом окне свойств инструмента-скрипта, и переустановили его на "RED" в initializeParameters(), значением по умолчанию станет "RED". Как только был вызван метод initializeParameters(), диалоговое окно свойств инструмента-скрипта будет отображать "RED" в качестве значения по умолчанию. Если вы (или ваши пользователи) попадете в ситуацию, когда сделанные изменения для одного из этих четырех свойств параметра в диалоговом окне свойств скрипта не были сохранены, то это произошло, скорее всего, поскольку свойство было переписано в классе ToolValidator.
parameterDependencies
Как правило, вы устанавливаете набор зависимостей параметра для использования объектом Схема. Существуют два случая, когда зависимость уже может быть установлена на вкладке Параметры в свойствах инструмента.
- Для параметра выходного набора данных, тип которого Производный (Derived), зависимостью является индекс параметра, из которого извлекаются выходные данные.
- Для определенных типов входных данных, зависимостью является индекс параметра, содержащий информацию, используемую элементом управления, как показано в таблице ниже.
Тип входных данных | Зависимый тип данных | Описание |
---|---|---|
Поле или выражение SQL | Таблица | Таблица, содержащая поля. |
Элемент INFO или выражение INFO | Таблица INFO | Таблица INFO, содержащая элементы. |
Класс объектов покрытия | Покрытие | Покрытие, содержащее пространственные объекты. |
Единицы площади и длины | Набор геоданных | Географический набор данных, используемый для определения единиц измерения по умолчанию. |
Система координат | Рабочая область | Рабочая область, использованная для определения системы координат по умолчанию. |
Настройки иерархии Network Analyst | Набор сетевых данных | Набор сетевых данных, содержащий информацию об иерархии. |
Таблица геостатистических значений | Геостатистический слой | Слой сетевого анализа, содержащий таблицы. |
Зависимости обычно устанавливаются в методе initializeParameters():
def initializeParameters(self):
# Set the dependencies for the output and its schema properties
#
self.params[2].parameterDependencies = [0, 1]
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].value:
if not self.params[6].altered:
extent = arcpy.Describe(self.params[0].value).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 объекта Значение (Value). Пример кода использует метод os.path.dirname, чтобы вернуть директорию для набора данных.
if self.params[0].value:
workspace = os.path.dirname(self.params[0].value.value)
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).
#
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 extension используют категории, как показано ниже.
Поскольку вы можете задать категорию только один раз, задайте ее в 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, код внутренней проверки геообработки анализирует эти правила и обновляет описание выходных данных.
Для проверки, настройка заключается в следующем:
- Во время первого открытия диалогового окна инструмента вызывается initializeParameters(). Для описания выходных данных устанавливаются статические правила (правила, которые не изменяются вводимыми пользователем данными). На этом этапе не создается описания на выходе, так как пользователь не указал значения ни для одного из параметров (если вы не задали значений по умолчанию).
- Как только пользователь начинает как-либо работать с диалоговым окном, происходит вызов updateParameters().
- updateParameters() может изменить объект схемы с учетом динамического поведения, которое нельзя установить с помощью параметрических зависимостей (например, добавление нового поля с помощью Добавить поле).
- После процедуры updateParameters() запускаются подпрограммы внутренней проверки, а правила, найденные в объекте схемы, применяются для обновления описания выходных данных.
- Затем происходит вызов 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 | Список объектов поля Python |
cellSizeRule | String: "AsSpecified", "FirstDependency", "Min", "Max", "Environment" |
cellsize | Double |
rasterRule | String: "FirstDependency", "Min", "Max", "Integer", "Float" |
rasterFormatRule | String: "Img", "Grid" |
additionalChildren | Список наборов данных Python для добавления в схему рабочей области |
Использование 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 равен "Производный", будет создана точная копия. Это поведение инструмента Добавить поле (Add Field).
- Если значением parameter.parameterType является "Обязательный", то также будет создана точная копия, но путь к каталогу, содержащему набор данных, будет изменен. Пути каталога состоят из двух частей: рабочая область и базовое имя. Пример:
E:/Data/TestData/netcity.gdb/infrastructure/roads
- Workspace = E:/Data/TestData/netcity.gdb/infrastructure
- Base name = 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" | Тип объекта будет таким же, как и первый влияющий параметр. Если первый влияющий параметр содержит несколько значений (список значений), будет использоваться первое значение в этом списке. |
featureType
Если значением featureTypeRule является "AsSpecified", то значение featureType используется для указания типа объекта выходных данных.
Значение | Описание |
---|---|
"Simple" | Выходные данные будут содержать простые объекты. Тип геометрии объектов указывается с помощью geometryTypeRule. |
"Annotation" | Выходные данные будут содержать объекты аннотаций. |
"Dimension" | Выходные данные будут содержать объекты размеров. |
geometryTypeRule
Этот параметр определяет тип геометрии (например, точка или полигон) выходного класса объектов.
Значение | Описание |
---|---|
"Unknown" | Это установка по умолчанию. Обычно вы должны иметь возможность определить тип геометрии в updateParameters() на основе значений других параметров. Вам только нужно установить правило на Неизвестный ("Unknown"), если у вас нет достаточной информации для определения типа геометрии. |
"FirstDependency" | Тип геометрии будет совпадать с первым влияющим параметром. Если первый влияющий параметр содержит несколько значений (список значений), будет использоваться первое значение в этом списке. |
"Min", "Max" | Проверяет геометрии всех зависимых параметров и устанавливает тип выходной геометрии на минимальный или максимальный найденный тип. "Mин" и "Maкс" определяются следующим образом:
|
"AsSpecified" | Тип геометрии будет определен значением свойства geometryType. |
geometryType
Установите этот значение для типа геометрии (Точка ("Point"), Мультиточка ("Multipoint"), Полилиния ("Polyline") или Полигон ("Polygon")), если значение geometryTypeRule равно "AsSpecified".
extentRule
Значение | Описание |
---|---|
"AsSpecified" | Выходной экстент будет указан в свойстве extent. |
"FirstDependency" | Выходной экстент будет совпадать с первым влияющим параметром. Если первый влияющий параметр содержит несколько значений (список значений), будет использоваться первое значение в этом списке. |
"Intersection" | Выходным экстентом будет геометрическое пересечение всех влияющих параметров. (Это то, что использует инструмент Вырезать, как показано ниже.) |
"Union" | Выходным экстентом будет геометрическое объединение всех влияющих параметров. |
"Environment" | Выходной экстент будет вычислен на основе настроек параметров среды выходного экстента. |
Пример
# 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, взятым в каждом классе объектов или таблице.
Значение | Описание |
---|---|
"None" | Поля не выводятся (кроме идентификатора объекта). |
"FirstDependency" | Выходные поля будут совпадать с первым влияющим параметром. Если первый влияющий параметр содержит несколько значений (список значений), будет использоваться первое значение в этом списке. |
"FirstDependencyFIDs" | Только ObjectID первого зависимого входного параметра будет записан в выходные данные. |
"All" | Выводятся все поля в списке зависимых параметров. |
"AllNoFIDs" | Выводятся все поля кроме ObjectID. |
"AllFIDsOnly" | Выводятся все поля ObjectID, но другие поля из входных параметров не записываются. |
Пример инструмента Вырезать, использующего правило 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 берет из Python список объектов поля.
cellSizeRule
Это определяет размер ячейки выходных растров или гридов.
Значение | Описание |
---|---|
"AsSpecified" | Выходной размер ячейки определяется свойством cellSize. |
"FirstDependency" | Размер ячейки вычисляется на основе первого зависимого параметра. Если первым зависимым параметром является растр, то используется его размер ячейки. Для других типов зависимых параметров, таких как классы объектов или наборы данных объектов, для вычисления размера ячейки используется экстент данных. Если первый влияющий параметр содержит несколько значений (список значений), будет использоваться первое значение в этом списке. |
"Min", "Max" | "Mин" означает, что выходной размер ячейки является наименьшим размером ячейки у зависимых параметров. "Maкс" означает, что берется наибольший размер ячейки у зависимых параметров. |
"Environment" | Выходной размер ячейки будет вычислен на основе настроек параметров среды размер ячейки. |
cellSize
Установите это значение для размера ячейки, если значение cellSizeRule равно "AsSpecified".
rasterRule
Определяет тип данных (integer или float) в выходных растровых данных.
Значение | Описание |
---|---|
"FirstDependency" | Тип данных (integer или float) будет совпадать с первым влияющим параметром. Если первый влияющий параметр содержит несколько значений (список значений), будет использоваться первое значение в этом списке. |
"Min", "Max" | Целое число считается меньшим, чем число с плавающей точкой. Например, если есть два зависимых параметра, один содержит целочисленные значения, а второй – числа с плавающей точкой, "Mин" выдаст выходные значения как целочисленные, а "Maкс" – как числа с плавающей точкой. |
"Integer" | Выходной растр содержит целочисленные значения. |
"Float" | Выходной растр содержит значения – числа с плавающей точкой. |
rasterFormatRule
Это определяет формат выходного растра: "Grid" или "Img". По умолчанию значением является "Img", это формат ERDAS IMAGINE. "Grid" – это формат Esri.
additionalChildren
Рабочая область является контейнером для наборов данных (объектов, таблиц и растров). Эти наборы данных являются дочерними для рабочей области (вы можете считать рабочую область родителем по отношению к ним). Если ваш инструмент добавляет набор данных к новой или существующей рабочей области, вы можете обновить описание рабочей области, добавив описания дочерних объектов. Например, вы можете использовать инструмент, который получает список классов объектов (многозначный элемент), обновляет их некоторым способом, и затем записывает измененные классы объектов в существующую рабочую область. Если инструмент используется в ModelBuilder, рабочая область получается как выходной результат инструмента, и вы можете захотеть использовать эту рабочую область в качестве входного параметра для инструмента Выбрать данные. ВыбратьДанные позволяет вам выбрать дочерний набор данных из контейнера и использовать его, как входной параметр для другого инструмента.
Входной параметр для additionalChildren – это одно или более описаний дочерних элементов. Существует две формы описания дочерних элементов:
Форма | Описание |
---|---|
Объект value | Класс объектов, таблица, растр, объект-измерение или объект аннотации, как результат свойства value. |
Объект списка Python в форме [тип (type), имя (name), поля, экстент, пространственная привязка (fields, extent, spatial reference)] | Список Python, содержащий добавляемое описание к дочерним элементам Необходимы только первые два элемента в списке – тип и имя. Остальные аргументы являются необязательными. |
При добавлении более одного дочернего элемента, вы предоставляете список описаний дочерних элементов. Если вы добавляете дочерний элемент, используя форму объекта списка 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 | дополнительно | Объект пространственной привязки. |
Данные аргументы должны быть приведены в указанном порядке. Чтобы пропустить необязательный аргумент, используйте ключевое слово Python None или "#".
Ниже приведены примеры задания схемы рабочей области. Эти примеры основаны на инструменте-скрипте, который имеет следующие аргументы:
Имя параметра | Свойства | |
---|---|---|
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 позволяет указать варианты значений параметра, доступные пользователю. Например, можно установить фильтр поля, ограничивающий варианты только текстовыми полями. Фильтр выполняет три задания:
- Фильтр только представляет возможного пользователя с доступными вариантами выбора при обзоре данных. Если вы установите фильтр на точечный класс объектов, только точечные классы объектов будут показаны при обзоре данных пользователем. Если вы установите фильтр на текстовые поля, ниспадающий список полей покажет только текстовые поля.
- Если пользователь вводит значение параметра (вместо выбора значения из списка или обзора файлов), значение будет проверено фильтром. Если пользователь вводит некорректное значение (например, числовое поле вместо текстового поля), автоматически выводится предупреждение или ошибка.
- Поскольку значения проверяются фильтром с помощью внутренней проверки, фильтр освобождает вас от программирования вашей собственной проверки в классе ToolValidator.
Есть два способа их определения фильтров:
- На вкладке Параметры диалогового окна свойств инструмента, выберите параметр, затем щелкните ячейку рядом с Фильтром и выберите тип фильтра из ниспадающего списка. После того, как вы выбрали тип фильтра, откроется диалоговое окно, где вы сможете задать значения для фильтра.
- Вы можете задать значения программно в классе ToolValidator (примеры приведены ниже). Геообработка автоматически создает фильтры для параметров, имеющих тип string, long, double, класс пространственных объектов, файл, поле и рабочая область. Даже если вы не хотите выбрать фильтр в диалоговом окне свойств инструмента, все равно существует фильтр, который связан с параметром – просто он является пустым. Пустой фильтр равнозначен отсутствию фильтра. Добавляя значения в пустой фильтр, вы активизируйте фильтр, и варианты, из которых может выбирать пользователь, ограничены установками фильтра.
Есть шесть видов фильтров, как показано в таблице ниже:
Тип фильтра | Значения |
---|---|
ValueList | Список строковых или числовых значений. Используется с типами данных String, Long, Double и Boolean. |
Range | Минимальное и максимальное значение. Используется с типами данных Long и Double. |
FeatureClass | Список допустимых типов классов объектов, определенных значениями Точка ("Point"), Мультиточка ("Multipoint"), Полилиния ("Polyline"), Полигон ("Polygon"), Мультипатч ("MultiPatch"), Сфера ("Sphere"), Аннотация ("Annotation"), Размерность ("Dimension"). В фильтре можно задать несколько значений. |
File | Список суффиксов файлов, например, ".txt", ".e00", ".ditamap". |
Field | Список допустимых типов полей, определенных значениями "Short", "Long", "Single", "Double", "Text", "Date", "OID", "Geometry", "Blob", "Raster", "GUID", "GlobalID", "XML". В фильтре можно задать несколько значений. |
Workspace | Список допустимых типов рабочей области, определенных значениями Система Файлов ("FileSystem"), Локальная База Данных ("LocalDatabase") и Удаленная База Данных ("RemoteDatabase"). Может быть задано более одного значения. |
Свойства
Свойство | Описание |
---|---|
type | Тип фильтра (Список значений (Value List), Диапазон (Range), Класс объектов (Feature Class), Файл (File), Поле (Field), и Рабочая область (Workspace)). Вы можете задать тип фильтра при работе с параметрами Long и Double (см. примечание ниже). Для других типов параметров существует только один корректный тип фильтра, поэтому задание типа для этих параметров игнорируется. Если вы не хотите фильтровать значения, установите свойство списка на пустой список (empty list). |
list | Список Python, содержащий значения для фильтра. Если вы не хотите фильтровать значения, установите свойство списка на пустой список (empty list). |
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.
Продолжая работу с данным примером, код ниже отображает процедуру 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
Range
Для параметров с типом данных 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. Если вы хотите использовать Фильтр диапазона, установите тип фильтра в 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.
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].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
File
Фильтр файлов содержит список допустимых суффиксов файлов, таких как ".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
Field
Фильтр поля определяет допустимые типы полей. Значениями могут быть: "Short", "Long", "Float", "Single", "Double", "Text", "Date", "OID", "Geometry", "Blob", "Raster", "GUID", "GlobalID" и "XML".
Отображаемое имя и внутреннее имя
Есть четыре типа поля, которые имеют внутреннее имя, они показаны в таблице ниже.
Отображаемое имя | Внутреннее имя |
---|---|
Short | SmallInteger |
Long | Integer |
Float | Single |
Text | 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].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
Workspace
В фильтре рабочей области указываются типы допустимых рабочих областей на входе. Существует три значения:
Фильтр рабочей области | Описание |
---|---|
Система Файлов ("FileSystem") | Папка на диске, используемая для хранения шейп-файлов, покрытий, таблиц INFO и гридов |
Локальная База Данных ("LocalDatabase") | Персональная или файловая база геоданных |
Удаленная База Данных ("RemoteDatabase") | Подключение базы данных ArcSDE |