// $Source: /usr/local/SimSoft/Sfx3D/src/gts/gtsmgra.cpp,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: gtsmgra.cpp,v $
// Revision 1.2  2001/11/29 15:18:10  baum
// -Realzeitsteuerung eingebaut
// -Handsteuerung eingebaut
//

#define _GTSMGRA_CPP

/*** Windows headers ***/
#ifdef WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#undef WIN32_LEAN_AND_MEAN
//#include <winnt.h>
#endif /*WIN32*/

#ifdef __GNUC__
#include <unistd.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "XGraph/XGraph.h"
#include "XGraph/AllViews.h"

#include <tcl.h>
#include <tk.h>

#include "IniFile.h"
#include "gtsgui.h"
#include "gtsglob.h"
#include "gtsgraf.h"
#include "gtsini.h"
#include "gtstgb.h"
#include "gtsb00.h"
#include "gtsb01.h"
#include "gtsb02.h"
#include "gtsb03.h"
#include "gtsb04.h"
#include "gtsb05.h"
#include "gtsb06.h"
#include "gtsb07.h"
#include "gtsb08.h"
#include "gtsb09.h"
#include "gtsb10.h"
#include "gtsb12.h"
#include "gtsb14.h"
#include "gtsb15.h"
#include "gtsb16.h"
#include "gtsb17.h"
#include "gtsb18.h"
#include "gtsb19.h"
#include "gtsb20.h"
#include "gtsb23.h"
#include "gtsb24.h"
#include "gtsb25.h"
#include "gtsb26.h"
#include "gtsb28.h"
#include "gtsb29.h"
#include "gtsb30.h"
#include "gtsb31.h"
#include "gtsb32.h"
#include "gtsb33.h"
#include "gtsb34.h"
#include "gtsb35.h"
#include "gtsb36.h"
#include "gtsb37.h"
#include "gtsb38.h"
#include "gtsb39.h"
#include "gtstfk.h"
#include "gtstlm.h"
#include "gtstzt.h"


void Dialogabbrechen ()
{
  EndeEingabe = false;
  GTSSpace->MySelection()->removeAll();
  GTSSpace->flushAllViews();
  Meld.StatusZeile (Meld.getSpeicher(), true);
} // ENDE Dialogabbrechen

void getBausteinTypen ()
{
  Ustring Buffer = TgbBibliothek->BausteinNamen();
  sprintf(DlgBuffer, "%s",  (char*) Buffer.str());
}  // ENDE getBausteinTypen

void getVariantTypenUeberBsttyp (const char *argv4)
{
  GeoObject   *selObj;
  typBaustein *zbst;
  Ustring     buf;
  selObj = GTSSpace->MySelection()->SelectedObjects().First ();
  zbst   = GTSMAP.findKey (*selObj);
  if (zbst)
   buf = "{";
   buf += TgbBibliothek->VariantNamenUeberBausteintyp(ArgInt(argv4));
   buf += "} {";
   buf += zbst->getName();
   buf += "}";
  sprintf(DlgBuffer, "%s",  (char*) buf.str());
}  // ENDE getVariantTypenUeberBsttyp

void getVariantTypenUeberIndex (const char *argv3)
{
  Ustring Buffer =
     TgbBibliothek->VariantNamenUeberIndex(ArgInt(argv3));
  sprintf(DlgBuffer, "%s",  (char*) Buffer.str());
}  // ENDE getVariantTypenUeberIndex

void BstErsetzen (const char *argv5)
{
  GeoObject   *selObj;
  typBaustein *zbst;
  BstVariante *zaufTGB;
  Ustring     buf;
  selObj = GTSSpace->MySelection()->SelectedObjects().First ();
  zbst   = GTSMAP.findKey (*selObj);
  if (zbst)
  {
   LCursor<BstBasis> zhilfe;
   zhilfe = TgbBibliothek->BsttypInListe (zbst->i_BstTyp());
   zaufTGB = zhilfe()->findBstUeberIndex (ArgInt(argv5));
   TgbBibliothek->Oeffnen();
   TgbBibliothek->LeseBaustein (zaufTGB->getTyp(), zaufTGB->getVariante());
   TgbBibliothek->Schliessen();
   zbst->VarianteErsetzen (zaufTGB);
  }
}  // ENDE BstErsetzen

