Como posso rastrear a árvore de diretórios e alterar Mxd relativePaths para true?

9

Eu tenho um grande número de pastas de projeto em que cada pasta de projeto pode ter muitas subpastas. Essas subpastas podem conter mxds, shapefiles, gdb's pessoais e fgdbs. Em muitos casos, o usuário esqueceu de verificar "Usar caminhos relativos" antes de salvar os mxds; portanto, quando a pasta é copiada, os links da fonte de dados ficam quebrados.

Eu gostaria de escrever um script arcpy autônomo que rastreie os diretórios, abra cada mxd, defina o relatedPaths como true e salve o mxd. Existe um script que faz isso em algum lugar?

A propriedade relativePaths no objeto MapDocument é somente leitura. Existe alguma outra maneira de mudar isso?

Kirk Kuykendall
fonte
Não tenho certeza se isso é possível ou não usando esse fluxo de trabalho. Mas o que eu acho que poderia funcionar é se você abrir automaticamente cada .mxd, copiar todas as fontes de dados e informações desse original .mxd em um novo .mxd em branco que possua caminhos relativos verificados e salve novamente o novo. Apenas uma idéia como solução alternativa, se o seu primeiro caminho acabar não sendo possível.
MLowry
Eu não acho que é possível. Você pode obter uma lista de todos os documentos usando caminhos absolutos e seus autores e SPAM-los com um e-mail severo.
21711 Sean

Respostas:

6

Isso é possível usando o seguinte script python (com agradecimentos a Neil Clemmons no fórum da ESRI ). Você precisará da biblioteca de tipos e do módulo Snippets da 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
fonte
Consulte também o encadeamento canônico local para usar o módulo Snippets da Pierssen em Como acessar o ArcObjects a partir do Python?
Matt Wilkie
2

Não é possível na versão 10.0 , mas tive sucesso com o ArcObjects em Python para tarefas relativamente simples como essa, quando escrever um aplicativo .NET seria um exagero, mas a funcionalidade necessária não foi exposta nos módulos arcpy / arcgisscripting. Use os.walk para rastrear a parte da árvore de diretórios.

Para o bit ArcObjects, use IMapDocument.Open()para abrir o MXD (sem ter que abri-lo no ArcMap), converter IMxDocumente definir RelativePathscomo true e use IMapDocument.Save()para salvá-lo.

blah238
fonte
Você verificou que isso realmente corrige os caminhos para relativo?
Jason Scheirer
Eu não tentei me, não, mas esta discussão sugere que ele deve funcionar: forums.esri.com/Thread.asp?c=93&f=1154&t=260812
blah238
Também estou certo de Kirk já sabe como fazer isso: forums.esri.com/Thread.asp?c=93&f=992&t=64946 :)
blah238
@ blah238 Esse é o VBA, o que eu preciso é de um script arcpy independente.
Kirk Kuykendall 23/08
11
A pergunta era em referência a fazer isso com o arcpy, não o .NET, e pelo que entendi não é possível fazer com o arcpy na 10.0 (veja o primeiro link na minha resposta).
precisa saber é