Suite

Mettre à jour un groupe de calques à l'aide d'arcpy


Je travaille avec plusieurs MXD'S et j'essaye de mettre à jour un groupe de calque nommé "allHa" contenant plusieurs calques avec ce code :

importer arcpy,os,sys,string importer arcpy.mapping depuis arcpy importer env env.workspace = r"D:PROJECTS
oad_20gis" sourceLayer = arcpy.mapping.Layer(r"D:PROJECTS
oad_20gis couches16_12_15allHa.lyr") pour mxdname dans arcpy.ListFiles("*.mxd") : print mxdname mxd = arcpy.mapping.MapDocument(r"D:PROJECTS
oad_20gis" + mxdname) df = arcpy.mapping.ListDataFrames(mxd, "Layers")[0] updateLayer = arcpy.mapping.ListLayers(mxd, "allHa", df)[0] dfList = arcpy.mapping.ListDataFrames(mxd, "*") pour df dans dfList : pour lyr dans arcpy.mapping.ListLayers(mxd, "", df) : si lyr.name == u"allHa": arcpy.mapping.UpdateLayer(df, lyr, sourceLayer, True) print 'UpdateLayer' mxd.save() de mxd

mais j'obtiens une erreur :

>>> antiquities__55-30__403.mxd Traceback (appel le plus récent en dernier) : Fichier "C:Program FilesCCleaneryaronshonotsoftware---gis--- 	oolsYARON_SCRIPTSUpdateLayer 1 df.py" , ligne 16, dans  arcpy.mapping.UpdateLayer(df, updateLayer, sourceLayer, True) Fichier "C:Program Files (x86)ArcGISDesktop10.3ArcPyarcpyutils.py", ligne 182, dans fn_ return fn(*args , **kw) Fichier "C:Program Files (x86)ArcGISDesktop10.3ArcPyarcpymapping.py", ligne 1897, dans UpdateLayer tl._update(rl, symbology_only) ValueError : LayerObject : erreur inattendue >>>

Vous obtiendrez cette erreur exacte si vous essayez d'exécuter UpdateLayer avec une couche source et une couche de mise à jour avec différents types de géométrie ou si l'une des couches est un groupe de couches sans aucune symbologie propre.

Ce qui se passe probablement, c'est que votre fichier allHa.lyr contient en fait un groupe de calques avec le calque que vous souhaitez mettre à jour en tant qu'enfant vers ce calque.

exécutez ce code et dites-moi ce que vous obtenez.

sourceLayer = arcpy.mapping.Layer(r"D:PROJECTS
oad_20gislayers16_12_15allHa.lyr") imprimer sourceLayer.isGroupLayer

si votre couche source, votre couche de mise à jour ou les deux sont un groupe de couches, UpdateLayer générera une erreur.

EDIT : évitez et protégez-vous contre cela comme ceci :

# si notre fichier de calque contient un groupe de calques comme calque racine, nous devons # trouver un calque non-groupe à utiliser comme source. Ce code suppose qu'il existe # n'importe quel niveau d'imbrication de couches de groupe et une seule couche avec symbologie. # cela peut être évité si vous contrôlez le fichier .lyr et pouvez simplement enregistrer le nœud feuille (nœud de couche non groupé) en tant que son propre fichier .lyr def findLeafLayer(groupLayer): if groupLayer.isGroupLayer: pour la couche dans arcpy.mapping .ListLayers(groupLayer): sinon layer.isGroupLayer: return layer else: return groupLayer sourceLayer = findLeafLayer(arcpy.mapping.Layer(r"D:PROJECTS
oad_20gislayers16_12_15allHa.lyr")) pour df dans dfList : lyr = findLeafLayer(arcpy.mapping.ListLayers(mxd, "allHa", df)[0]) arcpy.mapping.UpdateLayer(df, lyr, sourceLayer, True) print 'Updatedlayer '

Je pense que Ryan a raison. Un groupe de couches ne peut pas être mis à jour. Au lieu de cela, mettez à jour les calques du groupe. Vous devez donc étendre votre boucle for-each.

si lyr.name == u"allHa": pour <> dans <>: <>'

Il suffit de modifier le<<… >>