Как я могу сканировать дерево каталогов и изменить MxdlativePaths на true?

9

У меня есть большое количество папок проекта, где каждая папка проекта может иметь много подпапок. Эти подпапки могут содержать MXDS, шейп-файлы, личные GDB и FGDB. Во многих случаях пользователь забывал проверить «Использовать относительные пути» перед сохранением mxds, поэтому, когда папка копируется, ссылки на источники данных нарушаются.

Я хотел бы написать автономный скрипт arcpy, который сканирует каталоги, открывает каждый mxd, устанавливает относительные пути в true, а затем сохраняет mxd. Есть сценарий, который делает это где-нибудь?

СвойствоlativePaths объекта MapDocument доступно только для чтения . Есть ли другой способ изменить это?

Кирк Куйкендалл
источник
Я не уверен, возможно ли это или нет, используя этот рабочий процесс. Но я думаю, что может сработать, если вы автоматически откроете каждый файл .mxd, скопируете все источники данных и информацию из этого оригинального файла .mxd в новый пустой файл .mxd с проверенными относительными путями, а затем повторно сохраните новый. Просто идея как обходной путь, если ваш первый путь окажется невозможным.
MLowry
Я не думаю, что это возможно. Вы можете получить список всех документов, используя абсолютные пути и их авторов, и спамить их строгим письмом.
Шон

Ответы:

6

Это возможно, используя следующий скрипт на python (благодаря Нилу Клеммонсу на форуме ESRI ). Вы будете нуждаться в comtypes библиотеке и Snippets модуле из 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
источник
Также см. Местный канонический поток по использованию модуля Snipspets Пирссена в разделе Как получить доступ к ArcObjects из Python?
Мэтт Уилки
2

Невозможно в 10.0 , но я имел некоторый успех, используя ArcObjects в Python для относительно простых задач, подобных этой, где написание приложения .NET было бы излишним, но необходимые функции не были представлены в модулях arcpy / arcgisscripting. Используйте os.walk для сканирования части дерева каталогов.

Для бита ArcObjects используйте, IMapDocument.Open()чтобы открыть MXD (без необходимости открывать его в ArcMap), привести к значению true IMxDocumentи установить RelativePathsего и использовать IMapDocument.Save()для его сохранения.

blah238
источник
Вы убедились, что это на самом деле фиксирует пути к родственнику?
Джейсон Шайрер
Я сам не пробовал, нет, но эта ветка предполагает, что это должно работать: forums.esri.com/Thread.asp?c=93&f=1154&t=260812
blah238
Также я уверен, что Кирк уже знает, как это сделать: forums.esri.com/Thread.asp?c=93&f=992&t=64946 :)
blah238
@ blah238 Это VBA, мне нужен отдельный Arcpy скрипт.
Кирк Куйкендалл
1
Вопрос касался того, чтобы сделать это с arcpy, а не .NET, и, насколько я понимаю, это невозможно сделать с arcpy на 10.0 (см. Первую ссылку в моем ответе).
blah238