How to redraw circles drawn using custom drawing?

TeeChart for Microsoft Visual Studio .NET, Xamarin Studio (Android, iOS & Forms) & Monodevelop.
Post Reply
Nitin
Newbie
Newbie
Posts: 52
Joined: Fri Jun 30, 2006 12:00 am

How to redraw circles drawn using custom drawing?

Post by Nitin » Fri Sep 04, 2009 7:58 am

Hi,
I have 10 fast line series. In each of the series, if there is a null value then i am drawing one custom circle to show the start and end of the null values.
Now, from legend control, when i am unchecking the series - means making the series as invisible, the series goes off but the circles remains there.
How to solve this problem?
I am drawing those circles on beforedrawSeries event using the Graphics3D object.

Please help.
See the image below -
[img]
UndrawProblem.PNG
UndrawProblem.PNG (33.4 KiB) Viewed 10025 times
[/img]

Narcís
Site Admin
Site Admin
Posts: 14730
Joined: Mon Jun 09, 2003 4:00 am
Location: Banyoles, Catalonia
Contact:

Re: How to redraw circles drawn using custom drawing?

Post by Narcís » Fri Sep 04, 2009 8:16 am

Hi Nitin,

Before doing the drawing in the BeforeDrawSeries event I'd check if that specific series is visible (FastLine.Visible or FastLine.Active) and only do the drawing if series is visible otherwise don't do that.
Best Regards,
Narcís Calvet / Development & Support
Steema Software
Avinguda Montilivi 33, 17003 Girona, Catalonia
Tel: 34 972 218 797
http://www.steema.com
Image Image Image Image Image Image
Instructions - How to post in this forum

Nitin
Newbie
Newbie
Posts: 52
Joined: Fri Jun 30, 2006 12:00 am

Re: How to redraw circles drawn using custom drawing?

Post by Nitin » Fri Sep 04, 2009 10:45 am

Sorry, i could not understand.
I am drawing all the series by default. Then from legend control (not teechart legend) it raise an event when the check box is changed. Based on that i am making the series visible or invisible. But the circles are custom drawn. With the series goes invisble, the circles are not going off.
Please have a look into the code below -

Code: Select all

        //Event to make the series visible or invisible
        void _TagInfo_OnVisibleStateChanged(object sender, bool visible)
        {
            TagInfo _TagInfo = sender as TagInfo;
            TeeChart.Series.WithTitle(_TagInfo.TagName).Visible = visible;
            TeeChart.Refresh(); //this call is also very costly. But to call the 
                                           //BeforeDrawSeries event i need to call this function. Is it right?
        }

        private void TeeChart_BeforeDrawSeries(object sender, Graphics3D g)
        {
            //Draw circles between the Null Value ranges in each of the series
            if (this.TeeChart.Series.Count > 0)
            {
                foreach (Series _Series in TeeChart.Series)
                {
                    if (_Series.Visible)
                        DrawCircle(g);
                }
            }
        }

      private void DrawCircle(Graphics3D GraphObj)
        {
            //Get the TagInfo of the series
            foreach (Series _Series in TeeChart.Series)
            {
                TagInfo _TagInfo = _TrendService.TrendManager.TagInfos[_Series.Title];

                //Iterate through the Null indexes instead of the whole data to get the points 
                //for drawing the circle
                for (int i = 0; i < _TagInfo.NullIndexes.Count; i++)
                {
                  int _PtXPos = -1;
                  int _PtYPos = -1;
                  Color PtColor;                    //Point Color
                  double xPtVal = -1;
                  double yPtVal = -1;
                  int _CurrentmiSeriesIndex = _TagInfo.NullIndexes[i];

                  if (_CurrentmiSeriesIndex > 0)
                  {
                    if (!_Series.IsNull(_TagInfo.NullIndexes[i] - 1))
                    {

                      xPtVal = _Series[_CurrentmiSeriesIndex - 1].X;
                      yPtVal = _Series[_CurrentmiSeriesIndex - 1].Y;

                      _PtXPos = _Series.CalcXPosValue(xPtVal);
                      _PtYPos = _Series.CalcYPosValue(yPtVal);

                    }

                    PtColor = _Series.Color;
                    //Paint the circle
                    PaintCircle(GraphObj, _PtXPos, _PtYPos, PtColor);
                  }
                  else if (_CurrentmiSeriesIndex < 0) continue;

                  if (_CurrentmiSeriesIndex + 1 == _Series.Count)
                    continue;
                  if (!_Series.IsNull(_CurrentmiSeriesIndex + 1))
                  {
                    xPtVal = _Series[_CurrentmiSeriesIndex + 1].X;
                    yPtVal = _Series[_CurrentmiSeriesIndex + 1].Y;

                    _PtXPos = _Series.CalcXPosValue(xPtVal);
                    _PtYPos = _Series.CalcYPosValue(yPtVal);

                    PtColor = _Series.Color;
                    GraphObj.Pen.Style = System.Drawing.Drawing2D.DashStyle.Solid;
                    GraphObj.Pen.Transparency = 0;
                    PaintCircle(GraphObj, _PtXPos, _PtYPos, PtColor);
                  }
                }
            }
        }

        private void PaintCircle(Graphics3D GraphObj, int xPos, int yPos, Color PtColor)
        {
            GraphObj.Brush.Color = PtColor;
            GraphObj.Brush.Transparency = 100;

            TeeChart.Canvas.Pen.Color = PtColor;
            TeeChart.Canvas.Pen.Width = 1;

            //Subtrating by radius of the circle
            GraphObj.Ellipse(new Rectangle(xPos - 3, yPos - 3, 6, 6));
        }

