Wie kann ich den Verzeichnisbaum crawlen und Mxd relativePaths in true ändern?

9

Ich habe eine große Anzahl von Projektordnern, wobei jeder Projektordner viele Unterordner haben kann. Diese Unterordner können mxds, Shapefiles, persönliche GDBs und FGDs enthalten. In vielen Fällen hat der Benutzer vergessen, die "Relative Pfade verwenden" zu überprüfen, bevor die mxds gespeichert wurden. Wenn der Ordner kopiert wird, werden die Datenquellen-Links unterbrochen.

Ich möchte ein eigenständiges Arcpy-Skript schreiben, das durch die Verzeichnisse kriecht, jedes mxd öffnet, die relativen Pfade auf true setzt und dann das mxd speichert. Gibt es irgendwo ein Skript, das das macht?

Die relativePaths-Eigenschaft für das MapDocument-Objekt ist schreibgeschützt. Gibt es eine andere Möglichkeit, dies zu ändern?

Kirk Kuykendall
quelle
Ich bin mir nicht sicher, ob dies möglich ist oder nicht. Ich denke jedoch, dass dies funktionieren könnte, wenn Sie automatisch jede .mxd-Datei öffnen, alle Datenquellen und Informationen aus dieser ursprünglichen .mxd-Datei in eine neue leere .mxd-Datei kopieren, in der die relativen Pfade überprüft wurden, und dann die neue erneut speichern. Nur eine Idee als Workaround, wenn Ihr erster Weg nicht möglich ist.
MLowry
Ich denke nicht, dass es möglich ist. Sie könnten jedoch eine Liste aller Dokumente unter Verwendung absoluter Pfade und ihrer Autoren erhalten und diese mit einer strengen E-Mail SPAMEN.
Sean

Antworten:

6

Dies ist mit dem folgenden Python-Skript möglich (danke an Neil Clemmons im ESRI-Forum ). Sie benötigen die comtypes- Bibliothek und das Snippets- Modul von 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
quelle
Weitere Informationen zum Verwenden von Pierssens Snippets-Modul finden Sie im lokalen kanonischen Thread unter Wie greife ich von Python aus auf ArcObjects zu?
Matt Wilkie
2

In 10.0 nicht möglich , aber ich hatte einige Erfolge mit ArcObjects in Python für relativ einfache Aufgaben wie diese, bei denen das Schreiben einer .NET-Anwendung übertrieben wäre, aber die erforderliche Funktionalität in den arcpy / arcgisscripting-Modulen nicht verfügbar gemacht wurde. Verwenden Sie os.walk zum Crawlen des Verzeichnisbaumteils.

Verwenden Sie für das ArcObjects-Bit, um IMapDocument.Open()die MXD zu öffnen (ohne sie in ArcMap öffnen zu müssen), in true umzuwandeln IMxDocumentund RelativePathsauf true zu setzen und IMapDocument.Save()zum Speichern zu verwenden.

blah238
quelle
Haben Sie überprüft, dass dies tatsächlich die Pfade zu Verwandten festlegt?
Jason Scheirer
Ich habe es nicht selbst versucht, nein, aber dieser Thread schlägt vor, dass es funktionieren sollte: forums.esri.com/Thread.asp?c=93&f=1154&t=260812
blah238
Ich bin mir auch sicher, dass Kirk bereits weiß, wie das geht: forums.esri.com/Thread.asp?c=93&f=992&t=64946 :)
blah238
@ blah238 Das ist VBA, was ich brauche, ist ein eigenständiges Arcpy-Skript.
Kirk Kuykendall
1
Die Frage bezog sich darauf, dies mit arcpy und nicht mit .NET zu tun, und meines Wissens ist es mit arcpy bei 10.0 nicht möglich (siehe den ersten Link in meiner Antwort).
blah238