AlexeyRedko Posted May 26, 2011 Report Posted May 26, 2011 Hello! I try to create annotation programmaticly (in my case this is rectange) that adjusted to scale of specific axis. For example: I have axis Y that its range is 34-36 and axis X that it range 0-60 minutes (in ticks) .I need to create rectangle with the next coordinates {(5,34.5),(5,35.5),(30,35.5),(30,34.5) }. When I use annotations I can to attach the annotation to specific point but when I create a rectangle I need to convert the values to pixels and I don't know how to do it (when I use Axis ValueToPixel function I get wrong coordinates and my rectangle gets wrong location and size) Quote
AlexeyRedko Posted June 2, 2011 Author Report Posted June 2, 2011 I solved the problem with rectangle using Annotation.SetAttachHeight and SetAttachWidth functions but I still have a problem if I want to draw polygon (triangle for example).The polygon is not resized according the scales when I resize the chart Quote
AndreG Posted June 3, 2011 Report Posted June 3, 2011 SetAttachedHeight is not working for polygon? Can you post your code? Also, ValueToPixel can only be called after the chart has been drawn, so that is probably why it is not working for you. Quote
AlexeyRedko Posted June 5, 2011 Author Report Posted June 5, 2011 Thanks to your response! I reviewed my code and I think I understood the problem.When I draw the polygon there is no need to use the ValueToPixel method .It is enough to create the polygon and to use AttachHeight and AttachWidth methods .It works fine but only for non logarithmic axes.In case I use logarithmic one I have a problem.In my code I want to set annotation for example triangle with coordinates (2,10) (4,10) (4,100) (see the code below).I create the triangle and use AtthachHeight(pol,2) AttachWidth(pol ,90). Triangle is streched as I wanted.Everything is allright. Now I set the chart.AxisX.LogBase = 10.0 and I get trianle with width more than 90. There are two scenarios: 1.I don't use the AtthachHeight and AttachWidth properly - so If it is the case please explain me how to do it . 2.This is the bug. Actually after some research I discoverd if I set AttachWidth (pol,100/10) instead of AttachWidth (pol,100-10) I get the desirable result.Frankly speaking from point of view of simple user it is a little buggy becouse I don't think I have to ajust my own data according to LogBase of Axis this is the code : Xaml < Window x:Class="CustomSteps.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525" xmlns:cfx="http://schemas.softwarefx.com/chartfx/wpf/80"> <Grid> <cfx:Chart Name="chart" /></Grid> </ Window> Code behind: namespace CustomSteps { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { private Annotations _annotations;public MainWindow() { InitializeComponent(); ReloadData(); } public struct MyPoint { public double X { get;set; } public double Y { get;set; } public DateTime Time { get;set; } } private void ReloadData() { MyPoint[] data1 = new MyPoint[21]; FillData(data1, 1); SeriesAttributes sa1 = new SeriesAttributes(); sa1.ItemsSource = data1; chart.Series.Add(sa1); Pane pane = new Pane();Axis ax1 = new Axis(); ax1.Min = 0; ax1.Max = 10; this.chart.Panes.Add(pane); pane.Series.Add(sa1); sa1.AxisY = ax1; sa1.AxisX = chart.AxisX;sa1.BindingPathX = "X";sa1.BindingPath = "Y"; pane.AxesY.Add(ax1); sa1.Gallery = Gallery.Curve;chart.AxisX.DataPath = "X";chart.AxisX = new Axis(); chart.AxisX.LogBase = 10;chart.AxisX.GetLabel += new AxisLabelEventHandler(AxisX_GetLabel); chart.PanesPanel = new StackPanePanel(); AddAnnotations(sa1); } private void AddAnnotations(SeriesAttributes Ser) { Polygon pol = new Polygon(); pol.Stretch = Stretch.Fill; pol.Fill = Brushes.Red;pol.Stroke = Brushes.Red; pol.StrokeThickness = 2; pol.Opacity = 0.5; Point p1 = new Point(0, 0); Point p2 = new Point(0, 1);Point p3 = new Point(1, 1); pol.Points = new PointCollection() { p1, p2, p3}; if (_annotations == null) {_annotations = new Annotations();this.chart.Extensions.Add(_annotations); } _annotations.Children.Add(pol); Annotations.SetAxisY(pol, Ser.AxisY); Annotations.SetAxisX(pol, this.chart.AxisX);Annotations.SetAttachX(pol, 10); Annotations.SetAttachY(pol, 4);Annotations.SetAttachHeight(pol, 2); //without log 10 - looks like right //with log 10 looks wrongAnnotations.SetAttachWidth(pol, 100);Annotations.SetSeries(pol, Ser); } void AxisX_GetLabel(object sender, AxisLabelEventArgs e) { Trace.TraceInformation("{0}",e.Text); } private void FillData(MyPoint[] data1, double factor) { for (int i = 0; i < data1.Length; i++) { data1.Y = i; data1.X = i*10; } } } } Quote
AndreG Posted June 6, 2011 Report Posted June 6, 2011 It's working for me. Is this not the result you were expecting? Attaching to 100 does not mean 100px, but 100 units on the axis. Quote
AlexeyRedko Posted June 9, 2011 Author Report Posted June 9, 2011 Hello AndreG! (Sorry .I don't know your name) May be I didn't explain myself clearly,but this is the point.I set SetAttachWidht to 100 units of axis x and I expect that my triangle will be bounded between 10 to 110 units on axis x.But instead of this I get triangle that bounded between 10 and 1000 units and I suppose that this is uncorrect.I hope you understand me. Quote
AndreG Posted June 9, 2011 Report Posted June 9, 2011 Hello Alexey, My name is Andre SetAttachWidht sets the width using the X axis. Since the axis is in log, it uses log. 1 would be at the base of the triangle (regardless of the fact it is positioned at 10). If you want your triangle to be from 10 to 110, use the code below. Annotations.SetAttachWidth(pol, 10); Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.