Source code for gui.post_processing

import tkinter as tk
import matplotlib.pyplot as plt
from data_treat.make_report import make_report
from data_treat.data_pp import get_init_angle, get_impact_position, get_velocity
from gui.gui_utils import makeform, popupmsg
import os
import platform
import numpy as np


[docs]def pp_tab(root,frame, cam_top, cam_left, traj_3d): """Setup the post-processing tab :param root: tk root window :param frame: calibration tab frame object :param cam_top,cam_left: top and left camera objects :param traj_3d: Experiment object """ pic = tk.Frame(frame, width=500, height=350, highlightbackground="black", highlightthickness=1.) T = tk.Text(pic) T.insert(tk.END, '') T.pack() pic.pack(side=tk.TOP) params = tk.Frame(frame) vel_frame = tk.Frame(params) title = tk.Label(vel_frame, text="Velocity determination parameters") title.pack(side=tk.TOP) vels = makeform(vel_frame, ['Velocity detection factor', 'Initial index', 'Minimum number of points'], ["1.3", '1', '2']) angle_frame = tk.Frame(params) title = tk.Label(angle_frame, text="Angle determination parameters") title.pack(side=tk.TOP) angles = makeform(angle_frame, ['Initial index', 'End index'], ["0", "3"]) pos_frame = tk.Frame(params) title = tk.Label(angle_frame, text="Impact position parameters") title.pack(side=tk.TOP) pos = makeform(angle_frame, ['Threshold'], ["0.995"]) vel_frame.pack(side=tk.LEFT) angle_frame.pack(side=tk.LEFT) pos_frame.pack(side=tk.LEFT) params.pack(side=tk.TOP) save_frame = tk.Frame(frame) file_save = makeform(save_frame, ['Output file name'], [traj_3d.save_dir], pos=tk.TOP) b1 = tk.Button(save_frame, text='Save results', command=(lambda fs=file_save: save_res(cam_top, cam_left, T, traj_3d, fs))) b1.pack(side=tk.BOTTOM, padx=5, pady=5) save_frame.pack(side=tk.BOTTOM) b1 = tk.Button(frame, text='Launch Analysis !', command=(lambda x=vels, fs=file_save, ang=angles, ps=pos: launch_pp(x, cam_top, cam_left, T, traj_3d, fs, ang, ps))) b1.pack(side=tk.BOTTOM, padx=5, pady=5)
[docs]def save_res(cam_top, cam_left, T, traj_3d, fileSave): """Saves the results and make a report :param cam_top,cam_left: top and left camera objects :param T: Text canvas to log the results :param traj_3d: Experiment object :param fileSave: report save directory """ list_pic = os.listdir('data_treat') try: traj_3d.save_dir = fileSave[0][1].get() if 'Angle.png' in list_pic: move_file('data_treat/Angle.png', parse_dir(traj_3d.save_dir)) if 'Impact_position.png' in list_pic: move_file('data_treat/Impact_position.png', parse_dir(traj_3d.save_dir)) if 'Velocity.png' in list_pic: move_file('data_treat/Velocity.png', parse_dir(traj_3d.save_dir)) if 'Reproj_error.png' in list_pic: move_file('data_treat/Reproj_error.png', parse_dir(traj_3d.save_dir)) make_report(traj_3d, cam_top, cam_left, "data_treat/report_template.txt") log = '\nTrajectory exported as ' + traj_3d.save_dir T.insert(tk.END, log) except: popupmsg("Wrong save directory") else: popupmsg("File saved successfully !")
[docs]def parse_dir(save_dir): """Parses the save directory to get only the directory (without the file name) to save the pictures to :param save_dir: save directory string :return: save directory string without the file name """ dir_list = save_dir.split('/') dir = '' if len(dir_list) == 1: dir_list = dir_list[0].split('\\') if not(len(dir_list) == 1): for elem in dir_list[:-1]: dir += elem + '/' return dir
[docs]def move_file(init, end): """Moves a file using either batch or shell command according to the current os (Windows or Linux only) :param init: path of the file to move :param end: target directory path """ if platform.system() == 'Windows': init = init.replace('/', '\\') end = end.replace('/', '\\') os.system('copy '+init+' '+end) elif platform.system() == 'Linux': os.system('scp -r '+init+' '+end) else: popupmsg("Unknown OS, I cannot save the pictures. You may find them in the data_treat folder directly...")
[docs]def launch_pp(vels, cam_top, cam_left, T, traj_3d, fileSave, ang, pos): """Launch a post-processing analysis :param vels: velocity parameter form :param cam_top,cam_left: top and left camera objects :param T: Text canvas to log the results :param traj_3d: Experiment object :param fileSave: report save directory :param ang: angle parameter form :param pos: impact position parameter form """ #plt.close() log = '' fileSave[0][1].delete(0, tk.END) fileSave[0][1].insert(tk.END, traj_3d.save_dir) alpha = get_init_angle(traj_3d.X, traj_3d.Y, traj_3d.Z, traj_3d.t, cam_top, cam_left, init=int(ang[0][1].get()), end=int(ang[1][1].get())) log += 'Angle with horizontal: {:.02f}°\n'.format(alpha) xi, yi, zi, imp_i = get_impact_position(traj_3d.X, traj_3d.Y, traj_3d.Z, cam_left, cam_top, threshold=float(pos[0][1].get())) log += 'Impact position (cm): ({:.02f}, {:.02f} {:.02f})\n'.format(xi, yi, zi) Vinit, Vend = get_velocity(traj_3d.t, traj_3d.X, traj_3d.Y, traj_3d.Z, thres=float(vels[0][1].get()), init=int(vels[1][1].get()), pt_num=int(vels[2][1].get())) vi_norm = np.sqrt(Vinit[0] ** 2 + Vinit[1] ** 2 + Vinit[2] ** 2) vo_norm = np.sqrt(Vend[0] ** 2 + Vend[1] ** 2 + Vend[2] ** 2) log += 'Initial velocity (m/s): ({:.02f}, {:.02f} {:.02f})\n'.format(Vinit[0], Vinit[1], Vinit[2]) log += 'Initial velocity norm (m/s): {:.02f}\n'.format(vi_norm) log += 'Velocity after impact (m/s): ({:.02f}, {:.02f} {:.02f})\n'.format(Vend[0], Vend[1], Vend[2]) log += 'Velocity norm after impact (m/s): {:.02f}\n'.format(vo_norm) traj_3d.set_pp(alpha, Vinit, Vend, [xi, yi, zi], imp_i) T.delete('1.0', tk.END) T.insert(tk.END, log)