Использование MultiValue в параметрах инструмента скрипта Python?

10

Мой скрипт отлично работает с одним классом объектов, выбранным для clip_fc = arcpy.GetParameter(0).

Однако, когда я устанавливаю clip_fc в значение MultiValue в свойствах сценария, а затем выбираю несколько классов объектов, я получаю сообщение об ошибке «Параметры недопустимы».

Может кто-нибудь показать мне, где я иду не так?

import arcpy
import os.path
from arcpy import env

arcpy.env.workspace = r"C:\GIS Home\project_1\clipshps\Combined_mf.gdb"
arcpy.env.overwriteOutput = True
clip_fc = arcpy.GetParameter(0)
clip_name = str(clip_fc)
output_dir = r"C:\GIS Home\project_1\clipshps\outputs_clip"

for fds in arcpy.ListDatasets():
    for fc in arcpy.ListFeatureClasses('','',fds):
        out = os.path.join(output_dir, fc + "_" + clip_name[40:] + "_clip.shp")
        arcpy.Clip_analysis(fc, clip_fc, out, "")
Matt
источник
1
Не могли бы вы поставить скрипт с fc_list, чтобы увидеть, как вы его используете?
om_henners
привет @om_henners Извините, я исправил свой вопрос, теперь должно быть больше смысла.
Мэтт
Связанный: gis.stackexchange.com/questions/9406/…
Рой

Ответы:

21

Вы должны пройти через ваши входы. Многозначный разделен точкой с запятой. Разделитесь на это и пройдитесь по ним. (AddMessages, чтобы показать, как представлены FCS)

import arcpy

ins = arcpy.GetParameterAsText(0)
arcpy.AddMessage(ins)

for fc in ins.split(';'):
    arcpy.AddMessage(fc)
    arcpy.Clip_analysis(fc, clipfeats, out)

Хотя я не совсем уверен в вашем рабочем процессе. Вы передаете несколько функций для закрепления, но также перебираете несколько функций в GDB? Вы должны будете взять логику, которую я разместил выше, и выяснить, какую комбинацию входов вы хотите (1 или много FC внутри GDB + 1 или много входов для вашего инструмента)

РЕДАКТИРОВАТЬ ... Исходя из вашего комментария, вы хотите, чтобы многие классы объектов были обрезаны по множеству классов объектов. Попробуйте эту смесь кода, основанную на вашем и моем:

import arcpy, os

ins = arcpy.GetParameterAsText(0)
arcpy.AddMessage(ins)

arcpy.env.workspace = r"C:\GIS Home\project_1\clipshps\Combined_mf.gdb"
output_dir = r"C:\GIS Home\project_1\clipshps\outputs_clip"


for fds in arcpy.ListDatasets():

    # will loop for every featureclass
    for fc in arcpy.ListFeatureClasses('','',fds):            

        # will loop for each input fc from the tool
        for fc_clip in ins.split(';'):
            outName = os.path.join(output_dir, str(os.path.basename(fc)) + "_" + str(os.path.basename(fc_clip)))
            arcpy.Clip_analysis(fc, fc_clip, outName, "")
KHibma
источник
2
Вот ссылка на файлы справки по параметрам инструмента сценариев ESRI . Они также предлагают пример кода.
Рой
Спасибо @KHibma Глядя на ваш ответ, я думаю, что я поступаю неправильно. У меня есть база геоданных, содержащая несколько классов объектов, и я хочу несколько раз обрезать каждый класс объектов, используя разные шейп-файлы.
Мэтт
@KHibma попробовал это и получил «клип1 не существует или не поддерживается»
Мэтт
Ммм, это нормально работает для меня? Единственное, что я могу думать, это выходной каталог. Возможно, вам понадобится добавить «.shp» в конец вашего outname в качестве папки, а не в gdb.
Хибма
7
for fc in arcpy.GetParameterAsText(0).split(";"):
    arcpy.AddMessage(fc)
arcpy.AddMessage("No more shapefiles")
Джейсон Шайрер
источник