Select to view content in your preferred language

How to add symbol and symbol layers?

376
2
Jump to solution
02-23-2024 06:16 PM
HaoWong
New Contributor III

Frm cim-spec/docs/v3/Overview-Symbols.md at main · Esri/cim-spec (github.com), I can read the number and properties of symbol and symbol layers. However, how to add a symbol or symbol layer of an existing symbolic system in a layer with SDK? 

0 Kudos
1 Solution

Accepted Solutions
UmaHarano
Esri Regular Contributor

Hi,

 

Are you looking to add a new class break to a Unique Value renderer? If so, here is a code snippet:

 var layer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault();
 if (layer == null)
   return;
 QueuedTask.Run( () => { 
    var uvr = layer.GetRenderer() as CIMUniqueValueRenderer;
   if (uvr == null)
       return;
   var cimUniqueValueGroup = uvr.Groups[0] as CIMUniqueValueGroup;
   var classes = cimUniqueValueGroup.Classes;
   var cimUniqueValueClass = new CIMUniqueValueClass();
   cimUniqueValueClass.Label = "New Value";
   var lineSymbol = SymbolFactory.Instance.ConstructLineSymbol(ColorFactory.Instance.RedRGB, 2.0, SimpleLineStyle.Solid) ;
   lineSymbol.UseRealWorldSymbolSizes = false;
   cimUniqueValueClass.Symbol = lineSymbol.MakeSymbolReference();

   #region New value to the class
   var cimUniqueValues = new List<CIMUniqueValue>();
   var cimUniqueValue = new CIMUniqueValue() { FieldValues = new string[] { "New Value" } };
   cimUniqueValues.Add(cimUniqueValue);
   #endregion
   cimUniqueValueClass.Values = cimUniqueValues.ToArray();
   cimUniqueValueClass.Visible = true;
   var classesList = classes.ToList();
   classesList.Add(cimUniqueValueClass);
   cimUniqueValueGroup.Classes = classesList.ToArray();
   uvr.Groups[0] = cimUniqueValueGroup;
   layer.SetRenderer(uvr);
 });

 

Regarding your second question, if you are looking to add a new Symbol layer to an existing symbol, this is the code snippet:

 

var layer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault( s => s.ShapeType == esriGeometryType.esriGeometryPolyline);
QueuedTask.Run( () => { 
   var simpleRenderer = layer.GetRenderer() as CIMSimpleRenderer;
   var lineSymbol = simpleRenderer.Symbol.Symbol as CIMLineSymbol;
  if (lineSymbol == null)
        return;
  var layers = lineSymbol.SymbolLayers;
  var solidStroke = SymbolFactory.Instance.ConstructStroke(ColorFactory.Instance.RedRGB, 2.0, SimpleLineStyle.Solid);
  var offSetEffect = new CIMGeometricEffectOffset()
  {
    Method = GeometricEffectOffsetMethod.Rounded,
    Offset = 3,
    Option = GeometricEffectOffsetOption.Fast
  };
  solidStroke.Effects = new CIMGeometricEffect[] { offSetEffect };
  var layersList = layers.ToList();
  layersList.Add(solidStroke);
  lineSymbol.SymbolLayers = layersList.ToArray();
  simpleRenderer.Symbol = lineSymbol.MakeSymbolReference();
  layer.SetRenderer(simpleRenderer);
});

 

View solution in original post

2 Replies
HaoWong
New Contributor III

20240224102317.png

For example, if there is a symbol system represented by a unique value, I programmed a CIMLineSymbol variable. How to add it and generate a new line in this table.

 

20240224102337.png

Also, when I programmed a CIMSymbolLayer variable, how to add it to the above table as a new line? 

0 Kudos
UmaHarano
Esri Regular Contributor

Hi,

 

Are you looking to add a new class break to a Unique Value renderer? If so, here is a code snippet:

 var layer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault();
 if (layer == null)
   return;
 QueuedTask.Run( () => { 
    var uvr = layer.GetRenderer() as CIMUniqueValueRenderer;
   if (uvr == null)
       return;
   var cimUniqueValueGroup = uvr.Groups[0] as CIMUniqueValueGroup;
   var classes = cimUniqueValueGroup.Classes;
   var cimUniqueValueClass = new CIMUniqueValueClass();
   cimUniqueValueClass.Label = "New Value";
   var lineSymbol = SymbolFactory.Instance.ConstructLineSymbol(ColorFactory.Instance.RedRGB, 2.0, SimpleLineStyle.Solid) ;
   lineSymbol.UseRealWorldSymbolSizes = false;
   cimUniqueValueClass.Symbol = lineSymbol.MakeSymbolReference();

   #region New value to the class
   var cimUniqueValues = new List<CIMUniqueValue>();
   var cimUniqueValue = new CIMUniqueValue() { FieldValues = new string[] { "New Value" } };
   cimUniqueValues.Add(cimUniqueValue);
   #endregion
   cimUniqueValueClass.Values = cimUniqueValues.ToArray();
   cimUniqueValueClass.Visible = true;
   var classesList = classes.ToList();
   classesList.Add(cimUniqueValueClass);
   cimUniqueValueGroup.Classes = classesList.ToArray();
   uvr.Groups[0] = cimUniqueValueGroup;
   layer.SetRenderer(uvr);
 });

 

Regarding your second question, if you are looking to add a new Symbol layer to an existing symbol, this is the code snippet:

 

var layer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault( s => s.ShapeType == esriGeometryType.esriGeometryPolyline);
QueuedTask.Run( () => { 
   var simpleRenderer = layer.GetRenderer() as CIMSimpleRenderer;
   var lineSymbol = simpleRenderer.Symbol.Symbol as CIMLineSymbol;
  if (lineSymbol == null)
        return;
  var layers = lineSymbol.SymbolLayers;
  var solidStroke = SymbolFactory.Instance.ConstructStroke(ColorFactory.Instance.RedRGB, 2.0, SimpleLineStyle.Solid);
  var offSetEffect = new CIMGeometricEffectOffset()
  {
    Method = GeometricEffectOffsetMethod.Rounded,
    Offset = 3,
    Option = GeometricEffectOffsetOption.Fast
  };
  solidStroke.Effects = new CIMGeometricEffect[] { offSetEffect };
  var layersList = layers.ToList();
  layersList.Add(solidStroke);
  lineSymbol.SymbolLayers = layersList.ToArray();
  simpleRenderer.Symbol = lineSymbol.MakeSymbolReference();
  layer.SetRenderer(simpleRenderer);
});