void BstErzeugen (const char *argv3, const char *argv4)
{
  Meld.deleteSpeicher();
  BstVariante *zaufTGB;
  typBaustein    *zbst = NULL;
  zaufTGB = TgbBibliothek->SucheBausteinUeberIndex (ArgInt(argv3), ArgInt(argv4));
  if (zaufTGB == NULL)
  {
    Msg.Warning ("BstErzeugen",
                 "Baustein mit Bst.Index=%d und Var.Index=%d nicht vorhanden",
                  ArgInt(argv3), ArgInt(argv3));
    sprintf(DlgBuffer, "%d", 0);
    return;
  }
  TgbBibliothek->Oeffnen();
  TgbBibliothek->LeseBaustein (zaufTGB->getTyp(), zaufTGB->getVariante());
  TgbBibliothek->Schliessen();
  int nr = BausteinListe->FreieBstNummer();
  switch (zaufTGB->getTyp())
  {
    case tLayout
         : zbst = new typBSTLayout              (zaufTGB, nr); break;
    case tQuelle
         : zbst = new typBSTQuelle              (zaufTGB, nr); break;
    case tSenke
         : zbst = new typBSTSenke               (zaufTGB, nr); break;
    case tLinearStaufoerderer
         : zbst = new typBSTStaufoerderer       (zaufTGB, nr); break;
    case tWeiche
         : zbst = new typBSTWeiche              (zaufTGB, nr); break;
    case tVWagen
         : zbst = new typBSTVWagen              (zaufTGB, nr); break;
    case tGasse
         : zbst = new typBSTGasse               (zaufTGB, nr); break;
    case tMaschine
         : zbst = new typBSTMaschine            (zaufTGB, nr); break;
    case tDrehpuffer
         : zbst = new typBSTDrehpuffer          (zaufTGB, nr); break;
    case tMehrfachLader
         : zbst = new typBSTMehrfachLader       (zaufTGB, nr); break;
    case tLaufkran
         : zbst = new typBSTLaufkran            (zaufTGB, nr); break;
    case tAbstrakteRegaleinheit
         : zbst = new typBSTAbstrakteRegaleinheit (zaufTGB, nr); break;
    case tRechtsKurveStaufoerderer
         : zbst = new typBSTRechtsKurveStaufoerderer (zaufTGB, nr); break;
    case tLinksKurveStaufoerderer
         : zbst = new typBSTLinksKurveStaufoerderer  (zaufTGB, nr); break;
    case tSammler
         : zbst = new typBSTSammler             (zaufTGB, nr); break;
    case tVereinzeler
         : zbst = new typBSTVereinzeler         (zaufTGB, nr); break;     
    case tRegaleinheit
         : zbst = new typBSTRegaleinheit        (zaufTGB, nr); break;
    case tRegalverwalter
         : zbst = new typBSTRegalverwalter      (zaufTGB, nr); break;
    case tNcPoolverwalter
         : zbst = new typBSTNcPoolverwalter     (zaufTGB, nr); break;
    case tKettenfoerderer
         : zbst = new typBSTKettenfoerderer     (zaufTGB, nr); break;
    case tQuerfoerderer
         : zbst = new typBSTQuerfoerderer       (zaufTGB, nr); break;
    case tKommissionierer
         : zbst = new typBSTKommissionierer     (zaufTGB, nr); break;
    case tKomVerwalter
         : zbst = new typBSTKomVerwalter        (zaufTGB, nr); break;
    case tFtsLadepool
         : zbst = new typBSTFtsLadepool         (zaufTGB, nr); break;
    case tFtsLadeplatz
         : zbst = new typBSTFtsLadeplatz        (zaufTGB, nr); break;
    case tFtsVerwalter
         : zbst = new typBSTFtsVerwalter        (zaufTGB, nr); break;
    case tFtsWagen
         : zbst = new typBSTFtsWagen            (zaufTGB, nr); break;
    case tFtsEinbahnstrecke
         : zbst = new typBSTFtsEinbahnstrecke   (zaufTGB, nr); break;
    case tFtsZweibahnstrecke
         : zbst = new typBSTFtsZweibahnstrecke  (zaufTGB, nr); break;
    case tFtsKurve
         : zbst = new typBSTFtsKurve            (zaufTGB, nr); break;
    case tFtsAbzweigung
         : zbst = new typBSTFtsAbzweigung       (zaufTGB, nr); break;
    case tFtsKreuzung
         : zbst = new typBSTFtsKreuzung         (zaufTGB, nr); break;
    case tFtsEinbahnMitInhalt
         : zbst = new typBSTFtsEinbahnMitInhalt (zaufTGB, nr); break;
    case tFtsZweibahnMitInhalt
         : zbst = new typBSTFtsZweibahnMitInhalt(zaufTGB, nr); break;
    case tFtsEndstrecke
         : zbst = new typBSTFtsEndstrecke       (zaufTGB, nr); break;
    default : Msg.Warning ("BstErzeugen",
                 "Bausteintyp %d nicht implementiert",
                  zaufTGB->getTyp());
  } // ENDE switch

  if (zbst)
  {
    BausteinListe->BstInListe (*zbst);
    GTSSpace->MySelection()->removeAll();
    GTSSpace->MySelection()->insert (*(GTSMAP.find (*zbst)));
    Tcl_Eval (GTSInterpreter, (char*)Ustring("SetzBstButton {active}").str());
    sprintf(DlgBuffer, "%d", 1);
  }
  else
  sprintf(DlgBuffer, "%d", 0);
}  // ENDE BstErzeugen

