Page 1 of 1

Floating point overflow zooming in

Posted: Thu Sep 20, 2012 12:48 pm
by 16460479
Hi,

I have a chart comprising a TAreaSeries and some TLineSeries. After a number of successful zoom-in operations without unzooming, I get 'floating point overflow'. Is this something to do with the chart being unable to calculate a tick increment? Is there a way to anticipate the error?

Thanks

Trevor Cooper

Re: Floating point overflow zooming in

Posted: Thu Sep 20, 2012 2:28 pm
by yeray
Hi Trevor,

Can you please arrange a simple example project we can run as-is to reproduce the problem here?
Thanks in advance.

Re: Floating point overflow zooming in

Posted: Thu Sep 20, 2012 5:28 pm
by 16460479
Hi,

I've attached a an example project. If you keep zooming then the error will occur sooner or later, usually somewhere between the 3rd and 15th zoom. Sometimes zooming where there's no data seems to produce the error sooner. I know it seems unlikely that a user would usefully zoom in 15 times, but sometimes they do when they're looking for miniscule changes of data.

This is running TeeChart Pro v2012.06.120613 32-bit VCL in Delphi 2007.

Hope you can repdocue the error.

Regards

Trevor Cooper

Re: Floating point overflow zooming in

Posted: Fri Sep 21, 2012 9:11 am
by yeray
Hi Trevor,

Thanks for the project. I could reproduce the problem with it. I simplified it to the minimum so the smallest code I found that still reproduces the problem is this:

Code: Select all

uses Series;

procedure TForm1.FormCreate(Sender: TObject);
begin
  with Chart1 do
  begin
    View3D:=False;
    Axes.Bottom.Inverted:=True;
  end;

  with Chart1.AddSeries(TLineSeries) as TLineSeries do
  begin
    XValues.Order := loNone;
    FillSampleValues;
  end;
end;
It seems the combination of 2D, an inverted bottom axis and a TLineSeries with XValues.Order set to loNone gives this problem.
I've added it to the defect list to be further investigated (TV52016351).

Re: Floating point overflow zooming in

Posted: Fri Sep 21, 2012 1:31 pm
by yeray
Hi Trevor,

We've just reviewed and fixed it for the next maintenance release (TV52016351).

Re: Floating point overflow zooming in

Posted: Tue Sep 25, 2012 4:34 pm
by 16460479
Thanks Yeray.

When's the next maintenance release?

In the meantime, it doesn't seem possible to trap the error, and when it occurs the default unzoom behaviour no longer works, so users have to rebuild the chart. If you know the fix, then do you also know whether there is an obvious way of predicting when the problem will occur so we can anticipate it by preventing 'too many' zooms?

Thanks

Trevor Cooper

Re: Floating point overflow zooming in

Posted: Wed Sep 26, 2012 11:53 am
by yeray
Hi Trevor,
Toreba wrote:When's the next maintenance release?
I'm afraid I can't tell you when the next maintenance release will be published. You can see the release notes to have an idea on how often we use to do it.
Toreba wrote:In the meantime, it doesn't seem possible to trap the error, and when it occurs the default unzoom behaviour no longer works, so users have to rebuild the chart. If you know the fix, then do you also know whether there is an obvious way of predicting when the problem will occur so we can anticipate it by preventing 'too many' zooms?
The easier workaround I see right now would be to create a custom series inheriting from TLineSeries and overriding the DrawValue method to prevent it:

Code: Select all

uses Series;

{ MySeries }

type
  MySeries = class(TLineSeries)
  protected
    procedure DrawValue(ValueIndex:Integer); override;
  end;

procedure MySeries.DrawValue(ValueIndex: Integer);
var XPos: Integer;
begin
  XPos:=CalcXPos(ValueIndex);
  if (XPos<$7FFF) and (XPos>-$7FFF) then
    inherited;
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  with Chart1 do
  begin
    View3D:=False;
    Axes.Bottom.Inverted:=True;
  end;

  with Chart1.AddSeries(MySeries) as MySeries do
  begin
    XValues.Order := loNone;
    FillSampleValues;
  end;
end;

Re: Floating point overflow zooming in

Posted: Wed Sep 26, 2012 2:00 pm
by 16460479
Yeray,

Yes, that works, thank you very much. The software now doesn't crash, but at one point during the sequence of zooms the chart plot area fills with grey and no series are visible, but we can zoom or unzoom out of that and continue working with the chart as normal. I think we can live with that quite happily until the next maintenance release.

Thanks for your help.

Trevor Cooper

Re: Floating point overflow zooming in

Posted: Wed Sep 26, 2012 3:20 pm
by yeray
Hi Trevor,
Toreba wrote:The software now doesn't crash, but at one point during the sequence of zooms the chart plot area fills with grey and no series are visible, but we can zoom or unzoom out of that and continue working with the chart as normal. I think we can live with that quite happily until the next maintenance release.
I'm not sure to be able to reproduce this. I've taken your project, removed the 3 TLineSeries and added the same code, but at runtime, to be able to substitute them for MySeries type. Here is the code:

Code: Select all

{ MySeries }

  MySeries = class(TLineSeries)
  protected
    procedure DrawValue(ValueIndex:Integer); override;
  end;

  TForm1 = class(TForm)
    ChartEditor1: TChartEditor;
    Chart1: TChart;
    procedure Chart1DblClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;
  Series3: TAreaSeries;
  Series2: MySeries;
  Series1: MySeries;
  Series4: MySeries;

implementation

{$R *.dfm}

