Source code for simba.ui.pop_ups.quick_path_plot_pop_up

import os
import threading
from tkinter import *
from typing import Union

from simba.mixins.config_reader import ConfigReader
from simba.mixins.pop_up_mixin import PopUpMixin
from simba.plotting.ez_path_plot import EzPathPlot
from simba.ui.tkinter_functions import (CreateLabelFrameWithIcon,
                                        SimBADropDown, SimBALabel)
from simba.utils.checks import (check_file_exist_and_readable,
                                check_if_valid_rgb_tuple, check_int, check_str)
from simba.utils.enums import Formats
from simba.utils.errors import NoFilesFoundError
from simba.utils.lookups import get_color_dict
from simba.utils.read_write import get_fn_ext, read_video_info


[docs]class QuickLineplotPopup(PopUpMixin, ConfigReader): def __init__(self, config_path: Union[str, os.PathLike]): """ :example: >>> _ = QuickLineplotPopup(config_path='/Users/simon/Desktop/envs/simba/troubleshooting/two_black_animals_14bp/project_folder/project_config.ini') """ check_file_exist_and_readable(file_path=config_path) ConfigReader.__init__(self, config_path=config_path) if len(self.outlier_corrected_paths) == 0: raise NoFilesFoundError(msg=f"No data found in the {self.outlier_corrected_paths} directory. Place files in this directory to create quick path plots.", source=self.__class__.__name__) PopUpMixin.__init__(self, title="SIMPLE LINE PLOT", icon='path_2') self.video_filepaths = {get_fn_ext(filepath=i)[1]: i for i in self.outlier_corrected_paths} color_lst = list(get_color_dict().keys()) settings_frm = CreateLabelFrameWithIcon(parent=self.main_frm, header='SETTINGS', icon_name='settings') video_names = list(self.video_filepaths.keys()) video_name_max_len = max(len(s) for s in video_names) self.video_dropdown = SimBADropDown(parent=settings_frm, dropdown_options=video_names, label='VIDEO: ', label_width=25, dropdown_width=video_name_max_len, value=video_names[0], img='video_2') self.bp_dropdown = SimBADropDown(parent=settings_frm, dropdown_options=self.body_parts_lst, label='BODY-PART: ', label_width=25, dropdown_width=video_name_max_len, value=self.body_parts_lst[0], img='pose') self.background_color = SimBADropDown(parent=settings_frm, dropdown_options=color_lst, label="BACKGROUND COLOR: ", label_width=25, dropdown_width=video_name_max_len, value="White", img='fill') self.line_color = SimBADropDown(parent=settings_frm, dropdown_options=color_lst, label="LINE COLOR: ", label_width=25, dropdown_width=video_name_max_len, value="Red", img='line') self.line_thickness = SimBADropDown(parent=settings_frm, dropdown_options=list(range(1, 11)), label="LINE THICKNESS: ", label_width=25, dropdown_width=video_name_max_len, value=1, img='bold') self.circle_size = SimBADropDown(parent=settings_frm, dropdown_options=list(range(1, 11)), label="CIRCLE SIZE: ", label_width=25, dropdown_width=video_name_max_len, value=5, img='circle_2') self.last_frm_only_dropdown = SimBADropDown(parent=settings_frm, dropdown_options=["TRUE", "FALSE"], label="LAST FRAME ONLY: ", label_width=25, dropdown_width=video_name_max_len, value='FALSE', img='finish') self.inst_lbl = SimBALabel(parent=settings_frm, txt="NOTE: For more complex path plots, faster, \n see 'CREATE PATH PLOTS' under the [VISUALIZATIONS] tab", txt_clr='green') settings_frm.grid(row=0, sticky=W) self.video_dropdown.grid(row=0, sticky=W) self.bp_dropdown.grid(row=2, sticky=W) self.background_color.grid(row=3, sticky=W) self.line_color.grid(row=4, sticky=W) self.line_thickness.grid(row=5, sticky=W) self.circle_size.grid(row=6, sticky=W) self.last_frm_only_dropdown.grid(row=7, sticky=W) self.inst_lbl.grid(row=8, sticky=W) self.create_run_frm(run_function=self.run) self.main_frm.mainloop()
[docs] def run(self): video_name = self.video_dropdown.getChoices() data_path = self.video_filepaths[video_name] meta_data, _, fps = read_video_info(vid_info_df=self.video_info_df, video_name=video_name) size = (int(meta_data["Resolution_width"]), int(meta_data["Resolution_height"])) last_frm = self.last_frm_only_dropdown.getChoices() if last_frm == "TRUE": save_path = os.path.join( self.path_plot_dir, f"{video_name}_simple_path_plot.png" ) last_frm = True else: save_path = os.path.join( self.path_plot_dir, f"{video_name}_simple_path_plot.mp4" ) last_frm = False if not os.path.isdir(self.path_plot_dir): os.makedirs(self.path_plot_dir) background_color = get_color_dict()[self.background_color.getChoices()] line_color = get_color_dict()[self.line_color.getChoices()] line_thickness = self.line_thickness.getChoices() circle_size = self.circle_size.getChoices() bp = self.bp_dropdown.getChoices() check_int( name=f"{self.__class__.__name__} line_thickness", value=line_thickness, min_value=1, ) check_int( name=f"{self.__class__.__name__} circle_size", value=circle_size, min_value=1, ) check_if_valid_rgb_tuple(data=background_color) check_if_valid_rgb_tuple(data=line_color) check_str(name=f"{self.__class__.__name__} body-part", value=bp) plotter = EzPathPlot( data_path=data_path, size=size, fps=fps, body_part=bp, bg_color=background_color, line_color=line_color, line_thickness=int(line_thickness), circle_size=int(circle_size), last_frm_only=last_frm, save_path=save_path, ) threading.Thread(target=plotter.run).start()
#_ = QuickLineplotPopup(config_path=r"D:\troubleshooting\maplight_ri\project_folder\project_config.ini") # _ = QuickLineplotPopup(config_path=r"C:\troubleshooting\mitra\project_folder\project_config.ini") # _ = QuickLineplotPopup(config_path='/Users/simon/Desktop/envs/simba/troubleshooting/two_black_animals_14bp/project_folder/project_config.ini') # _ = QuickLineplotPopup(config_path='/Users/simon/Desktop/envs/troubleshooting/two_black_animals_14bp/project_folder/project_config.ini')