Як я можу сканувати дерево каталогів і змінювати Mxd relaPaths на true?


9

У мене є велика кількість папок проектів, де кожна папка проекту може мати багато підпапок. Ці папки можуть містити mxds, shapefiles, персональні gdb та fgdb. У багатьох випадках користувач забув перевірити "Використовувати відносні шляхи" перед збереженням mxds, тому коли папка скопіюється, посилання на джерела даних порушуються.

Я хотів би написати окремий скрипт arcpy, який проскакує через каталоги, відкриває кожен mxd, встановлює relaTaths на істинний, а потім зберігає mxd. Чи є сценарій, який робить це десь?

Властивість RelaPaths на об'єкті MapDocument читається лише заново . Чи є якийсь інший спосіб змінити це?


Я не впевнений, що це можливо чи не використовую цей робочий процес. Але я думаю, що це може спрацювати, якщо ви автоматично відкриєте кожен .mxd, скопіюйте всі джерела даних та інформацію з цього оригіналу .mxd у новий порожній .mxd, який має перевірені відносні шляхи, та повторно збережіть новий. Просто ідея як обхід, якщо ваш перший шлях виявиться неможливим.
MLowry

Я не думаю, що це можливо. Ви можете отримати список усіх документів, використовуючи абсолютні шляхи, та їх авторів, і СПАМУЙТЕ їх за допомогою суворого електронного листа.
Шон

Відповіді:


6

Це можливо за допомогою наступного сценарію python (завдяки Нілу Клеммонсу на форумі ESRI ). Вам знадобиться бібліотека комтитів та модуль 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

Також див. Локальний канонічний потік для використання модуля Snippets Pierssen у розділі Як отримати доступ до ArcObjects з Python?
matt wilkie

2

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

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


Ви перевірили, що це фактично фіксує шляхи до відносного?
Jason Scheirer

Я сам не пробував це, ні, але ця тема пропонує, щоб вона спрацювала: 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.