procedure TForm1.Chart1DblClick(Sender: TObject);
begin
  Self.ChartEditor1.Execute;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  Series3:=Chart1.AddSeries(TAreaSeries) as TAreaSeries;
  with Series3 as TAreaSeries do
  begin
    Marks.Arrow.Visible := True;
    Marks.Callout.Brush.Color := clBlack;
    Marks.Callout.Arrow.Visible := True;
    Marks.Visible := False;
    SeriesColor := clSilver;
    Title := 'Invert Level';
    AreaLinesPen.Color := clGray;
    AreaLinesPen.Style := psDashDot;
    DrawArea := True;
    Pointer.InflateMargins := True;
    Pointer.Style := psRectangle;
    Pointer.Visible := False;
    XValues.Name := 'X';
    XValues.Order := loAscending;
    YValues.Name := 'Y';
    YValues.Order := loNone;
  end;

  Series2:=Chart1.AddSeries(MySeries) as MySeries;
  with Series2 as MySeries do
  begin
    Marks.Arrow.Visible := True;
    Marks.Callout.Brush.Color := clBlack;
    Marks.Callout.Arrow.Visible := True;
    Marks.Visible := False;
    SeriesColor := clBlue;
    Title := 'Hydraulic Level';
    LinePen.Color := clBlue;
    LinePen.Width := 2;
    Pointer.InflateMargins := True;
    Pointer.Style := psRectangle;
    Pointer.Visible := False;
    XValues.Name := 'X';
    XValues.Order := loNone;
    YValues.Name := 'Y';
    YValues.Order := loNone;
  end;

  Series1:=Chart1.AddSeries(MySeries) as MySeries;
  with Series1 as MySeries do
  begin
    Marks.Arrow.Visible := True;
    Marks.Callout.Brush.Color := clBlack;
    Marks.Callout.Arrow.Visible := True;
    Marks.Visible := False;
    Title := 'Energy Level';
    LinePen.Color := clRed;
    LinePen.Width := 2;
    Pointer.InflateMargins := True;
    Pointer.Style := psRectangle;
    Pointer.Visible := False;
    XValues.Name := 'X';
    XValues.Order := loNone;
    YValues.Name := 'Y';
    YValues.Order := loNone;
  end;

  Series4:=Chart1.AddSeries(MySeries) as MySeries;
  with Series4 as MySeries do
  begin
    Marks.Arrow.Visible := True;
    Marks.Callout.Brush.Color := clBlack;
    Marks.Callout.Arrow.Visible := True;
    Marks.Visible := False;
    Title := 'Soffit Level';
    LinePen.Color := clGreen;
    Pointer.InflateMargins := True;
    Pointer.Style := psRectangle;
    Pointer.Visible := False;
    XValues.Name := 'X';
    XValues.Order := loAscending;
    YValues.Name := 'Y';
    YValues.Order := loNone;
  end;

  Series1.FillSampleValues(10);
  Series2.FillSampleValues(10);
  Series3.FillSampleValues(10);
  Series4.FillSampleValues(10);
end;

procedure MySeries.DrawValue(ValueIndex: Integer);
var XPos: Integer;
begin
  XPos:=CalcXPos(ValueIndex);
  if (XPos<$7FFF) and (XPos>-$7FFF) then
    inherited;
end;
I zoom several times and there's no error message and I can't see this effect. Could you please send us some screenshot so we can see where are you exactly zooming in?

Re: Floating point overflow zooming in

Posted: Thu Sep 27, 2012 10:58 am
by 16460479
Yeray,

I modified my oroginal project accroding to your suggested workround, as attached. If you maximise the form, zoom in far enough, say somewhere between the 10th and 25th zooms, then the plot area goes grey as in the attached image, but there's no error and you can still zoom in and out at this stage.

But, the greying out only occurs if the form is maximised. Otherwise all is fine.

I hope that makes sense to you.

Regards

Trevor Cooper

Re: Floating point overflow zooming in

Posted: Thu Sep 27, 2012 3:28 pm
by yeray
Hi,

But I'm not sure where are you exactly zooming. Note there are zones where you will see everything on gray in just one zoom (if you zoom into the area series).
Please, show us a video, or post an example with hardcoded values and hardcoded zoom rectangles to be sure we are doing exactly the same.

Re: Floating point overflow zooming in

Posted: Thu Sep 27, 2012 4:43 pm
by 16460479
Yeray,

I've slightly expanded my example project with a hard-coded set-up of series values, and a memo showing the last zoomed coordinates. If I had more time today I'd hard code these zoom coordinates for you. If I concentrate on zooming in the top left part of the chart, and keep going,I get a greying out of the plot area after about eight zooms. I attach the project with screen captures of start and end of the process.

Hope that helps.

Trevor Cooper

Re: Floating point overflow zooming in

Posted: Fri Sep 28, 2012 10:29 am
by yeray
Hi,

I could reproduce the issue now thanks to your project.
Simplifying it to the minimum, indeed, it seems to be completely different issue:

Code: Select all

uses Series;

procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
  Chart1.Align:=alClient;
  Chart1.View3D:=false;

  with Chart1.AddSeries(TAreaSeries) do
    for i:=1 to 10 do
      AddXY(i, 15-i);

  Chart1.Axes.Bottom.SetMinMax(9.105085051, 9.105129839);
  Chart1.Axes.Left.SetMinMax(17.090535587, 17.090594192);

  Self.WindowState:=wsMaximized;
end;
I've observed it seems to depend on the height the chart actually has. The problem is reproducible when the window is maximized, but also if you don't maximize the window and you resize it to have big height.
I've added it to the wish list to be investigated (TV52016366).

Re: Floating point overflow zooming in

Posted: Fri Sep 28, 2012 2:49 pm
by 16460479
Okay, thanks for your help Yeray!