Laden...

ZedGraph zeichnet erst nach klick // zeichnet ohne wirkliche Skalierung

Erstellt von stav0815 vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.014 Views
S
stav0815 Themenstarter:in
12 Beiträge seit 2008
vor 15 Jahren
ZedGraph zeichnet erst nach klick // zeichnet ohne wirkliche Skalierung

Hallo,

ich habe mich heute mit ZedGraph eingelesen und es auch geschafft, anhand der Beispiele aus zwei Arrays einen Graphen zeichnen zu lassen. Allerdings funzt dies ned so richtig wie ich will und die Skalierung (die ja eigentlich automatisch geschehen sollte) passiert nicht.


        private void qwaehlen_Click(object sender, EventArgs e)
        {
            source.pfad();
            pfadbox.Text = source.getpath();
            path = source.getpath();
            if (path != null)
            {
                StreamReader ausles = new StreamReader(path);
                {
                    string zeile;
                    //inhaltbox.Text = ausles.ReadToEnd();
                    while (zaehler <= 1000)
                    {
                        zaehler++;
                        // ergänzung 
                        zeile = ausles.ReadLine();
                        //MessageBox.Show(zeile);
                        if (zeile == null)
                        {
                            break;
                        }
                        else
                        {
                            char[] sep = { ' ', '\t' };
                            string[] x = zeile.Split(sep, 5);
                            inhaltbox.Text += zeile + "\r\n";
                            //try/catch, daist in dem fall nicht notwendig in diversen Zeilen keine Zahlen stehn 
                            try
                            {
                                xachse[zaehler] = Convert.ToInt32(Convert.ToDouble(x[0]) * 100);
                                yachse[zaehler] = Convert.ToInt32(x[2]);
                            }
                            catch
                            {
                            }
                            // ergänzung 
                        }
                    }
                }
            }
        }

Dies ist der Code, in dem ich meine Arrays mit Daten fütter die aus ner Textdatei kommen. Das funzt auch soweit.



        private void zeichnen_Click(object sender, EventArgs e)
        {
            CreateGraph(zg1);
            SetSize();
        }
        private void CreateGraph(ZedGraphControl zg1)
        {
            // get a reference to the GraphPane
            GraphPane myPane = zg1.GraphPane;

            // Set the Titles
            myPane.Title.Text = "Diagramm";
            myPane.XAxis.Title.Text = "Zeit in ms";
            myPane.YAxis.Title.Text = "Temperatur in °C";
            myPane.XAxis.MajorGrid.IsVisible = true;
            myPane.YAxis.MajorGrid.IsVisible = true;

            // Make up some data arrays based on the Sine function
            PointPairList list1 = new PointPairList();
            for (int i = 2; i < 100; i++)
            {
                if (yachse[1] < 0)
                {
                    list1.Add(xachse[i], yachse[i]);
                }
            }
                LineItem myCurve = myPane.AddCurve("Temperatur",
                      list1, Color.Red, SymbolType.None);

                // Tell ZedGraph to refigure the
                // axes since the data have changed
                zg1.AxisChange();

            
        }
        private void Form1_Resize(object sender, EventArgs e)
        {
            SetSize();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            SetSize();
        }

und das is der Code für das zeichnen des Diagramms. Das funzt fast ned...

R
317 Beiträge seit 2006
vor 15 Jahren

Hi,

also was mir jetzt mal auffällt ist, dass du die Funktion CreateGraph in einer Funktion aufrufst, die ja einen Klick erfordert:


        private void zeichnen_Click(object sender, EventArgs e)
        {
            CreateGraph(zg1);
            SetSize();
        }

Da ist es dann auch logisch, dass du erst klicken musst, damit der Graph kommt.
Soll der Graph sofort gezeichnet werden, würde ich den Aufruf an CreateGraph() halt einfach ans ende der Funktion hängen, wo du die Datei auswählst.

Was macht die Funktion SetSize? So wie du das aufgebaut hast, müsste er schon automatisch skalieren.

MFg,
Daniel

S
stav0815 Themenstarter:in
12 Beiträge seit 2008
vor 15 Jahren

ja, er soll erst auf click des buttons zeichnen. aber das macht er irgendwie ja ned richtig. erst wenn ich im diagramm nen fenster auswähl.

das setsize() brauch ich dann ned, oder wie?

R
317 Beiträge seit 2006
vor 15 Jahren

Also ich hab das SetSize noch nie benutzt, ist auch in diesem Fall nicht notwendig.

Das mit dem Klick müsste dann schon passen.

Was heißt denn "er zeichnet nicht richtig" genau? 😉

S
stav0815 Themenstarter:in
12 Beiträge seit 2008
vor 15 Jahren

Er zeichnet nicht richtig bedeutet, dass er nicht zeichnet, bis ich nen Fenster im Diagramm zieh oO

R
317 Beiträge seit 2006
vor 15 Jahren

Also in meinem Projekt sieht das z.B. so aus:


        public void setValues(List<Messspur> spuren)
        {
            int xz = 0;

            lst = spuren;

            foreach (Messspur spur in spuren)
            {
                double[] X = new double[spur.m_Values.Count];
                double[] Y = new double[spur.m_Values.Count];

                for (int i = 0; i < spur.m_Values.Count; i++)
                {
                    X[i] = (double)((Messwerte)spur.m_Values[i]).x_pos;
                    Y[i] = ((Messwerte)spur.m_Values[i]).o_diameter;
                }

                zedGraphControl1.GraphPane.Title.Text = "Auswertung - " + spur.m_zskType + " / " + spur.m_zskSpur;
                zedGraphControl1.GraphPane.XAxis.Title.Text = "Position";
                zedGraphControl1.GraphPane.YAxis.Title.Text = "Durchmesser";

                // Skalierung
                zedGraphControl1.GraphPane.XAxis.Scale.Min = spur.xMin;
                zedGraphControl1.GraphPane.XAxis.Scale.Max = spur.xMax;
                
                zedGraphControl1.GraphPane.AddCurve("Messspur 1", X, Y, colors[xz], ZedGraph.SymbolType.None);
                xz++;
            }

            

            zedGraphControl1.AxisChange();
        }

und wird sofort gezeichnet.
Sieht aber bei dir auch vergleichbar aus 😉

S
stav0815 Themenstarter:in
12 Beiträge seit 2008
vor 15 Jahren

ich hab keine derartige skalierung, werd das aber definitiv mal ausprobieren 😁

R
317 Beiträge seit 2006
vor 15 Jahren

Bei mir ist auch als Minimum nur der Minimalwert der Messwerte, als Maximalwert halt der Maximalwert der Messwerte.

Soviel ich mich erinnern kann ging es aber auch ohne das manuelle setzen der Skalierung.

S
stav0815 Themenstarter:in
12 Beiträge seit 2008
vor 15 Jahren

mein problem ist halt, dass er das ding wirklich erst zeichnet nachdem ich in das Ding reinklicke und ein Fenster ziehe... ansonsten wär mir die Auto-Skalierung schon recht

R
317 Beiträge seit 2006
vor 15 Jahren

Hast dus nachm zeichnen schon mal mit Update() oder Refresh() des Fensters oder des ZedGraph Controls probiert?

S
stav0815 Themenstarter:in
12 Beiträge seit 2008
vor 15 Jahren

ne, muss ich aber mal versuchen...