Détecter Join par programmation à l'aide d'ArcPy?

10

J'ai du code Python qui est lancé à partir d'un projet ArcMap. Toutes les jointures que l'utilisateur peut avoir créées dans le projet doivent être supprimées pour que mon code s'exécute. Malheureusement, le code qui supprime une jointure… arcpy.RemoveJoin_management ("layer1", "layer2") ... casse également certaines des propriétés de couche qui sont essentielles pour mon application (champs en surbrillance, champs en lecture seule, etc.).

Si les jointures sont supprimées en cliquant avec le bouton droit sur la couche dans ArcMap et en choisissant «Supprimer les jointures», les propriétés de la couche restent intactes.

Si je peux détecter qu'une jointure existe à partir de mon code, je quitterai simplement le code et afficherai un message indiquant que l'utilisateur doit supprimer manuellement ses jointures avant d'essayer d'exécuter le code. Alors… Une jointure peut-elle être détectée par programme?

BrianPeasley
la source
Je suis un peu perdu sur la façon dont faire le RemoveJoin via arcpy provoque des problèmes. Comment cela gâche-t-il un champ en lecture seule? En outre, l'utilisation de l'outil Supprimer la jointure dans ArcMap provoque-t-elle les mêmes problèmes?
Nathanus
Peut-être qu'une autre façon de résoudre ce problème serait de rendre votre code python insensible aux jointures?
Dan S.
@ Nathanus - Le manuel Supprimer la jointure dans ArcMap ne casse pas les propriétés de ma couche, contrairement à l'outil GP. Voici une citation pertinente de l'aide ESRI: "Comme ces outils effectuent le traitement de jointure réel en arrière-plan légèrement différemment de la boîte de dialogue Join Data, utilisez les outils si vous rencontrez des problèmes inattendus avec la fonctionnalité de jointure de cette boîte de dialogue. "
BrianPeasley
@ Dan S. - J'utilise des curseurs d'insertion et autres dans mon code. Je n'ai aucune idée de la façon dont j'allais rendre mon code insensible aux jointures.
BrianPeasley
1
eh bien, cela valait la peine d'être demandé. ;) forums.esri.com/Thread.asp?c=93&f=1729&t=293173 semble impliquer que vous pourrez peut-être mettre à jour les valeurs d'une table jointe en préfixant les noms de colonne par le nom de la table; peut-être que cela fonctionnerait également sur un encart?
Dan S.

Réponses:

8

Dommage qu'il n'y ait pas de propriété hasJoin sur la classe arcpy.Layer . Je pense que vous pouvez tester une jointure en regardant les noms de champs. Voici une preuve de concept simple pour les données d'une géodatabase fichier:

import arcpy, arcpy.mapping as arc

def joinCheck(lyr):
  fList = arcpy.Describe(lyr).fields
  for f in fList:
    if f.name.find(lyr.datasetName) > -1:
      return True
  return False

arcpy.env.workspace = r'<path_to_your_gdb>'
mxd = arc.MapDocument(r'<path_to_your_mxd>')
lyrs = arc.ListLayers(mxd)
for lyr in lyrs:
  # ignore group layers
  if not lyr.isGroupLayer:
    hasJoin = joinCheck(lyr)
    if hasJoin:
      print '\nFound a join: %s.' % lyr.datasetName
    else:
      print '\nNo join found on %s.' % lyr.datasetName
Derek Swingley
la source
Cela semble prometteur! Je ne comprends pas la chair de ce qu'il fait: "si f.name.find (lyr.datasetName)> -1:" mais je vais l'essayer dans quelques jours et rapporter (je suis sur le point de neiger et perdre du pouvoir!) ... Merci!
BrianPeasley
Heureux de vous aider. Découvrez la méthode de recherche intégrée pour les chaînes python: docs.python.org/library/string.html ainsi que le document pour les objets de champ arcpy : help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/ Field /… Je dirais que vous devriez essayer ce code avec vos données et voir si cela fonctionne.
Derek Swingley
1
J'ai fini par utiliser une fonction très similaire à celle-ci et cela fonctionne très bien ... Pour chaque couche de mon document, je passe en revue la liste des champs et j'utilise Python pour déterminer s'il y a un "point" dans le nom du champ.
BrianPeasley
1

Je pense que vous constaterez qu'il n'y a pas de moyen pare-balles de le faire avec des objets GP, vous devrez utiliser ArcObjects et comtypes. Voici quelques discussions des forums ESRI sur les difficultés à vérifier les jointures avec les outils / objets GP standard: https://geonet.esri.com/thread/20317

blah238
la source
Les ArcObjects et les comtypes ne seront pas la solution pour ce projet, ils me sont étrangers et ce projet est dû hier. Merci de m'avoir indiqué ce fil de discussion! Je vais essayer l'idée présentée ici: "... vérifiez si l'un des champs fieldname.split (".)
Résulterait