ฉันจะตระเวนไดเรกทอรีต้นไม้และเปลี่ยน Mxd relativePaths เป็นจริงได้อย่างไร


9

ฉันมีโฟลเดอร์โครงการจำนวนมากที่แต่ละโฟลเดอร์โครงการสามารถมีโฟลเดอร์ย่อยได้มากมาย โฟลเดอร์ย่อยเหล่านี้สามารถมี mxds, shapefiles, gdb ส่วนตัวและ fgdb's ในหลายกรณีผู้ใช้ลืมที่จะตรวจสอบ "ใช้เส้นทางญาติ" ก่อนที่จะบันทึก mxds ดังนั้นเมื่อโฟลเดอร์ได้รับการคัดลอกลิงก์แหล่งข้อมูลจะใช้งานไม่ได้

ฉันต้องการเขียนสคริปต์ arcpy แบบสแตนด์อโลนที่รวบรวมข้อมูลผ่านไดเรกทอรีเปิดแต่ละ mxd ตั้งค่า relativePaths เป็น true จากนั้นบันทึก mxd มีสคริปต์ที่ทำสิ่งนี้อยู่ที่ไหนสักแห่ง?

คุณสมบัติ relativePaths บนวัตถุ MapDocumentเป็นแบบอ่านอย่างเดียว มีวิธีอื่นในการเปลี่ยนแปลงสิ่งนี้หรือไม่?


ฉันไม่แน่ใจว่าสิ่งนี้เป็นไปได้หรือไม่ได้ใช้เวิร์กโฟลว์นั้น แต่สิ่งที่ฉันคิดว่าสามารถใช้งานได้คือถ้าคุณเปิดแต่ละ. xxd โดยอัตโนมัติคัดลอกแหล่งข้อมูลและข้อมูลทั้งหมดจาก. mxd ต้นฉบับนั้นลงใน. mxd เปล่าใหม่ที่มีการตรวจสอบเส้นทางสัมพัทธ์แล้วบันทึกใหม่อีกครั้ง เพียงแค่ความคิดเป็นวิธีการแก้ปัญหาถ้าวิธีแรกของคุณจบลงไม่ได้เป็นไปได้
MLowry

ฉันไม่คิดว่ามันเป็นไปได้ คุณสามารถรับรายชื่อของเอกสารทั้งหมดโดยใช้เส้นทางที่แน่นอนและผู้แต่งและสแปมของพวกเขาด้วยอีเมลที่เข้มงวด
ฌอน

คำตอบ:


6

นี้เป็นไปได้โดยใช้สคริปต์หลามดังต่อไปนี้ (ด้วยความขอบคุณนีลเคลมมอนส์มากกว่าที่ฟอรั่ม 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

โปรดดูที่เธรดมาตรฐานของท้องถิ่นสำหรับการใช้โมดูล Snippets ของ Pierssen ที่ฉันจะเข้าถึง ArcObjects จาก Python ได้อย่างไร
แมตต์วิลคี

2

เป็นไปไม่ได้ใน 10.0แต่ฉันประสบความสำเร็จในการใช้ ArcObjects ใน Pythonสำหรับงานที่ค่อนข้างง่ายเช่นนี้ซึ่งการเขียนแอปพลิเคชั่น. NET จะ overkill แต่การทำงานที่จำเป็นไม่ได้แสดงในโมดูล arcpy / arcgisscripting ใช้os.walkสำหรับการรวบรวมข้อมูลไดเรกทอรีต้นไม้ส่วน

สำหรับบิต ArcObjects ใช้IMapDocument.Open()เพื่อเปิด MXD (โดยไม่ต้องเปิดใน ArcMap), โยนIMxDocumentและตั้งค่าRelativePathsเป็นจริงและใช้IMapDocument.Save()เพื่อบันทึก


คุณได้รับการตรวจสอบที่ว่านี้จริงแก้ไขเส้นทางไปยังญาติ?
Jason Scheirer

ฉันยังไม่ได้ลองด้วยตัวเอง แต่กระทู้นี้แนะนำว่าควรใช้งานได้: forums.esri.com/Thread.asp?c=93&f=1154&t=260812
blah238

นอกจากนี้ฉันแน่ใจว่า Kirk รู้วิธีการทำเช่นนี้แล้ว: forums.esri.com/Thread.asp?c=93&f=992&t=64946 :)
blah238

@ blah238 นั่นคือ VBA สิ่งที่ฉันต้องการก็คือสคริปต์ arcpy แบบสแตนด์อโลน
Kirk Kuykendall

1
คำถามคือการอ้างอิงถึงการทำเช่นนี้กับ arcpy ไม่ใช่. NET และฉันเข้าใจว่ามันเป็นไปไม่ได้ที่จะทำกับ arcpy ที่ 10.0 (ดูลิงค์แรกในคำตอบของฉัน)
blah238
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.