From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

Measurement Studio for .NET Languages

cancel
Showing results for 
Search instead for 
Did you mean: 

I would like the X axis on my WPF graph to display time in seconds from Zero

I have a graph with three AnalogWaveform<double> with sample rate of 50 as the datasource.

 

What is the best strategy to get the graph to display time in seconds or mm:ss starting at zero and ignore the full timestamp

 

 

0 Kudos
Message 1 of 2
(4,225 Views)

You can use a custom value formatter for the LabelPresenter on the MajorDivisions of your time axis. Here is a sample implementation for waveforms using precision timing, including two ways to format the time difference from Zero (mm:ss and total seconds):


    Code
    public sealed class RelativeTimeFormatter : GeneralValueFormatter {

        public PrecisionDateTime? ZeroValue { get; set; }
        public bool DisplayMinutesAndSeconds { get; set; }

        protected override string FormatCore<TData>( TData value, ValuePresenterArgs args ) {
            var time = value as PrecisionDateTime?;
            if( !time.HasValue )
                return base.FormatCore( value, args );

            // Get the first time value specified for all waveforms
            // or retrieve the last start value observed by the graph.
            var zeroValue = ZeroValue ?? (PrecisionDateTime)args.Data["Zero Value"];

            // Determine the time from Zero.
            PrecisionTimeSpan difference = time.Value - zeroValue;

            // Format result.
            string result;
            if( DisplayMinutesAndSeconds ) {
                long wholeMinutes = difference.WholeSeconds / 60;
                double seconds = difference.TotalSeconds % 60;
                result = wholeMinutes + ":" + seconds.ToString( "00" );
            }
            else {
                result = base.FormatCore( difference.TotalSeconds, args );
            }

            return result;
        }
    }

    XAML
    <ni:AxisDouble Orientation="Horizontal">
        <ni:AxisDouble.MajorDivisions>
            <ni:RangeLabeledDivisions>
                <ni:RangeLabeledDivisions.LabelPresenter>
                    <local:RelativeTimeFormatter DisplayMinutesAndSeconds="True" />
                </ni:RangeLabeledDivisions.LabelPresenter>
            </ni:RangeLabeledDivisions>
        </ni:AxisDouble.MajorDivisions>
    </ni:AxisDouble>

~ Paul H
Message 2 of 2
(4,219 Views)