-
Pierre Saramito authoredPierre Saramito authored
page1_simulation.py 14.54 KiB
from tkinter import *
from tkinter import ttk
from vertical_canvas import *
from lavaview_variable import *
import os
import functools
#import plotly.plotly as py
import pymap
dark_grey = "#282827"
light_grey = "#484845"
class page1():
"""
A class to create the first page about the domain
"""
def __init__(self, parent, mytitle, *args, **kw):
self.parent=parent
self.dir_path = os.path.dirname(os.path.abspath(__file__))
f = parent.n.add(mytitle)
parent.n.tab(mytitle).configure(background=dark_grey,fg="white")
self.scrollable_canvas = VerticalScrolledFrame(f)
self.scrollable_canvas.pack(fill = 'both', expand = 1)
parent.n.tab(mytitle).bind('<1>',self.reset_the_view,add="+") #reset the view after click on tabs
main_window = self.scrollable_canvas.interior
# Create a frame to center all widgets
center_Frame = Frame(main_window)
center_Frame.pack()
center_Frame.configure(borderwidth=0, bg=dark_grey)
Label(center_Frame,text="Simulation domain setting",font=("Helvetica", 16, "bold"), bg=dark_grey, fg= "white").grid(row=0,column=0,columnspan=3,padx = 5, pady = 5)
Label(center_Frame,text="Select DEM", bg=dark_grey, fg= "white").grid(row=1,column=0,padx = 5, pady = 5)
self.select_map = Listbox(center_Frame,height=3,exportselection=False,selectmode='single')
self.select_map.insert('end', "Reunion island (2008)")
self.select_map.insert('end', "Kilauea lava flow (1974)")
self.select_map.insert('end', "Etna (2001)")
self.select_map.grid(sticky = "w", row=1, column=1, columnspan = 2, padx = 5, pady = 5)
self.selected_item = IntVar()
self.selected_item.set(0)
self.select_map.select_set(self.selected_item.get())
self.select_map.bind("<<ListboxSelect>>", self.updateLabel)
self.xmin = 0
self.xmax = 0
self.ymin = 0
self.ymax = 0
#self.info_DEM_Label=Label(main_window, bg=dark_grey, fg= "white")
self.utm_zone = Lavaview_variable(center_Frame,"UTM grid zone", "UTM grid zone (<< longitudinal zone number >><< latitudinal zone letter >>, \n ex: the southern end of South America is 19F)","40K",2,0,dark_grey)
self.main_vent_xe_variable = Lavaview_scale_variable(center_Frame,0,1000,1,1,"main vent position E (UTM coordinates)","the main vent position E in UTM coordinates (m)", 0,3,0,dark_grey)
self.main_vent_ye_variable = Lavaview_scale_variable(center_Frame,0,1000,1,1,"main vent position N (UTM coordinates)","the main vent position N in UTM coordinates (m)", 0,4,0,dark_grey)
self.south_variable = Lavaview_scale_variable(center_Frame,0,1000,100,1,"south","south extension", 1000,5,0,dark_grey)
self.est_variable = Lavaview_scale_variable(center_Frame,0,1000,100,1,"est","est extension",1000,6,0,dark_grey)
self.north_variable = Lavaview_scale_variable(center_Frame,0,1000,100,1,"north","north extension", 1000,7,0,dark_grey)
self.west_variable = Lavaview_scale_variable(center_Frame,0,1000,100,1,"west", "west extension", 1000,8,0,dark_grey)
self.main_vent_xe_variable.Myvar.trace("w", self.callback_trace_xe)
self.main_vent_ye_variable.Myvar.trace("w", self.callback_trace_ye)
self.south_variable.Myvar.trace("w", self.callback_trace_south)
self.est_variable.Myvar.trace("w", self.callback_trace_est)
self.north_variable.Myvar.trace("w", self.callback_trace_north)
self.west_variable.Myvar.trace("w", self.callback_trace_west)
self.main_vent_xe_variable.Myscale.config(command=self.callback_scale_xe)
self.main_vent_ye_variable.Myscale.config(command=self.callback_scale_ye)
self.south_variable.Myscale.config(command=self.callback_scale_south)
self.est_variable.Myscale.config(command=self.callback_scale_est)
self.north_variable.Myscale.config(command=self.callback_scale_north)
self.west_variable.Myscale.config(command=self.callback_scale_west)
self.main_vent_xe_variable.MyEntry.bind('<FocusOut>', self.controle_value_xe)
self.main_vent_ye_variable.MyEntry.bind('<FocusOut>', self.controle_value_ye)
self.south_variable.MyEntry.bind('<FocusOut>', functools.partial(self.controle_value, variable=self.south_variable))
self.est_variable.MyEntry.bind('<FocusOut>', functools.partial(self.controle_value, variable=self.est_variable))
self.north_variable.MyEntry.bind('<FocusOut>', functools.partial(self.controle_value, variable=self.north_variable))
self.west_variable.MyEntry.bind('<FocusOut>', functools.partial(self.controle_value, variable=self.west_variable))
self.reso_variable = Lavaview_variable(center_Frame,"resolution", "resolution of DEM (m)", 10,9,0,dark_grey)
self.message_Label=Label(main_window, bg=dark_grey, fg= "white")
self.updateLabel() #default value (reunion volcano)
Frame_for_button=Frame(main_window,bg=dark_grey)
Frame_for_button.pack(padx = 5, pady = 5)
generate_mesh_button = ttk.Button(Frame_for_button, text = 'Generate mesh and DEM files', command = lambda:self.generate_mesh_command(parent))
generate_mesh_button.grid(row=0,column=0, padx = 5, pady = 5)
view_DEM_button = ttk.Button(Frame_for_button, text = 'View DEM with Paraview', command = self.view_DEM)
view_DEM_button.grid(row=0,column=1, padx = 5, pady = 5)
view_map_button = ttk.Button(center_Frame, text = 'View map', command = self.view_map)
view_map_button.grid(row=9,column=2, padx = 5, pady = 5)
next_from_1_to_2 = ttk.Button(Frame_for_button, text = 'Next', command = lambda:parent.n.nextpage())
next_from_1_to_2.grid(row=1,column=0, columnspan=2, padx = 5, pady = 25)
def reset_the_view(self, event):
self.scrollable_canvas.canvas.xview_moveto(0)
self.scrollable_canvas.canvas.yview_moveto(0)
def update_DEM_limit(self): # update values of xmin,xmax,ymin,ymax
path = self.parent.parent.dir_path
if self.selected_item.get()==0:
self.xmin=float(os.popen("head -n 1 "+path+"/reunion_5m_volcano.xyz | awk \'{print $1}\'").read().rstrip())
self.xmax=float(os.popen("tail -n 1 "+path+"/reunion_5m_volcano.xyz | awk \'{print $1}\'").read().rstrip())
self.ymin=float(os.popen("tail -n 1 "+path+"/reunion_5m_volcano.xyz | awk \'{print $2}\'").read().rstrip())
self.ymax=float(os.popen("head -n 1 "+path+"/reunion_5m_volcano.xyz | awk \'{print $2}\'").read().rstrip())
self.utm_zone.Myvar.set("40K")
elif self.selected_item.get()==1:
self.xmin=float(os.popen("head -n 1 "+path+"/kilauea1974_2m.xyz | awk \'{print $1}\'").read().rstrip())
self.xmax=float(os.popen("tail -n 1 "+path+"/kilauea1974_2m.xyz | awk \'{print $1}\'").read().rstrip())
self.ymin=float(os.popen("tail -n 1 "+path+"/kilauea1974_2m.xyz | awk \'{print $2}\'").read().rstrip())
self.ymax=float(os.popen("head -n 1 "+path+"/kilauea1974_2m.xyz | awk \'{print $2}\'").read().rstrip())
self.utm_zone.Myvar.set("5Q")
elif self.selected_item.get()==2:
self.xmin=float(os.popen("head -n 1 "+path+"/etna2001_10m.xyz | awk \'{print $1}\'").read().rstrip())
self.xmax=float(os.popen("tail -n 1 "+path+"/etna2001_10m.xyz | awk \'{print $1}\'").read().rstrip())
self.ymin=float(os.popen("tail -n 1 "+path+"/etna2001_10m.xyz | awk \'{print $2}\'").read().rstrip())
self.ymax=float(os.popen("head -n 1 "+path+"/etna2001_10m.xyz | awk \'{print $2}\'").read().rstrip())
self.utm_zone.Myvar.set("33S")
#self.info_DEM_Label.config(text="xmin = "+str(self.xmin)+", xmax = "+str(self.xmax)+", ymin = "+str(self.ymin)+", ymax = "+str(self.ymax))
#self.info_DEM_Label.pack(padx = 5, pady = 5)
def update_scale(self,variable,min_value,max_value):
if (variable.min_scale_value.get()!=min_value) or (variable.max_scale_value.get()!=max_value):
variable.min_scale_value.set(min_value)
variable.max_scale_value.set(max_value)
variable.my_interval = (max_value - min_value)/1.0
variable.Myscale.config(from_=min_value, to=max_value,tickinterval=variable.my_interval)
#if (float(variable.Myvar.get())>max_value) or (float(variable.Myvar.get())<min_value):
variable.Myvar.set(str(0.5*(max_value+min_value)))
def update_vent_position(self):
xmin=self.xmin
xmax=self.xmax
ymin=self.ymin
ymax=self.ymax
self.update_scale(self.main_vent_xe_variable,xmin,xmax)
self.update_scale(self.main_vent_ye_variable,ymin,ymax)
def update_scale_cardinaux(self):
xe=float(self.main_vent_xe_variable.Myvar.get())
ye=float(self.main_vent_ye_variable.Myvar.get())
xmin=self.xmin
xmax=self.xmax
ymin=self.ymin
ymax=self.ymax
self.update_scale(self.south_variable,0,ye-ymin)
self.update_scale(self.est_variable,0,xmax-xe)
self.update_scale(self.north_variable,0,ymax-ye)
self.update_scale(self.west_variable,0,xe-xmin)
def updateLabel(self, event=None): # event when choose DEM
print("change of DEM")
line = self.select_map.curselection()[0]
self.selected_item.set(line)
self.update_DEM_limit()
self.update_vent_position()
self.update_scale_cardinaux()
def inside_callback_trace(self,variable):
if (variable.Myvar.get()!=""):
try:
variable.Myscalevar.set(float(variable.Myvar.get()))
self.update_xe_vents_p3(self.main_vent_xe_variable.Myscalevar.get())
self.update_ye_vents_p3(self.main_vent_ye_variable.Myscalevar.get())
except:
variable.Myvar.set(str(variable.Myscalevar.get()))
def callback_trace_xe(self,*args):
if (self.main_vent_xe_variable.Myvar.get()!=""):
try:
self.main_vent_xe_variable.Myscalevar.set(float(self.main_vent_xe_variable.Myvar.get()))
self.modif_from_xe(self.main_vent_xe_variable.Myscalevar.get())
except:
self.main_vent_xe_variable.Myvar.set(str(self.main_vent_xe_variable.Myscalevar.get()))
def callback_trace_ye(self,*args):
if (self.main_vent_ye_variable.Myvar.get()!=""):
try:
self.main_vent_ye_variable.Myscalevar.set(float(self.main_vent_ye_variable.Myvar.get()))
self.modif_from_ye(self.main_vent_ye_variable.Myscalevar.get())
except:
self.main_vent_ye_variable.Myvar.set(str(self.main_vent_ye_variable.Myscalevar.get()))
def callback_trace_south(self,*args):
self.inside_callback_trace(self.south_variable)
def callback_trace_est(self,*args):
self.inside_callback_trace(self.est_variable)
def callback_trace_north(self,*args):
self.inside_callback_trace(self.north_variable)
def callback_trace_west(self,*args):
self.inside_callback_trace(self.west_variable)
def controle_value(self,event=None,variable=None):
if (event!='mouv_scale') and (float(variable.Myvar.get())==variable.Myscalevar.get()):
return False
else:
variable.Myvar.set(str(variable.Myscalevar.get()))
return True
def callback_scale_xe(self,*args):
self.controle_value_xe('mouv_scale')
def callback_scale_ye(self,*args):
self.controle_value_ye('mouv_scale')
def callback_scale_south(self,*args):
self.controle_value('mouv_scale',self.south_variable)
def callback_scale_est(self,*args):
self.controle_value('mouv_scale',self.est_variable)
def callback_scale_north(self,*args):
self.controle_value('mouv_scale',self.north_variable)
def callback_scale_west(self,*args):
self.controle_value('mouv_scale',self.west_variable)
def update_xe_vents_p3(self,xe):
est = float(self.est_variable.Myvar.get())
west = float(self.west_variable.Myvar.get())
xmin_value = xe-west
xmax_value = xe+est
for vent in self.parent.p3.hot_spot_Frame.vent_frame_list:
self.update_scale(vent.xe_variable,xmin_value,xmax_value)
self.parent.p3.hot_spot_Frame.vent_frame_list[0].xe_variable.Myvar.set(self.main_vent_xe_variable.Myvar.get())
def modif_from_xe(self,xe):
xmin=self.xmin
xmax=self.xmax
self.update_scale(self.west_variable,0,xe-xmin)
self.update_scale(self.est_variable,0,xmax-xe)
self.update_xe_vents_p3(xe)
def update_ye_vents_p3(self,ye):
south = float(self.south_variable.Myvar.get())
north = float(self.north_variable.Myvar.get())
ymin_value = ye-south
ymax_value = ye+north
for vent in self.parent.p3.hot_spot_Frame.vent_frame_list:
self.update_scale(vent.ye_variable,ymin_value,ymax_value)
self.parent.p3.hot_spot_Frame.vent_frame_list[0].ye_variable.Myvar.set(self.main_vent_ye_variable.Myvar.get())
def modif_from_ye(self,ye):
ymin=float(self.ymin)
ymax=float(self.ymax)
self.update_scale(self.south_variable,0,ye-ymin)
self.update_scale(self.north_variable,0,ymax-ye)
self.update_ye_vents_p3(ye)
def controle_value_xe(self,event=None):
if self.controle_value(event,self.main_vent_xe_variable):
self.modif_from_xe(float(self.main_vent_xe_variable.Myvar.get()))
def controle_value_ye(self,event=None):
if self.controle_value(event,self.main_vent_ye_variable):
self.modif_from_ye(float(self.main_vent_ye_variable.Myvar.get()))
def write_domain_input(self):
xe = float(self.main_vent_xe_variable.Myvar.get())
ye = float(self.main_vent_ye_variable.Myvar.get())
south = float(self.south_variable.Myvar.get())
est = float(self.est_variable.Myvar.get())
north = float(self.north_variable.Myvar.get())
west = float(self.west_variable.Myvar.get())
reso = float(self.reso_variable.Myvar.get())
xmin = xe-west
xmax = xe+est
ymin = ye-south
ymax = ye+north
os.makedirs('tmp', exist_ok=True)
my_file = open("tmp/domain_input.gdat", "w") # erase file
my_file.write(str(xe)+" ")
my_file.write(str(ye)+" ")
my_file.write(str(south)+ " ")
my_file.write(str(est)+ " ")
my_file.write(str(north)+ " ")
my_file.write(str(west)+ " ")
my_file.write(str(reso)+ " ")
my_file.write(str(xmin)+ " ")
my_file.write(str(xmax)+ " ")
my_file.write(str(ymin)+ " ")
my_file.write(str(ymax))
my_file.close()
def generate_mesh_command(self, parent):
print("Generated of mesh (.geo) and DEM (.field)")
self.message_Label.pack_forget()
self.message_Label.config(text="It may take a few minutes ...")
self.message_Label.pack()
parent.configure(cursor='watch')
parent.update_idletasks()
parent.update()
self.write_domain_input()
if self.selected_item.get()==0:
os.system("sh "+self.dir_path+"/simulation_domain_fournaise_5m.sh \""+self.dir_path+"\"")
os.system(self.dir_path+"/smooth_DEM grille.geo P1 5 DEM_fournaise_5m.field > fh_smooth.field")
elif self.selected_item.get()==1:
os.system("sh "+self.dir_path+"/simulation_domain_kilauea_2m.sh")
os.system(self.dir_path+"/smooth_DEM grille.geo P1 5 DEM_hawaii_2m.field > fh_smooth.field")
elif self.selected_item.get()==2:
os.system("sh "+self.dir_path+"/simulation_domain_etna2001_10m.sh")
os.system(self.dir_path+"/smooth_DEM grille.geo P1 1 DEM_etna_10m.field > fh_smooth.field")
os.system("field fh_smooth.field -paraview -noclean -noexecute")
os.system("rm fh_smooth.py")
self.message_Label.config(text="mesh and DEM created")
parent.configure(cursor='')
def view_DEM(self):
print("open DEM with paraview")
os.system("paraview fh_smooth.vtk")
def view_map(self):
osm = pymap.mymap(self.utm_zone.Myvar.get(), self.xmin,self.xmax,self.ymin,self.ymax,self.south_variable,self.est_variable,self.north_variable,self.west_variable,self.parent.p3.hot_spot_Frame.vent_frame_list, self.parent.p5.shape_filename)