Laden...

ZedGraph x-achse Zeitangabe

Erstellt von jkRf4n vor 15 Jahren Letzter Beitrag vor 14 Jahren 8.222 Views
J
jkRf4n Themenstarter:in
39 Beiträge seit 2008
vor 15 Jahren
ZedGraph x-achse Zeitangabe

So ich hab schon mal versucht hier mein Problem zu lösen aber ich glaube mein Problem wurde nicht richtig verstande.
Ich möchte aus einem Textfile(anhang) Werte auslesen die auch einen Zeitstempel besitzen.

Nun möchte ich aus diesen werten einen Graphen erstellen.
Die Werte sollen auf die y-Achse und die Zeit sollte auf die x-achse.
Hier mal mein Code:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using ZedGraph;

namespace MSV_Software
{
    public partial class frmAnalyseTool : Form
    {
        PointPairList Kurve;
        LineItem MeineKurve;
        GraphPane Grafik;
        StreamReader Txtlesen2;
        StreamWriter Txtschreiben;
        ZedGraphControl zgc = new ZedGraphControl();
        bool Löschen = false;

        public frmAnalyseTool()
        {
            InitializeComponent();
        }

           private void btnZurückAnalyseTool_Click_1(object sender, EventArgs e)
        {
            new frmAuswahlverfahren().Show();
            this.Hide();
        }
       
            private void btnBeendenAnalyseTool_Click_1(object sender, EventArgs e)
        {
            Application.Exit();
        }
     
        private void frmAnalyseTool_Resize(object sender, EventArgs e)
        {
            SetSize();
        }



        private void SetSize()
        {
            zedGraphControl1.Location = new Point(10, 10);


            zedGraphControl1.Size = new Size(ClientRectangle.Width - 50, ClientRectangle.Height - 50);

        }

        public void frmAnalyseTool_Load(object sender, EventArgs e)
        {
            Löschen2(zedGraphControl1);

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Stream myStream = null;
            OpenFileDialog openFileDialog1 = new OpenFileDialog();

            openFileDialog1.InitialDirectory = "c:\\";
            openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
            openFileDialog1.FilterIndex = 2;
            openFileDialog1.RestoreDirectory = true;

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                try
                {

                    if ((myStream = openFileDialog1.OpenFile()) != null)
                    {

                        using (myStream)
                        {


                            StreamReader Txtlesen = new StreamReader(myStream);
                            Txtschreiben = new StreamWriter(@"c:\1.txt");
                            String Leerzeile;

                            while ((Leerzeile = Txtlesen.ReadLine()) != null)
                            {

                                Txtschreiben.WriteLine(Leerzeile);


                            }

                            Txtlesen.Close();
                            Txtschreiben.Close();
                            CreateGraph(zedGraphControl1);

                            SetSize();
                            zgc.AxisChange();
                            zedGraphControl1.Update();
                            zgc.Refresh();
                            zedGraphControl1.Refresh();

                            if (Löschen == false)
                            {
                                Löschen = true;
                            }

                        }


                    }

                }

                catch (Exception ex)
                {
                    MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
                }
            }
        }

        public void Löschen2(ZedGraphControl zgc)
        {
            Grafik = zgc.GraphPane;
            Grafik.Title.Text = "AnalyseTool";
            Grafik.XAxis.Title.Text= "Zeit";
            Grafik.YAxis.Title.Text = "Amplitude / [µW/m2]";


            if (Löschen == true)
            {
                zedGraphControl1.Refresh();
                MeineKurve.Clear();
                Grafik.CurveList.Clear();
                zgc.Refresh();
                SetSize();
                zgc.ZoomOutAll(Grafik);

            }
            zgc.Refresh();
            Löschen = false;

        }

