This repository has been archived by the owner on Oct 24, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Form1.vb
92 lines (81 loc) · 3.68 KB
/
Form1.vb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
Imports DevExpress.XtraCharts
Imports System
Imports System.Collections.Generic
Imports System.Windows.Forms
Namespace CustomDateTimeMeasureUnitSample
Partial Public Class Form1
Inherits Form
Public Sub New()
InitializeComponent()
End Sub
#Region "#ChartConfiguring"
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
Chart.Series.Add(GenerateSeries(10000))
Dim diagram As XYDiagram = TryCast(Chart.Diagram, XYDiagram)
If diagram Is Nothing Then
Return
End If
diagram.AxisX.DateTimeScaleOptions.AggregateFunction = AggregateFunction.Average
diagram.AxisX.DateTimeScaleOptions.ScaleMode = ScaleMode.Automatic
diagram.AxisX.DateTimeScaleOptions.AutomaticMeasureUnitsCalculator = New CustomDateTimeMeasureUnitsCalculator()
diagram.AxisY.WholeRange.AlwaysShowZeroLevel = False
End Sub
#End Region ' #ChartConfiguring
Private Function GenerateSeries(ByVal pointCount As Integer) As Series
Dim series As Series = New Series With {.Name = "Generated data", .View = New SideBySideBarSeriesView()}
Dim time As Date = Date.Now
Dim generator As New Random()
For i As Integer = 0 To pointCount - 1
time = time.AddHours(1)
series.Points.Add(New SeriesPoint(time, generator.NextDouble()))
Next i
Return series
End Function
End Class
#Region "#DateTimeUnitsCalculatorImpl"
Friend Class CustomDateTimeMeasureUnitsCalculator
Implements IDateTimeMeasureUnitsCalculator
Private Const daysInWeek As Integer = 7
Private Const daysInMonth As Integer = 30
Private Const daysInQuarter As Integer = 4 * daysInMonth
Private Const daysInYear As Integer = 365
Private Const minCount As Integer = 5
Public Function CalculateMeasureUnit(
ByVal series As IEnumerable(Of Series),
ByVal axisLength As Double,
ByVal pixelsPerUnit As Integer,
ByVal visualMin As Double,
ByVal visualMax As Double,
ByVal wholeMin As Double,
ByVal wholeMax As Double) As DateTimeMeasureUnit Implements IDateTimeMeasureUnitsCalculator.CalculateMeasureUnit
' Calculate visual range in msecs.
Dim visualRange As Double = visualMax - visualMin
Dim ts As TimeSpan = TimeSpan.FromMilliseconds(visualRange)
If ts.TotalDays >= 1.0R Then
If ts.TotalDays <= minCount * daysInWeek Then
Return DateTimeMeasureUnit.Day
End If
If ts.TotalDays <= minCount * daysInMonth Then
Return DateTimeMeasureUnit.Week
End If
If ts.TotalDays <= minCount * daysInQuarter Then
Return DateTimeMeasureUnit.Month
End If
If ts.TotalDays <= minCount * daysInYear Then
Return DateTimeMeasureUnit.Quarter
Else
Return DateTimeMeasureUnit.Year
End If
ElseIf ts.TotalHours >= 20.0R Then
Return DateTimeMeasureUnit.Hour
ElseIf ts.TotalMinutes >= 20.0R Then
Return DateTimeMeasureUnit.Minute
ElseIf ts.TotalSeconds >= 20.0R Then
Return DateTimeMeasureUnit.Second
Else
Return DateTimeMeasureUnit.Millisecond
End If
End Function
End Class
#End Region ' #DateTimeUnitsCalculatorImpl
End Namespace