Jak mogę przeszukiwać drzewo katalogów i zmienić wartość parametru Mxd relativePaths na true?

9

Mam dużą liczbę folderów projektów, w których każdy folder projektu może mieć wiele podfolderów. Te podfoldery mogą zawierać pliki mxds, shapefile, osobiste pliki gdb i fgdb. W wielu przypadkach użytkownik zapomniał sprawdzić „Użyj ścieżek względnych” przed zapisaniem mxds, więc gdy folder zostanie skopiowany, łącza źródła danych ulegają uszkodzeniu.

Chciałbym napisać samodzielny skrypt arcpy, który przeszukuje katalogi, otwiera każdy plik mxd, ustawia parametr relativePaths na wartość true, a następnie zapisuje plik mxd. Czy jest gdzieś skrypt, który to robi?

Właściwość relativePaths w obiekcie MapDocument jest tylko do odczytu. Czy jest jakiś inny sposób, aby to zmienić?

Kirk Kuykendall
źródło
Nie jestem pewien, czy to możliwe, czy nie korzystam z tego przepływu pracy. Ale myślę, że może zadziałać, jeśli automatycznie otworzysz każdy plik .mxd, skopiujesz wszystkie źródła danych i informacje z tego oryginalnego pliku .mxd do nowego pustego pliku .mxd z zaznaczonymi ścieżkami względnymi, a następnie ponownie zapiszesz nowy. Pomysł na obejście, jeśli Twoja pierwsza droga nie będzie możliwa.
MLowry
Nie sądzę, żeby to było możliwe. Możesz jednak uzyskać listę wszystkich dokumentów, używając bezwzględnych ścieżek i ich autorów, i SPAM je surowym adresem e-mail.
Sean

Odpowiedzi:

6

Jest to możliwe przy użyciu następującego skryptu python (dzięki dzięki Neilowi ​​Clemmonsowi z forum ESRI ). Będziesz potrzebować biblioteki comtypes i modułu Snippets od 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
źródło
Zobacz także lokalny wątek kanoniczny dotyczący korzystania z modułu Snippets Pierssena w temacie Jak uzyskać dostęp do ArcObjects z Pythona?
matt wilkie
2

Nie jest to możliwe w wersji 10.0 , ale odniosłem pewien sukces przy użyciu ArcObjects w Pythonie do stosunkowo prostych zadań, takich jak to, gdzie pisanie aplikacji .NET byłoby przesadą, ale niezbędna funkcjonalność nie została ujawniona w modułach arcpy / arcgisscripting. Użyj os.walk do przeszukiwania części drzewa katalogów.

W przypadku bitu ArcObjects użyj, IMapDocument.Open()aby otworzyć MXD (bez konieczności otwierania go w ArcMap), przesłać na IMxDocumenti ustawić RelativePathsna true, i użyć, IMapDocument.Save()aby go zapisać.

blah238
źródło
Masz dowód, że to rzeczywiście rozwiązuje ścieżki na względne?
Jason Scheirer,
Nie próbowałem tego sam, nie, ale ten wątek sugeruje, że powinien działać: forums.esri.com/Thread.asp?c=93&f=1154&t=260812
blah238
Jestem też pewien, że Kirk już wie, jak to zrobić: forums.esri.com/Thread.asp?c=93&f=992&t=64946 :)
blah238,
@ blah238 To jest VBA, potrzebuję samodzielnego skryptu arcpy.
Kirk Kuykendall
1
Pytanie dotyczyło robienia tego z arcpy, a nie .NET, i jak rozumiem, nie można zrobić z arcpy przy 10.0 (zobacz pierwszy link w mojej odpowiedzi).
blah238