ArcGIS Pro 3.7 API Reference Guide
ArcGIS.Core.CIM Namespace / CIMUniqueValueRenderer Class / ValueExpressionInfo Property
Example

In This Topic
    ValueExpressionInfo Property (CIMUniqueValueRenderer)
    In This Topic
    Gets or sets ExpressionInfo that contains the Arcade expression that returns value as a string. When both Fields and ValueExpressionInfo are present ValueExpressionInfo is used.
    Syntax
    Public Property ValueExpressionInfo As CIMExpressionInfo
    public CIMExpressionInfo ValueExpressionInfo {get; set;}
    Example
    Evaluating Arcade Visual Variable Expressions on a Renderer
    {
      //Consult https://github.com/Esri/arcade-expressions/ and
      //https://developers.arcgis.com/arcade/ for more examples
      //and arcade reference
    
      // Note: the following should be embedded in a QueuedTask.Run() statement
      {
        //Assume we have a layer that is using Visual Variable
        //expressions that we want to evaluate interactively...
        var def = featureLayer.GetDefinition() as CIMFeatureLayer;
    
        //Most all feature renderers have a VisualVariable collection
        var renderer = def.Renderer as CIMUniqueValueRenderer;
        List<CIMVisualVariable> vis_variables = renderer.VisualVariables?.ToList() ??
                              [];
        if (vis_variables.Count == 0)
          return;//there are none
        var vis_var_with_expr = new Dictionary<string, string>();
        //see if any are using expressions
        foreach (var vv in vis_variables)
        {
          if (vv is CIMColorVisualVariable cvv)
          {
            if (!string.IsNullOrEmpty(cvv.ValueExpressionInfo?.Expression))
              vis_var_with_expr.Add("Color", cvv.ValueExpressionInfo?.Expression);
          }
          else if (vv is CIMTransparencyVisualVariable tvv)
          {
            if (!string.IsNullOrEmpty(tvv.ValueExpressionInfo?.Expression))
              vis_var_with_expr.Add("Transparency", tvv.ValueExpressionInfo?.Expression);
          }
          else if (vv is CIMSizeVisualVariable svv)
          {
            if (!string.IsNullOrEmpty(svv.ValueExpressionInfo?.Expression))
              vis_var_with_expr.Add("Outline", svv.ValueExpressionInfo?.Expression);
          }
        }
        if (vis_var_with_expr.Count == 0)
          return;//there aren't any with expressions
    
        //loop through the features (outer)
        //per feature evaluate each visual variable.... (inner)
        //....
        //the converse is to loop through the expressions (outer)
        //then per feature evaluate the expression (inner)
        using RowCursor rc = featureLayer.Search();
        while (rc.MoveNext())
        {
          foreach (var kvp in vis_var_with_expr)
          {
            var expr_info = new CIMExpressionInfo()
            {
              Expression = kvp.Value,
              ReturnType = ExpressionReturnType.Default
            };
            //per feature eval each expression...
            using ArcadeEvaluator arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
                                        expr_info, ArcadeProfile.Visualization);
    
            var variables = new List<KeyValuePair<string, object>>() {
                new("$feature", rc.Current)
              };
            //note 2D maps can also have view scale...
            //...if necessary...
            if (mv.ViewingMode == MapViewingMode.Map)
            {
              variables.Add(new("$view.scale", mv.Camera.Scale));
            }
            var result = arcade.Evaluate(variables).GetResult().ToString();
            //output
            System.Diagnostics.Debug.WriteLine(
               $"[{rc.Current.GetObjectID()}] '{kvp.Key}': {result}");
          }
        }
      }
    }
    Modify renderer using Arcade
    {
      // Note: the following should be embedded in a QueuedTask.Run() statement
      {
        // GetRenderer from Layer (assumes it is a unique value renderer)
        if (featureLayer.GetRenderer() is not CIMUniqueValueRenderer uvRenderer)
        {
          // not a unique value renderer, leave
          return;
        }
        //layer has STATE_NAME field if using the community sample Data\Admin\AdminSample.aprx
        string expression = "if ($view.scale > 21000000) { return $feature.STATE_NAME } else { return 'All' }";
        CIMExpressionInfo updatedExpressionInfo = new()
        {
          Expression = expression,
          Title = "Custom" // can be any string used for UI purpose.
        };
        //set the renderer's expression
        uvRenderer.ValueExpressionInfo = updatedExpressionInfo;
    
        //SetRenderer on Layer
        featureLayer.SetRenderer(uvRenderer);
      }
    }
    Requirements

    Target Platforms: Windows 11 Home, Pro, Enterprise (64 bit)

    ArcGIS Pro version: 3.0 or higher.
    See Also