Suite

Erreur arcpy.mapping.Layer lors de l'utilisation de fichiers sur plusieurs trames de données


Je peux faire en sorte que le code suivant s'exécute dans un mxd avec une seule trame de données. J'en ai besoin, cependant, pour exécuter et parcourir un mxd qui a plusieurs dataframes avec des fichiers et des sources de données portant le même nom que ceux de ma liste de chansons.

ÉDITER Information additionnelle - L'intention de la dernière instruction if était de fournir une solution de contournement à l'incapacité d'arcpy à définir l'expression d'affichage dans la boîte de dialogue des propriétés de la couche en rajoutant un fichier avec un champ de nom. Ainsi, le nœud de la question est de savoir comment mettre à jour au mieux une expression d'affichage de couches de manière automatisée (de préférence avec python car je ne connais pas ArcObjects).

import arcpy lyrlist = ['Inset Bridges','Bridges', 'Transportation Points', 'Transportation Lines'] mxd = arcpy.mapping.MapDocument("Current") dflist = arcpy.mapping.ListDataFrames(mxd) pour df dans dflist : if df.scale <= 126720: pour lyr dans (arcpy.mapping.ListLayers(mxd, "", df)): if lyr.supports("DEFINITIONQUERY") : si lyr.name dans lyrlist : NewFile = arcpy.mapping .Layer(lyr.dataSource) OldFN = lyr.name NewFile.name ="NewFi" lyr.name = "OldFi" arcpy.mapping.InsertLayer(df, lyr, NewFile, "AFTER") #la ligne suivante génère l'erreur ValueError lorsqu'il est exécuté dans un #mxd qui a plusieurs dataframes avec des noms de fichiers de lyrlist updateLyr = arcpy.mapping.Layer("NewFi") sourceLyr = arcpy.mapping.Layer("OldFi") arcpy.mapping.UpdateLayer(df, updateLyr, sourceLyr, True) updateLyr.name = OldFN arcpy.mapping.RemoveLayer(df, lyr) arcpy.RefreshTOC() arcpy.RefreshActiveView print "script complete" del mxd

Le code fonctionne bien jusqu'à ce qu'il atteigne l'endroit où j'affecte la variable updateLyr. Cela me donne l'erreur suivante :

Erreur d'exécution Traceback (appel le plus récent en dernier) :

Fichier "", ligne 44, dans

Fichier "c:program files (x86)arcgisdesktop10.1arcpyarcpyarcobjectsmixins.py", ligne 389, dans init super(LayerMixin, soi).init(fichier lyrique)

Fichier "c:program files (x86)arcgisdesktop10.1arcpyarcpyarcobjects_base.py", ligne 47, dans init pour arg dans args))

ValueError : Object : CreateObject Layer source de données non valide


Pour déboguer cela, je vous recommande de modifier :

pour df dans dflist : si df.scale <= 126720 : pour lyr dans (arcpy.mapping.ListLayers(mxd, "", df)): si lyr.supports("DEFINITIONQUERY") :

à:

pour df dans dflist : if df.scale <= 126720 : pour lyr in (arcpy.mapping.ListLayers(mxd, "", df)): print df.name + " : " + lyr.name if lyr.supports(" DEFINITIONQUERY") :

Je n'ai pas testé ce qui précède, mais cela devrait vous permettre d'identifier la trame de données et la couche qu'elle contient qui déclenche votre erreur.


J'ai eu de bonnes idées de débogage qui m'ont finalement aidé à trouver ma solution qui a fini par être plus simple que ce que j'essayais de faire. Fondamentalement, je laisse arcpy UpdateLayer faire plus de travail pour résoudre mon problème d'expression d'affichage. Je ne sais pas quelle était la source de mon problème d'origine, mais la solution suivante a fait ce que je voulais :

* EDIT Voici ma solution. Il a été modifié pour changer le dernier paramètre UpdateLayer en False. C'était essentiel car il appliquait ensuite l'ensemble du modèle de calque et pas seulement la légende au fichier dont l'affichage devait être mis à jour. Voir la documentation d'ESRI pour plus d'informations.

import arcpy mxd = arcpy.mapping.MapDocument("Current") dflist = arcpy.mapping.ListDataFrames(mxd) pour df dans dflist : if df.scale <= 126720 : pour lyr dans (arcpy.mapping.ListLayers(mxd, " ", df)): if lyr.supports("DEFINITIONQUERY"): if lyr.name == "Bridges": sourceLyr = arcpy.mapping.Layer(r"C:Bridgefile.lyr") arcpy.mapping.UpdateLayer( df, lyr, sourceLyr, False) print lyr.name + " mis à jour" elif lyr.name == "Transportation Lines": sourceLyr = arcpy.mapping.Layer(r":C:TransFile.lyr") arcpy.mapping. UpdateLayer(df, lyr, sourceLyr, False) print lyr.name + " mis à jour" arcpy.RefreshTOC() arcpy.RefreshActiveView print "script complete" del mxd


Voir la vidéo: Python в ArcGIS - ТОП-10 самых востребованных функций,, Esri CIS (Octobre 2021).