/// <summary> /// Call this method to apply symbol groups to the featureLayer - one group per value in the renderer. /// The first group to be added will be the first group to be drawn /// </summary> /// <param name="featureLayer"></param> private void SetUpSymbolLevelsForUSHighways(FeatureLayer featureLayer) { //All of these methods have to be called on the MCT if (Module1.OnUIThread) throw new CalledOnWrongThreadException(); CIMBaseLayer baseLayer = featureLayer.GetDefinition(); //We need CIMGeoFeatureLayerBase because this class controls whether or not we //use 'groups' (ie Pro Symbol Levels) with the renderer CIMGeoFeatureLayerBase geoFeatureLayer = baseLayer as CIMGeoFeatureLayerBase; // assume the unique value renderer was created using the CreateCIMRenderer() CIMUniqueValueRenderer uniqueValueRenderer = geoFeatureLayer.Renderer as CIMUniqueValueRenderer; CIMSymbolLayerDrawing symbolLayerDrawing = new CIMSymbolLayerDrawing(); // This flag controls the drawing code and forces it to use defined symbol layers. //It must be set 'true' symbolLayerDrawing.UseSymbolLayerDrawing = true; // setup the symbol layers. List<CIMSymbolLayerIdentifier> symbolLayers = new List<CIMSymbolLayerIdentifier>(); // this will be a for loop that will iterate over the unique value classes and updating the symbol in each class int index = 0; foreach (CIMUniqueValueGroup nextGroup in uniqueValueRenderer.Groups) { foreach (CIMUniqueValueClass nextClass in nextGroup.Classes) { CIMMultiLayerSymbol multiLayerSymbol = nextClass.Symbol.Symbol as CIMMultiLayerSymbol; if (multiLayerSymbol == null) //This check probably is not needed continue; //Each group must be uniquely named string uniqueName = "Group_" + index.ToString(); nextClass.Symbol.SymbolName = uniqueName; for (int i = 0; i < multiLayerSymbol.SymbolLayers.Length; i++) //Assign the unique name to all of the layers in the symbol multiLayerSymbol.SymbolLayers[i].Name = uniqueName; index++; //Assign the name to a 'CIMSymbolLayerIdentifier'. This is the equivalent //of a KeyValuePair in a Dictionary. The Names of each SymbolLayerIdentifier //will be matched up in the renderer to a corresponding symbol (via nextClass.Symbol.SymbolName) //So that each SymbolLayer is associated with a specific symbol for a specific value CIMSymbolLayerIdentifier nextSymbolLayer = new CIMSymbolLayerIdentifier() { SymbolReferenceName = "symbolReferenceName", SymbolLayerName = uniqueName }; symbolLayers.Add(nextSymbolLayer); } } //This is where the symbol layers get added to the feature layer definition symbolLayerDrawing.SymbolLayers = symbolLayers.ToArray(); geoFeatureLayer.SymbolLayerDrawing = symbolLayerDrawing; // update the featureLayer definition. featureLayer.SetDefinition(geoFeatureLayer as CIMBaseLayer); }
/// <summary> /// Call this method to apply symbol groups to the featureLayer - one group per value in the renderer. /// The first group to be added will be the first group to be drawn /// </summary> /// <param name="featureLayer"></param> private void SetUpSymbolLevelsForUSHighways(FeatureLayer featureLayer) { //All of these methods have to be called on the MCT if (Module1.OnUIThread) { throw new CalledOnWrongThreadException(); } CIMBaseLayer baseLayer = featureLayer.GetDefinition(); //We need CIMGeoFeatureLayerBase because this class controls whether or not we //use 'groups' (ie Pro Symbol Levels) with the renderer CIMGeoFeatureLayerBase geoFeatureLayer = baseLayer as CIMGeoFeatureLayerBase; // assume the unique value renderer was created using the CreateCIMRenderer() CIMUniqueValueRenderer uniqueValueRenderer = geoFeatureLayer.Renderer as CIMUniqueValueRenderer; CIMSymbolLayerDrawing symbolLayerDrawing = new CIMSymbolLayerDrawing() { // This flag controls the drawing code and forces it to use defined symbol layers. //It must be set 'true' UseSymbolLayerDrawing = true }; // setup the symbol layers. List <CIMSymbolLayerIdentifier> symbolLayers = new List <CIMSymbolLayerIdentifier>(); // this will be a for loop that will iterate over the unique value classes and updating the symbol in each class int index = 0; foreach (CIMUniqueValueGroup nextGroup in uniqueValueRenderer.Groups) { foreach (CIMUniqueValueClass nextClass in nextGroup.Classes) { CIMMultiLayerSymbol multiLayerSymbol = nextClass.Symbol.Symbol as CIMMultiLayerSymbol; if (multiLayerSymbol == null) //This check probably is not needed { continue; } //Each group must be uniquely named string uniqueName = "Group_" + index.ToString(); nextClass.Symbol.SymbolName = uniqueName; for (int i = 0; i < multiLayerSymbol.SymbolLayers.Length; i++) { //Assign the unique name to all of the layers in the symbol multiLayerSymbol.SymbolLayers[i].Name = uniqueName; } index++; //Assign the name to a 'CIMSymbolLayerIdentifier'. This is the equivalent //of a KeyValuePair in a Dictionary. The Names of each SymbolLayerIdentifier //will be matched up in the renderer to a corresponding symbol (via nextClass.Symbol.SymbolName) //So that each SymbolLayer is associated with a specific symbol for a specific value CIMSymbolLayerIdentifier nextSymbolLayer = new CIMSymbolLayerIdentifier() { SymbolLayerName = uniqueName }; symbolLayers.Add(nextSymbolLayer); } } //This is where the symbol layers get added to the feature layer definition symbolLayerDrawing.SymbolLayers = symbolLayers.ToArray(); geoFeatureLayer.SymbolLayerDrawing = symbolLayerDrawing; // update the featureLayer definition. featureLayer.SetDefinition(geoFeatureLayer as CIMBaseLayer); }