#*************************************************************
# Progamm:			fluisa_gitter_3d
# Sinn des Programms: 		Gittergenerator für 3d-Gitter
# Sinn der Einheit  :		Hauptprogramm	
# Name dieser Datei:		fluisa_gitter_3d_haupt.py
# Versionsnummer:		1
# Wird aufgerufen von:		-
# Ruft auf:			steuer.py, gitter.py, ausgabe.py
# Nummer im Programmpaket:	1
# von:				4			
# Autor: 			Armin Ulrich
# Erster Lauf: 			24.04.2023
# Letzte Änderung: 		20.07.2025
#*************************************************************

#*************************************************************
# Importieren der Klassen zur Zeitdokumentation
#*************************************************************

import time
import datetime

#*************************************************************
# Importieren der Klassen
#*************************************************************

from steuer import Steuer
from gitter import Gitter
from ausgabe import Ausgabe

steuer = Steuer()
gitter = Gitter()
ausgabe = Ausgabe()

print("gitter_3d:")

#*************************************************************
# Berechnung der Startzeit des Programmes mit:
# a) datetime
# b) time
# und Konvertieren der Startzeit zu einem String "datum_zeit"
#*************************************************************
dt_start = datetime.datetime.now()
lt_start = time.localtime()
jahr, monat, tag, stunde, minute, sekunde  = lt_start[0:6]
datum_zeit_anfang = "Start der Rechnung: \nDatum: " +str(tag)+"."+str(monat)+"."+str(jahr)+"\n"+"Zeit: "+str(stunde)+":"+str(minute)+":"+str(sekunde)

#*************************************************************
# Einlesen der Steuerdaten und Erfolgskontrolle
#*************************************************************
if(steuer.steuer_input()):
#*************************************************************
# Aufruf des Gitterrechners
#*************************************************************
  if gitter.gitter_rechner(steuer.gitter_typ,steuer.m,steuer.n,steuer.o, steuer.x_west, steuer.x_ost, steuer.y_süd, steuer.y_nord, steuer.z_unten,\
    steuer.z_oben): 
    ausgabe.ausgabe_rückgabeliste_init()     
    if steuer.schirm_ausgabe_wähler:
      if steuer.gitter_typ == "d":
        ausgabe.schirm_ausgabe_fdm(steuer.m, steuer.n, steuer.o, gitter.x, gitter.y, gitter.z, gitter.delta_x, gitter.delta_y, gitter.delta_z)
      elif steuer.gitter_typ == "v":
        ausgabe.schirm_ausgabe_fvm(steuer.m, steuer.n, steuer.o, gitter.x, gitter.y, gitter.z, gitter.delta_x, gitter.delta_y, gitter.delta_z,\
        gitter.x_gf, gitter.y_gf, gitter.z_gf, gitter.A_gf_we, gitter.A_gf_sn,  gitter.A_gf_bt, gitter.Delta_x, gitter.Delta_y, gitter.Delta_z, gitter.V)
      else:
        print("Fehler in Schirmausgabe.")        
        
    if steuer.datei_ausgabe_wähler:
      if steuer.gitter_typ == "d":
        ausgabe.datei_ausgabe_fdm(steuer.gitter_datei, steuer.index_ausgabe_wähler, steuer.ascii_bin,steuer.m, steuer.n, steuer.o, gitter.x, gitter.y,\
        gitter.z, gitter.delta_x, gitter.delta_y, gitter.delta_z)
      elif steuer.gitter_typ == "v":
        ausgabe.datei_ausgabe_fvm(steuer.gitter_datei, steuer.index_ausgabe_wähler, steuer.ascii_bin, steuer.m,steuer.n, steuer.o,gitter.x, gitter.y, \
        gitter.z, gitter.delta_x, gitter.delta_y, gitter.delta_z, gitter.x_gf, gitter.y_gf, gitter.z_gf, gitter.A_gf_we, gitter.A_gf_sn,  gitter.A_gf_bt,\
        gitter.Delta_x, gitter.Delta_y, gitter.Delta_z, gitter.V)
      else:
        print("Fehler im System") 
        
    if steuer.graphik_ausgabe_wähler:
      if steuer.gitter_typ == "d":
        ausgabe.graphik_ausgabe_fdm(steuer.m, steuer.n, steuer.o, gitter.x, gitter.y, gitter.z, steuer.graphik_datei_ausgabe_wähler,\
        steuer.graphik_datei_name, steuer.graphik_datei_format, steuer.graphik_titel)

      elif steuer.gitter_typ == "v":
        ausgabe.graphik_ausgabe_fvm(steuer.m, steuer.n, steuer.o, gitter.x, gitter.y, gitter.z, gitter.x_gf, gitter.y_gf, gitter.z_gf,\
        steuer.graphik_datei_ausgabe_wähler,steuer.graphik_datei_name, steuer.graphik_datei_format, steuer.graphik_titel)
      else:
        print("Fehler im System")
#*************************************************************
# Fehler bei der Gitterberechnung
#*************************************************************
  else:
    print( "Fehler bei der Berechnung des Gitters")

#*************************************************************
# Fehle beim Einlesen der Steuerdatei
#*************************************************************      
else:
  print(steuer.rückgabeliste[3])
