Solved! Go to Solution.
def openLayerFile(strLayerFile): objLayerFile = comtypes.client.CreateObject(esriCarto.LayerFile, interface=esriCarto.ILayerFile) objLayerFile.Open(strLayerFile) return objLayerFile def getValueField(objLayer): objFeatureLayer = objLayer.QueryInterface(esriCarto.IFeatureLayer) objGeoFeatureLayer = objLayer.QueryInterface(esriCarto.IGeoFeatureLayer) objFeatureRenderer = objGeoFeatureLayer.Renderer try: objRenderer = objFeatureRenderer.QueryInterface(esriCarto.IUniqueValueRenderer) return objRenderer.Field(0) except: try: objRenderer = objFeatureRenderer.QueryInterface(esriCarto.IClassBreaksRenderer) return objRenderer.Field except: return "" def getDataSource(objLayer): objFeatureLayer = objLayer.QueryInterface(esriCarto.IFeatureLayer) objDataLayer = objFeatureLayer.QueryInterface(esriCarto.IDataLayer) objDatasetName = objDataLayer.DataSourceName.QueryInterface(esriGeoDatabase.IDatasetName) objWorkspaceName = objDatasetName.WorkspaceName strDataSource = os.path.join(objWorkspaceName.PathName, objDatasetName.Name) return strDataSource import comtypes.client import os esriCarto = comtypes.client.GetModule(r'C:\Program Files\ArcGIS\com\esriCarto.olb') esriGeoDatabase = comtypes.client.GetModule(r'C:\Program Files\ArcGIS\com\esriGeoDatabase.olb') strLayerFile = r"C:\Temp\test.lyr" objLayerFile = openLayerFile(strLayerFile) objLayer = objLayerFile.Layer print getValueField(objLayer) print getDataSource(objLayer) del objLayer del objLayerFile
def openLayerFile(strLayerFile): objLayerFile = comtypes.client.CreateObject(esriCarto.LayerFile, interface=esriCarto.ILayerFile) objLayerFile.Open(strLayerFile) return objLayerFile def getValueField(objLayer): objFeatureLayer = objLayer.QueryInterface(esriCarto.IFeatureLayer) objGeoFeatureLayer = objLayer.QueryInterface(esriCarto.IGeoFeatureLayer) objFeatureRenderer = objGeoFeatureLayer.Renderer try: objRenderer = objFeatureRenderer.QueryInterface(esriCarto.IUniqueValueRenderer) return objRenderer.Field(0) except: try: objRenderer = objFeatureRenderer.QueryInterface(esriCarto.IClassBreaksRenderer) return objRenderer.Field except: return "" def getDataSource(objLayer): objFeatureLayer = objLayer.QueryInterface(esriCarto.IFeatureLayer) objDataLayer = objFeatureLayer.QueryInterface(esriCarto.IDataLayer) objDatasetName = objDataLayer.DataSourceName.QueryInterface(esriGeoDatabase.IDatasetName) objWorkspaceName = objDatasetName.WorkspaceName strDataSource = os.path.join(objWorkspaceName.PathName, objDatasetName.Name) return strDataSource import comtypes.client import os esriCarto = comtypes.client.GetModule(r'C:\Program Files\ArcGIS\com\esriCarto.olb') esriGeoDatabase = comtypes.client.GetModule(r'C:\Program Files\ArcGIS\com\esriGeoDatabase.olb') strLayerFile = r"C:\Temp\test.lyr" objLayerFile = openLayerFile(strLayerFile) objLayer = objLayerFile.Layer print getValueField(objLayer) print getDataSource(objLayer) del objLayer del objLayerFile
Assuming when you say layer file it means the ".lyr" type, if you have comtypes installed you can use the code below. I simplified it from existing code I had lying around so you'll need to add error-checking at some point.
http://sourceforge.net/projects/comtypes/def openLayerFile(strLayerFile): objLayerFile = comtypes.client.CreateObject(esriCarto.LayerFile, interface=esriCarto.ILayerFile) objLayerFile.Open(strLayerFile) return objLayerFile def getValueField(objLayer): objFeatureLayer = objLayer.QueryInterface(esriCarto.IFeatureLayer) objGeoFeatureLayer = objLayer.QueryInterface(esriCarto.IGeoFeatureLayer) objFeatureRenderer = objGeoFeatureLayer.Renderer try: objRenderer = objFeatureRenderer.QueryInterface(esriCarto.IUniqueValueRenderer) return objRenderer.Field(0) except: try: objRenderer = objFeatureRenderer.QueryInterface(esriCarto.IClassBreaksRenderer) return objRenderer.Field except: return "" def getDataSource(objLayer): objFeatureLayer = objLayer.QueryInterface(esriCarto.IFeatureLayer) objDataLayer = objFeatureLayer.QueryInterface(esriCarto.IDataLayer) objDatasetName = objDataLayer.DataSourceName.QueryInterface(esriGeoDatabase.IDatasetName) objWorkspaceName = objDatasetName.WorkspaceName strDataSource = os.path.join(objWorkspaceName.PathName, objDatasetName.Name) return strDataSource import comtypes.client import os esriCarto = comtypes.client.GetModule(r'C:\Program Files\ArcGIS\com\esriCarto.olb') esriGeoDatabase = comtypes.client.GetModule(r'C:\Program Files\ArcGIS\com\esriGeoDatabase.olb') strLayerFile = r"C:\Temp\test.lyr" objLayerFile = openLayerFile(strLayerFile) objLayer = objLayerFile.Layer print getValueField(objLayer) print getDataSource(objLayer) del objLayer del objLayerFile
def openLayerFile(strLayerFile): objLayerFile = comtypes.client.CreateObject(esriCarto.LayerFile, interface=esriCarto.ILayerFile) objLayerFile.Open(strLayerFile) return objLayerFile def getLayers(objLayer): """ Returns a list of layers from a layer file""" colLayerList = [] try: objCompositeLayer = objLayer.QueryInterface(esriCarto.ICompositeLayer) for i in range(objCompositeLayer.Count): objCurrentLayer = objCompositeLayer.Layer(i) try: objNestedCompositeLayer = objCurrentLayer.QueryInterface(esriCarto.ICompositeLayer) colLayersInGroup = getLayers(objCurrentLayer) colLayerList += colLayersInGroup except: colLayerList.append(objCurrentLayer) except: colLayerList.append(objLayer) return colLayerList def getValueField(objLayer): objFeatureLayer = objLayer.QueryInterface(esriCarto.IFeatureLayer) objGeoFeatureLayer = objLayer.QueryInterface(esriCarto.IGeoFeatureLayer) objFeatureRenderer = objGeoFeatureLayer.Renderer try: objRenderer = objFeatureRenderer.QueryInterface(esriCarto.IUniqueValueRenderer) return objRenderer.Field(0) except: try: objRenderer = objFeatureRenderer.QueryInterface(esriCarto.IClassBreaksRenderer) return objRenderer.Field except: return "" def getDataSource(objLayer): objFeatureLayer = objLayer.QueryInterface(esriCarto.IFeatureLayer) objDataLayer = objFeatureLayer.QueryInterface(esriCarto.IDataLayer) objDatasetName = objDataLayer.DataSourceName.QueryInterface(esriGeoDatabase.IDatasetName) objWorkspaceName = objDatasetName.WorkspaceName strDataSource = os.path.join(objWorkspaceName.PathName, objDatasetName.Name) return strDataSource import comtypes.client import os esriCarto = comtypes.client.GetModule(r'C:\Program Files\ArcGIS\com\esriCarto.olb') esriGeoDatabase = comtypes.client.GetModule(r'C:\Program Files\ArcGIS\com\esriGeoDatabase.olb') strLayerFile = r"C:\Temp\testGroup.lyr" objLayerFile = openLayerFile(strLayerFile) colLayers = getLayers(objLayerFile.Layer) for objLayer in colLayers: print objLayer.Name print getValueField(objLayer) print getDataSource(objLayer) del objLayer del objLayerFile
Good point about the layerfiles containing a group of layers. I've added a function that allows it to also extract all layers if it's a group layer. It's recursive so it should work with nested group layers within a group layer.
Note that it's the ICompositeLayer interface, not IGroupLayer, that allows you to extract individual layers from a group layer. IGroupLayer simply accesses the general layer properties of the group.
myMXD = arcpy.mapping.MapDocument("Current") lstDataFrames=arcpy.mapping.ListDataFrames(myMXD) lstLayers=arcpy.mapping.ListLayers(myMXD) hazardLayer=arcpy.mapping.ListLayers(myMXD,'*Haz*') allFrames=arcpy.mapping.ListDataFrames(myMXD) for dataFrame in allFrames: ... myMXD.activeView=dataFrame ... for mapLayer in hazardLayer: ... mapLayer.visible=False