Line movement
Line movement
Hi All
I have a taken a line object to draw the lines , I want to move that line from one point to another. How can move the lines.
Please reply me as soon possible.
Thanks
Sudhir Srivastava
I have a taken a line object to draw the lines , I want to move that line from one point to another. How can move the lines.
Please reply me as soon possible.
Thanks
Sudhir Srivastava
-
- Site Admin
- Posts: 14730
- Joined: Mon Jun 09, 2003 4:00 am
- Location: Banyoles, Catalonia
- Contact:
Re: Line movement
Hi Sudhir,
Just click on a line to select it and drag it to another location in the chart. Click and drag handles to change start or end point. You can find examples at All Features\Welcome !\Tools\Draw Lines in the features demo available at TeeChart's program group.
If that's not what you are looking for please give us more details.
Just click on a line to select it and drag it to another location in the chart. Click and drag handles to change start or end point. You can find examples at All Features\Welcome !\Tools\Draw Lines in the features demo available at TeeChart's program group.
If that's not what you are looking for please give us more details.
Best Regards,
Narcís Calvet / Development & Support Steema Software Avinguda Montilivi 33, 17003 Girona, Catalonia Tel: 34 972 218 797 http://www.steema.com |
Instructions - How to post in this forum |
Re: Line movement
Hi Narcís,
Thanks for the support you provide so far.
I am now able to move the line series on chart. But I have some problem which i ma explaining bellow:
I have a chart having logarithmic axes. On this chart I have two lines. Say first line is Line1 and other is Line2. We can move only Line1 by clicking it and dragging over the chart only in Y direction. I want to move Line2 at the same time with same distance (the distance line1 is moved)
Problem: Line 2 is not moving properly. It move with a varying diatance. However if we change axes to non log, it works.
For explaining it I am attaching sample project. In this project there are two forms. Form one have a chart with Logarithmic axes and Form2 have Non- Logarithmic axes. Please run both the forms. I want the movement in form1 as in form2.
I am very thankful for your kind and precious support. It will be so kind of you if you please help me as soon as possible.
Thanks and regards
Ashish Pandey
Thanks for the support you provide so far.
I am now able to move the line series on chart. But I have some problem which i ma explaining bellow:
I have a chart having logarithmic axes. On this chart I have two lines. Say first line is Line1 and other is Line2. We can move only Line1 by clicking it and dragging over the chart only in Y direction. I want to move Line2 at the same time with same distance (the distance line1 is moved)
Problem: Line 2 is not moving properly. It move with a varying diatance. However if we change axes to non log, it works.
For explaining it I am attaching sample project. In this project there are two forms. Form one have a chart with Logarithmic axes and Form2 have Non- Logarithmic axes. Please run both the forms. I want the movement in form1 as in form2.
I am very thankful for your kind and precious support. It will be so kind of you if you please help me as soon as possible.
Thanks and regards
Ashish Pandey
- Attachments
-
- MovementOfLineInLogAxes.rar
- (31.84 KiB) Downloaded 871 times
Re: Line movement
Hello Ashish,
I think the project you've sent is working as expected. The deltaY variable you are calculating in the MouseMove event is the distance in pixels between the Y Position where the line was and the actual Y Position of the mouse. Note that this is a linear distance, not a logarithmic one. So it will be difficult to use it to set a regular distance in a logarithmic scale.
I'd suggest you to take the distance in pixels between the clicked line and the other line at the MouseDown event. This distance in pixels is the one you want to always maintain (if I understood correctly). So I've added a line in your MouseDown event:
But, as we are talking about a logarithmic axis, this distance in pixels means different distances in values depending on the concrete position. So, we can take the position in pixels of the clicked line (CalcYPos), subtract the distance in pixels previously calculated to get the Y position in pixels we'll have to impose to the other line. And we'll have to translate this calculated position in pixels to values with the axis CalcPosPoint function.
So instead of:
You could do this:
And it seems to work as I understood you would like to. Please, make us know if it doesn't work as you expected.
I think the project you've sent is working as expected. The deltaY variable you are calculating in the MouseMove event is the distance in pixels between the Y Position where the line was and the actual Y Position of the mouse. Note that this is a linear distance, not a logarithmic one. So it will be difficult to use it to set a regular distance in a logarithmic scale.
I'd suggest you to take the distance in pixels between the clicked line and the other line at the MouseDown event. This distance in pixels is the one you want to always maintain (if I understood correctly). So I've added a line in your MouseDown event:
Code: Select all
if (indexOfClickedPoint != -1)
{
isMouseDownOnLine = true;
distInPixels = Line1.CalcYPos(indexOfClickedPoint) - Line2.CalcYPos(indexOfClickedPoint);
}
So instead of:
Code: Select all
Line2[0].Y += deltaY;
Line2[1].Y += deltaY;
Code: Select all
Line2[0].Y = tChart1.Axes.Left.CalcPosPoint(Line1.CalcYPos(indexOfClickedPoint) - distInPixels);
Line2[1].Y = tChart1.Axes.Left.CalcPosPoint(Line1.CalcYPos(indexOfClickedPoint) - distInPixels);
Best Regards,
Yeray Alonso Development & Support Steema Software Av. Montilivi 33, 17003 Girona, Catalonia (SP) | |
Please read our Bug Fixing Policy |
Re: Line movement
HI Yeray,
Thanks you very-very much for the precious help you provided. The code you provided is working as expected. I and my senior in management are very delightful with Steema’s support. We were using Evaluation version of Tee-Chart 2010. But now we got its licence. After now I will work on it.
I do have one other query: I want to draw a line with half (45°) slope whose end point always is on Chart’s boundaries. I can also move it along the X axis. I am able to move it in non log axes. But in log axes I am unable to draw this line, movement is so far. Once again I am attaching project which will explain my problem. This project is on same pattern as previous as it contain two forms , one with log axes and other of non log axes.
One thing I want to let you know that currently I am new in Tee-Chart, so maybe I need your frequent support.
Once again I would like to say: Thank you!
Thanks and regards
Ashish Pandey
Thanks you very-very much for the precious help you provided. The code you provided is working as expected. I and my senior in management are very delightful with Steema’s support. We were using Evaluation version of Tee-Chart 2010. But now we got its licence. After now I will work on it.
I do have one other query: I want to draw a line with half (45°) slope whose end point always is on Chart’s boundaries. I can also move it along the X axis. I am able to move it in non log axes. But in log axes I am unable to draw this line, movement is so far. Once again I am attaching project which will explain my problem. This project is on same pattern as previous as it contain two forms , one with log axes and other of non log axes.
One thing I want to let you know that currently I am new in Tee-Chart, so maybe I need your frequent support.
Once again I would like to say: Thank you!
Thanks and regards
Ashish Pandey
- Attachments
-
- MovementOfLineInLogAxes.rar
- (36.16 KiB) Downloaded 867 times
Re: Line movement
Hello Amol,
Sorry for the delay.You need calculate position of values in the Log Axes Left if you want get correct position of Line, as do in next lines of code:
Could you tell us if previous code works as you expected?
Thanks,
Sorry for the delay.You need calculate position of values in the Log Axes Left if you want get correct position of Line, as do in next lines of code:
Code: Select all
private void CreateDataForHalfSlopeLine(double KnownX, double KnownY, ref List<double> XDATA, ref List<double> YDATA)
{
float slope = 1; //with 1/2 slope, i.e. 45 .
PointF pointOfIndex2 = new PointF();
pointOfIndex2.X =(float)tChart1.Axes.Left.CalcPosPoint((int)(KnownX + (((tChart1.Axes.Left.Maximum - KnownY) / slope))));
pointOfIndex2.Y = (float)tChart1.Axes.Left.CalcPosPoint((int)tChart1.Axes.Left.Maximum);
slope = ((float)KnownY - pointOfIndex2.Y) / ((float)KnownX - pointOfIndex2.X);
PointF pointOfIndex0 = new PointF();
pointOfIndex0.X = (float)tChart1.Axes.Left.CalcPosPoint((int)(KnownX + ((tChart1.Axes.Left.Minimum - KnownY) / slope)));
pointOfIndex0.Y = (float)tChart1.Axes.Left.CalcPosPoint((int)tChart1.Axes.Left.Minimum);
XDATA.Add(pointOfIndex0.X);
XDATA.Add(tChart1.Axes.Left.CalcPosValue(KnownX));
XDATA.Add(pointOfIndex2.X);
YDATA.Add(pointOfIndex0.Y);
YDATA.Add(tChart1.Axes.Left.CalcPosValue(KnownY));
YDATA.Add(pointOfIndex2.Y);
}
Thanks,
Best Regards,
Sandra Pazos / Development & Support Steema Software Avinguda Montilivi 33, 17003 Girona, Catalonia Tel: 34 972 218 797 http://www.steema.com |
Instructions - How to post in this forum |
Re: Line movement
Hi Sandra,
Thanks for reply. I am afraid, but code you provided is not working as it is unable to draw line. In the code provided by you, the lists ‘XDATA’ and ‘YDATA’ contains its entire item with value zero. Since the values are zero, it could not draw line.
I am still unable to draw a line with half slope whose end points are always on chart axes. But I am working on it. Meanwhile you can suggest me another way to do it.
There is one more query regarding Legend in TeeChart 2010 (version 4.1.2011). Legend is not being displayed on Chart with this dll, while if we use its previous version (version 4.1.2011) it works fine.
It will be so kind of you if you please help me ASAP.
Thanks and Regards,
Ashish Pandey
Thanks for reply. I am afraid, but code you provided is not working as it is unable to draw line. In the code provided by you, the lists ‘XDATA’ and ‘YDATA’ contains its entire item with value zero. Since the values are zero, it could not draw line.
I am still unable to draw a line with half slope whose end points are always on chart axes. But I am working on it. Meanwhile you can suggest me another way to do it.
There is one more query regarding Legend in TeeChart 2010 (version 4.1.2011). Legend is not being displayed on Chart with this dll, while if we use its previous version (version 4.1.2011) it works fine.
It will be so kind of you if you please help me ASAP.
Thanks and Regards,
Ashish Pandey
Re: Line movement
Hello Amol,
Sorry, in previous example I have been forgotten add tChart1.Draw() because function CalcPosPoint() can calculate correctly. You can add tChart1.Draw() as in next code:
On the other hand, I am not sure that this is a right solution for logarithmic axes and how you want behave exactly line as you want draw. Please, could you attach us and image where appears line in the correct position to you (you can draw it) and explain exactly as you want achieve line behave in logarithmic axes?
Thanks,
Sorry, in previous example I have been forgotten add tChart1.Draw() because function CalcPosPoint() can calculate correctly. You can add tChart1.Draw() as in next code:
Code: Select all
private void CreateDataForHalfSlopeLine(double KnownX, double KnownY, ref List<double> XDATA, ref List<double> YDATA)
{
tChart1.Draw();
float slope = 1; //with 1/2 slope, i.e. 45 .
PointF pointOfIndex2 = new PointF();
pointOfIndex2.X =(float)tChart1.Axes.Left.CalcPosPoint((int)(KnownX + (((tChart1.Axes.Left.Maximum - KnownY) / slope))));
pointOfIndex2.Y = (float)tChart1.Axes.Left.CalcPosPoint((int)tChart1.Axes.Left.Maximum);
slope = ((float)KnownY - pointOfIndex2.Y) / ((float)KnownX - pointOfIndex2.X);
PointF pointOfIndex0 = new PointF();
pointOfIndex0.X = (float)tChart1.Axes.Left.CalcPosPoint((int)(KnownX + ((tChart1.Axes.Left.Minimum - KnownY) / slope)));
pointOfIndex0.Y = (float)tChart1.Axes.Left.CalcPosPoint((int)tChart1.Axes.Left.Minimum);
XDATA.Add(pointOfIndex0.X);
XDATA.Add(tChart1.Axes.Left.CalcPosValue(KnownX));
XDATA.Add(pointOfIndex2.X);
YDATA.Add(pointOfIndex0.Y);
YDATA.Add(tChart1.Axes.Left.CalcPosValue(KnownY));
YDATA.Add(pointOfIndex2.Y);
}
Thanks,
Best Regards,
Sandra Pazos / Development & Support Steema Software Avinguda Montilivi 33, 17003 Girona, Catalonia Tel: 34 972 218 797 http://www.steema.com |
Instructions - How to post in this forum |
Re: Line movement
Hi Sandra,
Yes, you are right code you provided in last post was not working as expected. But after adding tChart1.Draw() it works fine. Thanks for making correction.
Sandra says:
Please, could you attach us and image where appears line in the correct position to you (you can draw it) and explain exactly as you want achieve line behave in logarithmic axes?
To know what I am trying to do, you can see fifth post. You can also see the project attached. Anyways I am explaining it once again:
I have a chart with logarithmic axes. In this chart we need a line which will be on half slope (45°) and its end points always touches the boundaries of the chart (We have done this by your help provided in last post). But the major part of the requirement is that we can move this line along X- axis by just clicking it and moving mouse over the chart. While moving the line, its end points should always be boundaries. I have successfully made this type of chart for linear axes, but for logarithmic axes I am still grappling.
The project attached in fifth post may be helpful for you to understand. In this project there are two forms. Form1 have a chart with Logarithmic axes and Form2 have Non- Logarithmic axes. Please run both the forms. I want the movement of half slope line in form1 as in form2.
There is one more query regarding Legend in TeeChart 2010 (version 4.1.2011). Legend is not being displayed on Chart with this dll, while if we use its previous version (version 4.0.2010) it works fine.
We will appreciate your suggestions.
Thanks and Regards,
Ashish Pandey
Yes, you are right code you provided in last post was not working as expected. But after adding tChart1.Draw() it works fine. Thanks for making correction.
Sandra says:
Please, could you attach us and image where appears line in the correct position to you (you can draw it) and explain exactly as you want achieve line behave in logarithmic axes?
To know what I am trying to do, you can see fifth post. You can also see the project attached. Anyways I am explaining it once again:
I have a chart with logarithmic axes. In this chart we need a line which will be on half slope (45°) and its end points always touches the boundaries of the chart (We have done this by your help provided in last post). But the major part of the requirement is that we can move this line along X- axis by just clicking it and moving mouse over the chart. While moving the line, its end points should always be boundaries. I have successfully made this type of chart for linear axes, but for logarithmic axes I am still grappling.
The project attached in fifth post may be helpful for you to understand. In this project there are two forms. Form1 have a chart with Logarithmic axes and Form2 have Non- Logarithmic axes. Please run both the forms. I want the movement of half slope line in form1 as in form2.
There is one more query regarding Legend in TeeChart 2010 (version 4.1.2011). Legend is not being displayed on Chart with this dll, while if we use its previous version (version 4.0.2010) it works fine.
We will appreciate your suggestions.
Thanks and Regards,
Ashish Pandey
Re: Line movement
Hello Amol,
Thanks,
I think that would be helpful to you, use a drawline tool, as do in next thread : http://www.teechart.net/support/viewtop ... t=0#p52763 where explain as you do to draw the drawline in all of chart and it works fine in Logarithmic axes. I think is a easy way to achieve as you want.Sandra says:
Please, could you attach us and image where appears line in the correct position to you (you can draw it) and explain exactly as you want achieve line behave in logarithmic axes?
To know what I am trying to do, you can see fifth post. You can also see the project attached. Anyways I am explaining it once again:
I have a chart with logarithmic axes. In this chart we need a line which will be on half slope (45°) and its end points always touches the boundaries of the chart (We have done this by your help provided in last post). But the major part of the requirement is that we can move this line along X- axis by just clicking it and moving mouse over the chart. While moving the line, its end points should always be boundaries. I have successfully made this type of chart for linear axes, but for logarithmic axes I am still grappling.
The project attached in fifth post may be helpful for you to understand. In this project there are two forms. Form1 have a chart with Logarithmic axes and Form2 have Non- Logarithmic axes. Please run both the forms. I want the movement of half slope line in form1 as in form2.
Sorry I forgot answer this question. I have checked it with source code and it works fine so it will be solved to next maintenance release of TeeChart.NetThere is one more query regarding Legend in TeeChart 2010 (version 4.1.2011). Legend is not being displayed on Chart with this dll, while if we use its previous version (version 4.0.2010) it works fine.
Thanks,
Best Regards,
Sandra Pazos / Development & Support Steema Software Avinguda Montilivi 33, 17003 Girona, Catalonia Tel: 34 972 218 797 http://www.steema.com |
Instructions - How to post in this forum |
Re: Line movement
Hi Sandra,
Thanks for your quick response. There are some restraints so I cannot use DrawLine tool. I had a long discussion about this in the posts available at the link you provided. At last I found that Draw Line cannot help me.
It will be so kind of you if you please provide the solution using Line series.
Thanks in advance
Thanks and Regards,
Ashish Pandey
Thanks for your quick response. There are some restraints so I cannot use DrawLine tool. I had a long discussion about this in the posts available at the link you provided. At last I found that Draw Line cannot help me.
It will be so kind of you if you please provide the solution using Line series.
Thanks in advance
Thanks and Regards,
Ashish Pandey
Re: Line movement
Hello Ashish,
Back to your application, I see you try to draw a line with a given slope. And you want that line to be draggable in a logarithmic axis maintaining the sople or angle.
- First of all note that you have to calculate the coordinates of the dragged line and, as more points in the series, more points you'll need to calculate. I mean, since a line is drawn with two points, why to have three?
- You use the clicked method at MouseDown event to check if the line is clicked. Then, at MouseMove event, you try to recalculate the coordinates of the points. As these points will cut the ChartRect, I see this problematic pretty similar to the problematic in the other thread, where you try to do exactly the same but with a DrawLine tool. So the code should look very similar to the code in there. The main difference is that the DrawLine tool takes pixels as coordinates, while a Line series has to be set with axes values. So you'll have to transform the coordinates calculated in the DrawLine example, and transform them to axes values with CalcPosPoint function.
Taking your example and the code from the DrawLine tool thread, with some little modifications, it seems to work fine for me here. This is the code I use to calculate the two Line points:
In the last post of the mentioned discussion I suggested you a way to achieve the last problematic you exposed. If you found any other problem with the workaround or anything else we'll be pleased to hear about it (please, do it in the according thread if you want us to take a look at it).Amol wrote:There are some restraints so I cannot use DrawLine tool. I had a long discussion about this in the posts available at the link you provided. At last I found that Draw Line cannot help me.
I think the problem in your code is regarding the relation and transformation from screen pixels to axes values and vicevesa. I'd suggest you to take a look at the following thread to understand the purpose of CalcPosValue and CalcPosPoint functions.Amol wrote:It will be so kind of you if you please provide the solution using Line series.
Back to your application, I see you try to draw a line with a given slope. And you want that line to be draggable in a logarithmic axis maintaining the sople or angle.
- First of all note that you have to calculate the coordinates of the dragged line and, as more points in the series, more points you'll need to calculate. I mean, since a line is drawn with two points, why to have three?
- You use the clicked method at MouseDown event to check if the line is clicked. Then, at MouseMove event, you try to recalculate the coordinates of the points. As these points will cut the ChartRect, I see this problematic pretty similar to the problematic in the other thread, where you try to do exactly the same but with a DrawLine tool. So the code should look very similar to the code in there. The main difference is that the DrawLine tool takes pixels as coordinates, while a Line series has to be set with axes values. So you'll have to transform the coordinates calculated in the DrawLine example, and transform them to axes values with CalcPosPoint function.
Taking your example and the code from the DrawLine tool thread, with some little modifications, it seems to work fine for me here. This is the code I use to calculate the two Line points:
Code: Select all
int X0, Y0, X1, Y1;
double slope = 1;
double alfa = Math.Atan2(1, 1*slope);
double alfad = (alfa * (180.0 / Math.PI)) % 360;
X0 = Math.Max(e.X - (int)(Math.Abs(tChart1.Axes.Left.IEndPos - e.Y) / Math.Tan(alfa)), tChart1.Axes.Bottom.IStartPos);
Y0 = Math.Min(e.Y + (int)(Math.Tan(alfa) * Math.Abs(e.X - tChart1.Axes.Bottom.IStartPos)), tChart1.Axes.Left.IEndPos);
X1 = Math.Min(e.X + (int)(Math.Abs(tChart1.Axes.Left.IStartPos - e.Y) / Math.Tan(alfa)), tChart1.Axes.Bottom.IEndPos);
Y1 = Math.Max(e.Y - (int)(Math.Tan(alfa) * Math.Abs(e.X - tChart1.Axes.Bottom.IEndPos)), tChart1.Axes.Left.IStartPos);
m_lnHalfSlope.XValues[0] = tChart1.Axes.Bottom.CalcPosPoint(X0);
m_lnHalfSlope.YValues[0] = tChart1.Axes.Left.CalcPosPoint(Y0);
m_lnHalfSlope.XValues[1] = tChart1.Axes.Bottom.CalcPosPoint(X1);
m_lnHalfSlope.YValues[1] = tChart1.Axes.Left.CalcPosPoint(Y1);
Best Regards,
Yeray Alonso Development & Support Steema Software Av. Montilivi 33, 17003 Girona, Catalonia (SP) | |
Please read our Bug Fixing Policy |
Re: Line movement
HI Yeray,
Thanks you very much for giving your precious time. I told you earlier some reason why I cannot use ‘DrawLine’ tool. Now our project is growing huge. We have created lots of this type of graph in our project using Line Series (but with non logarithmic axes). There are some dependencies of those plots with each other. As we are continuously using line series, it will be difficult to have Draw Line in some plot and in some Line Series. Also there are some synchronisations which could be lost by using DrawLine tool. One more thing was also there, as discussed that we could not find it in legend. If we create custom legend then it will be very difficult to maintain real-time synchronization as already present in default legend of Tee chart.
Once again I am explaining what I am trying to do(as attached figure): I want to draw a line series at a slope of 45° on logarithmic axes whose end points should always be on the boundaries. It should also have a pointer inside chart which would be used for calculation. After plotting it I could move it over the chart along the X axis by just clicking and dragging it by mouse. I am still working on it using Line series but meanwhile if you get anything for me then please let me know.
Please help me.
Thanks and regards
Ashish Pandey
Thanks you very much for giving your precious time. I told you earlier some reason why I cannot use ‘DrawLine’ tool. Now our project is growing huge. We have created lots of this type of graph in our project using Line Series (but with non logarithmic axes). There are some dependencies of those plots with each other. As we are continuously using line series, it will be difficult to have Draw Line in some plot and in some Line Series. Also there are some synchronisations which could be lost by using DrawLine tool. One more thing was also there, as discussed that we could not find it in legend. If we create custom legend then it will be very difficult to maintain real-time synchronization as already present in default legend of Tee chart.
As you suggested, for understanding CalcPosValue and CalcPosPoint functions, I am trying to get it correctly.I'd suggest you to take a look at the following thread to understand the purpose of CalcPosValue and CalcPosPoint functions.
Once again I am explaining what I am trying to do(as attached figure): I want to draw a line series at a slope of 45° on logarithmic axes whose end points should always be on the boundaries. It should also have a pointer inside chart which would be used for calculation. After plotting it I could move it over the chart along the X axis by just clicking and dragging it by mouse. I am still working on it using Line series but meanwhile if you get anything for me then please let me know.
Please help me.
Thanks and regards
Ashish Pandey
Re: Line movement
Hello Ashish,
A part from this, the concepts explained above should be enough to calculate the line values to draw your 45º slope. Here it is the complete Form1 that does it for me. The only thing I'm not sure why it isn't working as I'd expect is how the line looks the first time it is drawn. Maybe you can find what I'm missing.
But it seems to work as I'd expect when you drag it, isn't it?
I see, since you want a line with a central pointer visible, this line has to have minimum 3 points. You could use the line series GetPointerStyle event to show the pointer with index=1 and hide the pointers with index=0 and index=2.Amol wrote:Once again I am explaining what I am trying to do(as attached figure): I want to draw a line series at a slope of 45° on logarithmic axes whose end points should always be on the boundaries. It should also have a pointer inside chart which would be used for calculation. After plotting it I could move it over the chart along the X axis by just clicking and dragging it by mouse. I am still working on it using Line series but meanwhile if you get anything for me then please let me know.
A part from this, the concepts explained above should be enough to calculate the line values to draw your 45º slope. Here it is the complete Form1 that does it for me. The only thing I'm not sure why it isn't working as I'd expect is how the line looks the first time it is drawn. Maybe you can find what I'm missing.
But it seems to work as I'd expect when you drag it, isn't it?
Code: Select all
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Steema.TeeChart.Styles;
namespace MovementOfLineInLogAxes
{
internal class PointD
{
public double X, Y;
}
public partial class Form1 : Form
{
Line Line1 = new Line();
Line Line2 = new Line();
PointF m_pCurrent, m_pOrigin;
bool isMouseDownOnLine = false;
bool isMouseDownOnHalfSlopeLine = false;
int indexOfClickedPoint = -1;
int indexOfHalfSlopeLine = -1;
Line m_lnHalfSlope = new Line();
Point CentralPointPix;
public Form1()
{
InitializeComponent();
CreateChart();
}
private void CreateChart()
{
tChart1.Aspect.View3D = false;
tChart1.Aspect.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
tChart1.Panel.Color = Color.White;
tChart1.Panel.Gradient.Visible = false;
tChart1.BackColor = Color.White;
tChart1.Walls.Back.Gradient.Visible = false;
tChart1.Axes.Left.Automatic = false;
tChart1.Axes.Left.Logarithmic = true;
tChart1.Axes.Bottom.Automatic = false;
tChart1.Axes.Bottom.Logarithmic = true;
tChart1.Walls.Back.Color = Color.White;
tChart1.Walls.Back.Transparency = 0;
tChart1.Legend.CustomPosition = true;
tChart1.Chart.Panning.Allow = Steema.TeeChart.ScrollModes.None;
tChart1.Legend.Top = 14;
tChart1.Legend.Left = 824;
tChart1.Legend.Visible = true;
tChart1.Legend.LegendStyle = Steema.TeeChart.LegendStyles.Series;
tChart1.Zoom.Allow = false;
tChart1.Axes.Left.Minimum = 1;
tChart1.Axes.Left.Maximum = 1000;
tChart1.Axes.Bottom.Minimum = 0.0001;
tChart1.Axes.Bottom.Maximum = 1000;
Line1.Add(tChart1.Axes.Bottom.Minimum, 14.1456);
//Line1.Add(96.0, 14.1456);
Line1.Add(tChart1.Axes.Bottom.Maximum, 14.1456);
Line1.Pointer.Visible = false;
Line1.Color = Color.Blue;
tChart1.Series.Add(Line1);
Line2.Add(tChart1.Axes.Bottom.Minimum, 5.0992);
//Line2.Add(0.001, 5.0992);
Line2.Add(tChart1.Axes.Bottom.Maximum, 5.0992);
Line2.Pointer.Visible = false;
Line2.Color = Color.Red;
tChart1.Series.Add(Line2);
List<double> XDATA = new List<double>();
List<double> YDATA = new List<double>();
CreateDataForHalfSlopeLine(80, 30, ref XDATA, ref YDATA);
m_lnHalfSlope.Add(XDATA.ToArray(), YDATA.ToArray());
m_lnHalfSlope.Title = "Half Slope Line";
m_lnHalfSlope.Pointer.Visible = false;
m_lnHalfSlope.Pointer.Visible = true;
m_lnHalfSlope.Color = Color.Red;
m_lnHalfSlope.ZOrder = 1;
tChart1.Series.Add(m_lnHalfSlope);
CentralPointPix = new Point();
m_lnHalfSlope.GetPointerStyle += new CustomPoint.GetPointerStyleEventHandler(m_lnHalfSlope_GetPointerStyle);
}
void m_lnHalfSlope_GetPointerStyle(CustomPoint series, GetPointerStyleEventArgs e)
{
switch (e.ValueIndex)
{
case 0:
case 2: e.Style = PointerStyles.Nothing;
break;
case 1: e.Style = series.Pointer.Style;
break;
}
}
int distInPixels = 0;
private void tChart1_MouseDown(object sender, MouseEventArgs e)
{
m_pOrigin = new PointF(Convert.ToSingle(getPositionX(e.X)), Convert.ToSingle(getPositionYl(e.Y)));
originY = m_pOrigin.Y;
indexOfClickedPoint = Line1.Clicked(e.X, e.Y);
indexOfHalfSlopeLine = m_lnHalfSlope.Clicked(e.X, e.Y);
if (indexOfClickedPoint != -1)
{
isMouseDownOnLine = true;
distInPixels = Line1.CalcYPos(indexOfClickedPoint) - Line2.CalcYPos(indexOfClickedPoint);
}
if (indexOfHalfSlopeLine != -1)
{
isMouseDownOnHalfSlopeLine = true;
}
}
double currentY = 0, originY = 0;
private void tChart1_MouseMove(object sender, MouseEventArgs e)
{
m_pCurrent = new PointF(Convert.ToSingle(getPositionX(e.X)), Convert.ToSingle(getPositionYl(e.Y)));
if (isMouseDownOnLine)
{
double deltaY = currentY - originY;
if (indexOfClickedPoint != -1)
{
Line1[indexOfClickedPoint].Y = m_pCurrent.Y;
Line1[1].Y = m_pCurrent.Y;
}
Line2[0].Y = tChart1.Axes.Left.CalcPosPoint(Line1.CalcYPos(indexOfClickedPoint) - distInPixels);
Line2[1].Y = tChart1.Axes.Left.CalcPosPoint(Line1.CalcYPos(indexOfClickedPoint) - distInPixels);
originY = currentY;
}
if (isMouseDownOnHalfSlopeLine)
{
CentralPointPix.X = e.X;
CentralPointPix.Y = e.Y;
for (int i = 0; i < 3; i++)
{
PointD tmpPoint = FindPointOfGivenIndex(i);
m_lnHalfSlope.XValues[i] = tmpPoint.X;
m_lnHalfSlope.YValues[i] = tmpPoint.Y;
}
m_lnHalfSlope.Repaint();
}
}
private void tChart1_MouseUp(object sender, MouseEventArgs e)
{
m_pOrigin = m_pCurrent;
isMouseDownOnLine = false;
isMouseDownOnHalfSlopeLine = false;
}
/// <summary>
/// To convert the absolute X value of cursor into value corresponding to Bottom axis
/// </summary>
/// <returns>Bottom axes values for given pixel value in horizontal direction</returns>
public double getPositionX(float X)
{
return Line1.ScreenPointToValuePoint(Convert.ToInt32(X), 0).X;
}
/// <summary>
/// To convert the absolute Y value of cursor into value corresponding to Left axis
/// </summary>
/// <returns>Left axes values for given pixel value in vertical direction</returns>
double getPositionYl(float Yl)
{
return Line1.ScreenPointToValuePoint(0, Convert.ToInt32(Yl)).Y;
}
private void CreateDataForHalfSlopeLine(double KnownX, double KnownY, ref List<double> XDATA, ref List<double> YDATA)
{
tChart1.Draw();
CentralPointPix.X = tChart1.Axes.Bottom.CalcPosValue(KnownX);
CentralPointPix.Y = tChart1.Axes.Left.CalcPosValue(KnownY);
PointD tmpPoint;
tmpPoint = FindPointOfGivenIndex(0);
XDATA.Add(tmpPoint.X);
YDATA.Add(tmpPoint.Y);
XDATA.Add(KnownX);
YDATA.Add(KnownY);
tmpPoint = FindPointOfGivenIndex(2);
XDATA.Add(tmpPoint.X);
YDATA.Add(tmpPoint.Y);
}
private PointD FindPointOfGivenIndex(int index)
{
double slope = 1;
double alfa = Math.Atan2(1, 1 * slope);
double alfad = (alfa * (180.0 / Math.PI)) % 360;
PointD pointOfGiveIndex = new PointD();
switch (index)
{
case 1:
pointOfGiveIndex.X = tChart1.Axes.Bottom.CalcPosPoint(CentralPointPix.X);
pointOfGiveIndex.Y = tChart1.Axes.Left.CalcPosPoint(CentralPointPix.Y);
break;
case 0:
pointOfGiveIndex.X = tChart1.Axes.Bottom.CalcPosPoint(Math.Max(CentralPointPix.X - (int)(Math.Abs(tChart1.Axes.Left.IEndPos - CentralPointPix.Y) / Math.Tan(alfa)), tChart1.Axes.Bottom.IStartPos));
pointOfGiveIndex.Y = tChart1.Axes.Left.CalcPosPoint(Math.Min(CentralPointPix.Y + (int)(Math.Tan(alfa) * Math.Abs(CentralPointPix.X - tChart1.Axes.Bottom.IStartPos)), tChart1.Axes.Left.IEndPos));
break;
case 2:
pointOfGiveIndex.X = tChart1.Axes.Bottom.CalcPosPoint(Math.Min(CentralPointPix.X + (int)(Math.Abs(tChart1.Axes.Left.IStartPos - CentralPointPix.Y) / Math.Tan(alfa)), tChart1.Axes.Bottom.IEndPos));
pointOfGiveIndex.Y = tChart1.Axes.Left.CalcPosPoint(Math.Max(CentralPointPix.Y - (int)(Math.Tan(alfa) * Math.Abs(CentralPointPix.X - tChart1.Axes.Bottom.IEndPos)), tChart1.Axes.Left.IStartPos));
break;
}
return pointOfGiveIndex;
}
}
}
Best Regards,
Yeray Alonso Development & Support Steema Software Av. Montilivi 33, 17003 Girona, Catalonia (SP) | |
Please read our Bug Fixing Policy |
Re: Line movement
Hi Yeray,
Thank you very much for the code you provided in above post. I have no words to explain how you helped me. Your support has been tremendous.
As an independent project it is working fine. Now we will incorporate it in out project and let you know the status. Hope it’ll work same here.
Thanks and regards
Ashish Pandey
Thank you very much for the code you provided in above post. I have no words to explain how you helped me. Your support has been tremendous.
As an independent project it is working fine. Now we will incorporate it in out project and let you know the status. Hope it’ll work same here.
Thanks and regards
Ashish Pandey