#*************************************************************
# Berechnung der Endzeit des Programmes mit:
# a) datetime
# b) time
# und Konvertieren der Endzeit zu einem String "datum_zeit"
#*************************************************************
lt_end = time.localtime()
jahr, monat, tag, stunde, minute, sekunde  = lt_end[0:6]
datum_zeit_ende = "Ende der Rechnung: \nDatum: "+str(tag)+"."+str(monat)+"."+str(jahr)+"\n"+"Zeit: "+str(stunde)+":"+str(minute)+":"+str(sekunde)
dt_end = datetime.datetime.now()

#*************************************************************
# Berechnung der Rechendauer mit dem Zeitdifferenzoperator 
# des Moduls datetime
#*************************************************************
dauer = dt_end - dt_start

#*************************************************************
# Öffnen der log-Datei
#*************************************************************
fobj_log = open("fluisa_gitter_3d.log","w")

#*************************************************************
# Schreiben von Datum und Zeit des Programmstarts 
# in die Logdatei 
#*************************************************************
fobj_log.write(datum_zeit_anfang + "\n")

#*************************************************************
# Schreiben von Datum und Zeit des Programmendes und der 
# Rechendauer in die Logdatei 
#*************************************************************
fobj_log.write(datum_zeit_ende + "\n")
fobj_log.write("Rechendauer: "+ "\n" + str(dauer) + "\n")

fobj_log.write( steuer.rückgabeliste[1] + "\n")

if(steuer.rückgabeliste[4] == True):
  fobj_log.write(steuer.rückgabeliste[6] + "\n")
else:
  fobj_log.write("Keine manuelle Änderung der Steuerdaten." + "\n")
fobj_log.write(gitter.rückgabeliste[2] + "\n") 
fobj_log.write(str(ausgabe.rückgabeliste[2]) + "\n")
fobj_log.write(ausgabe.rückgabeliste[3] + "\n") 
fobj_log.write(ausgabe.rückgabeliste[4] + "\n")
fobj_log.write(ausgabe.rückgabeliste[5] + "\n") 
fobj_log.write(ausgabe.rückgabeliste[7] + "\n")
fobj_log.write(str(ausgabe.rückgabeliste[9]) + "\n") 

#*************************************************************
# Importieren der Klasse tkinter für GUI-Elemente
#*************************************************************
import tkinter
main = tkinter.Tk()

#*************************************************************
#Funktion zum Auflösen der Benutzeroberfläche
#*************************************************************
def ende():
  main.destroy()

#*************************************************************
# GUI-Fuktion
#*************************************************************    
lb_prozeß_ausgabe_zeit_anfang = tkinter.Label(main, text = datum_zeit_anfang)
lb_prozeß_ausgabe_zeit_anfang.pack()
lb_prozeß_ausgabe_zeit_ende = tkinter.Label(main, text = datum_zeit_ende)
lb_prozeß_ausgabe_zeit_ende.pack()
lb_prozeß_ausgabe_zeit_ende = tkinter.Label(main, text = "Rechenzeit:  " + str(dauer))
lb_prozeß_ausgabe_zeit_ende.pack()
lb_prozeß_ausgabe_steuer_datei = tkinter.Label(main, text = steuer.rückgabeliste[1])
lb_prozeß_ausgabe_steuer_datei.pack()             
lb_prozeß_ausgabe_steuer = tkinter.Label(main, text = steuer.rückgabeliste[3])
lb_prozeß_ausgabe_steuer.pack()
lb_prozeß_ausgabe_steuer_änderung = tkinter.Label(main, text = steuer.rückgabeliste[6])
lb_prozeß_ausgabe_steuer_änderung.pack()
lb_prozeß_ausgabe_gitter = tkinter.Label(main, text = gitter.rückgabeliste[1])
lb_prozeß_ausgabe_gitter.pack()
lb_prozeß_ausgabe_gitter_art = tkinter.Label(main, text = gitter.rückgabeliste[2])
lb_prozeß_ausgabe_gitter_art.pack()
lb_prozeß_ausgabe_schirm_ausgabe = tkinter.Label(main, text = ausgabe.rückgabeliste[1])
lb_prozeß_ausgabe_schirm_ausgabe.pack()
lb_prozeß_ausgabe_datei_ausgabe = tkinter.Label(main, text = ausgabe.rückgabeliste[3])
lb_prozeß_ausgabe_datei_ausgabe.pack()
lb_prozeß_ausgabe_gitter_datei_ascii_bin = tkinter.Label(main, text = ausgabe.rückgabeliste[4])
lb_prozeß_ausgabe_gitter_datei_ascii_bin.pack()
lb_prozeß_ausgabe_gitter_datei_indizes = tkinter.Label(main, text = ausgabe.rückgabeliste[5])
lb_prozeß_ausgabe_gitter_datei_indizes.pack()
lb_prozeß_ausgabe_gitter_graphik_ausgabe = tkinter.Label(main, text = ausgabe.rückgabeliste[7])
lb_prozeß_ausgabe_gitter_graphik_ausgabe.pack()
lb_prozeß_ausgabe_gitter_graphik_datei_ausgabe = tkinter.Label(main, text = ausgabe.rückgabeliste[9])
lb_prozeß_ausgabe_gitter_graphik_datei_ausgabe.pack()

#*************************************************************
# Schließen der Logdatei
#*************************************************************
fobj_log.close()
#*************************************************************
# Button zur Beendigung des Programms
#*************************************************************   
bende = tkinter.Button(main, text = "Ende",command = ende)
bende.pack()
#*************************************************************
# Endlosschleife
#*************************************************************
main.mainloop()
#*************************************************************
#Programmende
#*************************************************************


