

Public Class CIMSizeVisualVariable Inherits CIMVisualVariable Implements System.ComponentModel.INotifyPropertyChanged, System.Xml.Serialization.IXmlSerializable
public class CIMSizeVisualVariable : CIMVisualVariable, System.ComponentModel.INotifyPropertyChanged, System.Xml.Serialization.IXmlSerializable
VariableType = Graduated use expression, Minimum/Maximum size, Minimum/Maximum value.
VariableType = Proportional, unit defined use Expression, ValueUnit, ValueShape, ValueRepresentation.
VariableType = Proportional, unit NOT defined use Expression, MinSize, MinValue, could use MaxSize.
{
//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}");
}
}
}
}
System.Object
ArcGIS.Core.CIM.CIMObject
ArcGIS.Core.CIM.CIMVisualVariable
ArcGIS.Core.CIM.CIMSizeVisualVariable
ArcGIS.Core.CIM.CIMSizeClassBreaksVisualVariable
Target Platforms: Windows 11 Home, Pro, Enterprise (64 bit)