void BstDuplizieren ()
{
  List<typBstZeiger> lst;
  typBaustein *zbst;
  typBaustein *zcopy;
  GeoObject   *selObj;
  
  for (selObj = GTSSpace->MySelection()->SelectedObjects().First ();
       (GTSSpace->MySelection()->SelectedObjects())();
        selObj = GTSSpace->MySelection()->SelectedObjects().Next()) 
  {
    zcopy = GTSMAP.findKey (*selObj);
    if (zcopy)
    {
      int nr = BausteinListe->FreieBstNummer();
      switch (zcopy->i_BstTyp())
      {
        case tLayout
         : zbst = new typBSTLayout              (*((typBSTLayout*)zcopy), nr); break;
        case tQuelle
         : zbst = new typBSTQuelle              (*((typBSTQuelle*)zcopy), nr); break;
        case tSenke
         : zbst = new typBSTSenke               (*((typBSTSenke*)zcopy), nr); break;
        case tLinearStaufoerderer
         : zbst = new typBSTStaufoerderer       (*((typBSTStaufoerderer*)zcopy), nr); break;
        case tWeiche
         : zbst = new typBSTWeiche              (*((typBSTWeiche*)zcopy), nr); break;
        case tVWagen
         : zbst = new typBSTVWagen              (*((typBSTVWagen*)zcopy), nr); break;
        case tGasse
         : zbst = new typBSTGasse               (*((typBSTGasse*)zcopy), nr); break;
        case tMaschine
         : zbst = new typBSTMaschine            (*((typBSTMaschine*)zcopy), nr); break;
        case tDrehpuffer
         : zbst = new typBSTDrehpuffer          (*((typBSTDrehpuffer*)zcopy), nr); break;
        case tMehrfachLader
         : zbst = new typBSTMehrfachLader       (*((typBSTMehrfachLader*)zcopy), nr); break;
        case tLaufkran
         : zbst = new typBSTLaufkran            (*((typBSTLaufkran*)zcopy), nr); break;
        case tAbstrakteRegaleinheit
         : zbst = new typBSTAbstrakteRegaleinheit (*((typBSTAbstrakteRegaleinheit*)zcopy), nr); break;
        case tRechtsKurveStaufoerderer
         : zbst = new typBSTRechtsKurveStaufoerderer (*((typBSTRechtsKurveStaufoerderer*)zcopy), nr); break;
        case tLinksKurveStaufoerderer
         : zbst = new typBSTLinksKurveStaufoerderer  (*((typBSTLinksKurveStaufoerderer*)zcopy), nr); break;
        case tSammler
         : zbst = new typBSTSammler             (*((typBSTSammler*)zcopy), nr); break;
        case tVereinzeler
         : zbst = new typBSTVereinzeler         (*((typBSTVereinzeler*)zcopy), nr); break;
        case tRegaleinheit
         : zbst = new typBSTRegaleinheit        (*((typBSTRegaleinheit*)zcopy), nr); break;
        case tRegalverwalter
         : zbst = new typBSTRegalverwalter      (*((typBSTRegalverwalter*)zcopy), nr); break;
        case tNcPoolverwalter
         : zbst = new typBSTNcPoolverwalter     (*((typBSTNcPoolverwalter*)zcopy), nr); break;
        case tKettenfoerderer
         : zbst = new typBSTKettenfoerderer     (*((typBSTKettenfoerderer*)zcopy), nr); break;
        case tQuerfoerderer
         : zbst = new typBSTQuerfoerderer       (*((typBSTQuerfoerderer*)zcopy), nr); break;
        case tKommissionierer
         : zbst = new typBSTKommissionierer     (*((typBSTKommissionierer*)zcopy), nr); break;
        case tKomVerwalter
         : zbst = new typBSTKomVerwalter        (*((typBSTKomVerwalter*)zcopy), nr); break;
        case tFtsLadepool
         : zbst = new typBSTFtsLadepool         (*((typBSTFtsLadepool*)zcopy), nr); break;
        case tFtsLadeplatz
         : zbst = new typBSTFtsLadeplatz        (*((typBSTFtsLadeplatz*)zcopy), nr); break;
        case tFtsVerwalter
         : zbst = new typBSTFtsVerwalter        (*((typBSTFtsVerwalter*)zcopy), nr); break;
        case tFtsWagen
         : zbst = new typBSTFtsWagen            (*((typBSTFtsWagen*)zcopy), nr); break;
        case tFtsEinbahnstrecke
         : zbst = new typBSTFtsEinbahnstrecke   (*((typBSTFtsEinbahnstrecke*)zcopy), nr); break;
        case tFtsZweibahnstrecke
         : zbst = new typBSTFtsZweibahnstrecke  (*((typBSTFtsZweibahnstrecke*)zcopy), nr); break;
        case tFtsKurve
         : zbst = new typBSTFtsKurve            (*((typBSTFtsKurve*)zcopy), nr); break;
        case tFtsAbzweigung
         : zbst = new typBSTFtsAbzweigung       (*((typBSTFtsAbzweigung*)zcopy), nr); break;
        case tFtsKreuzung
         : zbst = new typBSTFtsKreuzung         (*((typBSTFtsKreuzung*)zcopy), nr); break;
        case tFtsEinbahnMitInhalt
         : zbst = new typBSTFtsEinbahnMitInhalt (*((typBSTFtsEinbahnMitInhalt*)zcopy), nr); break;
        case tFtsZweibahnMitInhalt
         : zbst = new typBSTFtsZweibahnMitInhalt(*((typBSTFtsZweibahnMitInhalt*)zcopy), nr); break;
        case tFtsEndstrecke
         : zbst = new typBSTFtsEndstrecke       (*((typBSTFtsEndstrecke*)zcopy), nr); break;
       default : Msg.Warning ("BstKopieren",
                              "Bausteintyp %d nicht implementiert",
                               zcopy->i_BstTyp());
      } // ENDE switch
      BausteinListe->BstInListe (*zbst);
      lst.append(*(new typBstZeiger (zbst)));
    }
  }
  GTSSpace->flushAllViews();
  GTSSpace->MySelection()->removeAll();

  LCursor<typBstZeiger> zhilfe;
  for (zhilfe = lst; zhilfe; zhilfe++)
       GTSSpace->MySelection()->insert (*(GTSMAP.find (*(zhilfe()->zBst))));
  while (!lst.isEmpty()) delete lst.removeFirst();
}  // ENDE BstDuplizieren