        public void CreateGraph(ZedGraphControl zgc)
        {

            Grafik = zgc.GraphPane;
            Löschen2(zgc);
            Grafik.YAxis.Scale.Min = 0;
            Grafik.XAxis.Type = AxisType.DateAsOrdinal;
            Grafik.XAxis.MajorGrid.IsVisible = true;
            Grafik.YAxis.MajorGrid.IsVisible = true;

            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de-DE"); // Englische Zeitformatierung in Deutsche umwandeln
            DateTime hallo = new DateTime(1);

            Txtlesen2 = File.OpenText(@"c:\1.txt");
            string[] zeilen = File.ReadAllLines(@"c:\1.txt");
            Kurve = new PointPairList();
            
            double Wert = 0;
            double Zeit = 0;

            foreach (string zeile in zeilen)
            {
                double Stunden2 = 0;
                double hun2 = 0;
                double hun = 0;
                double Minuten = 0;
                double Minuten2 = 0;
                double Stunden = 0;
                double Sekunden = 0;
                double Sekunden2 = 0;

                string Zeile = "";
                Zeile = Txtlesen2.ReadLine();
                string[] arr = new Regex(@"[^0-9](\s)(\w\w)(\sýW/m2\s)(\w\w)(:)(\w\w)(\s)(\w\w)(\s)(\w\w\w)").Split(Zeile);

                Wert = double.Parse(arr[2], System.Globalization.CultureInfo.InvariantCulture);

                Stunden = double.Parse(arr[4]);
                Stunden2 = Stunden * 3600.0;

                Minuten = double.Parse(arr[6]);
                Minuten2 = Minuten * 60.0;

                Sekunden = double.Parse(arr[8]);
                Sekunden2 = Sekunden * 1.0;

                hun = double.Parse(arr[10]);
                hun2 = hun / 100.0;

                Zeit = Stunden2 + Minuten2 + Sekunden2 + hun2;

                MessageBox.Show(Zeit.ToString());
                
                zgc.GraphPane.XAxis.Scale.Format = Stunden + ":" + Minuten + ":" + Sekunden + "," + hun;

                Kurve.Add (Zeit, Wert);

            }

            Txtlesen2.Close();
            MeineKurve = Grafik.AddCurve("Wert", Kurve, Color.Green, SymbolType.None);

            zgc.Refresh();

            zgc.AxisChange();

        }
    }
}

Hat da vl jeamnd einen Plan was daran falsch ist, weil ich bekomme zwar enien Graphen jedoch steht nicht die gewünschte Zeit auf der X-achse sondern immer nur der letzt Zeitwert von dem Textfile immer und immer wieder...

Danke schon mal im voraus Lg jkRf4n

J
jkRf4n Themenstarter:in
39 Beiträge seit 2008
vor 15 Jahren

Hier noch wie es zur zeit aussieht die Ausgabe

R
158 Beiträge seit 2007
vor 15 Jahren

Moin,

