Обновление схемы в наборе инструментов

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

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

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

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

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

type

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

clone

Логическое

featureTypeRule

Строковое: "AsSpecified", "FirstDependency"

featureType

Строковое: "Simple", "Annotation", "Dimension"

geometryTypeRule

Строковое: "Unknown", "FirstDependency", "Min", "Max", "AsSpecified"

geometryType

Строковое: "Point", "Multipoint", "Polyline", "Polygon"

extentRule

Строковое: "AsSpecified", "FirstDependency", "Intersection", "Union", "Environment"

extent

Объект Экстент (Extent)

fieldsRule

Строковое: "None", "FirstDependency", "FirstDependencyFIDs", "All", "AllNoFIDs", "AllFIDsOnly"

additionalFields

Список объектов-полей

cellSizeRule

Строковое: "AsSpecified", "FirstDependency", "Min", "Max", "Environment"

cellsize

Double

rasterRule

Строковое: "FirstDependency", "Min", "Max", "Integer", "Float"

rasterFormatRule

Строковое: "Img", "Grid"

additionalChildren

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

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

Использование FirstDependency (Первая Зависимость)

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

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

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

type

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

clone

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

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

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

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

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

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

Пример 1: Явная установка всех правил
class ExampleClipTool1(object):
    def __init__(self):
        self.label = "Example Clip tool 1"
        self.description = "Explicitly setting all rules"

    def getParameterInfo(self):
        # Input feature class
        param0 = arcpy.Parameter(
            displayName="Input Features",
            name="in_features",
            datatype="GPFeatureLayer",
            parameterType="Required",
            direction="Input")

        # Input table
        param1 = arcpy.Parameter(
            displayName="Clip Features",
            name="clip_features",
            datatype="GPFeatureLayer",
            parameterType="Required",
            direction="Input")

        # Input workspace
        param2 = arcpy.Parameter(
            displayName="Output Feature Class",
            name="out_feature_class",
            datatype="DEFeatureClass",
            parameterType="Required",
            direction="Output")

        # Set the dependencies for the output and its schema properties
        #  The two input parameters are feature classes.
        #
        param2.parameterDependencies = [param0.name, param1.name]

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

        # The extent of the output is the intersection of the input features 
        #  and the clip features (parameter 1)
        #
        param2.schema.extentRule = "Intersection"

        params = [param0, param1, param2]

        return params
Пример 2: Использование clone для установки правил на FirstDependency и замещения правила экстента:
class ExampleClipTool2(object):
    def __init__(self):
        self.label       = "Example Clip tool 2"
        self.description = "Using clone to set rules to FirstDependency, then overriding the extent rule"

    def getParameterInfo(self):
        # Input feature class
        param0 = arcpy.Parameter(
            displayName="Input Features",
            name="in_features",
            datatype="GPFeatureLayer",
            parameterType="Required",
            direction="Input")

        # Input table
        param1 = arcpy.Parameter(
            displayName="Clip Features",
            name="clip_features",
            datatype="GPFeatureLayer",
            parameterType="Required",
            direction="Input")

        # Input workspace
        param2 = arcpy.Parameter(
            displayName="Output Feature Class",
            name="out_feature_class",
            datatype="DEFeatureClass",
            parameterType="Required",
            direction="Output")

        # Set the dependencies for the output and its schema properties
        #  The two input parameters are feature classes.
        #
        param2.parameterDependencies = [param0.name, param1.name]
        param2.schema.clone = True

        params = [param0, param1, param2]

        return params

    def updateParameters(self, parameters):
        # 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)
        #
        parameters[0].schema.extentRule = "Intersection"
        return

featureTypeRule

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

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

"AsSpecified"

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

"FirstDependency"

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

Значения featureTypeRule

featureType

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

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

"Simple"

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

"Annotation"

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

"Dimension"

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

Значения featureType

geometryTypeRule

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

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

"Unknown"

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