void BstLoeschen ()
{
  GeoObject   *selObj;
  typBaustein *zloesch;
  for (selObj = GTSSpace->MySelection()->SelectedObjects().First ();
       (GTSSpace->MySelection()->SelectedObjects())();
        selObj = GTSSpace->MySelection()->SelectedObjects().Next())
  {
    zloesch = GTSMAP.findKey (*selObj);
    if (zloesch)
    {
      BausteinListe->BstAusListe (zloesch);
      GTSSpace->MySelection()->remove(*selObj);
      delete (zloesch);
      Tcl_Eval (GTSInterpreter, (char*)Ustring("SetzBstButton {disabled}").str());
      Tcl_Eval (GTSInterpreter,(char*)Ustring("SetzAusrichtButton {disabled}").str());
      if (BausteinListe->Leer())
         Tcl_Eval (GTSInterpreter,
                  (char*)Ustring("SetzMenueStatus {disabled}").str());
    }
  }
  GTSSpace->flushAllViews();
}  // ENDE BstLoeschen

void BstListeNumerieren ()
{
  GTSSpace->MySelection()->removeAll();
  if (BausteinListe->Sortieren()) Meld.Ausgabe (190);
}  // ENDE BstListeNumerieren

void AllesAuswaehlen ()
{
  BausteinListe->AllesAuswaehlen();
  if (GTSSpace->MySelection()->SelectedObjects().Count())
  {
    Tcl_Eval (GTSInterpreter, (char*)Ustring("SetzMenueStatus {active}").str());
    Tcl_Eval (GTSInterpreter, (char*)Ustring("SetzBstButton {active}").str());
    if (GTSSpace->MySelection()->SelectedObjects().Count() > 1)
       Tcl_Eval (GTSInterpreter,(char*)Ustring("SetzAusrichtButton {active}").str());
  }
}  // ENDE AllesAuswaehlen

