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

#include "baustein.h"
#include "DynArray.h"
#include "List.h"

#ifdef _FTSNETZ_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


//---------------------------------------------------------
// Klasse typNetzKnoten
//---------------------------------------------------------

class typNetzBaustein;
class typFtsWagen;
class typNetzKnoten {

	
public :
	typNetzKnoten (typNetzBaustein* MBaustein, Vec3D Pos);		// Konstruktor
	~typNetzKnoten ();                    				// Destruktor
	//void setMNetzBaustein (unsigned bstnr);     // Setzt den MutterBaustein des Knoten
	void machnachbar (typNetzKnoten* nach);				// Verknüpft den nachfolgenden Knoten
	void machvorgaenger (typNetzKnoten* vor);		// Verknüpft den nachfolgenden Knoten
	void loeschnachbar (typNetzKnoten* knoten);		// Löscht aus der Nachbarliste den Knoten
	Vec3D Position ();
	
	void drucknachbar () const;
	void druckvor () const;
	void druck ();
	
	void setBelegt (typFtsWagen* fts);						// Setzt den BelegtStatus des Knoten
	typFtsWagen* Belegt ();											// Gibt Null zurück wenn der Knoten nicht belegt ist
	void setBesucht (const bool status);		// Für die Strategie der Faden der A.
	bool Besucht ();                     // True wenn bereits besucht worden
	void setGesperrt (const bool status);				// Sperrt/Entsperrt den Knoten
	bool Gesperrt ();                           // True wenn Gesperrt
	void setReserviert (const bool status);				// Sperrt/Entsperrt den Knoten
	bool Reserviert ();                           // True wenn Gesperrt

	
protected :
	Vec3D ObjPosition;
  typFtsWagen* belegt;												// Von welchem FTSWagen der Knoten belegt ist
	bool besucht;
	bool gesperrt;																// Status ob der Knoten gesperrt ist
	bool reserviert;															// Status ob der Knoten reserviert ist
	DynArray<typNetzKnoten> nachfolger;						// Liste der folgenden Knoten
	DynArray<typNetzKnoten> vorgaenger;						// Liste der vorhergehenden  Knoten. Wird nur bei Einbahnstrecken benötigt
	DynArray<typNetzBaustein*> MNetzBaustein;			// Der MutterBaustein des Knoten
	friend class typFtsVerwalter;
	friend class typFtsWagen;
};





//---------------------------------------------------------
// Klasse typNetzBaustein
//---------------------------------------------------------

class typNetzBaustein : public typBaustein {
public :
	typNetzBaustein (unsigned n, unsigned b);
	//~typNetzBaustein ();	
  unsigned Variante () const;
	virtual void typTGSlesen (InputFile& file);
  virtual ostream& typTGSschreiben (ostream& ostrm) const;
	virtual void typTBVlesen (InputFile& file);
	virtual void interneVerknuepfung(); 					// MUSS in den angeleiteten Klassen implementiert werden
	void aSperren ();
	void eSperren ();
  bool isGesperrtOrGestoert () const;

	void druckNetz() const;
	
	
	virtual bool hasKapazitaet(typTransportEinheit*) const;
	virtual void individuellAktivieren(typBaustein*);		
	virtual void typTTPlesen (InputFile& file);	
protected :
	bool gesperrt;
	DynArray<typNetzKnoten> NetzKnotenliste;
	Angle delta;                                    // Winkel zwischen zwei Knoten auf einer Kurve
	double schrittweite;													// Abstand der Knoten in Meter

	Pattern* text;
	friend class typFtsVerwalter;

};



//---------------------------------------------------------
// Klasse typNetzStrecke
//---------------------------------------------------------

class typNetzZBStrecke : public typNetzBaustein {
public :
	typNetzZBStrecke (unsigned n, unsigned b);
	void interneVerknuepfung();
};


//---------------------------------------------------------
// Klasse typNetzEinBahnStrecke
//---------------------------------------------------------

class typNetzEBStrecke : public typNetzBaustein {
public :
	typNetzEBStrecke (unsigned n, unsigned b);
	void interneVerknuepfung();
};


//---------------------------------------------------------
// Klasse typNetzKurve
//---------------------------------------------------------


class typNetzKurve : public typNetzBaustein {
public :
  typNetzKurve (unsigned n, unsigned b);
	void interneVerknuepfung();
};

//---------------------------------------------------------
// Klasse typNetzAbzweigung
//---------------------------------------------------------

class typNetzAbzweigung : public typNetzBaustein {
public :
	typNetzAbzweigung (unsigned n, unsigned b);
	void interneVerknuepfung();
};

// #endif
