public void AutoScaleHorizontal() { PointD min = PointD.Empty; PointD max = PointD.Empty; foreach (Trace t in DataSource.Traces) { min.KeepMinimum(t.Minimum); max.KeepMaximum(t.Maximum); } double distance = max.X - min.X; if (distance == 0) { Settings.HorScale = 1; Settings.HorOffset = -min.X; return; } double div = distance / ((double)Settings.HorizontalDivisions); double multiplier = 1f; while (div > 10) { multiplier *= 10; div /= 10; } while (div < 0.5) { multiplier /= 10; div *= 10; } if (div <= 1) { Settings.HorScale = (double)(1 * multiplier); } else if (div <= 2) { Settings.HorScale = (double)(2 * multiplier); } else if (div <= 5) { Settings.HorScale = (double)(5 * multiplier); } else { Settings.HorScale = (double)(10 * multiplier); } Settings.HorOffset = -(double)(min.X); }
public void AutoScaleHorizontalTime() { PointD min = PointD.Empty; PointD max = PointD.Empty; foreach (Trace t in DataSource.Traces) { min.KeepMinimum(t.Minimum); max.KeepMaximum(t.Maximum); } DateTime start = new DateTime((long)min.X); DateTime end = new DateTime((long)max.X); TimeSpan span = end - start; if (span.TotalDays >= Settings.HorizontalDivisions) { Settings.HorScale = Math.Ceiling(span.TotalDays / Settings.HorizontalDivisions) * TimeSpan.TicksPerDay; start.AddMilliseconds(-start.Millisecond); start.AddSeconds(-start.Second); start.AddMinutes(-start.Minute); start.AddHours(-start.Hour); } else if (span.TotalHours >= Settings.HorizontalDivisions) { Settings.HorScale = Math.Ceiling(span.TotalHours / Settings.HorizontalDivisions) * TimeSpan.TicksPerHour; start.AddMilliseconds(-start.Millisecond); start.AddSeconds(-start.Second); start.AddMinutes(-start.Minute); } else if (span.TotalMinutes >= Settings.HorizontalDivisions) { Settings.HorScale = Math.Ceiling(span.TotalMinutes / Settings.HorizontalDivisions) * TimeSpan.TicksPerMinute; start.AddMilliseconds(-start.Millisecond); start.AddSeconds(-start.Second); } else if (span.TotalSeconds >= Settings.HorizontalDivisions) { Settings.HorScale = Math.Ceiling(span.TotalSeconds / Settings.HorizontalDivisions) * TimeSpan.TicksPerSecond; start.AddMilliseconds(-start.Millisecond); start.AddSeconds(-start.Second); } else { Settings.HorScale = Math.Ceiling(span.TotalMilliseconds / Settings.HorizontalDivisions) * TimeSpan.TicksPerMillisecond; start.AddMilliseconds(-start.Millisecond); } Settings.HorOffset = -start.Ticks; }
public void AutoScaleHorizontalTime(TimeSpan scale) { PointD min = PointD.Empty; PointD max = PointD.Empty; foreach (Trace t in DataSource.Traces) { min.KeepMinimum(t.Minimum); max.KeepMaximum(t.Maximum); } Settings.HorScale = scale.Ticks; Settings.HorOffset = -min.X; }
public void FitHorizontalInXDivs(int divs) { PointD min = PointD.Empty; PointD max = PointD.Empty; foreach (Trace t in DataSource.Traces) { min.KeepMinimum(t.Minimum); max.KeepMaximum(t.Maximum); } double distance = max.X - min.X; if (distance == 0) { Settings.HorScale = 1; Settings.HorOffset = -min.X; return; } Settings.HorScale = (double)distance / (double)divs; Settings.HorOffset = -(double)(min.X); }
private void DrawData(Graphics g) { if (DataSource == null) { g.DrawString("No datasource bound", DefaultFont, Brushes.White, new Point(this.Width / 2 - 50, this.Height / 2)); } else { int errNo = 0; Brush errBrush = new SolidBrush(Color.Red); double pxPerUnits_hor = viewPort.Width / (Settings.HorizontalDivisions * Settings.HorScale); var sortedTraces = from trace in DataSource.Traces orderby trace.Layer descending select trace; PointD min = PointD.Empty; PointD max = PointD.Empty; foreach (Trace t in sortedTraces.Where(t => t.Visible)) { min.KeepMinimum(t.Minimum); max.KeepMaximum(t.Maximum); } double xLeft = Settings.HorOffset; double xRight = ((viewPort.Width) / pxPerUnits_hor) - Settings.HorOffset; //Loop through traces foreach (Trace trace in sortedTraces) { double pxPerUnits_ver = viewPort.Height / (Settings.VerticalDivisions * trace.Scale); Func <PointD, Point> convert = (p) => new Point( (int)((p.X + Settings.HorOffset) * pxPerUnits_hor) + viewPort.X, (int)(zeroPos - (p.Y + trace.Offset) * pxPerUnits_ver)); try { trace.Draw(g, viewPort, convert, min.X, max.X, xLeft, xRight, Settings.Font); } catch (Exception ex) { g.DrawString(ex.Message, Settings.Font, errBrush, new Point(0, (errNo++) * Settings.Font.Height)); } } try { foreach (Marker marker in dataSource.Markers) { if (marker is LinkedMarker lm) { double pxPerUnits_ver = viewPort.Height / (Settings.VerticalDivisions * lm.Trace.Scale); Func <PointD, Point> convert = (p) => new Point( (int)((p.X + Settings.HorOffset) * pxPerUnits_hor) + viewPort.X, (int)(zeroPos - (p.Y + lm.Trace.Offset) * pxPerUnits_ver)); marker.Draw(g, viewPort, convert, Settings.Font); } else if (marker is FreeMarker fm) { double pxPerUnits_ver = viewPort.Height / (Settings.VerticalDivisions * 1); Func <PointD, Point> convert = (p) => new Point( (int)((p.X + Settings.HorOffset) * pxPerUnits_hor) + viewPort.X, (int)(zeroPos - (p.Y + 0) * pxPerUnits_ver)); marker.Draw(g, viewPort, convert, Settings.Font); } } } catch (Exception ex) { g.DrawString(ex.Message, Settings.Font, errBrush, new Point(0, (errNo++) * Settings.Font.Height)); } try { foreach (IScopeDrawable drawable in dataSource.Drawables) { Func <PointD, Point> convert = (p) => new Point((int)((p.X + Settings.HorOffset) * pxPerUnits_hor), (int)(viewPort.Height / 2 - p.Y)); drawable.Draw(g, convert); } } catch (Exception ex) { g.DrawString(ex.Message, Settings.Font, errBrush, new Point(0, (errNo++) * Settings.Font.Height)); } } }