Archived
514 lines
22 KiB
Python
514 lines
22 KiB
Python
# @ File : UI_main.py
|
|
#
|
|
# Copyright (c) 2024 KenanZhu. All Right Reserved.
|
|
#
|
|
# @ Author : KenanZhu
|
|
# @ Time : 2024/11/04
|
|
# @ Brief : Main window class.
|
|
# #
|
|
# @ IDE : PyCharm 2024.2.1 (Community Edition)
|
|
#
|
|
# ----------------------------------------------------------------------------------------
|
|
|
|
### Self
|
|
import Ui_view as vie
|
|
import Ui_about as abo
|
|
import Ui_options as opt
|
|
import Ui_processor as pro
|
|
import Config_file as config
|
|
import Func_callback as func
|
|
|
|
### Std
|
|
import threading
|
|
|
|
from tkinter import ttk
|
|
from PIL import ImageTk
|
|
from base64 import b64decode
|
|
from matplotlib.backends.backend_tkagg import (
|
|
FigureCanvasTkAgg, NavigationToolbar2Tk)
|
|
|
|
import tkinter as tk
|
|
import tkinter.font as tkfont
|
|
import cartopy.crs as ccrs
|
|
#import cartopy.feature as cfeature
|
|
import matplotlib as mpl
|
|
mpl.use('TkAgg')
|
|
import matplotlib.pyplot as plt
|
|
|
|
def instanceOPT(hwndparent, cfg_get_, func_):
|
|
opt.OPTGUI(hwndparent, cfg_get_, func_)
|
|
|
|
def instancePRO(hwndparent, cfg_get_, func_):
|
|
pro.EXECUDUI(hwndparent, cfg_get_, func_)
|
|
|
|
def instanceVIE(hwndparent, func_):
|
|
vie.VIEWGUI(hwndparent, func_)
|
|
|
|
def instanceABO(hwndparemt, cfg_get_, func_):
|
|
abo.ABODUI(hwndparemt, cfg_get_, func_)
|
|
|
|
def _instanceOPT(hwndparemt, cfg_get_, func_):
|
|
T = threading.Thread(target=lambda :instanceOPT(hwndparemt, cfg_get_, func_))
|
|
T.start()
|
|
|
|
def _instancePRO(hwndparemt, cfg_get_, func_):
|
|
T = threading.Thread(target=lambda :instancePRO(hwndparemt, cfg_get_, func_))
|
|
T.start()
|
|
|
|
def _instanceVIE(hwndparemt, func_):
|
|
T = threading.Thread(target=lambda :instanceVIE(hwndparemt, func_))
|
|
T.start()
|
|
|
|
def _instanceABO(hwndparemt, cfg_get_, func_):
|
|
T = threading.Thread(target=lambda :instanceABO(hwndparemt, cfg_get_, func_))
|
|
T.start()
|
|
|
|
|
|
# noinspection PyUnusedLocal,PyProtectedMember
|
|
class MAINGUI:
|
|
def __init__(self, hwnd_, func_):
|
|
# init
|
|
# -------------------------------------------------------------------------------
|
|
self.func = func_
|
|
self.hwnd = hwnd_
|
|
|
|
self.ux = None
|
|
self.nx = None
|
|
self.ex = None
|
|
|
|
self.satn = None
|
|
self.satvisb = None
|
|
self.sattrack = None
|
|
|
|
self.canvas1 = None
|
|
self.canvas0 = None
|
|
self.canvas2 = None
|
|
|
|
self.Drawcards = None
|
|
self.Figurefrm_Sky = None
|
|
self.Figurefrm_Vis = None
|
|
self.Figurefrm_ENU = None
|
|
|
|
self.lastx = None
|
|
self.lasty = None
|
|
self.press = None
|
|
|
|
self.plotstate = None
|
|
|
|
self.initGUI()
|
|
|
|
def initGUI(self):
|
|
# -------------------------------------------------------------------------------
|
|
# >
|
|
# Method:
|
|
# Brief :
|
|
# Author: @KenanZhu All Right Reserved.
|
|
# -------------------------------------------------------------------------------
|
|
### Set size
|
|
self.hwnd.title(
|
|
"KNZ_GeoTrackLab %s"
|
|
%cfg_get['INFO']['Version']
|
|
)
|
|
self.func.Move_center(hwnd,1200,700)
|
|
self.hwnd.minsize(1200, 700)
|
|
### Set icon
|
|
icon_ico = (b'AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMS4xMTGQMDAwKgAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMTE0MjIy7jMzM/8zMzPrMDAwLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvLy8QMTExSAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAMTExNDIyMu4zMzP/MzMz/zMzM/8zMzPrMDAwLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALy8vEDIyMsoyMjLKAAAAAAAAAAAAAAAAAAAAADExMTQyMjLuMzMz/zIy'
|
|
b'MvsxMTGaMjIy/TMzM/8zMzPrMTExLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAyMjJRMjIy3TExMbgyMjLKMzMz/zIyMtkAAAAAMDAwOioqKgYAAAAAMTExszMzM/8yMjL7MDAwWQAAAAAxMTFhMjIy/TMz'
|
|
b'M/8zMzPrMTExLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIyMt0zMzP/MzMz/zMz'
|
|
b'M/8zMzP/MTExrjExMU0yMjL4MTExsyoqKgYqKioMMjIyvzAwMFkAAAAAAAAAAAAAAAAxMTFhMjIy/TMzM/8zMzPrMTExLgAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTExuDMzM/8zMzP/MzMz/zMzM/8xMTGaMjIy+DMz'
|
|
b'M/8zMzP/MTExsyoqKgYAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAxMTFhMjIy/jMzM/8yMjLfAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8vLxAyMjLKMzMz/zMzM/8zMzP/MzMz9TIyMvkzMzP/MzMz/zMzM/8zMzP/MTExsyoq'
|
|
b'KgYAAAAAAAAAAAAAAAAAAAAAAAAAADExMY8zMzP/MzMz/zMzM8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAvLy8QMjIyyjMzM/8zMzP/MzMz/zMzM/UyMjL+MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MTExsyoqKgYAAAAAAAAAAAAA'
|
|
b'AAAxMTGPMzMz/zMzM/8yMjLTMDAwFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMUgyMjLKMjIy2DEx'
|
|
b'Ma4xMTGaMjIy+TMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MTExsyoqKgYAAAAAMTExbDMzM/8zMzP/MjIy0zAw'
|
|
b'MBUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTExTTIyMvgzMzP/MzMz/zMz'
|
|
b'M/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MTExsyoqKgYqKioMMzMzwzIyMtMwMDAVAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDoyMjL4MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMz'
|
|
b'M/8zMzP/MzMz/zMzM/8zMzP/MTExsyoqKgYqKioMMDAwFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAKioqBjIyMrIzMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMz'
|
|
b'M/8zMzP/MTExsyoqKgYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAKioqBjIyMrIzMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MjIyfgAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTExNDExMbMqKioMKioqBjIy'
|
|
b'MrIzMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8xMTGUAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDUyMjLvMzMz/zIyMsAAAAABKioqBjIyMrIzMzP/MzMz/zMz'
|
|
b'M/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MjIy3i0tLRwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAwMDA1MjIy7zMzM/8yMjL7MDAwWQAAAAAAAAAAKioqBjIyMrIzMzP/MzMz/zMzM/8zMzP/MzMz/zMz'
|
|
b'M/8zMzP/MzMz/zIyMt4zMzMeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwLzIy'
|
|
b'Mu8zMzP/MjIy+zAwMFkAAAAAAAAAAAAAAAAAAAAAKioqBjIyMrIzMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8yMjLeMzMzHgAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMTGQMzMz/zMzM/8zMzObAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAKioqBjIyMrIzMzP/MzMz/zMzM/8zMzP/MjIy3jMzMx4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMSkzMzPrMzMz/zIyMv0xMTFiAAAAAAAAAAAAAAAAAAAAADEx'
|
|
b'MWwqKioMKioqBjIyMrIzMzP/MzMz/zIyMt4zMzMeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMS4zMzPrMzMz/zIyMv0xMTFiAAAAAAAAAAAxMTGQMzMz/zMzM8MqKioMKioqBjIy'
|
|
b'Mn4xMTGULy8vGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAADExMS4zMzPrMzMz/zIyMv0xMTFiMTExkDMzM/8zMzP/MjIy0zAwMBUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEx'
|
|
b'MS4zMzPrMzMz/zIyMv4zMzP/MzMz/zIyMtMwMDAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMS4zMzPrMzMz/zMz'
|
|
b'M/8yMjLTMDAwFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMS4yMjLfMTExxzAwMBUAAAAAAAAAAAAA'
|
|
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////'
|
|
b'/////////////////x////4P//58B//8eAP/4EhB/+AA4P/gAfD/wAHw/4AA4P+AAEH/8AAD/+AAB//gAA//8AAP/8AAD/+A'
|
|
b'AA//BgAf/g8AP/4fgH/+DwD//wYB//+AH///wD///+B////w//8=')
|
|
icon_ico = b64decode(icon_ico)
|
|
icon_ico = ImageTk.PhotoImage(data=icon_ico)
|
|
self.hwnd.tk.call('wm', 'iconphoto', self.hwnd._w, icon_ico)
|
|
### Set front
|
|
default_font = tkfont.nametofont("TkDefaultFont")
|
|
default_font.configure(family="Segoe UI", size=9)
|
|
### Top tool
|
|
self.initTOPMENU()
|
|
### Plot area
|
|
self.initPLOT()
|
|
### State bar
|
|
self.initSTATE_BAR()
|
|
### Quit event & mainloop start
|
|
self.hwnd.protocol("WM_DELETE_WINDOW", self.hwnd.quit)
|
|
self.hwnd.mainloop()
|
|
|
|
def initTOPMENU(self):
|
|
# -------------------------------------------------------------------------------
|
|
# Class :
|
|
# >
|
|
# Method:
|
|
# Brief :
|
|
# Author: @KenanZhu All Right Reserved.
|
|
# -------------------------------------------------------------------------------
|
|
topmenu = tk.Menu(self.hwnd)
|
|
### File
|
|
filemenu = tk.Menu(topmenu, tearoff=False)
|
|
### File > Open...
|
|
openmenu = tk.Menu(filemenu, tearoff=False)
|
|
### File > Open... > Open Pos Solution
|
|
openmenu.add_command(
|
|
label="Open Pos Solution",
|
|
accelerator='Ctrl+S',
|
|
command=lambda :self.func._OpenkslnFile(
|
|
self.ex,self.nx,self.ux,self.satn,self.satvisb,
|
|
self.canvas0,self.canvas1,self.plotstate)
|
|
)
|
|
### File > Open... > Open Sat Solution
|
|
openmenu.add_command(
|
|
label="Open Sat Solution",
|
|
accelerator='Ctrl+S',
|
|
command=lambda :self.func._Plot2polar(
|
|
self.sattrack,self.plotstate,self.canvas2)
|
|
)
|
|
### File > Open... > Open RINEX
|
|
openmenu.add_command(
|
|
label="Open RINEX",
|
|
command=lambda :instancePRO(hwnd, cfg_get, self.func),
|
|
accelerator='Ctrl+P'
|
|
)
|
|
filemenu.add_cascade(label="Open...", menu=openmenu)
|
|
### File > Clesr
|
|
filemenu.add_command(
|
|
label="Clear",
|
|
command=self.Clear_canvas
|
|
)
|
|
### File > View
|
|
filemenu.add_command(
|
|
label="View",
|
|
command=lambda :instanceVIE(self.hwnd, self.func)
|
|
)
|
|
### File > Exit
|
|
filemenu.add_command(
|
|
label="Exit",
|
|
command=self.hwnd.quit,
|
|
accelerator='Ctrl+E'
|
|
)
|
|
topmenu.add_cascade(label="File", menu=filemenu)
|
|
|
|
### Options
|
|
optmenu = tk.Menu(topmenu, tearoff=False)
|
|
### Options > Options...
|
|
optmenu.add_command(
|
|
label="Options...",
|
|
command=lambda :instanceOPT(self.hwnd,cfg_get,self.func)
|
|
)
|
|
topmenu.add_cascade(
|
|
label="Options",
|
|
menu=optmenu
|
|
)
|
|
|
|
### Help
|
|
helpmenu = tk.Menu(topmenu, tearoff=False)
|
|
### Help > About
|
|
helpmenu.add_command(
|
|
label="About",
|
|
command=lambda :instanceABO(self.hwnd, cfg_get, self.func)
|
|
)
|
|
topmenu.add_cascade(label="Help", menu=helpmenu)
|
|
|
|
self.hwnd.config(menu=topmenu)
|
|
|
|
def initPLOT(self):
|
|
# -------------------------------------------------------------------------------
|
|
# >
|
|
# Method: initPLOT
|
|
# Brief : Initializes the drawing area of the main ui
|
|
# Author: @KenanZhu All Right Reserved.
|
|
# -------------------------------------------------------------------------------
|
|
self.Drawcards = ttk.Notebook(self.hwnd)
|
|
# E-N-U Plot area
|
|
# -------------------------------------------------------------------------------
|
|
self.PLOT_ENU()
|
|
self.Drawcards.add(self.Figurefrm_ENU, text='ENU-Draw')
|
|
# Valid Satellite Amout area
|
|
# -------------------------------------------------------------------------------
|
|
self.PLOT_VIS()
|
|
self.Drawcards.add(self.Figurefrm_Vis, text='Sat Number')
|
|
# Sky Track Plot area
|
|
# -------------------------------------------------------------------------------
|
|
self.PLOT_SKY()
|
|
self.Drawcards.add(self.Figurefrm_Sky, text='Sat Track')
|
|
self.Drawcards.pack(fill=tk.BOTH, expand=True, padx='2px', pady='0px')
|
|
|
|
def PLOT_ENU(self):
|
|
# -------------------------------------------------------------------------------
|
|
# >
|
|
# >
|
|
# Method:
|
|
# Brief :
|
|
# Author: @KenanZhu All Right Reserved.
|
|
# -------------------------------------------------------------------------------
|
|
self.Figurefrm_ENU = tk.Frame(self.hwnd)
|
|
self.Figurefrm_ENU.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES)
|
|
|
|
plt.rc('font', family='Segoe UI')
|
|
plt.rcParams['xtick.direction'] = 'in'
|
|
plt.rcParams['ytick.direction'] = 'in'
|
|
fig, (self.ex, self.nx, self.ux) = plt.subplots(
|
|
3,
|
|
1,
|
|
figsize=(10, 0),
|
|
sharex=True
|
|
)
|
|
for spine in ['right', 'left']:
|
|
self.ex.spines[spine].set_visible(False)
|
|
self.ex.set_facecolor('#f5f5f5')
|
|
for spine in ['right', 'left']:
|
|
self.nx.spines[spine].set_visible(False)
|
|
self.nx.set_facecolor('#f5f5f5')
|
|
|
|
for spine in ['right', 'left']:
|
|
self.ux.spines[spine].set_visible(False)
|
|
self.ux.set_facecolor('#f5f5f5')
|
|
fig.subplots_adjust(
|
|
left=0,
|
|
bottom=0.040,
|
|
right=1,
|
|
top=1,
|
|
hspace=0.0
|
|
)
|
|
self.canvas0 = FigureCanvasTkAgg(fig, self.Figurefrm_ENU)
|
|
self.canvas0.draw()
|
|
self.canvas0.get_tk_widget().pack( side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES)
|
|
toolbar0 = NavigationToolbar2Tk(self.canvas0, self.Figurefrm_ENU, pack_toolbar=False)
|
|
toolbar0.update()
|
|
toolbar0.pack(side=tk.LEFT)
|
|
### Call back event
|
|
self.canvas0.mpl_connect("button_press_event",self.On_press)
|
|
self.canvas0.mpl_connect("button_release_event",self.On_release)
|
|
self.canvas0.mpl_connect("motion_notify_event",self.On_move)
|
|
self.canvas0.mpl_connect('scroll_event',self.On_scaleing)
|
|
|
|
def PLOT_VIS(self):
|
|
# -------------------------------------------------------------------------------
|
|
# >
|
|
# Method:
|
|
# Brief :
|
|
# Author: @KenanZhu All Right Reserved.
|
|
# -------------------------------------------------------------------------------
|
|
self.Figurefrm_Vis = tk.Frame(self.hwnd)
|
|
self.Figurefrm_Vis.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES)
|
|
|
|
plt.rc('font', family='Segoe UI')
|
|
plt.rcParams['xtick.direction'] = 'in'
|
|
plt.rcParams['ytick.direction'] = 'in'
|
|
fig, (self.satn, self.satvisb) = plt.subplots(
|
|
2,
|
|
1,
|
|
figsize=(10, 0),
|
|
sharex=True
|
|
)
|
|
fig.subplots_adjust(
|
|
left=0,
|
|
bottom=0.045,
|
|
right=1,
|
|
top=0.95,
|
|
hspace=0.0
|
|
)
|
|
for spine in ['right', 'left']:
|
|
self.satn.spines[spine].set_visible(False)
|
|
self.satn.set_facecolor('#f5f5f5')
|
|
for spine in ['right', 'left']:
|
|
self.satvisb.spines[spine].set_visible(False)
|
|
self.satvisb.set_facecolor('#f5f5f5')
|
|
|
|
self.canvas1 = FigureCanvasTkAgg(fig, self.Figurefrm_Vis)
|
|
self.canvas1.draw()
|
|
self.canvas1.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES)
|
|
toolbar1 = NavigationToolbar2Tk(self.canvas1, self.Figurefrm_Vis, pack_toolbar=False)
|
|
toolbar1.update()
|
|
toolbar1.pack(side=tk.LEFT)
|
|
|
|
def PLOT_SKY(self):
|
|
# -------------------------------------------------------------------------------
|
|
# >
|
|
# >
|
|
# Method:
|
|
# Brief :
|
|
# Author: @KenanZhu All Right Reserved.
|
|
# -------------------------------------------------------------------------------
|
|
self.Figurefrm_Sky = tk.Frame(self.hwnd)
|
|
self.Figurefrm_Sky.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES)
|
|
|
|
plt.rc('font', family='Segoe UI')
|
|
fig = plt.figure()
|
|
self.sattrack = fig.add_subplot(
|
|
projection=ccrs.Mercator()
|
|
)
|
|
self.sattrack.coastlines(resolution='110m')
|
|
self.sattrack.gridlines()
|
|
fig.subplots_adjust(
|
|
left=0,
|
|
bottom=0.03,
|
|
right=1,
|
|
top=0.95
|
|
)
|
|
for spine in ['right', 'left']:
|
|
self.sattrack.spines[spine].set_visible(False)
|
|
self.sattrack.set_facecolor('#f5f5f5')
|
|
|
|
self.canvas2 = FigureCanvasTkAgg(fig, self.Figurefrm_Sky)
|
|
self.canvas2.draw()
|
|
self.canvas2.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES)
|
|
toolbar2 = NavigationToolbar2Tk(self.canvas2, self.Figurefrm_Sky, pack_toolbar=False)
|
|
toolbar2.update()
|
|
toolbar2.pack(side=tk.TOP, anchor='w')
|
|
|
|
def initSTATE_BAR(self):
|
|
stateframe = tk.Frame(self.hwnd)
|
|
stateframe.pack(side=tk.BOTTOM, fill=tk.X)
|
|
self.plotstate = ttk.Label(stateframe, text="None")
|
|
self.plotstate.pack(side=tk.LEFT, anchor='w')
|
|
|
|
def On_press(self, event):
|
|
# -------------------------------------------------------------------------------
|
|
# >
|
|
# Method:
|
|
# Brief :
|
|
# Author: @KenanZhu All Right Reserved.
|
|
# -------------------------------------------------------------------------------
|
|
if event.inaxes:
|
|
if event.button == 1:
|
|
self.press = True
|
|
self.lastx = event.xdata
|
|
self.lasty = event.ydata
|
|
|
|
def On_move(self, event):
|
|
# -------------------------------------------------------------------------------
|
|
# >
|
|
# Method:
|
|
# Brief :
|
|
# Author: @KenanZhu All Right Reserved.
|
|
# -------------------------------------------------------------------------------
|
|
axtemp = event.inaxes
|
|
if axtemp:
|
|
if self.press:
|
|
x = event.xdata - self.lastx
|
|
y = event.ydata - self.lasty
|
|
x_min, x_max = axtemp.get_xlim()
|
|
y_min, y_max = axtemp.get_ylim()
|
|
x_min = x_min - x
|
|
x_max = x_max - x
|
|
y_min = y_min - y
|
|
y_max = y_max - y
|
|
axtemp.set_xlim(x_min, x_max)
|
|
axtemp.set_ylim(y_min, y_max)
|
|
self.canvas0.draw()
|
|
|
|
def On_release(self, event):
|
|
# -------------------------------------------------------------------------------
|
|
# >
|
|
# Method:
|
|
# Brief :
|
|
# Author: @KenanZhu All Right Reserved.
|
|
# -------------------------------------------------------------------------------
|
|
if self.press:
|
|
self.press = False
|
|
|
|
def On_scaleing(self, event):
|
|
# -------------------------------------------------------------------------------
|
|
# >
|
|
# Method:
|
|
# Brief :
|
|
# Author: @KenanZhu All Right Reserved.
|
|
# -------------------------------------------------------------------------------
|
|
axtemp = event.inaxes
|
|
y_min, y_max = axtemp.get_ylim()
|
|
scaley = (y_max - y_min) / 10
|
|
if event.button == 'up':
|
|
axtemp.set(ylim=(y_min + scaley, y_max - scaley))
|
|
elif event.button == 'down':
|
|
axtemp.set(ylim=(y_min - scaley, y_max + scaley))
|
|
self.canvas0.draw_idle()
|
|
|
|
def Clear_canvas(self):
|
|
# -------------------------------------------------------------------------------
|
|
# >
|
|
# Method: Clear_canvas
|
|
# Brief : clear the canvas
|
|
# Author: @KenanZhu All Right Reserved.
|
|
# -------------------------------------------------------------------------------
|
|
self.ex.clear()
|
|
self.nx.clear()
|
|
self.ux.clear()
|
|
self.satn.clear()
|
|
self.satvisb.clear()
|
|
self.sattrack.clear()
|
|
self.canvas0.draw()
|
|
self.canvas1.draw()
|
|
self.canvas2.draw()
|
|
self.plotstate.config(text="None")
|
|
self.hwnd.update()
|
|
|
|
if __name__ == "__main__":
|
|
|
|
### LOad Config
|
|
cfg = config.Configinit('config.ini')
|
|
cfg.load_config()
|
|
cfg_get = cfg.get_config()
|
|
|
|
### Call Back Process
|
|
func = func.CALLBACK(cfg, cfg_get)
|
|
|
|
### Main Window
|
|
hwnd = tk.Tk()
|
|
mainui = MAINGUI(hwnd, func)
|
|
|
|
|