Converting MXD to Layer file in Arcpy
Working on doing some advanced ArcGIS server printing and had the need to batch convert many existing .mxd files to .lyr files. So instead of opening up X number of map documents, thought I would do it via code. All of my .mxds in this case had just one data frame so the process was pretty simple–I add an empty group layer (Thanks Petr Krebs for the idea), copy all the existing layers into it, and save it out as a layer file.
I created an ArcGIS toolbox with two options–one to convert a single .mxd and one to batch convert an entire folder. To use it, make sure to have the EmptyGroup.lyr in the same directory as the .py file.
Here is the raw code or git it:
import os
import arcpy
import inspect
import glob
import uuid
import inspect
codeDir = os.path.dirname(inspect.getfile(inspect.currentframe()))
EmptyGroupLayerFile = codeDir+"/EmptyGroup.lyr"
inArg1 = sys.argv[1]
inArg2 = sys.argv[2]
def printit(inMessage):
arcpy.AddMessage(inMessage)
def makeLyrFromMXD(inMXD, outLyr):
if not (os.path.exists(inMXD)):
printit( "ERROR: {} does not exist".format(inMXD))
return False
if not (os.path.exists(EmptyGroupLayerFile)):
printit( "ERROR: {} does not exist".format(EmptyGroupLayerFile))
return False
if (os.path.exists(outLyr)):
printit( "Skipping: {} already exists".format(outLyr))
return True
printit( "Making Layer file: {0}".format(outLyr))
mxd = arcpy.mapping.MapDocument(inMXD)
###Right now, just doing the first Dataframe, this could be modified
df = arcpy.mapping.ListDataFrames(mxd)[0]
theUUID = str(uuid.uuid1())
iGroupLayerRaw = arcpy.mapping.Layer(EmptyGroupLayerFile)
iGroupLayerRaw.name = theUUID
arcpy.mapping.AddLayer(df,iGroupLayerRaw,"TOP")
groupBaseName = os.path.basename(outLyr).split(".")[0]
for lyr in arcpy.mapping.ListLayers(df):
if not (lyr.name == theUUID):
if (lyr.longName == lyr.name):
arcpy.mapping.AddLayerToGroup (df, iGroupLayer, lyr, "Bottom")
else:
iGroupLayer = lyr
iGroupLayer.name = groupBaseName
arcpy.SaveToLayerFile_management(iGroupLayer, outLyr)
return os.path.exists(outLyr)
def doMultiple(inDir,outDir):
for iMxd in glob.glob(inDir+"/*.mxd"):
lyrFile = outDir+"/"+os.path.basename(iMxd).lower().replace(".mxd",".lyr")
makeLyrFromMXD(iMxd, lyrFile)
if(not os.path.exists(EmptyGroupLayerFile)):
printit("Error: {} is missing, can not run.".format(EmptyGroupLayerFile))
else:
if (os.path.isdir(inArg1) and (os.path.isdir(inArg2))):
doMultiple(inArg1,inArg2)
elif (os.path.isfile(inArg1)):
if (os.path.exists(inArg2)):
printit("Error: {} already exists".format(inArg2))
else:
makeLyrFromMXD(inArg1,inArg2)
else:
printit("Unable to understand input parameters")