AnsweredAssumed Answered

Python toolbox: issue with defining output layer symbology?

Question asked by Andrea_Vaccari_esri on Apr 10, 2015

Hello ESRI community!


I'm pretty new at ArcGIS python toolboxes. Here is one problem I've been fighting with for a while.

I want to create an output layer (`GPFeatureLayer`) with a specific symbology (`GRADUATED_COLORS`) and then modify the parameters of the symbology to "light up" features with a given value in a specific field.

First I create a layer in ArcGIS, selected a datasource (shapefile), applied the `GRADUATED_COLORS` symbology, and save it as layer file.

In my toolbox, within the `def getParameterInfo(self):` method, I define the output parameter as:


out_layer = arcpy.Parameter(displayName="Output layer showing the results",
GV_LYR = os.path.join(os.path.dirname(__file__), "graduated_colors_point.lyr")
out_layer.symbology = GV_LYR


Later on, within the `def execute(self, parameters, messages):` method,

- I first create the `out_layer` using `, out_layer)` (where `out_layer = parameters[2].valueAsText` and `in_layer = parameters[0].valueAsText`),

- then I extract the output layer object using `out_layer_obj = parameters[2].value`


Following this step, I would like to modify the parameters of the symbology (`valueField`, `classBreakValues`, `classBreakLabels`) to fit my needs but when I check for the symbology type (`out_layer_obj.symbologyType`) I get `OTHER` instead of `GRADUATED_COLORS`. At the same time, within the ArcGIS map, a new layer is created with `GRADUATED_COLORS` symbology, and relative parameters, copied from the `graduated_colors_point.lyr`.


I've also tried a different approach when I created a plain out_layer without specifying the type of symbology in the parameter definition and then use the following:


GV_LYR = os.path.join(os.path.dirname(__file__), "graduated_colors_point.lyr")
sym_layer_obj = arcpy.mapping.Layer(GV_LYR), sym_layer_obj)
out_layer_obj = arcpy.mapping.Layer(out_layer)


In which case it seems to work properly only on my computer while, anybody else who tried it (on same and different version of ArcGIS) gets the following error: `ERROR 000968: The symbol layer does not match the input layer` when running the `ApplySymbologyFromLayer` function.




In the process of trying to figure out what's happening while the toolbox executes, I've noticed the following. While the `out_layer` parameter is defined as described above, there is also an `in_layer` parameter that is defined as follows:


in_layer = arcpy.Parameter(displayName="Layer containing selected SqueeSAR data",


When, right at the beginning of the `def execute(self, parameters, messages):` method, I look at the object types of the parameters values:


in_layer = parameters[0].value
arcpy.AddMessage("Input layer: {0}".format(type(in_layer)))

out_layer = parameters[2].value
arcpy.AddMessage("Output layer: {0}".format(type(out_layer)))


I would expect for both of them to register as `geoprocessing Layer object` but this is true only for `in_layer` whereas `out_layer` is registered as `geoprocessing value object`. (My `updateParameters(self, parameters):` and `updateMessages(self, parameters):` methods are empty).


Any suggestions or comment?