ArcGIS Pro 3.3 API Reference Guide
ArcGIS.Core.CIM Namespace / CIMVisualVariable Class
Members Example

In This Topic
    CIMVisualVariable Class
    In This Topic
    Represents a visual variable.
    Object Model
    CIMVisualVariable ClassCIMVisualVariableAuthoringInfo Class
    Syntax
    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
    
    var mv = MapView.Active;
    var map = mv.Map;
    
    QueuedTask.Run(() =>
    {
      //Assume we a layer - Oregon County (poly) that is using Visual Variable
      //expressions that we want to evaluate interactively...
      var def = oregon_cnts.GetDefinition() as CIMFeatureLayer;
    
      //Most all feature renderers have a VisualVariable collection
      var renderer = def.Renderer as CIMUniqueValueRenderer;
      var vis_variables = renderer.VisualVariables?.ToList() ??
                            new List<CIMVisualVariable>();
      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 arent 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 (var rc = oregon_cnts.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 (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
                                        expr_info, ArcadeProfile.Visualization))
            {
    
              var variables = new List<KeyValuePair<string, object>>() {
                new KeyValuePair<string, object>("$feature", rc.Current)
              };
              //note 2D maps can also have view scale...
              //...if necessary...
              if (mv.ViewingMode == MapViewingMode.Map)
              {
                variables.Add(new KeyValuePair<string, object>(
                  "$view.scale", mv.Camera.Scale));
              }
              var result = arcade.Evaluate(variables).GetResult().ToString();
              //output
              System.Diagnostics.Debug.WriteLine(
                 $"[{rc.Current.GetObjectID()}] '{kvp.Key}': {result}");
            }
          }
        }
      }
    
      ////foreach (var kvp in vis_var_with_expr)
      ////{
      ////  var expr_info = new CIMExpressionInfo()
      ////  {
      ////    Expression = kvp.Value,
      ////    ReturnType = ExpressionReturnType.Default
      ////  };
    
      ////  using (var arcade = ArcadeScriptEngine.Instance.CreateEvaluator(
      ////                                  expr_info, ArcadeProfile.Visualization))
      ////  {
      ////    //loop through the features
      ////    using (var rc = oregon_cnts.Search())
      ////    {
      ////      while (rc.MoveNext())
      ////      {
      ////        var variables = new List<KeyValuePair<string, object>>() {
      ////          new KeyValuePair<string, object>("$feature", rc.Current)
      ////        };
    
      ////        var result = arcade.Evaluate(variables).GetResult();
      ////        //output
      ////        //...
      ////      }
      ////    }
      ////  }
      ////}
    });
    
    Inheritance Hierarchy
    Requirements

    Target Platforms: Windows 11, Windows 10

    ArcGIS Pro version: 3 or higher.
    See Also