Set the color of the pointer based on the color of the ranges in the Gauge web part

Applies to: Nevron Gauge for SharePoint (WSS3.0, SharePoint 2007/2010/2013)

How to set the color of the pointer based on the color of the ranges in the Gauge web part?

In Nevron Gauge for SharePoint you can change the color of a gauge pointer(s) (needle or marker) when the pointer is in specific range. This feature can be used as another way to indicate a specific status based on the values passed to the gauge (similar to the Gauge State Indicator).



Let’s say that we have added 3 ranges with different fill styles (Green, Yellow and Red) to a radial gauge:



The following example code will check for the Indicators (Value Indicators and Range Indicators) and will color the pointer (gauge needle) when it is in specific gauge range, using the color of this range. The code will do the same with the gauge Cap.

[C#]
using System;
using System.Drawing;
using Nevron.GraphicsCore;
using Nevron.Chart;
using Nevron.ReportingServices;
 
namespace MyNamespace
{
    /// <summary>
    /// Sample class
    /// </summary>
    public class MyClass
    {
        /// <summary>
        /// Main entry point
        /// </summary>
        /// <param name="context"></param>
        public static void RSMain(NRSGaugeCodeContext context)
        {
            // check if gauge document contains gauges
            if (context.Document.Gauges.Count == 0)
                return;
 
            // the needle indicator is after the range
            NGaugePanel gauge = context.Document.Gauges[0] as NGaugePanel;
            if (gauge == null || gauge.Indicators.Count == 0)
                return;
 
            NRadialGaugePanel radialGauge = gauge as NRadialGaugePanel;
            int indicatorCount = gauge.Indicators.Count;
            NValueIndicator needle = null;
 
            for (int i = 0; i < indicatorCount; i++)
            {
                needle = gauge.Indicators[i] as NValueIndicator;
 
                if (needle != null)
                    break;
            }
 
            if (needle == null)
                return;
 
            int rangIndicatorIndex = 0;
 
            for (int i = 0; i < indicatorCount; i++)
            {
                NRangeIndicator rangeIndicator = gauge.Indicators[i] as NRangeIndicator;
 
                if (rangeIndicator != null)
                {
                    NRange1DD range = new NRange1DD(rangeIndicator.Origin, rangeIndicator.Value);
                    range.Normalize();
 
                    // if indicator value is contained by the range change its color to red
                    if (range.Contains(needle.Value))
                    {
                        //needle.Shape.FillStyle = GetFillStyleForRange(rangIndicatorIndex);
                        needle.Shape.FillStyle = rangeIndicator.FillStyle;
                        if (radialGauge != null)
                        {
                            //radialGauge.CapStyle.Shape.FillStyle = GetFillStyleForRange(rangIndicatorIndex);
                            radialGauge.CapStyle.Shape.FillStyle = rangeIndicator.FillStyle;
                        }
 
                        break;
                    }
 
                    rangIndicatorIndex++;
                }
            }
        }
 
        //static NFillStyle GetFillStyleForRange(int rangeIndex)
        //{
        //    switch (rangeIndex)
        //    {
        //        case 0:
        //            return new NColorFillStyle(Color.Green);
 
        //        case 1:
        //            return new NColorFillStyle(Color.Yellow);
 
        //        case 2:
        //            return new NColorFillStyle(Color.Red);
 
        //        default:
        //            return new NColorFillStyle(Color.Black);
        //    }
        //}
    }
}

[VB.NET]
Imports System
Imports System.Drawing
Imports Nevron.GraphicsCore
Imports Nevron.Chart
Imports Nevron.ReportingServices
 
Namespace MyNamespace
    ''' <summary>
    ''' Sample class
    ''' </summary>
    Public Class [MyClass]
        ''' <summary>
        ''' Main entry point
        ''' </summary>
        ''' <param name="context"></param>
        Public Shared Sub RSMain(context As NRSGaugeCodeContext)
            ' check if gauge document contains gauges
            If context.Document.Gauges.Count = 0 Then
                Return
            End If
 
            ' the needle indicator is after the range
            Dim gauge As NGaugePanel = TryCast(context.Document.Gauges(0), NGaugePanel)
            If gauge Is Nothing OrElse gauge.Indicators.Count = 0 Then
                Return
            End If
 
            Dim radialGauge As NRadialGaugePanel = TryCast(gauge, NRadialGaugePanel)
            Dim indicatorCount As Integer = gauge.Indicators.Count
            Dim needle As NValueIndicator = Nothing
 
            For i As Integer = 0 To indicatorCount - 1
                needle = TryCast(gauge.Indicators(i), NValueIndicator)
 
                If needle IsNot Nothing Then
                    Exit For
                End If
            Next
 
            If needle Is Nothing Then
                Return
            End If
 
            Dim rangIndicatorIndex As Integer = 0
 
            For i As Integer = 0 To indicatorCount - 1
                Dim rangeIndicator As NRangeIndicator = TryCast(gauge.Indicators(i), NRangeIndicator)
 
                If rangeIndicator IsNot Nothing Then
                    Dim range As New NRange1DD(rangeIndicator.Origin, rangeIndicator.Value)
                    range.Normalize()
 
                    ' if indicator value is contained by the range change its color to red
                    If range.Contains(needle.Value) Then
                        'needle.Shape.FillStyle = GetFillStyleForRange(rangIndicatorIndex);
                        needle.Shape.FillStyle = rangeIndicator.FillStyle
                        If radialGauge IsNot Nothing Then
                            'radialGauge.CapStyle.Shape.FillStyle = GetFillStyleForRange(rangIndicatorIndex);
                            radialGauge.CapStyle.Shape.FillStyle = rangeIndicator.FillStyle
                        End If
 
                        Exit For
                    End If
 
                    rangIndicatorIndex += 1
                End If
            Next
        End Sub
 
        'static NFillStyle GetFillStyleForRange(int rangeIndex)
        '{
        '    switch (rangeIndex)
        '    {
        '        case 0:
        '            return new NColorFillStyle(Color.Green);
 
        '        case 1:
        '            return new NColorFillStyle(Color.Yellow);
 
        '        case 2:
        '            return new NColorFillStyle(Color.Red);
 
        '        default:
        '            return new NColorFillStyle(Color.Black);
        '    }
        '}
    End Class
End Namespace

If you use the commented code in the bottom instead, you could specify the color of the pointer and the cap separately. Note that in this case, if you have more Ranges, you will have to specify additional cases in the code, otherwise the needle will take the default color.

Article ID: 213, Created On: 3/19/2012, Modified: 1/29/2013