// $Source: /usr/local/SimSoft/Sfx3D/src/gsl/transp.h,v $
// $Revision: 1.2 $
// $Author: baum $
// $Date: 2001/11/29 15:18:10 $
//
// Login name of the user who locked the revision
// $Locker:  $
// Tag name used to checkout the file
// $Name: Release-14 $
// State assigned to revision
// $State: Exp $
//
//
// $Log: transp.h,v $
// Revision 1.2  2001/11/29 15:18:10  baum
// -Realzeitsteuerung eingebaut
// -Handsteuerung eingebaut
//

#ifndef _TRANSP_H
#define _TRANSP_H     1

#include <stdlib.h>

#include "SimTime.h"

#include "Kalender.h"
#include "List.h"

#include "XGraph/XGraph.h"

class typTransportEinheit;
#include "platz.h"

#ifdef _TRANSP_CPP
#  undef _impexp
#  define _impexp __declspec(dllexport)
#elif defined BUILD_MAIN_DLL
#  undef _impexp
#  define _impexp
#else
#  undef _impexp
#  define _impexp __declspec(dllimport)
#endif

#if defined __GNUC__ || defined __hpux
#  undef _impexp
#  define _impexp
#endif

class typBaustein;
class typArbeitsplan;
class typVorgang;
class typTransportRoute;
class UserData;
class typStlElement;
//---------------------------------------------------------
// class typMeldung
//---------------------------------------------------------

class _impexp typMeldung {
  public :
    typMeldung  (typTransportEinheit *zTE);
    ~typMeldung ();

    typTransportEinheit* TransportEinheit   () const;
    typBaustein*   VonBaustein  () const;
    typBaustein*   NachBaustein () const;
    void setVonBaustein  (typBaustein* vonBst);
    void setNachBaustein (typBaustein* nachBst);

    int  Prioritaet      () const;
    void incPrioritaet   (int wert);
    void decPrioritaet   (int wert);
    void setPrioritaet   (int wert);
    void PrioEingliedern (List<typMeldung>& lst);

  private:
    int ObjPrio;
    typTransportEinheit* ObjTransportEinheit;
    typBaustein*   ObjVonBst;
    typBaustein*   ObjNachBst;

};

//---------------------------------------------------------
// class typTransportEinheit
//---------------------------------------------------------

typedef void (TransportEinheitDestroyFunction) (GeoObject* gObj);

class _impexp typTransportEinheit {
  public :
    typTransportEinheit  (typArbeitsplan *za);
    typTransportEinheit (typArbeitsplan *zA, unsigned sollVorgang);
    ~typTransportEinheit ();

    void setDestroyFunction (TransportEinheitDestroyFunction*);

    unsigned ID () const;

    void SystemEintritt (const Vec3D& pos, const Angle& globWinkel);
    void bewegen        (const Vec3D& move);
    void positionieren  (const Vec3D& pos);
    void drehen         (const Angle& ang);
    void ausrichten     (const Angle& angToX);
    void einblenden     ();
    void ausblenden     ();
    void setProjektID   (unsigned projektID);
    unsigned ProjektID  ();
    void setVariante    (unsigned variante, unsigned unterVariante = 1);
    unsigned Variante   ();

    Vec3D        Position () const;
    const Angle& Winkel   () const;
    Vec3D        Laenge   (const Vec3D& globalDir) const;

    bool hatArbeitsplan (unsigned was, unsigned istv) const;
    bool hatArtikel    (unsigned was, unsigned istv) const;

    unsigned Artikel    () const;
    unsigned setArtikel (unsigned artikel);

    const double& Menge    () const;
    const double& incMenge (const double& menge);
    const double& decMenge (const double& menge);
    const double& setMenge (const double& neuMenge);

    int Prioritaet    () const;
    int setPrioritaet (int wert);

    typVorgang* Vorgang  () const;
    void schalteVorgang  (int sollVorgang = 0);

    typBaustein* Station () const;
    typMeldung*  Meldung () const;

    typPlatz* AktPlatz     () const;
    typPlatz* schaltePlatz ();

    typPlatz* ZielPlatz    () const;
    typPlatz* setZielPlatz (typPlatz *zp);

    typPlatz* BuchPlatz    () const;
    typPlatz* setBuchPlatz (typPlatz *zb);

    typBaustein*   Baustein     () const;
    typBaustein*   nextBaustein () const;

    typTransportRoute* TransportRoute () const;
    typArbeitsplan*    Arbeitsplan    () const;
    GeoObject* Geometry ();
    
    void Anmelden ();

    void startBDE ();
    void stopBDE  ();

    const SimTime  Laufzeit         () const;
    const SimTime  TransportRouteLaufzeit () const;

    UserData* getUserData () const;
    void      setUserData (UserData* Data);
    UserData* resetUserData ();
	  
  private:
    void schalteStation  ();

    static unsigned ClassID;
    const  unsigned ObjID;
    unsigned ObjVariante;
    unsigned ObjUnterVariante;
    unsigned ObjProjektID;
    int ObjPrio;

    SimTime ObjAnkunft;
    SimTime ObjFkAnkunft;

    typMeldung* ObjMeldung;
    typPlatz*   ObjAktPlatz;
    typPlatz*   ObjZielPlatz;
    typPlatz*   ObjBuchPlatz;
    Vec3D       ObjPlatzKorrektur;

    typArbeitsplan*      ObjArbeitsplan;
    LCursor<typVorgang>  ObjVorgang;
    typStlElement*       ObjBestand;

    typTransportRoute*         ObjTransportRoute;
    mutable LCursor<typBaustein> ObjStation;

    GeoObject  ObjGeometry;
    Angle      ObjWinkel;
    // callback-function for delete
    TransportEinheitDestroyFunction* ObjDestroyFunc;

    UserData* ObjUData;
};

#endif /* _TRANSP_H */
