Cursortool tied to multiple series
Cursortool tied to multiple series
Hi,
Hopefully this is the correct place to post this now...
When we last "spoke" I received the following sample to try to tie a cursortool to multiple series:
private void cursorTool1_Change(object sender,
Steema.TeeChart.Tools.CursorChangeEventArgs e)
{
int xValIndex = line1.XValues.IndexOf(Math.Round(e.XValue, 0));
if(xValIndex >= 0)
label1.Text = line1.YValues[xValIndex].ToString();
}
This is nice and very much along the lines of what I was expecting however since the x axis is time, it can't be rounded. I changed it to the following:
Dim i As Integer
Dim x As Integer
grdLgnd.Rows(0).Caption = Date.FromOADate(e.XValue).ToString("HH:mm:ss")
For i = 1 To chrt1.Series.Count
With chrt1.Series(i - 1)
x = .XValues.IndexOf(e.XValue)
If x >= 0 Then
grdLgnd.Rows(i).Caption = .YValues(x).ToString,"#.00")
End If
End With
Next
grdLgnd is a grid I'm using to display the values where the cursor is located.
x is always -1 as a result of the XValues.IndexOf function which doesn't make any sense to me.
e.XValue = 37954.9583244213
or 11/29/2003 22:59:59...
The range of the chart is 11/29/2003 22:00:00 thru 11/29/2003 23:59:59.
Snap is turned on for the cursortool but since it is not tied to a series specifically, it probably has no effect.
I appreciate the help.
Mike
Hopefully this is the correct place to post this now...
When we last "spoke" I received the following sample to try to tie a cursortool to multiple series:
private void cursorTool1_Change(object sender,
Steema.TeeChart.Tools.CursorChangeEventArgs e)
{
int xValIndex = line1.XValues.IndexOf(Math.Round(e.XValue, 0));
if(xValIndex >= 0)
label1.Text = line1.YValues[xValIndex].ToString();
}
This is nice and very much along the lines of what I was expecting however since the x axis is time, it can't be rounded. I changed it to the following:
Dim i As Integer
Dim x As Integer
grdLgnd.Rows(0).Caption = Date.FromOADate(e.XValue).ToString("HH:mm:ss")
For i = 1 To chrt1.Series.Count
With chrt1.Series(i - 1)
x = .XValues.IndexOf(e.XValue)
If x >= 0 Then
grdLgnd.Rows(i).Caption = .YValues(x).ToString,"#.00")
End If
End With
Next
grdLgnd is a grid I'm using to display the values where the cursor is located.
x is always -1 as a result of the XValues.IndexOf function which doesn't make any sense to me.
e.XValue = 37954.9583244213
or 11/29/2003 22:59:59...
The range of the chart is 11/29/2003 22:00:00 thru 11/29/2003 23:59:59.
Snap is turned on for the cursortool but since it is not tied to a series specifically, it probably has no effect.
I appreciate the help.
Mike
Is this support?
This issue has been going on longer than a month. If this is still under discussion or having to go back to R&D I'd like to know. If no one is looking at this issue still, please advise.
-
- Site Admin
- Posts: 1349
- Joined: Thu Jan 01, 1970 12:00 am
- Location: Riudellots de la Selva, Catalonia
- Contact:
Hi -
Could you please modify the above to demonstrate the problem you are experiencing?
Many thanks!
Many apologies for the delay. The following seems to work OK here:This issue has been going on longer than a month. If this is still under discussion or having to go back to R&D I'd like to know. If no one is looking at this issue still, please advise.
Code: Select all
private void Form1_Load(object sender, System.EventArgs e) {
tChart1.Aspect.View3D = false;
line1.FillSampleValues(8000);
line1.XValues.DateTime = true;
line2.FillSampleValues(8000);
line2.XValues.DateTime = true;
line3.FillSampleValues(8000);
line3.XValues.DateTime = true;
line4.FillSampleValues(8000);
line4.XValues.DateTime = true;
line5.FillSampleValues(8000);
line5.XValues.DateTime = true;
line6.FillSampleValues(8000);
line6.XValues.DateTime = true;
cursorTool1.FollowMouse = true;
cursorTool1.Style = Steema.TeeChart.Tools.CursorToolStyles.Vertical;
cursorTool1.Pen.Color = Color.Cyan;
cursorTool1.Pen.Width = 2;
}
private void cursorTool1_Change(object sender, Steema.TeeChart.Tools.CursorChangeEventArgs e) {
DateTime tmp;
int xValIndex = line1.XValues.IndexOf(Math.Round(e.XValue, 0));
if(xValIndex >= 0) {
tmp = DateTime.FromOADate(line1.YValues[xValIndex]);
label1.Text = tmp.ToLongDateString();
}
}
Many thanks!
Thank you!
Christopher Ireland (Steema crew)
Please be aware of the newsgroup archives:
http://www.teechart.net/support/search.php
http://groups.google.com
http://codenewsfast.com/
Christopher Ireland (Steema crew)
Please be aware of the newsgroup archives:
http://www.teechart.net/support/search.php
http://groups.google.com
http://codenewsfast.com/
Hi,
Thanks for the reply. I created a new C# project, cut and pasted the code sample provided and nothing happens to label1. I set a break in cursorTool1_Change in the if statement. It is never executed. I am not a C# programmer so I could have omitted something in the creation of the project. Form1_Load is executing as I am getting 6 series placed on the chart. I did not rename anything from the default.
Please advise.
Thanks
Mike
Thanks for the reply. I created a new C# project, cut and pasted the code sample provided and nothing happens to label1. I set a break in cursorTool1_Change in the if statement. It is never executed. I am not a C# programmer so I could have omitted something in the creation of the project. Form1_Load is executing as I am getting 6 series placed on the chart. I did not rename anything from the default.
Please advise.
Thanks
Mike
-
- Site Admin
- Posts: 1349
- Joined: Thu Jan 01, 1970 12:00 am
- Location: Riudellots de la Selva, Catalonia
- Contact:
Hi Michael,
Alternatively you should easily be able to recreate the example using a blank VB.NET project, given that all the TeeChart objects, properties, methods and events are identical.
OK. Well, to associate the cursorTool1_Change() method with the cursorTool1 Change event simply click on the cursorTool1 at designtime, click on the thunder bolt in the properties window and enter cursorTool1_Change in the Change event.Thanks for the reply. I created a new C# project, cut and pasted the code sample provided and nothing happens to label1. I set a break in cursorTool1_Change in the if statement. It is never executed. I am not a C# programmer so I could have omitted something in the creation of the project. Form1_Load is executing as I am getting 6 series placed on the chart. I did not rename anything from the default.
Alternatively you should easily be able to recreate the example using a blank VB.NET project, given that all the TeeChart objects, properties, methods and events are identical.
Thank you!
Christopher Ireland (Steema crew)
Please be aware of the newsgroup archives:
http://www.teechart.net/support/search.php
http://groups.google.com
http://codenewsfast.com/
Christopher Ireland (Steema crew)
Please be aware of the newsgroup archives:
http://www.teechart.net/support/search.php
http://groups.google.com
http://codenewsfast.com/
Excellent, that was it and it now works but it is not what I'm looking for. What I am trying to get is the assoc. Y values for each series from the position of the cursortool without the cursortool being tied to a series. Every x value should a corresponding (or nearest) value in every series. I can get, as you've shown, the value for X. Now I need to take that X value back to each series and determine, in a very efficient manner to avoid cursortool movement lag, what is each series Y value for that X.
Thanks
Thanks
In an effort further things along I converted the sample to VB, I'm much more at ease there.... Here's my sample code that does not work.
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
TChart1.Aspect.View3D = False
Line1.FillSampleValues(8000)
Line1.XValues.DateTime = True
Line2.FillSampleValues(8000)
Line2.XValues.DateTime = True
Line3.FillSampleValues(8000)
Line3.XValues.DateTime = True
Line4.FillSampleValues(8000)
Line4.XValues.DateTime = True
Line5.FillSampleValues(8000)
Line5.XValues.DateTime = True
Line6.FillSampleValues(8000)
Line6.XValues.DateTime = True
CursorTool1.FollowMouse = True
CursorTool1.Style = Steema.TeeChart.Tools.CursorToolStyles.Vertical
CursorTool1.Pen.Color = Color.Cyan
CursorTool1.Pen.Width = 2
End Sub
Private Sub CursorTool1_Change(ByVal sender As Object, ByVal e As Steema.TeeChart.Tools.CursorChangeEventArgs) Handles CursorTool1.Change
Dim i As Integer
Dim x As Integer
Label1.Text = Date.FromOADate(e.XValue).ToString("M/dd/yyyy HH:mm:ss")
x = Line1.XValues.IndexOf(e.XValue)
If x >= 0 Then
Label2.Text = Line1.YValues(x).ToString("#.00")
Else
Label2.Text = ""
End If
End Sub
x in this case is always -1. e.XValue is a valid date as Label1.Text is correct.
I look forward to getting this fixed.
Thanks
Michael
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
TChart1.Aspect.View3D = False
Line1.FillSampleValues(8000)
Line1.XValues.DateTime = True
Line2.FillSampleValues(8000)
Line2.XValues.DateTime = True
Line3.FillSampleValues(8000)
Line3.XValues.DateTime = True
Line4.FillSampleValues(8000)
Line4.XValues.DateTime = True
Line5.FillSampleValues(8000)
Line5.XValues.DateTime = True
Line6.FillSampleValues(8000)
Line6.XValues.DateTime = True
CursorTool1.FollowMouse = True
CursorTool1.Style = Steema.TeeChart.Tools.CursorToolStyles.Vertical
CursorTool1.Pen.Color = Color.Cyan
CursorTool1.Pen.Width = 2
End Sub
Private Sub CursorTool1_Change(ByVal sender As Object, ByVal e As Steema.TeeChart.Tools.CursorChangeEventArgs) Handles CursorTool1.Change
Dim i As Integer
Dim x As Integer
Label1.Text = Date.FromOADate(e.XValue).ToString("M/dd/yyyy HH:mm:ss")
x = Line1.XValues.IndexOf(e.XValue)
If x >= 0 Then
Label2.Text = Line1.YValues(x).ToString("#.00")
Else
Label2.Text = ""
End If
End Sub
x in this case is always -1. e.XValue is a valid date as Label1.Text is correct.
I look forward to getting this fixed.
Thanks
Michael
-
- Site Admin
- Posts: 1349
- Joined: Thu Jan 01, 1970 12:00 am
- Location: Riudellots de la Selva, Catalonia
- Contact:
Hi Mike,
OK ... how about changing the CursorTool1_Change() event to something like this:In an effort further things along I converted the sample to VB, I'm much more at ease there.... Here's my sample code that does not work.
Code: Select all
Private Sub CursorTool1_Change(ByVal sender As Object, ByVal e As Steema.TeeChart.Tools.CursorChangeEventArgs) Handles CursorTool1.Change
Dim i As Integer
Dim x As Integer
Label1.Text = Date.FromOADate(e.XValue).ToString("M/dd/yyyy HH:mm:ss")
'x = Line1.XValues.IndexOf(e.XValue)
'If x >= 0 Then
' Label2.Text = Line1.YValues(x).ToString("#.00")
'Else
' Label2.Text = ""
'End If
Dim tmp As Double
Dim xValIndex As Integer = Line1.XValues.IndexOf(Math.Round(e.XValue, 0))
If (xValIndex >= 0) Then
tmp = Line1.YValues(xValIndex)
Label2.Text = tmp.ToString("#.00")
End If
End Sub
Thank you!
Christopher Ireland (Steema crew)
Please be aware of the newsgroup archives:
http://www.teechart.net/support/search.php
http://groups.google.com
http://codenewsfast.com/
Christopher Ireland (Steema crew)
Please be aware of the newsgroup archives:
http://www.teechart.net/support/search.php
http://groups.google.com
http://codenewsfast.com/
Chris,
That works but gets me back to where I was before....
In C, date values can be one very long integer. In VB they are doubles where the integer portion indicates the date, the decimal portion indicates the time of day... like....
?date.FromOADate(e.XValue)
#12/30/2003 11:26:03 PM#
?e.XValue
37985.976434937234
So rounding this value will not work where precision is needed down to the second.
Please advise.
Mike
That works but gets me back to where I was before....
In C, date values can be one very long integer. In VB they are doubles where the integer portion indicates the date, the decimal portion indicates the time of day... like....
?date.FromOADate(e.XValue)
#12/30/2003 11:26:03 PM#
?e.XValue
37985.976434937234
So rounding this value will not work where precision is needed down to the second.
Please advise.
Mike
-
- Site Admin
- Posts: 1349
- Joined: Thu Jan 01, 1970 12:00 am
- Location: Riudellots de la Selva, Catalonia
- Contact:
Hi Mike,
Well, the examples we've been using should arrive at that level of precision anyhow, given that FillSampleValues creates data whose XValues increment by one day at a time. However, adding data whose XValues increment by one second does bring this problem to the fore. There seems to be some precision problem with doubles with 9 or 10 decimal places when using ValueList.IndexOf() ... I have added this to the list of defects for the TeeChart for .NET meaning that a fix to it will be considered for inclusion into the next maintenance release. In the meantime I'm afraid I can't suggest a viable workaround which will work with 6 series of 8000 data points each.So rounding this value will not work where precision is needed down to the second.
Thank you!
Christopher Ireland (Steema crew)
Please be aware of the newsgroup archives:
http://www.teechart.net/support/search.php
http://groups.google.com
http://codenewsfast.com/
Christopher Ireland (Steema crew)
Please be aware of the newsgroup archives:
http://www.teechart.net/support/search.php
http://groups.google.com
http://codenewsfast.com/
Chris,
Yes, my sample data has a 4-second periodicity. I may be displaying as many as 12 series over an 8 hour period in 16 separate forms (charts) in one instance of the program. I am doing multiple dynamic chart creation for any time-based data source.
I have enjoyed working with Steema support over the past few years. You all have been able to tackle every problem I've come across and provide an efficient solution. I am looking forward to getting this issue resolved.
I am sorry that this can not be made to work in the current revision level in VB.Net. How can I be informed that this is fixed in a future release? Will you post a response here?
I do miss the direct email for this kind of problem. The forum is great for problem solving where we comsumers have access to every one else's problems and your suggestions,,, 90% of my issues are usually resolved this way. But where a bug is concerned, a direct email when a fix is available would be a very nice improvement. My customers are waiting for this fix also so I need to expedite when a fix is available.
Thanks
Michael
Yes, my sample data has a 4-second periodicity. I may be displaying as many as 12 series over an 8 hour period in 16 separate forms (charts) in one instance of the program. I am doing multiple dynamic chart creation for any time-based data source.
I have enjoyed working with Steema support over the past few years. You all have been able to tackle every problem I've come across and provide an efficient solution. I am looking forward to getting this issue resolved.
I am sorry that this can not be made to work in the current revision level in VB.Net. How can I be informed that this is fixed in a future release? Will you post a response here?
I do miss the direct email for this kind of problem. The forum is great for problem solving where we comsumers have access to every one else's problems and your suggestions,,, 90% of my issues are usually resolved this way. But where a bug is concerned, a direct email when a fix is available would be a very nice improvement. My customers are waiting for this fix also so I need to expedite when a fix is available.
Thanks
Michael
Hi Michael,
>I be informed that this is fixed in a future release? Will you post a >response here?
No, normally we include a "Release Notes" file in the new releases where you can see which bugfixes/changes has been made.
This file is also available on our web site at :
http://www.steema.com/support/versions.html
>concerned, a direct email when a fix is available would be a very nice >improvement.
There is no current mailing list for version info, but we'll consider for the next releases.
>I be informed that this is fixed in a future release? Will you post a >response here?
No, normally we include a "Release Notes" file in the new releases where you can see which bugfixes/changes has been made.
This file is also available on our web site at :
http://www.steema.com/support/versions.html
>concerned, a direct email when a fix is available would be a very nice >improvement.
There is no current mailing list for version info, but we'll consider for the next releases.
Pep Jorge
http://support.steema.com
http://support.steema.com
Hello Michael,
The posts in this thread have gone some way to getting a Y value from an X Value in a Cursor move event using IndexOf. That works easily on a simple example where integer values can be expected, for exampe on a 0,1,2,3.. indexed X data range.
The technique would prove weak for more 'intricate' numbersets (this uses standard Windows Array.IndexOf) and numbersets where X data could potentially be repeated (giving more than one Y value at an X point).
Assuming only one Y value at any given X value we can offer an alternative approach avoiding indexOf.
eg. Using a bit of rightangle triangle trig
There may still be some holes in that code and some ways to make it more efficient but with a check on datetime data here it seems to work ok.
Best regards,
Marc Meumann
Steema Support
The posts in this thread have gone some way to getting a Y value from an X Value in a Cursor move event using IndexOf. That works easily on a simple example where integer values can be expected, for exampe on a 0,1,2,3.. indexed X data range.
The technique would prove weak for more 'intricate' numbersets (this uses standard Windows Array.IndexOf) and numbersets where X data could potentially be repeated (giving more than one Y value at an X point).
Assuming only one Y value at any given X value we can offer an alternative approach avoiding indexOf.
eg. Using a bit of rightangle triangle trig
Code: Select all
Private Sub CursorTool1_Change(ByVal sender As Object, ByVal e As Steema.TeeChart.Tools.CursorChangeEventArgs) Handles CursorTool1.Change
Dim xRange, xSegment, yRange, ySegment, tanTheta As Double
Dim i, startIdx, endIdx As Integer
Dim negative As Boolean
negative = False
startIdx = 0
endIdx = Line1.Count - 1
'******************
'version release at end of month (Jan 04) will include
'the following properties to allow quicker scan though
'adjustment will need to be made if data zoomed so that
'no points are visible on Chart
'******************
'startIdx = Line1.FirstVisibleIndex
'endIdx = Line1.LastVisibleIndex
For i = startIdx To endIdx
If e.XValue > Line1.XValues.Value(i) Then
If e.XValue < Line1.XValues.Value(i + 1) Then
xRange = Line1.XValues.Value(i + 1) - Line1.XValues.Value(i)
yRange = Line1.YValues.Value(i + 1) - Line1.YValues.Value(i)
If yRange < 0 Then negative = True
yRange = Math.Abs(yRange)
xSegment = e.XValue - Line1.XValues.Value(i)
Exit For
End If
End If
Next i
tanTheta = xRange / yRange
ySegment = xSegment / tanTheta
Label1.Text = e.XValue.ToString()
If negative = True Then
Label2.Text = Line1.YValues.Value(i) - ySegment
Else
Label2.Text = Line1.YValues.Value(i) + ySegment
End If
End Sub
Best regards,
Marc Meumann
Steema Support
Hi Michael,
>This week?
Yes, most likely at the end of this week.
>This week?
Yes, most likely at the end of this week.
Pep Jorge
http://support.steema.com
http://support.steema.com