Suite

Calculer le champ en utilisant les noms de champs (variables ?!)

Calculer le champ en utilisant les noms de champs (variables ?!)


la question que j'ai est en quelque sorte posée avant. Mais je n'arrivais pas à trouver la solution.

ArcGIS 10.2.2 Python 2.7.5

J'ajoute des champs à une table en utilisant l'entrée utilisateur pour les noms de champs. Ensuite, je remplis ces champs et calcule avec ces champs encore un autre champ.

Cela ressemble à ceci :

fieldname1 = arcpy.GetParameterAsText(2) fieldname2 = arcpy.GetParameterAsText(3) arcpy.AddField_management(FC, fieldname1, "SHORT","", "", "", "", "NULLABLE") arcpy.AddField_management(FC, fieldname2, "SHORT","", "", "", "", "NULLABLE")

Dans l'outil, le type de données pour l'entrée utilisateur est défini sur "String".

Ensuite, j'utilise le curseur de recherche et de mise à jour pour remplir ces champs. Ensuite, je veux calculer le champ suivant, donc je construis un bloc de code et une expression et j'utilise CalculateField_management :

codeblock = """def myFunction(mthree, mtwo): if mthree >= 1 ou mtwo >= 3: return -3 elif mthree == 0 et (mtwo==1 or mtwo==2): return -2 elif mthree == 0 et mtwo < 3 et mone >= 5: return -2 if mthree == 0 et mtwo == 0 et mone ==4: return -1""" expression = 'myFunction(fieldname1, fieldname2)' arcpy. CalculerField_management(FC, "EPK_Gesamt",expression,"PYTHON_9.3",codeblock)

et ça ne marche pas. J'ai essayé plusieurs choses comme :

fieldn1 = '"!{}!"'.format(fieldname1) fieldn2 = '"!{}!"'.format(fieldname2) expression = 'myFunction(fieldn1, fieldn2)'

ou alors:

expression = "maFonction('!' + nomchamp1 + '!','!' + nomchamp2 + '!')'

Dans les deux cas, python me renvoie des valeurs de texte au lieu de noms de champs, ce qui ne fonctionne pas pour le calcul dans l'outil calculatefield.

Cela fonctionne bien si j'utilise les noms de champs réels dans la variable d'expression :

expression = 'maFonction(!exemple1!, !exemple2!)'

Mais bien sûr, je veux utiliser l'entrée utilisateur, afin que l'utilisateur n'ait pas à travailler dans le script. Quelqu'un sait comment gérer ça ?


Cela devrait fonctionner pour vous :

import arcpy fc = r"C:UsersusDocumentsArcGISDefault.gdb\_PointDistanceFc" field1 = arcpy.GetParameterAsText(0) field2 = arcpy.GetParameterAsText(1) codeblock = """def myFunction(field1_dum, field2_dum ): if field1_dum >= 1 ou field2_dum >= 3: return -3 elif field1_dum == 0 et (field2_dum==1 ou field2_dum==2): return -2 elif field1_dum == 0 et field2_dum < 3 et mone >= 5: return -2 if field1_dum == 0 et field2_dum == 0 et mone ==4: return -1""" expression = 'myFunction(!{0}!, !{1}!)'.format(field1, field2) arcpy.CalculateField_management(fc,"EPK_Gesamt",expression,"PYTHON_9.3",codeblock)

J'ai créé un outil de script avec ce code uniquement et deux paramètres d'entrée de types String. Les chaînes de noms de champs que je soumets sont correctement insérées dans l'expression.

En fonction de vos préférences personnelles, envisagez d'utiliser les curseurs arcpy pour mettre à jour les champs au lieu d'exécuter l'outil GP.


J'ai une autre question concernant ce problème:

>>> test1 = "test1" >>> fieldn = '!{}!'.format(test1) >>> print fieldn !test1! fieldna = '(!{0}!, !{1}!)'.format(test1,test2) >>> print fieldna (!test1!, !test2!)

Maintenant, je vois une différence. Si j'utilise la fonction de format, j'obtiens un tuple, mais le format convient quand même. Je ne comprends pas pourquoi je ne peux pas utiliser la première version dans ma fonction comme

expression = 'maFonction(test1,test2)'

ça marche bien avec :

expression = 'maFonction(!{0}!, !{1}!)'.format(test1,test2)

Mais je ne comprends pas pourquoi