ValueExpressionInfo Property (CIMUniqueValueRenderer)
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.
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
//// //...
//// }
//// }
//// }
////}
});
Modify renderer using Arcade
var lyr = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault(f => f.ShapeType == esriGeometryType.esriGeometryPolygon);
if (lyr == null) return;
QueuedTask.Run(() =>
{
// GetRenderer from Layer (assumes it is a unique value renderer)
var uvRenderer = lyr.GetRenderer() as CIMUniqueValueRenderer;
if (uvRenderer == null) return;
//layer has STATE_NAME field
//community sample Data\Admin\AdminSample.aprx
string expression = "if ($view.scale > 21000000) { return $feature.STATE_NAME } else { return 'All' }";
CIMExpressionInfo updatedExpressionInfo = new CIMExpressionInfo
{
Expression = expression,
Title = "Custom" // can be any string used for UI purpose.
};
//set the renderer's expression
uvRenderer.ValueExpressionInfo = updatedExpressionInfo;
//SetRenderer on Layer
lyr.SetRenderer(uvRenderer);
});
Target Platforms: Windows 11, Windows 10
ArcGIS Pro version: 3 or higher.