Page 1 of 1
Cursortool tied to multiple series
Posted: Thu Dec 04, 2003 4:02 pm
by 8120717
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
Is this support?
Posted: Fri Dec 19, 2003 9:05 pm
by 8120717
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.
Posted: Mon Dec 29, 2003 7:04 am
by Chris
Hi -
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.
Many apologies for the delay. The following seems to work OK here:
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();
}
}
Could you please modify the above to demonstrate the problem you are experiencing?
Many thanks!
Posted: Mon Dec 29, 2003 3:06 pm
by 8120717
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
Posted: Mon Dec 29, 2003 3:46 pm
by Chris
Hi Michael,
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.
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.
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.
Posted: Wed Dec 31, 2003 2:43 pm
by 8120717
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
Posted: Wed Dec 31, 2003 3:58 pm
by 8120717
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
Posted: Fri Jan 02, 2004 3:04 pm
by Chris
Hi Mike,
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.
OK ... how about changing the CursorTool1_Change() event to something like this:
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
Posted: Fri Jan 09, 2004 3:49 pm
by 8120717
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
Posted: Tue Jan 13, 2004 3:34 pm
by Chris
Hi Mike,
So rounding this value will not work where precision is needed down to the second.
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.
Posted: Thu Jan 15, 2004 5:53 pm
by 8120717
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
Posted: Fri Jan 16, 2004 1:51 pm
by Pep
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.
Posted: Mon Jan 19, 2004 5:23 pm
by Marc
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
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
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
Posted: Wed Feb 04, 2004 9:43 pm
by 8120717
Marc,
THANK YOU!!!!!!!
I'll be awaiting the new release as this is a little sluggish for the larger charts. This week?
Thanks again!!!!
Michael
Posted: Thu Feb 05, 2004 6:43 pm
by Pep
Hi Michael,
>This week?
Yes, most likely at the end of this week.