6 votos

Cómo obtener nombres de campo en una tabla de valores en función del valor de entrada

Me gustaría añadir un parámetro como tabla de valores siendo uno de los campos una lista de valores. La tabla de valores consta de 3 columnas, a saber, "tabla", "campo", "descripción", mientras que "campo" es una lista de valores. Los valores de la lista de valores dependerán de la "tabla" de entrada, por lo que cambiarán con cada nueva entrada. Por ejemplo, si se añade una tabla xyz a la lista de valores, se obtendrá una lista de campos que podrá seleccionarse a continuación.

Mi código por ahora:

        def getParameterInfo(self):
            in_tables = arcpy.Parameter(
                displayName = "test",
                name = "test",
                datatype = "GPValueTable",
                parameterType = "Optional",
                direction = "Input")
            in_tables.columns = [["DETable", "table"],["GPString","field"],["GPString","description"]]
            in_tables.filters[1].type = 'ValueList'
            in_tables.filters[1].list = ["<marker spalte>"] #dummy list which is updated in updateParamters

        ...
        def updateParameters(self, parameters):
            if parameters[0].value and parameters[0].altered:
                fields_list = [field.name for field in arcpy.Describe(parameters[0].value[0][0]).fields]
                parameters[0].filters[1].list = fields_list #update of dummy list

En realidad, esto funciona, pero siempre obtengo la lista de campos de la primera entrada. He pensado en utilizar len para obtener siempre la última entrada (lo que es un poco más útil pero sigue sin ser satisfactorio). Lo que preferiría es la identificación de la fila seleccionada para actualizar dinámicamente la lista de valores con los nombres de los campos relacionados.

¿Hay alguna forma de hacerlo?

ArcGIS 10.3.1

Actualización: El problema con mi parameters[0].value[0][0] El problema al trabajar con len() es que se produce un error si uno de los campos seleccionados anteriormente no existe en la última lista de campos. Por eso he cambiado mi método updateParameters.

        if parameters[0].value and parameters[0].altered:
            all_tables_list = parameters[0].value
            number_of_tables = len(all_tables_list)
            i = 0
            fields_list_tmp = []
            for in_table in all_tables_list:
                fields_list_tmp.append([field.name for field in arcpy.Describe(parameters[0].value[i][0]).fields])
                i += 1
            fields_list = list(set([item for sublist in fields_list_tmp for item in sublist]))
            parameters[0].filters[1].list = fields_list

que básicamente crea una lista con todos los campos existentes en todas las tablas seleccionadas.

2voto

Xetius Puntos 10445

No tengo acceso a la versión 10.3, pero ¿es posible en el parámetro.filters[] establecer una dependencia a la primera columna?

Si no es así, como dices, esta es la línea que está causando el problema.

parameters[0].value[0][0]

Ya que está llamando a la primera fila primera columna. Si eliges esta ruta, entonces creo que encontrar el len de la lista podría ser tu mejor opción.

Alternativamente, usted podría poner el campo como la primera columna, y sacar el DETable como un parámetro separado y luego establecer la dependencia del GPValueTable como ese parámetro. Esto podría forzar a las selecciones de campo a ser el dependiente de ese primer parámetro. Usted puede agregar una columna de cadena para almacenar el nombre de la tabla y luego utilizar el updatemessages/parámetros para comprobar para actualizar esa columna o como una comprobación de nombre. Lo siento, sé que suena un poco enrevesado.

Aquí hay un ejemplo que puede ayudar conceptualmente: Creación de una ValueTable con una columna que tiene dependencia

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X