Hope i am clear.

Narcís
Site Admin
Site Admin
Posts: 14730
Joined: Mon Jun 09, 2003 4:00 am
Location: Banyoles, Catalonia
Contact:

Re: How to redraw circles drawn using custom drawing?

Post by Narcís » Fri Sep 04, 2009 11:02 am

Hi Nitin,

Code below works fine for me here without the need of refreshing the chart. Using the AfterDraw event instead of BeforeDrawSeries also works fine. Does this code works fine for you? If the problem persists please attach a simple example project we can run "as-is" to reproduce the problem here.

Code: Select all

		public Form1()
		{
			InitializeComponent();
			InitializeChart();
		}

		private void InitializeChart()
		{
			tChart1.Aspect.View3D = false;
			tChart1.Legend.CheckBoxes = true;

			for (int i = 0; i < 5; i++)
			{
				Steema.TeeChart.Styles.Line line1 = new Steema.TeeChart.Styles.Line(tChart1.Chart);
				line1.FillSampleValues();
			}

			tChart1.BeforeDrawSeries += new Steema.TeeChart.PaintChartEventHandler(tChart1_BeforeDrawSeries);
		}

		void tChart1_BeforeDrawSeries(object sender, Steema.TeeChart.Drawing.Graphics3D g)
		{
			DrawCircles();
		}

		private void DrawCircles()
		{
			foreach (Steema.TeeChart.Styles.Series s in tChart1.Series)
			{
				if (s.Visible)
				{
					for (int i = 0; i < s.Count; i++)
					{
						int x = s.CalcXPos(i);
						int y = s.CalcYPos(i);
						tChart1.Graphics3D.Ellipse(x-3, y-3, x+3, y+3);
					}
				}
			}
		}
Thanks in advance.
Best Regards,
Narcís Calvet / Development & Support
Steema Software
Avinguda Montilivi 33, 17003 Girona, Catalonia
Tel: 34 972 218 797
http://www.steema.com
Image Image Image Image Image Image
Instructions - How to post in this forum

Nitin
Newbie
Newbie
Posts: 52
Joined: Fri Jun 30, 2006 12:00 am

Re: How to redraw circles drawn using custom drawing?

Post by Nitin » Tue Sep 08, 2009 8:05 am

This worked for me as well.
Thanks.

Post Reply