void ModellLoeschen ()
{
  Meld.deleteSpeicher();
  GTSSpace->MySelection()->removeAll();
  BausteinListe->Loeschen();
  ProzessListe->loeschen();
  EreignisListe->loeschen();
  GTSSpace->flushAllViews();
  Tcl_Eval (GTSInterpreter, (char*)Ustring("SetzMenueStatus {disabled}").str());
  Tcl_Eval (GTSInterpreter, (char*)Ustring("SetzBstButton {disabled}").str());
  Tcl_Eval (GTSInterpreter, (char*)Ustring("SetzAusrichtButton {disabled}").str());
  GTSCB.setToObjectMoving();
}  // ENDE ModellLoeschen

void Ausrichten (const Ustring Richtung)
{
  GeoObject   *selObj = GTSSpace->MySelection()->SelectedObjects().First ();
  typBaustein *zbst   = GTSMAP.findKey (*selObj);
  typBaustein *zhilfe;
  Vec3D BstPos;
  Vec3D RefPos = zbst->zBstGraphik->Pos();
  for (selObj = GTSSpace->MySelection()->SelectedObjects().Next ();
       (GTSSpace->MySelection()->SelectedObjects())();
        selObj = GTSSpace->MySelection()->SelectedObjects().Next())
  {
    zhilfe = GTSMAP.findKey (*selObj);
    BstPos = zhilfe->zBstGraphik->Pos();
    if (Richtung == "HORIZONTAL")
      zhilfe->zBstGraphik->setPos (Vec3D(BstPos.X(), RefPos.Y(), BstPos.Z()));
    else
      zhilfe->zBstGraphik->setPos (Vec3D(RefPos.X(), BstPos.Y(), BstPos.Z()));
  }
  GTSSpace->flushAllViews();
}  // ENDE Ausrichten

