Diskuze: Grafické zobrazení dat přijatých po sériovém portu
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Odpovídá na drbohlav.lukas
Jan Vargovský:19.11.2013 15:26
Editováno 19.11.2013 15:27
Jan Vargovský:19.11.2013 15:26
Optimalizací je více, ukaž nám jakým stylem to vykresluješ.
Odpovídá na Jan Vargovský
drbohlav.lukas:19.11.2013 15:30
drbohlav.lukas:19.11.2013 15:30
Tady je celá třída co to řeší...
using System;
//ROZHRANNÍ A TŘÍDY, KTERÉ DEFINUJÍ GENERICKÉ KOLEKCE.
//GENERICKÉ KOLEKCE: MOŽNOST SPECIFIKOVAT DATOVÝ TYP AŽ VE CHVÍLI VYTVOŘENÍ INSTANCE.
using System.Collections.Generic;
//POSKYTUJE TŘÍDY, KTERÉ SLOUŽÍ K IMPLEMENTACI CHOVÁNÍ KOMPONENT A ŘÍZENÍ.
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization;
using System.Windows.Forms.DataVisualization.Charting;
namespace WindowsFormsApplication1
{
public partial class MyGraph : MyControl
{
/*odkaz na metodu Show_Ulozene_data ze třídy Monitor.cs*/
public event MyStringDelegate Show_Old_Value;
/*Dictionary - kolekce, kde často hledáme prvek podle jedné určité vlastnosti*/
/*Series - řada, která ukládá datové body a atributy*/
public Dictionary<String,Series> series;
/*uložení globálního pole jmen*/
private String[] jmena = Global.Monitor.Jmena;
/*proměnna, která ukládá datu ma čas*/
public DateTime Cursor_date;
private DateTime Date_Time_posledni;
public MyGraph()
{
InitializeComponent();
this.BackColor = Color.Transparent;
/*konstruktor kolekce dictionary*/
series = new Dictionary<String,Series>();
/*pro každý prvek z globálního pole jmen se vytvoří nová řada*/
for (int i = 0; i < jmena.Length; i++) {
series.Add(jmena[i],new Series());
}
/*nastavení pro jednotlivé prvky*/
for (int i = 0; i < jmena.Length; i++)
{
/*zobrazení trendu pomocí linky*/
series[jmena[i]].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
/*zobrazení času na ose X*/
series[jmena[i]].XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Time;
/*přiřezení barev pro jednotlivé spojnice trendu*/
series[jmena[i]].Color = Global.Monitor.Barvy[i];
if (Array.IndexOf(Global.Monitor.Bool_data, i) != -1) {
series[jmena[i]].ChartArea = "bool";
}
}
chart.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss";
chart.ChartAreas["bool"].AxisX.LabelStyle.Format = "HH:mm:ss";
chart.ChartAreas[0].AxisY.ScaleBreakStyle.Enabled = false;
chart.ChartAreas[0].AxisY.Maximum = 105;
chart.ChartAreas[0].AxisY.Minimum = -5;
chart.ChartAreas["bool"].AxisY.ScaleBreakStyle.Enabled = false;
chart.ChartAreas["bool"].AxisY.Maximum = 1.5;
chart.ChartAreas["bool"].AxisY.Interval = 1;
chart.ChartAreas["bool"].AxisY.IntervalOffset = 0.5;
chart.ChartAreas["bool"].AxisY.Minimum = -0.5;
chart.ChartAreas[0].CursorX.Interval = 1;
chart.ChartAreas[0].CursorX.IntervalType = DateTimeIntervalType.Milliseconds;
/*Update 18.4.2013*/
chart.ChartAreas[0].BackColor = Color.White;
chart.ChartAreas["bool"].BackColor = Color.White;
chart.BackColor = Color.Transparent;
chart.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
chart.ChartAreas[0].AxisY.MajorGrid.Enabled = false;
chart.ChartAreas["bool"].AxisX.MajorGrid.Enabled = false;
chart.ChartAreas["bool"].AxisY.MajorGrid.Enabled = false;
/*Updated 24.4.2013*/
chart.ChartAreas[0].AxisY.Enabled = System.Windows.Forms.DataVisualization.Charting.AxisEnabled.False;
/*získání rozbalovacího labelu u kurzoru*/
this.chart.GetToolTipText += new System.EventHandler<System.Windows.Forms.DataVisualization.Charting.ToolTipEventArgs>(this.Chart1_GetToolTipText);
/*Updated 10.4.2013*/
ChangeLanguage(Language.Actual);
}
/*uložení dat do řady*/
public void show_data(DATA data)
{
try
{
for (int i = series[jmena[0]].Points.Count; i < data.Count(); i++)
{
DateTime time = (DateTime)data.data[i]["cas"];
int val = 0;
for (int j = 0; j < jmena.Length; j++)
{
val = (int)data.data[i][jmena[j]];
val = (int)(((val - Global.Monitor.Min[j]) * 100) / (Global.Monitor.Max[j] - Global.Monitor.Min[j]));
series[jmena[j]].Points.AddXY(time, val);
Date_Time_posledni = time;
}
}
}
catch (InvalidCastException e)
{
Global.Log.Error("Graf - chyba v show_data: " + e.Message);
}
if(Check_Act_Poin.Checked)
chart.ChartAreas[0].AxisX.ScaleView.Scroll(ScrollType.Last);
}
public void delete_data() {
for (int j = 0; j < jmena.Length; j++)
{
series[jmena[j]].Points.Clear();
}
}
private void ScrollBar_scale_ValueChanged(object sender, EventArgs e)
{
ChartArea area1=this.chart.ChartAreas[0];
ChartArea area2 = this.chart.ChartAreas[1];
area1.AxisX.ScaleView.Size = ScrollBar_scale.Value;
area2.AxisX.ScaleView.Size = ScrollBar_scale.Value;
label2.Text = ScrollBar_scale.Value.ToString();
}
private void chart_CursorPositionChanged(object sender, CursorEventArgs e)
{
if (((System.Windows.Forms.DataVisualization.Charting.Axis)e.Axis).Name == "Y (Value) axis")
{
Point point = PointToClient(MousePosition);
label_positionY.Location = new Point(label_positionY.Location.X, point.Y - 5);
double cislo=e.NewPosition;
if (Double.IsNaN(cislo))
{
label_positionY.Visible = false;
return;
}
label_positionY.Text = cislo.ToString();
label_positionY.Visible = true;
this.Check_Act_Poin.Checked = false;
}
if(((System.Windows.Forms.DataVisualization.Charting.Axis)e.Axis).Name == "X axis"){
try {
Cursor_date = DateTime.FromOADate(e.NewPosition);
int dny = 0;
TimeSpan span = Date_Time_posledni - Cursor_date;
dny = span.Days;
TimeSpan ts = new TimeSpan(dny,0,0,0,0);
Cursor_date += ts;
if (Show_Old_Value != null && Check_Act_Poin.Checked==false)
Show_Old_Value("");
}
catch {
};
Point point = PointToClient(MousePosition);
label_positionX.Location = new Point(point.X, label_positionX.Location.Y);
label_positionX.Text = Cursor_date.ToString("HH:m:ss");
label_positionX.Visible = true;
this.Check_Act_Poin.Checked = false;
}
}
private void Chart1_GetToolTipText(object sender, System.Windows.Forms.DataVisualization.Charting.ToolTipEventArgs e)
{
if (e.HitTestResult.ChartElementType == ChartElementType.DataPoint)
{
int i = e.HitTestResult.PointIndex;
DataPoint dp = e.HitTestResult.Series.Points[i];
e.Text = string.Format("{0:HH:mm:ss}, {1:F1}", DateTime.FromOADate(dp.XValue), dp.YValues[0]);
int xx = chart.Cursor.HotSpot.X;
}
}
private void chart_AxisScrollBarClicked(object sender, ScrollBarEventArgs e)
{
label_positionY.Visible = false;
}
private void chart_AxisViewChanged(object sender, ViewEventArgs e)
{
if (e.Axis.Name != "X axis")
return;
if (e.ChartArea.Name == "bool")
{
chart.ChartAreas["line"].AxisX.ScaleView.Zoom(e.ChartArea.AxisX.ScaleView.ViewMinimum, e.ChartArea.AxisX.ScaleView.ViewMaximum);
}
else
{
if(is_visible_sirie("bool"))
chart.ChartAreas["bool"].AxisX.ScaleView.Zoom(e.ChartArea.AxisX.ScaleView.ViewMinimum, e.ChartArea.AxisX.ScaleView.ViewMaximum);
}
}
private bool is_visible_sirie(string name_area) {
for (int i = 0; i < chart.Series.Count; i++)
{
if (chart.Series[i].ChartArea == name_area)
return true;
}
return false;
}
public void ChangeViewColor(Color backColor)
{
chart.ChartAreas[0].BackColor = backColor;
chart.ChartAreas["bool"].BackColor = backColor;
}
/*Updated 29.3.2013*/
public void ChangeLanguage(string lang)
{
if (lang == "CZ")
{
label1.Text = "Měřít.";
label3.Text = "Akt.Bod";
}
else
{
label1.Text = "Scale";
label3.Text = "Act.Pt";
}
}
}
}
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.
Zobrazeno 3 zpráv z 3.