public override void LoadDocument(string filePath) { try { using (StreamReader sr = new StreamReader(filePath)) { signals.Clear(); string line; while ((line = sr.ReadLine()) != null) { line = line.Trim(); string[] columns = line.Split('\t'); double val = Double.Parse(columns[0]); DateTime utcDt = DateTime.Parse(columns[1]); DateTime localDt = utcDt.ToLocalTime(); SignalValue sv = new SignalValue(val, localDt); signals.Add(sv); } } } catch (Exception e) { Console.WriteLine("The file could not be read:"); Console.WriteLine(e.Message); } UpdateAllViews(); TraceValues(); }
protected override void OnPaint(PaintEventArgs e) //felülírjuk a függvényt a rajzoláshoz { base.OnPaint(e); //meg kell hívni az őst Pen pen = new Pen(Color.Red, 1); pen.DashStyle = DashStyle.Dash; pen.EndCap = LineCap.ArrowAnchor; e.Graphics.DrawLine(pen, 0, ClientSize.Height, 0, 0); e.Graphics.DrawLine(pen, 0, ClientSize.Height / 2, ClientSize.Width, ClientSize.Height / 2); //az előző pár sorban rajzoltuk fel szaggatott pirossal a tengelyeket bool firstvalue = true; SignalValue prevsignal = null; float x1 = 0, y1 = 0, x2 = 0, y2; //végigmegyünk az adatainkon és a mostani és előző jel alapján fogjuk kirajzolni a vonalat, és a pontokat foreach (SignalValue currentsignal in document.Signals) { y2 = (float)-(currentsignal.Value * pixelPerValue * zoom) + (ClientSize.Height / 2); //megmondjuk, hogy milyen magasan legyen a vonal "vége" if (firstvalue) { firstvalue = false; //figyelünk arra, hogy a feladat alapján az első elem az különleges, tehát az x2-t nem változtatjuk } else { x2 += (float)(((currentsignal.TimeStamp.Ticks - prevsignal.TimeStamp.Ticks) / 10000000) * pixelPerSec * zoom); //elemenként csúsztatunk jobbra a négyzetek és "vonalvégek" kirajzolásánál e.Graphics.DrawLine(new Pen(Color.Blue, 3), x1, y1, x2, y2); //kékkel berajzoljuk a vonalat a kiszámolt koordináták alapján } e.Graphics.FillRectangle(new SolidBrush(Color.Blue), new RectangleF(x2, y2, 5, 5)); //majd a vonalak elejéhez be is rajzoljuk a kis négyzeteket prevsignal = currentsignal; //a végpontok számolásához el kell tárolnunk az előző jelet is x1 = x2; //és mivel tudjuk, hogy egy adott vonal végpontja a következő kezdőpontja lesz, ezért y1 = y2; //ezeket az adatokat átcseréljük } }
public override void LoadDocument(string filePath) { signals.Clear(); using (StreamReader sr = new StreamReader(filePath)) { string line; while ((line = sr.ReadLine()) != null) { // whitespacek torlese line = line.Trim(); // tabulatoroknal sorok vagasa, tombbe rakasa string[] columns = line.Split('\t'); // a tomb elso eleme a double ertek, ezt parseoljuk double d = double.Parse(columns[0]); // a tomb masodik eleme a UTC datum DateTime utcDt = DateTime.Parse(columns[1]); // helyi idove alakitas DateTime localDt = utcDt.ToLocalTime(); // uj jelertek letrehozasa SignalValue signalValue = new SignalValue(d, localDt); // signals listaba felvetele signals.Add(signalValue); } } // adatok tracelese TraceValues(); UpdateAllViews(); }
private void DrawTheSignals(PaintEventArgs e) { Color dataColor = Color.Blue; Pen signalPen = new Pen(dataColor, 2); SolidBrush dotBrush = new SolidBrush(dataColor); SizeF dotSize = new SizeF(dotSizeVal, dotSizeVal); SizeF halfDotSize = new SizeF(dotSizeVal / 2, dotSizeVal / 2); PointF lastSignalPosition = new PointF(); for (int i = 0; i < signals.Count(); ++i) { SignalValue currentSignal = signals[i]; float t = GetTimeElapsedInSeconds(signals[0].TimeStamp, currentSignal.TimeStamp); float x = t * pixelPerSec * scale; float y = ClientSize.Height / 2 - (float)currentSignal.Value * pixelPerValue * scale; PointF currentPosition = new PointF(x, y); RectangleF dot = new RectangleF(currentPosition - halfDotSize, dotSize); e.Graphics.FillRectangle(dotBrush, dot); if (i > 0) { e.Graphics.DrawLine(signalPen, lastSignalPosition, currentPosition); } lastSignalPosition = currentPosition; } }
private void GenerateNewSignal() { while (dataIsLive) { SignalValue randSignal = new SignalValue(rand.NextDouble() * 100 - 50, DateTime.Now); signals.Add(randSignal); Thread.Sleep(rand.Next(500)); } }
// A UserControl.Paint felüldefiniálása, ebben rajzolunk. protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); // tengelyek rajzolasa, x iranyba eggyel eltolva, hogy latszodjon az y tengely is Pen pen = new Pen(Color.Green, 2); pen.DashStyle = DashStyle.Dot; pen.EndCap = LineCap.ArrowAnchor; int x = ClientSize.Width; int y = ClientSize.Height; e.Graphics.DrawLine(pen, 1, y, 1, 0); e.Graphics.DrawLine(pen, 0, y / 2, x, y / 2); // boolean az elso pont megkulonboztetesehet bool first = true; // valtozok inicializalasa float actualx = 0.0f; float actualy = 0.0f; float prevx = 0.0f; float prevy = 0.0f; SignalValue prev = null; foreach (SignalValue signalValue in document.Signals) { if (first) { // masodpercebe atvaltva, skalárral és zoommal beszorozva a nagyitashoz actualy = (float)(y / 2 - (((signalValue.Value) * pixelPerValue)) * zoom); // elso pont koordinata kiszamolasa utan a boolean atallitasa first = false; } else { // masodpercebe atvaltva, skalárral és zoommal beszorozva a nagyitashoz actualx += (float)(((signalValue.TimeStamp.Ticks - prev.TimeStamp.Ticks) / 10000000.0f * pixelPerSec) * zoom); // masodpercebe atvaltva, skalárral és zoommal beszorozva a nagyitashoz actualy = (float)(y / 2 - ((signalValue.Value * pixelPerValue)) * zoom); // vonal kirajzolasa e.Graphics.DrawLine(new Pen(Color.Blue), prevx, prevy, actualx, actualy); } // koordinatakbol egyet kivonok, hogy a negyzet kozepen legyen a pont e.Graphics.FillRectangle(Brushes.Blue, actualx - 1, actualy - 1, 3, 3); // aktualis koordinatak hozzarendelese az elozo koordinatahoz, // a kovetkezo korbeni vonalrajzolas kezdopontjanak erdekeben prevx = actualx; prevy = actualy; prev = signalValue; } }
public override void LoadDocument(string filePath) { string line; signalValues.Clear(); using (StreamReader sr = new StreamReader(filePath)) // using keyword to handle the file Exception { while ((line = sr.ReadLine()) != null) // we read line by line until the end of file { // line contains the actual line as a string line = line.Trim(); // remove leading and ending whitespaces from the line string[] columns = line.Split('\t'); // split the line into 2 parts ( Value , Time ) double d = double.Parse(columns[0]); // convert the first part elements (Value) to double DateTime dt = DateTime.Parse(columns[1]); // convert the second part elements (Value) to DateTime DateTime localDt = dt.ToLocalTime(); // convert to local time format SignalValue sv = new SignalValue(d, localDt); // create a new Signal value object signalValues.Add(sv); // add it the list of signal values } } UpdateAllViews(); // view updating TraceValues(); // shows the steps/output after making any move with the program }
/// <summary> /// A UserControl.Paint felüldefiniálása, ebben rajzolunk. /// </summary> protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); //rajzoláshoz piros, szaggatott toll, nyíl végződéssel Pen pen = new Pen(Color.Red, 1); pen.DashStyle = DashStyle.Dash; pen.EndCap = LineCap.ArrowAnchor; //y tengely (0;0) pontból a teljes képernyőhosszon e.Graphics.DrawLine(pen, 0, ClientSize.Height, 0, 0); //x tengely a képernyő közepére e.Graphics.DrawLine(pen, 0, ClientSize.Height / 2, ClientSize.Width, ClientSize.Height / 2); //az első időbélyeg dátum formátumban DateTime timeBefore = document.Signals[0].TimeStamp; //az első érték double valueBefore = document.Signals[0].Value; //a legnagyobb felvett abszolútérték -> a grafikon kirajzolásakor ennek ki kell férnie double maxValue = valueBefore; foreach (SignalValue sv in document.Signals) { if (Math.Abs(sv.Value) > maxValue) { maxValue = Math.Abs(sv.Value); } } //időbélyegekhez skálatényező -> 1 másodperc ennyi pixelnek felel meg //az ablak szélességének 0.7-szeresét (hogy ne a legszélén legyenek az értékek) osztjuk a legnagyobb és legkisebb időérték különbségével double pixelPerSec = Convert.ToDouble(ClientSize.Width * 0.7) / ((document.Signals[document.Signals.Count - 1].TimeStamp.Ticks - document.Signals[0].TimeStamp.Ticks) / 10000000.0f); //értékhez skálatényező -> 1 egységnyi érték ennyi pixelnek felel meg //az ablak magasságának 0.7-szeresét (hogy ne a legszélén legyenek az értékek) osztjuk a legnagyobb abszolútérték kétszeresével, hiszen negatív értékeket is felvehet double pixelPerValue = Convert.ToDouble(ClientSize.Height * 0.7) / (maxValue * 2); //előző x és y koordináták a vonal kirajzolásához int xBefore = 0; //az első y koordináta számítása: az x tengely helyéhez képest a skálázott értékkel eltolva //a pixelPerVaule-val skálázott értéket a nagyítási skálatényezővel is szorozni kell int yBefore = Convert.ToInt32(ClientSize.Height / 2 - (valueBefore * pixelPerValue * scaleFactor)); //kék ecset SolidBrush brush = new SolidBrush(Color.Blue); //az első pont kirajzolása az x = 0 helyre e.Graphics.FillRectangle(brush, new Rectangle(xBefore, yBefore, 3, 3)); //az értékekeket ábrázoló pontok kirajzolása for (int i = 1; i < document.Signals.Count; i++) { SignalValue sv = document.Signals[i]; //az aktuális és első időbélyeg különbsége TimeSpan timeSpan = sv.TimeStamp.Subtract(timeBefore); //másodpercben double timeDifference = timeSpan.Ticks / 10000000.0; //az x koordináta az aktuális időbélyeg elsővel való eltolása lesz a skálatényezővel szorozva //a scaleFactor nagyítási skálatényezővel szorozni kell az értéket int x_koord = Convert.ToInt32(timeDifference * pixelPerSec * scaleFactor); //az y koordináta az x tengelyhez képest eltolva lesz a skálázott érték //a scaleFactor nagyítási skálatényezővel szorozni kell az értéket int y_koord = Convert.ToInt32(ClientSize.Height / 2 - (sv.Value * pixelPerValue * scaleFactor)); //a pont kirajzolása e.Graphics.FillRectangle(brush, new Rectangle(x_koord, y_koord, 3, 3)); //a vonal kirajzolása e.Graphics.DrawLine(new Pen(Color.Blue, 1), new Point(xBefore, yBefore), new Point(x_koord, y_koord)); //az előző x és y értékek átállítása a következő ciklusra xBefore = x_koord; yBefore = y_koord; } }