int DlgGrafik (ClientData /*clientData*/,
                     Tcl_Interp *interp, int argc, const char *argv[])
{
  GTSInterpreter = interp;
  if (testprog) {
    Write("DlgGrafik: Anfang >%s<", argv[1]);
    for (int i = 2; i <= argc; i++) Write(" >%s< ", argv[i]);
  }
  sprintf(DlgBuffer, "%s", "");

  Tcl_Eval (GTSInterpreter, "DeleteFloatMenue");
  if (!strcmp("BSTERZEUGEN", argv[1]))
  {
    if      (!strcmp("BASISTYP",    argv[2])) getBausteinTypen ();
    else if (!strcmp("VARIANTTYP",  argv[2])) getVariantTypenUeberIndex (argv[3]);
    else if (!strcmp("BSTERZEUGEN", argv[2])) BstErzeugen      (argv[3], argv[4]);
    else     sprintf(DlgBuffer, "Fehler in Baustein erzeugen!!!");
  }
  else if (!strcmp("BSTERSETZEN", argv[1]))
  {
    if      (!strcmp("INFO",        argv[2])) getVariantTypenUeberBsttyp (argv[4]);
    else if (!strcmp("BSTERSETZEN", argv[2])) BstErsetzen                (argv[5]);
    else     sprintf(DlgBuffer, "Fehler in Baustein ersetzen!!!");
  }
  else if (!strcmp("BSTDUPLIZIEREN",  argv[1])) BstDuplizieren ();
  else if (!strcmp("BSTLOESCHEN",     argv[1])) BstLoeschen ();
  else if (!strcmp("BSTNUMERIEREN",   argv[1])) BstListeNumerieren ();
  else if (!strcmp("ALLESAUSWAEHLEN", argv[1])) AllesAuswaehlen ();
  else if (!strcmp("MODELLLOESCHEN",  argv[1])) ModellLoeschen ();
  else if (!strcmp("AUSRICHTEN",      argv[1])) Ausrichten(Ustring(argv[2]));
  else if (!strcmp("ZoomHandling",    argv[1])) GTSCB.setToZooming ();
  else if (!strcmp("CameraHandling",  argv[1])) GTSCB.setToCamera ();
  else if (!strcmp("ObjectMoving",    argv[1])) GTSCB.setToObjectMoving ();
  else if (!strcmp("ObjectRotating",  argv[1])) GTSCB.setToObjectRotation ();
  else if (!strcmp("DIALOGABBRUCH",   argv[1])) Dialogabbrechen();
  // Text verschieben etc.
  else if (!strcmp ("ObjectManipulating", argv[1])) {
  }
  // Arbeitsplaene
  else if (!strcmp ("WorkScheduling", argv[1])) {
    GTSCB.setToWorkScheduling ();
  }
  else if (!strcmp ("ShowGrid", argv[1])) {
    if (argc > 2)
    {
      if (atoi (argv[2]))
        GTSView->showGrid ();
      else
        GTSView->hideGrid ();
      GTSView->flush ();
    }
  }
  else if (!strcmp ("ConfigGrid", argv[1])) {
    if (argc > 8)
      GTSView->setGrid (atoi (argv[2]),
         Vec3D (atof (argv[3]), atof (argv[4]), atof (argv[5])),
         Vec3D (atof (argv[6]), atof (argv[7]), atof (argv[8])));
  }
  else if (!strcmp ("setAnsicht", argv[1])) {
    MainViewHandler->Ansicht (Ustring(argv[2]));
  }
  else if (!strcmp ("GETBAUSTEINRASTER", argv[1])) {
        sprintf(DlgBuffer, "%f", MainViewHandler->getRasterWeite());
  }
  else if (!strcmp ("SETBAUSTEINRASTER", argv[1])) {
        MainViewHandler->setRasterWeite(atof (argv[2]));
  }
  else
  {
    sprintf (DlgBuffer, "DlgGrafik: Unbekannte Methode \"%.32s\"\n " , argv[1]);
    Tcl_SetResult( interp, DlgBuffer, TCL_STATIC );
    return TCL_ERROR;
  }
  if (testprog) Write("  -> Ende: DlgBuffer >%s<\n", DlgBuffer);
  Tcl_SetResult(interp, DlgBuffer, TCL_STATIC);
  return TCL_OK;
} //  ENDE DlgGrafik