guggst du mal DateTimeAxis. Hier wird beschrieben, wie DatumZeitwerte auf die x-Achse dargestellt werden. Vllt hilft dir das ein Stückl weiter ?(

Rainer

J
jkRf4n Themenstarter:in
39 Beiträge seit 2008
vor 15 Jahren

danke für deine mühe aber das hilft leider nicht weiter, da ich das tut schon die ganze zeit verwende (also für das was ich bis jetzt geschafft habe 😃

S
260 Beiträge seit 2007
vor 15 Jahren

In folgender Zeile liegt dein Fehler:

zgc.GraphPane.XAxis.Scale.Format = Stunden + ":" + Minuten + ":" + Sekunden + "," + hun;

Damit gibst du nur das Format der X-Achse an und überschreibst jedesmal deine X-Achsen-Beschriftung.

Evtl. Lösung deines Problems:


zgc.GraphPane.XAxis.Scale.Min = new XDate(today.Year, today.Month, today.Day, today.Hour, today.Minute, today.Second);
zgc.GraphPane.XAxis.Scale.MajorStep = ...
zgc.GraphPane.XAxis.Scale.Max = ...

Mit zgc.GraphPane.XAxis.Scale.Min und zgc.GraphPane.XAxis.Scale.Max kannst du auf jeden Fall schonmal den minimalen und den maximalen Wert deiner Skalierung angeben.
Die Werte in XDate musst dunatürlich aus deiner Datei holen, ich hab einfach als Beispiel das "heutige" Datum genommen.
Mit zgc.GraphPane.XAxis.Scale.MajorStep kannst du die Skalierung, also die Abstände zwischen der einzelnen Striche angeben.

Mfg
Michael

J
jkRf4n Themenstarter:in
39 Beiträge seit 2008
vor 15 Jahren

danke für deine hilfe...das hab ich so ja auch schon probiert, aber ich weis nicht wie ich den letzten und den ersten zeitwert ausm textfile bekomm^^

und vorallem wenn ich die zeiten habe was ich tun muss um die als min und max zu verwenden....

M
194 Beiträge seit 2008
vor 15 Jahren

Ich denke auch es liegt daran:

zgc.GraphPane.XAxis.Scale.Format = Stunden + ":" + Minuten + ":" + Sekunden + "," + hun;

Das Format solltest du eigentlich in der Form:

zgc.GraphPane.XAxis.Scale.Format = "hh:mm:ss";

angeben.

Versuchs mal stattdessen mit der Auto-Funktion:

            myPane.XAxis.Title.FontSpec.Size = 10;
            myPane.XAxis.Type = AxisType.Date;
            myPane.XAxis.Scale.FontSpec.Size = 8;
            myPane.XAxis.Scale.MajorStepAuto = true;
            myPane.XAxis.Scale.MinorStepAuto = true;
            myPane.XAxis.Scale.FormatAuto = true;

Grüße

"Indem Sie über dieses ernste Thema lachen disqualifizieren Sie sich selbst."
mrleeh.de

J
jkRf4n Themenstarter:in
39 Beiträge seit 2008
vor 15 Jahren

Auch dir danke für deine Antwort aber das geht auch nicht, weil dann wird ein Datum an die Xachse geschrieben und nicht meine gewünschte Zeit.

Geht es irgendwie, dass man die anfagszeit und die edzeit aus dem textfile ausliest und dann min und max affer achse macht???

LG

S
260 Beiträge seit 2007
vor 15 Jahren

Klar geht das.

Du liest ja die Zeit sowieso schon aus deinem Textfile aus. Du könntest die Zeit dann z.B. in ein Array schreiben und das sortieren.
Dann hast du an erster Stelle den minimalen Wert und an der letzten Stelle den maximalen Wert.

Und dann gibst du das eben in der Form, wie ich es in meinem vorherigen Post angegeben habe, für min und max auf der X-Achse an.

Gruß
Michael

P.S.: Mir ist gerade noch aufgefallen, dass der niedrigste Zeitwert in deinem Textdokument an erster Stelle und der höchste Zeitwert an letzter Stelle steht.
Ist das immer so?
Dann könntest du direkt den ersten Wert aus deinem Textdokument als min verwenden und den letzten Wert als max, dann brauchst du nix mehr sortieren.

J
jkRf4n Themenstarter:in
39 Beiträge seit 2008
vor 15 Jahren

ja die Files sind immer so das der niedrigste anfang und der höchste am ende ist

S
260 Beiträge seit 2007
vor 15 Jahren

Was hast du denn jetzt schon probiert?

Kann es momentan nicht testen, aber ich schreib mal ganz kurz freihändig code.
Die Stunden, Minuten, Sekunden liest du ja schon aus.
Jetzt musst dur nur noch wissen wann die niedrigste und wann die höchste Zeit kommt.
Du könntest z.B. eine if-Abfrage einbauen.


int counter = 0, anzahlzeilen = 0;
anzahlzeilen = zeilen.Count;
zgc.GraphPane.XAxis.Type = AxisType.Date;
zgc.GraphPane.XAxis.Scale.Format = "HH:mm:ss";

if(counter == 0)
     zgc.GraphPane.XAxis.Scale.Min = new XDate((today.Year, today.Month, today.Day, Convert.ToInt32(Stunden), Convert.ToInt32(Minuten), Convert.ToInt32(Sekunden));
if(counter == anzahlzeilen)
     zgc.GraphPane.XAxis.Scale.Max = new XDate((today.Year, today.Month, today.Day, Convert.ToInt32(Stunden), Convert.ToInt32(Minuten), Convert.ToInt32(Sekunden));
...

Edit: Mir ist aufgefallen, dass XDate immer das Jahr, Monat und Tag benötigt, was aber nichts ausmachen sollte.

Mfg
Michael

85 Beiträge seit 2006
vor 14 Jahren

Hallo,

ich lese mit einem Reader aus einer SQL DB Daten aus und die X Axe bekommt ihre von einer DateTime Spalte.

x = (double) new XDate(Convert.ToDateTime(reader["Date"]));

Alles passt soweit aber egal wie ich es dreh, im Chart steht z.B. 29.00.2009
Auch über mehrere Monate bleibt da immer die 00 stehen.

Kann nicht verstehen warum und wo der Fehler ist, er erkennt ja sonnst alles wunderbar.

Danke und Gruß tomylee

F
1 Beiträge seit 2009
vor 14 Jahren
datum

tagchen,

also bei mir hats auch einiges an zeit benötigt - um den "fehler" zu finden 😃

    fLastDate.Format = DateTimePickerFormat.Custom  
    
    fLastDate.CustomFormat = "dd.MM.yy hh:mm:ss"  

beachte !!! die >> MM << gross geschrieben 😃

85 Beiträge seit 2006
vor 14 Jahren

Oh neiiiiiiiiin...... 8o

Das kann wo nicht wahr sein. Wer erfindet denn so einen Misst 👶

Vielen Dank Fremder 😃

Gruß tomylee