#ifndef INCLUDE_NASTVISUALCONTEXTGNUPLOT_H
#define INCLUDE_NASTVISUALCONTEXTGNUPLOT_H

//-----------------------------------------------------------------------------
// NastVisualContextGnuplot.h
//-----------------------------------------------------------------------------
//
//  Copyright (C) 1998 Technische Universitaet Muenchen, Germany
//                   written by Bernhard Brueck
//
//  This file is part of Nast++
//
//-----------------------------------------------------------------------------
//  CNastVisualContextGnuplot implementiert einen VisualContextes mit
//  der Hilfe von Gnuplot. Dafuer wird gnuplot gestartet und mit 
//  einer pipe mit dem Hauptgrogramm verbunden.
//  Die einzelnen Visualisierungen werden dann in Gnuplotbefehle umgewandelt
//  und ueber die Pipe an Gnuplot geschickt.  
//  Dadurch ist eine Onlineaktualisierung der Ausgaben moeglich.
//-----------------------------------------------------------------------------
//  Aenderungen:
//     

#include "NastConfig.h"
#include "NastVisualContext.h"

#include <stdio.h>  //  wegen FILE

class CNastGrid2d;

class CNastVisualContextGnuplot : public CNastVisualContext
{
public:
    //-------------------------------------------------------------------------
    //                         Konstruktor + Destruktor
    //-------------------------------------------------------------------------

    CNastVisualContextGnuplot( const char *szTitle);			              
    virtual ~CNastVisualContextGnuplot();


    //-------------------------------------------------------------------------
    //                            Memberfunktionen
    //-------------------------------------------------------------------------
    virtual void show( const CNastArray<int> &arrY, 
        	       const char *szComment = 0,
        	       double time = 0.0        );

    virtual void show( const CNastArray<double> &arrY, 
        	       const char *szComment = 0,
        	       double time = 0.0        );

    virtual void show( const CNastArray<double> &arrX, 
        	       const CNastArray<double> &arrY,
        	       const char *szComment = 0,
        	       double time = 0.0        );

    virtual void show( const CNastGrid2d &grid,
        	       const char *szComment = 0,
        	       double time = 0.0        );

    virtual void show( const CNastStaggeredGrid2d &grid,
        	       const char* szComment = 0,
        	       double time = 0.0        );
    //-------------------------------------------------------------------------
    //  debugInfo    gibt Information ueber den Zustand des Objekts aus
    //  assertValid  testet das Objekt auf Integritaet
    //

    virtual void debugDump( CNastDumpContext &dumpContext ) const;
    virtual void assertValid() const;

private:
    CNastVisualContextGnuplot( const CNastVisualContextGnuplot & o);	            // nicht impl.
    const CNastVisualContextGnuplot& operator=( const CNastVisualContextGnuplot &o );   //  nicht impl.

    //-------------------------------------------------------------------------
    //                            Hilfsfunktionen
    //-------------------------------------------------------------------------

    void createData();		// Datenpipe erzeugen
    void openData();		// Datenpipe oeffnen
    void closeData();		// Datenpipe schliessen und entfernen
    const char* title() const;	// liefert den Titel

    //-------------------------------------------------------------------------
    //                            Membervariablen
    //-------------------------------------------------------------------------

    FILE *m_pipeProg;		// pipe zur Commandozeile von gnuplot
    FILE *m_pipeData;           // pipe um die Daten zuu uebertragen

    char  m_szNameData[100];	// Namen der pipes
    char  m_szNameProg[100];
    int   m_pid;		// pid von gnuplot
    char* m_szTitle;		// Titel
};

//-------------------------------------------------------------------------
//                            Inline
//-------------------------------------------------------------------------

inline const char*
CNastVisualContextGnuplot::title() const
{
    return m_szTitle;
}

#endif // INCLUDE_NASTVISUALCONTEXTGNUPLOT_H

