Hi.
For now I have following:
private void SetupRangeSelector()
{
if (_rsXRangeSelector != null)
{
return;
}
_rsXRangeSelector = new RangeSelector(fcChartRangeSelector);
_rsXRangeSelector.ValueChanged += (s, e) =>
{
flexChart3.AxisX.Min = _fdsi.GetNeededDate(fcChartRangeSelector.AxisX.TimeUnit,
_rsXRangeSelector.LowerValue);
flexChart3.AxisX.Max = _fdsi.GetNeededDate(fcChartRangeSelector.AxisX.TimeUnit, _rsXRangeSelector.UpperValue);
Debug.WriteLine($"before:{_rsXRangeSelector.LowerValue}-{_rsXRangeSelector.UpperValue}");
Debug.WriteLine($"after:{ flexChart3.AxisX.Min }-{flexChart3.AxisX.Max}");
};
}
...
internal class FlexDataSourceInfo
{
private readonly List<XPosition> _data;
private readonly DateTime _startYear = new DateTime(1900,1,1);
public FlexDataSourceInfo([NotNull] List<XPosition> data)
{
_data = data ?? throw new ArgumentNullException(nameof(data));
if (data.Count == 0)
{
throw new ArgumentException("No data points.");
}
}
public double GetNeededDate(TimeUnits units, double value)
{
var minDate = _data[0].Date;
double result;
switch(units)
{
case TimeUnits.Day:
var rangeDays = (int)Math.Truncate(value);
var dq = minDate.AddDays(rangeDays);
var hourDiff = value - rangeDays;
Debug.Assert(hourDiff >= 0, "hourDiff >= 0");
var hours = (int)(24 * hourDiff);
var z = (int)(new DateTime(dq.Year, dq.Month, dq.Day, hours, 0, 0) - _startYear).TotalDays;
result = z + hours / 100.0;
break;
case TimeUnits.Month:
var month = (int)Math.Truncate(value);
var mq = minDate.AddMonths(month);
var monthDiff = value - month;
Debug.Assert(monthDiff >= 0, "monthDiff >= 0");
var days = (int)(DateTime.DaysInMonth(mq.Year, mq.Month) * monthDiff);
if (days == 0)
{
days = 1;
}
result = (int)(new DateTime(mq.Year, mq.Month, days) - _startYear).TotalDays;
break;
case TimeUnits.Year:
var years = (int)Math.Truncate(value);
var yq = minDate.AddYears(years);
var yearsFraction = value - years;
Debug.Assert(yearsFraction >= 0, "yearsFraction >= 0");
var months = (int)(12 * yearsFraction);
if (months == 0)
{
months = yq.Month;
}
result = (int)(new DateTime(yq.Year, months, 1) - _startYear).TotalDays;
break;
default:
throw new ArgumentOutOfRangeException(nameof(units), units, null);
}
return result;
}
}
Consider method GetNeededDate and it’s switch. I generate data for say two years, hourly, so my month runs from 0 to 24. Say I got for some side of range selector value 7.843 (or similiar fractional number wher integer part from 0 to 24), I have problems interpretating fractional part – what is how was it obtained? Look at my code for TimeUnits.Day and TimeUnits.Month, I I think that I treat fractional part completely wrong but this code somehow works, I see aggregated chart for days and month for two years of hour data, probably not so precise, because I loose precision in my code, but it somehow works. But year part and my code (TimeUnits.Year) doesn’t wokr at all… I have no idea what to do there, how recover more data then a year?
Put it simple, suppose I have some amount of hour data (two month from tody), I aggregate them by days and see following values for code
Debug.WriteLine($"before:{_rsXRangeSelector.LowerValue}-{_rsXRangeSelector.UpperValue}");
before:14,0229885057471-61
before:16,0387931034483-61
before:19,8951149425287-61
before:20,1580459770115-61
before:20,1580459770115-60,2112068965517
before:20,1580459770115-56,3548850574713
before:20,1580459770115-54,3390804597701
Quite logical for me except fractional part and it’s representation.
Monthly:
before:0,378223495702006-2
before:0,495702005730659-2
before:0,553008595988539-2
before:0,578796561604584-2
before:0,578796561604584-1,99713467048711
before:0,578796561604584-1,79656160458453
Seems logical to me – span for 2 month, but what is in fraction?
Year:
before:0,249645390070922-1
before:0,327659574468085-1
before:0,327659574468085-0,970212765957447
before:0,327659574468085-0,862411347517731
before:0,327659574468085-0,788652482269504
Year range is for current and next 2022, so from 0 to 1, but have no idea what is in fraction…
I hope you get the idea, looking for your response.