Hi There,
I'm having trouble updating the symbolization of a raster layer in my mxd using python. The script is executed from a python addin tool and has the user drag a bounding box around some features and then reads an attribute field named 'PATH_TO_IMAGE' and adds this image to the map (it's a georeferenced .png). Adding it to the project works fine but it is added with some default coloUr ramp that is not B&W. I attempt to update this symbolization using a layer file I have packaged with the addin but for some reason the colour ramp will not change and the arcpy.UpdateLayer does not print messages for me to figure out why.
*Note: I attempt to update the symbolization of line 81.
Can anyone see where I am going wrong? It seems like lots of people get hung on on this...
import arcpy
import pythonaddins
import os
# set relative path of addin installation
relPath = os.path.dirname(__file__)
class ImageAdder(object):
"""Implementation for IndexAssistant_addin.ImageAdder (Tool)"""
def __init__(self):
self.enabled = False
self.shape = "Rectangle"
self.cursor = 3 # Crosshair
def onRectangle(self, rectangle_geometry):
# Construct rectangle geometry
ext = rectangle_geometry
lowerLeft = ext.lowerLeft
upperLeft = ext.upperLeft
lowerRight = ext.lowerRight
upperRight = ext.upperRight
array = arcpy.Array()
array.add(upperLeft)
array.add(upperRight)
array.add(lowerRight)
array.add(lowerLeft)
array.add(upperLeft)
poly = arcpy.Polygon(array)
# Get the 1st Data Frame
mxd = arcpy.mapping.MapDocument('current')
df = arcpy.mapping.ListDataFrames(mxd)[0]
# Set the Index from IndexSelector combo box
indexSelection = IndexSelector.selection
# Find layer to match the selected index
indexLayer = arcpy.mapping.ListLayers(mxd,indexSelection,df)[0]
indexPath = indexLayer.dataSource
# Make feature layer to do the work on
arcpy.MakeFeatureLayer_management(indexLayer,'indexlyr')
# Select features based on polygon rectangle
arcpy.SelectLayerByLocation_management('indexlyr','INTERSECT',poly)
# Count number of selected features and print to python window
result = arcpy.GetCount_management('indexlyr')
count = int(result.getOutput(0))
print('There were {} feature(s) selected in the {} layer.'.format(count,indexLayer))
# Try to get path
## path = indexLayer.
# Test for number of features and end if too many
if count > 0:
c = 0
# Open Search Cursor to read the image pathes of the selected features
with arcpy.da.SearchCursor('indexlyr',"PATH_TO_IMAGE") as cursor:
for row in cursor:
if c <= count:
try:
# Manipulate the path to remove a few characters that are printed
pathToImage = str(row)
pathToImage1 = pathToImage.replace("(u'",'')
pathToImage2 = pathToImage1.replace("',)",'')
# Instantiate the path as a layer object
addLayer = arcpy.mapping.Layer(pathToImage2)
try:
# Add the raster layer to the map
arcpy.mapping.AddLayer(df,addLayer,"BOTTOM")
# Set the source of the layer file with the correct B&W colour ramp
symbolLayer = os.path.join(relPath,'B_W.lyr')
try:
##updateLayer = arcpy.mapping.ListLayers(mxd, updateLayer, df)[0]
# Instantiate the path to the template colour ramp as a layer object
sourceLayer = arcpy.mapping.Layer(symbolLayer)
updateLayer = arcpy.mapping.ListLayers(mxd, addLayer, df)[0]
print('Update Layer: {}\nSource Layer: {}\nSymbol Layer: {}'.format(updateLayer,sourceLayer,symbolLayer))
arcpy.mapping.UpdateLayer(df,updateLayer,symbolLayer,True)
except:
print('Symbology could not be changed.')
except:
pythonaddins.MessageBox('The georeferenced plan {} could not be added to the map, check the path name and ensure it exists.'.format(addLayer))
# Refresh TOC with new layer
arcpy.Delete_management('indexlyr')
arcpy.RefreshActiveView()
arcpy.RefreshTOC()
c += 1
except:
pythonaddins.MessageBox("An error has occured while trying to add plans to the ArcMap project, please report this problem","Error Adding Plans")
else:
pass
else:
pythonaddins.MessageBox("There were no feature selected. Please select one and try again.","No Selection")