Page 1 of 2
Annotations are broken. Can't draw on the canvas.
Posted: Tue Oct 29, 2024 5:36 pm
by 18286055
Steema.TeeChart.NET.MAUI v6.2024.8.29
Seems that the following is the culprit:
Code: Select all
Microsoft.Maui.Graphics.Platform.PlatformCanvas
Seems like the
CurrentState is null. It should be an instance of
PlatformCanvasState.
Code: Select all
public override void FillRectangle(float x, float y, float width, float height)
{
var rectX = x;
var rectY = y;
var rectWidth = width;
var rectHeight = height;
_canvas.DrawRect(rectX, rectY, rectX + rectWidth, rectY + rectHeight, CurrentState.FillPaintWithAlpha);
}
AnnotationTool is a sub-classed
Steema.TeeChart.Tools.RectangleTool in the stack trace below.
System.NullReferenceException: Object reference not set to an instance of an object.
at Microsoft.Maui.Graphics.Platform.PlatformCanvas.FillRectangle(Single x, Single y, Single width, Single height) in /_/src/Graphics/src/Graphics/Platforms/Android/PlatformCanvas.cs:line 473
at Microsoft.Maui.Graphics.ScalingCanvas.FillRectangle(Single x, Single y, Single width, Single height) in /_/src/Graphics/src/Graphics/ScalingCanvas.cs:line 167
at Microsoft.Maui.Graphics.CanvasExtensions.FillRectangle(ICanvas target, Rect rect) in /_/src/Graphics/src/Graphics/CanvasExtensions.cs:line 22
at Steema.TeeChart.Maui.Drawing.CanvasMaui.Rectangle(Rect r)
at <project>.AnnotationTool.DrawText(CanvasMaui& graphics, ReadOnlyRectangle& bounds) in <project>\Graphs\AnnotationTool.cs:line 241
at <project>.AnnotationTool.Draw(CanvasMaui& graphics, Line& line, DashboardResult& result, ReadOnlyPoint& target, ReadOnlyPoint& source, Int32& currentPointIndex, Boolean& floatingAnnotations, Double& annotationOffset, CultureInfo& culture) in <project>\Graphs\AnnotationTool.cs:line 189
Re: Annotations are broken. Can't draw on the canvas.
Posted: Mon Nov 04, 2024 10:37 am
by edu
Hello,
I have tried to reproduce your issue but creating and setting up Annotations seems to work as expected on my end.
Could you please share additional details or code context so we can assist you further?
Best regards,
Edu
Re: Annotations are broken. Can't draw on the canvas.
Posted: Tue Nov 05, 2024 4:16 pm
by 18286055
As a part of the Annotation, I need to draw an arrow from the corner of the popup to the point in question. A lot of math is done prior to this, but the following is crashing due the stack trace bellow. I tried the native method and doing a custom arrow. Both crash.
Code: Select all
private void DrawArrow( ref readonly CanvasMaui graphics,
ref readonly ReadOnlyPoint target,
ref readonly ReadOnlyPoint source,
double arrowWidth = 10,
double arrowHeight = 10 )
{
graphics.Line( source, target );
double halfArrowWidth = arrowWidth / 2;
double dx = target.X - source.X;
double dy = target.Y - source.Y;
double length = Math.Sqrt( dx * dx + dy * dy );
double ux = dx / length;
double uy = dy / length; // (ux,uy) represents the unit vector in the direction from source(x1,y1) to target(x2,y2).
double tipX = target.X + arrowHeight * ux;
double tipY = target.Y + arrowHeight * uy;
ReadOnlyPoint tip = new(tipX, tipY);
ReadOnlyPoint left = new(target.X + halfArrowWidth * -uy, target.Y - halfArrowWidth * ux);
ReadOnlyPoint right = new(target.X + halfArrowWidth * -uy, target.Y - halfArrowWidth * ux);
PathGeometry path = new();
path.AppendPath( new PathF( tip ) );
path.AppendPath( new PathF( left ) );
path.AppendPath( new PathF( right ) );
path.AppendPath( new PathF( tip ) );
graphics.FillRegion( ArrowPen.DrawingPen, ArrowPen.DrawingPen, path );
/*
graphics.Arrow( true,
source,
target,
arrowWidth,
arrowHeight,
0 );
*/
}
Code: Select all
System.NullReferenceException: Object reference not set to an instance of an object.
at Microsoft.Maui.Graphics.Platform.PlatformCanvas.PlatformDrawLine(Single x1, Single y1, Single x2, Single y2)
in /_/src/Graphics/src/Graphics/Platforms/Android/PlatformCanvas.cs:line 363
at Microsoft.Maui.Graphics.AbstractCanvas`1[[Microsoft.Maui.Graphics.Platform.PlatformCanvasState, Microsoft.Maui.Graphics,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].DrawLine(Single x1, Single y1, Single x2, Single y2)
in /_/src/Graphics/src/Graphics/AbstractCanvas.cs:line 139
at Microsoft.Maui.Graphics.ScalingCanvas.DrawLine(Single x1, Single y1, Single x2, Single y2)
in /_/src/Graphics/src/Graphics/ScalingCanvas.cs:line 111
at Steema.TeeChart.Maui.Drawing.CanvasMaui.Line(Double x0, Double y0, Double x1, Double y1)
at Steema.TeeChart.Maui.Drawing.Graphics3DBase.Line(Point p0, Point p1)
at <project>.UI.AnnotationTool.DrawArrow(CanvasMaui& graphics, ReadOnlyPoint& target,
ReadOnlyPoint& source, Double arrowWidth, Double arrowHeight)
in <project>\Graphs\AnnotationTool.cs:line 211
at <project>.UI.AnnotationTool.Draw(CanvasMaui& graphics, Line& line, DashboardResult& result,
ReadOnlyPoint& target, ReadOnlyPoint& source, Int32& currentPointIndex, Boolean& floatingAnnotations,
Double& annotationOffset, CultureInfo& culture)
in <project>\Graphs\AnnotationTool.cs:line 195
Re: Annotations are broken. Can't draw on the canvas.
Posted: Tue Nov 05, 2024 5:20 pm
by 18286055
If i try to draw the popup first, it still crashes. The native RectangleTool.DrawText method also crashes. See the previous stack traces. The arrow is never drawn. Oddly though, the popup still is displayed but nothing else, regardless of the call order(text or arrow first)
Code: Select all
private void DrawText( ref readonly CanvasMaui graphics, ref readonly ReadOnlyRectangle bounds )
{
ChartFont font = (ChartFont)Shape.Font;
graphics.Rectangle( bounds ); // boom here
double height = graphics.TextHeight( font, Text );
double x = bounds.X;
double y = bounds.Y + (bounds.Height - height) / 2;
graphics.TextOut( font, x, y, Text );
}
Re: Annotations are broken. Can't draw on the canvas.
Posted: Tue Nov 05, 2024 5:29 pm
by 18286055
Here is a screenshot of so you can see it. The toast on the image is to help debug it.
In this case, the arrow should be from the bottom left corner of the popup to the 3rd point.
Code: Select all
#if DEBUG
_ = Dialogs.Toast( $"{nameof(AnnotationTool)}.{nameof(Draw)}.{Active}.{currentPointIndex}.{line.Count}" );
#endif
- 90259.jpeg (433.39 KiB) Viewed 13227 times
Re: Annotations are broken. Can't draw on the canvas.
Posted: Fri Nov 08, 2024 10:30 am
by Pep
Hello,
does the following code works for you ? it should draw an Arrow from left bottom corner to the third point in Chart.
Code: Select all
private void TChart1_AfterDraw(object sender, Steema.TeeChart.Drawing.IGraphics3D g)
{
var series = tChart1.Chart.Series[0];
int pointIndex = 2; // Index 3
double xValue = series.XValues[pointIndex];
double yValue = series.YValues[pointIndex];
int xScreen = series.CalcXPos(pointIndex);
int yScreen = series.CalcYPos(pointIndex);
int xStart = series.CalcXPosValue(0);
int yStart = series.CalcYPosValue(0);
g.Arrow(false, new System.Drawing.Point(xStart, yStart), new System.Drawing.Point(xScreen, yScreen), 3, 20, 0);
}
Re: Annotations are broken. Can't draw on the canvas.
Posted: Fri Nov 08, 2024 5:33 pm
by 18286055
Pep wrote: ↑Fri Nov 08, 2024 10:30 am
Hello,
does the following code works for you ? it should draw an Arrow from left bottom corner to the third point in Chart.
Code: Select all
private void TChart1_AfterDraw(object sender, Steema.TeeChart.Drawing.IGraphics3D g)
{
var series = tChart1.Chart.Series[0];
int pointIndex = 2; // Index 3
double xValue = series.XValues[pointIndex];
double yValue = series.YValues[pointIndex];
int xScreen = series.CalcXPos(pointIndex);
int yScreen = series.CalcYPos(pointIndex);
int xStart = series.CalcXPosValue(0);
int yStart = series.CalcYPosValue(0);
g.Arrow(false, new System.Drawing.Point(xStart, yStart), new System.Drawing.Point(xScreen, yScreen), 3, 20, 0);
}
The event is triggered, but nothing is drawn. i also tried using the original CanvasMaui vs the event's IGraphics3D g parameter but there was no change; nothing is rendered.
Re: Annotations are broken. Can't draw on the canvas.
Posted: Mon Nov 11, 2024 8:23 am
by Pep
Hello,
which platform are you using?
Here it's working fine, just tested on Android or Windows.
- canvas-draw.jpg (174.02 KiB) Viewed 12625 times
Re: Annotations are broken. Can't draw on the canvas.
Posted: Mon Nov 11, 2024 5:13 pm
by 18286055
I'm on android. Could you post the code for your demo?
Re: Annotations are broken. Can't draw on the canvas.
Posted: Tue Nov 12, 2024 2:30 pm
by Pep
Hello,
sure, here it's the code used:
Code: Select all
public MainPage()
{
InitializeComponent();
var line = new FastLine(tChart1.Chart);
line.LinePen.Style = Steema.TeeChart.Drawing.DashStyle.Dash;
line.Add(10, 10);
line.Add(20, 40);
line.Add(30, 20);
line.Add(40, 80);
line.Add(50, 40);
line.Add(60, 50);
line.Add(70, 30);
tChart1.AfterDraw += TChart1_AfterDraw;
}
private void TChart1_AfterDraw(object sender, Steema.TeeChart.Drawing.IGraphics3D g)
{
var series = tChart1.Chart.Series[0];
int pointIndex = 2; // Index 3
double xValue = series.XValues[pointIndex];
double yValue = series.YValues[pointIndex];
int xScreen = series.CalcXPos(pointIndex);
int yScreen = series.CalcYPos(pointIndex);
int xStart = series.CalcXPosValue(0);
int yStart = series.CalcYPosValue(0);
g.Arrow(false, new System.Drawing.Point(xStart, yStart), new System.Drawing.Point(xScreen, yScreen), 3, 20, 0);
}
Re: Annotations are broken. Can't draw on the canvas.
Posted: Wed Nov 13, 2024 9:23 pm
by 18286055
Not sure how, but got the arrow to show up. but as related to the issue
Steema.TeeChart.Tools.NearestPoint Change event doesn't trigger http://support.steema.com/viewtopic.php ... e7a75ee146, it's always at the first point. doesn't change no matter where i click or drag.
Re: Annotations are broken. Can't draw on the canvas.
Posted: Mon Nov 18, 2024 11:17 am
by Pep
Hello,
ok, let me check and prepare an example of using the NearestPoint tool on android.
Re: Annotations are broken. Can't draw on the canvas.
Posted: Tue Nov 19, 2024 8:07 pm
by 18286055
Somehow, the annotation popup hangs around after it is redrawn/invalidated. Only the most recent previous popup is visible aside from the current one. In otherwords, once you click again, it will remove the 2nd oldest, keeping the previous and draws the new one.
The arrow from is the current one, the other is the old one.
- 91125.jpeg (251.06 KiB) Viewed 8881 times
Re: Annotations are broken. Can't draw on the canvas.
Posted: Wed Nov 20, 2024 6:06 am
by Pep
Hello,
which code are you using to draw the annotation?
Drawing the annotation inside the OnAfterDraw event should do the trick.
If you send me code that you're using I can check it here.
Thanks
Re: Annotations are broken. Can't draw on the canvas.
Posted: Wed Nov 20, 2024 4:15 pm
by 18286055
Pep wrote: ↑Wed Nov 20, 2024 6:06 am
Hello,
which code are you using to draw the annotation?
Drawing the annotation inside the OnAfterDraw event should do the trick.
If you send me code that you're using I can check it here.
Thanks
Unfortunately, I can't send the source code as its private. it is possible the AfterDraw event is getting called multiple times?