Comment puis-je analyser l'arborescence de répertoires et modifier les chemins d'accès relatifs de Mxd en true?

9

J'ai un grand nombre de dossiers de projet où chaque dossier de projet peut avoir plusieurs sous-dossiers. Ces sous-dossiers peuvent contenir des mxds, des fichiers de formes, des gdb et fgdb personnels. Dans de nombreux cas, l'utilisateur a oublié de cocher la case "Utiliser les chemins d'accès relatifs" avant d'enregistrer les mxds. Ainsi, lorsque le dossier est copié, les liens de source de données sont rompus.

Je voudrais écrire un script arcpy autonome qui explore les répertoires, ouvre chaque mxd, définit les chemins relatifs sur true, puis enregistre le mxd. Y a-t-il un script qui fait ça quelque part?

La propriété relativePaths sur l' objet MapDocument est en lecture seule. Y a-t-il un autre moyen de changer cela?

Kirk Kuykendall
la source
Je ne sais pas si cela est possible ou si je n'utilise pas ce flux de travail. Mais ce que je pense pourrait fonctionner, c'est si vous ouvrez automatiquement chaque .mxd, copiez toutes les sources de données et les informations de ce .mxd d'origine dans un nouveau .mxd vierge dont les chemins relatifs sont vérifiés, puis réenregistrez le nouveau. Juste une idée comme solution de contournement si votre première approche n'est pas possible.
MLowry
Je ne pense pas que ce soit possible. Vous pouvez cependant obtenir une liste de tous les documents en utilisant des chemins absolus et leurs auteurs et les SPAM avec un e-mail sévère.
Sean

Réponses:

6

Ceci est possible en utilisant le script python suivant (avec merci à Neil Clemmons sur le forum ESRI ). Vous aurez besoin de la comtypes bibliothèque et le Snippets module à partir Pierssen Consulting.

from Snippets import GetLibPath, InitStandalone
from comtypes.client import GetModule, CreateObject
import os

m = GetModule(GetLibPath() + 'esriCarto.olb')
InitStandalone()
file_dir = r'C:\dir'
for filename in os.listdir(file_dir):
   fullpath = os.path.join(file_dir, filename)
   p = CreateObject(m.MapDocument, interface=m.MapDocument)
   p.Open(fullpath)
   newpath = os.path.join(file_dir,'Changed_' + filename)
   p.SaveAs(newpath,True,False)
   del p
Stev_k
la source
Consultez également le thread canonique local pour l'utilisation du module Snippets de Pierssen sur Comment accéder à ArcObjects à partir de Python?
matt wilkie
2

Pas possible dans 10.0 , mais j'ai eu un certain succès en utilisant ArcObjects en Python pour des tâches relativement simples comme celle-ci où l'écriture d'une application .NET serait exagérée, mais les fonctionnalités nécessaires n'étaient pas exposées dans les modules arcpy / arcgisscripting. Utilisez os.walk pour explorer la partie de l'arborescence des répertoires.

Pour le bit ArcObjects, utilisez IMapDocument.Open()pour ouvrir le MXD (sans avoir à l'ouvrir dans ArcMap), convertissez-le en true IMxDocumentet définissez-le RelativePaths, puis utilisez-le IMapDocument.Save()pour l'enregistrer.

blah238
la source
Avez-vous vérifié que cela corrige réellement les chemins d'accès relatifs?
Jason Scheirer
Je ne l'ai pas essayé moi-même, non, mais ce fil suggère qu'il devrait fonctionner: forums.esri.com/Thread.asp?c=93&f=1154&t=260812
blah238
Je suis également sûr que Kirk sait déjà comment faire: forums.esri.com/Thread.asp?c=93&f=992&t=64946 :)
blah238
@ blah238 C'est VBA, ce dont j'ai besoin est un script arcpy autonome.
Kirk Kuykendall,
1
La question faisait référence à faire cela avec arcpy, pas .NET, et si je comprends bien, il n'est pas possible de le faire avec arcpy à 10.0 (voir le premier lien dans ma réponse).
blah238