"FirstDependency"

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

"Min", "Max"

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

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

"AsSpecified"

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

Значения geometryTypeRule

geometryType

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

extentRule

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

"AsSpecified"

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

"FirstDependency"

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

"Intersection"

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

"Union"

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

"Environment"

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

Значения extentRule

Пример

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

extent

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

Пример
parameters[2].schema.extentRule = "AsSpecified"
parameters[2].schema.extent = "123.32 435.8 987.3 567.9"
# Alternatively use a list, as follows:
# parameters[2].schema.extent = [123.32, 435.8, 987.3, 567.9]

fieldsRule

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

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

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

"None"

Поля не выводятся (кроме идентификатора объекта).

"FirstDependency"

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

"FirstDependencyFIDs"

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

"All"

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

"AllNoFIDs"

Выводятся все поля кроме ObjectID.

"AllFIDsOnly"

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

Значения fieldsRule

additionalFields

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

cellSizeRule

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

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

"AsSpecified"

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

"FirstDependency"

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

"Min", "Max"

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

"Environment"

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

Значения cellSizeRule

cellSize

Установите это значение для размера ячейки, если значение cellSizeRule равно "AsSpecified".

rasterRule

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

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

"FirstDependency"

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

"Min", "Max"

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

"Integer"

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

"Float"

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

Значения rasterRule

rasterFormatRule

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

additionalChildren

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

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

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

Объект value

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

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

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

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

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

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

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

type

обязательно

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

name

обязательно

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

fields

дополнительно

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

еxtent

дополнительно

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

spatial reference

дополнительно

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

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

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

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

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

0

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

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

1

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

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

2

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

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

3

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

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

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

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

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

class ExampleTool(object):
    def __init__(self):
        self.label       = "Example tool"
        self.description = "Example of parameter dependencies"

    def getParameterInfo(self):
        #Define parameter definitions

        # Input feature class
        param0 = arcpy.Parameter(
            displayName="Input feature class",
            name="in_features",
            datatype="GPFeatureLayer",
            parameterType="Required",
            direction="Input")

        # Input table
        param1 = arcpy.Parameter(
            displayName="Input table",
            name="in_table",
            datatype="GPTableView",
            parameterType="Required",
            direction="Input")

        # Input workspace
        param2 = arcpy.Parameter(
            displayName="Input workspace",
            name="in_workspace",
            datatype="DEWorkspace",
            parameterType="Required",
            direction="Input")

        # Derived workspaces
        param3 = arcpy.Parameter(
            displayName="Derived workspace",
            name="out_workspace",
            datatype="DEWorkspace",
            parameterType="Derived",
            direction="Output")

        # Set dependencies to the input workspace parameter
        param3.parameterDependencies = [param0.name]

        # Copy all existing contents to output
        param3.schema.clone = True

        params = [param0, param1, param2, param3]

        return params

Пример: Скопируйте два входных элемента (без изменений) в выходную рабочую область:

def updateParameters(self, parameters):
    inFC = parameters[0].value     # input feature class
    inTable = parameters[1].value  # input table
    inWS = parameters[2].value     # input workspace
    if inFC and inTable and inWS:
        parameters[3].schema.additionalChildren = [inFC, inTable]

    return

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

def updateParameters(self, parameters):
    children = []    # New empty list
    children.append(parameters[0].value)
    children.append(parameters[1].value)
    children.append(["polygon", "SummaryPolygon"])
    parameters[3].schema.additionalChildren = children

    return

Пример: Добавьте поле во входной класс объектов.

def updateParameters(self, parameters):
    
    # 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(parameters[0].value)
    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"])
    parameters[3].schema.additionalChildren = children

    return

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

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

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

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

def updateParameters(self, parameters):
    inVT = parameters[0].value   # multivalue ValueTable
    inWS = parameters[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  # Row count in 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)            
              
        parameters[2].schema.additionalChildren = children
    return

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