Пример #1
0
        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();
        }
Пример #2
0
        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();
 }
Пример #4
0
        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;
            }
        }
Пример #5
0
        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;
            }
        }
Пример #7
0
        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
        }
Пример #8
0
        /// <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;
            }
        }