diff --git a/README.md b/README.md index 225ec49..141c057 100644 --- a/README.md +++ b/README.md @@ -17,9 +17,6 @@ Support method of orientation * Pseudorange positioning * (OINP) -Features : -* Realize 3D display of satellite orbit - # MAIN INTRO ## Program intro ### About KNZ_GeoTrackLab @@ -36,6 +33,13 @@ Features : ## Project Update +Update: 2024/11/03: +1. KNZ_GeoTrackLab: Fix some bug, Modify some UI logic. +2. KNZ_GeoTrackLab: Remove 3D plot function. +3. KNZ_GeoTrackLab: Merge some functions and concentrated. +4. KNZ_GeoTrackLab: New added: + Sat track projection ui(not ok on function). + Update: 2024/10/31: 1. KNZ_GeoTrackLab: Fix some bug, Modify some UI logic. 2. KNZ_GeoTrackLab: Optimize code structure. diff --git a/READMECN.md b/READMECN.md index 28d3ebd..345993c 100644 --- a/READMECN.md +++ b/READMECN.md @@ -10,16 +10,13 @@ 支持GNSS: * GPS:卫星位置解算&接收机定位 * Galileo:卫星位置解算&接收机定位 -* GLONASS:卫星位置解算 -* 北斗/Compass:卫星位置解算 +* GLONASS:卫星位置解算(OINP) +* 北斗/Compass:卫星位置解算(OINP) 支持定位方式 * 伪距定位 * (OINP) -特色功能: -* 实现卫星轨道3D显示 - # 主要介绍 ## 程序介绍 ### 关于KNZ_GeoTrackLab @@ -36,6 +33,13 @@ ## 项目更新 +更新: 2024/10/31: +1. KNZ_GeoTrackLab: 修复一些bug, 优化UI逻辑. +2. KNZ_GeoTrackLab: 移除3D绘图功能。 +2. KNZ_GeoTrackLab: 合并功能并专一化. +3. KNZ_GeoTrackLab: 新增: + 卫星轨迹投影图(还未实现功能化)。 + 更新: 2024/10/31: 1. KNZ_GeoTrackLab: 修复一些bug, 优化UI逻辑. 2. KNZ_GeoTrackLab: 优化代码结构. diff --git a/app/Config_file.py b/app/Config_file.py index 8bd3234..dd6629b 100644 --- a/app/Config_file.py +++ b/app/Config_file.py @@ -49,7 +49,7 @@ class Configinit: # ------------------------------------------------------------------------------- ### Config for software info self.config.add_section('INFO') - self.config.set('INFO', 'Version','1.5.4.1') + self.config.set('INFO', 'Version','1.5.5.0') self.config.add_section('Options_Calc') ### Config for calculate param self.config.set('Options_Calc', 'Iono_model', '0') diff --git a/app/Func_callback.py b/app/Func_callback.py index f72a5d5..65e5027 100644 --- a/app/Func_callback.py +++ b/app/Func_callback.py @@ -8,7 +8,6 @@ # # #-----------------------------------------------------------------# - ### Std import threading @@ -58,6 +57,10 @@ class CALLBACK: for i in self.outdir: if self.outdir.get(i): self.outvar += (self.outdir.get(i),) + ### Const value + global blank, C_V + blank = ' ' + C_V = 299792458 @staticmethod def Move_center(hwnd, win_x, win_y): @@ -158,7 +161,8 @@ class CALLBACK: self.cfg_get.set('Options_Draw', 'U_Line', str(entry2.get())) self.cfg.save_config() - def Dir_or_name_get(self, path, mode): + @staticmethod + def Dir_or_name_get(path, mode): # ------------------------------------------------------------------------------- # > # Method: @@ -259,8 +263,8 @@ class CALLBACK: path + '/*.sp') self.cfg.save_config() - def AskOrNotCheck(self, - AskOrNotCheckVar, + @staticmethod + def AskOrNotCheck(AskOrNotCheckVar, AskDirectorySelectBox, AskDirectorySelectButton): # ------------------------------------------------------------------------------- @@ -316,7 +320,7 @@ class CALLBACK: directory = self.Dir_or_name_get(directory, 1) syssign = self.system.get(int(self.cfg_get['Options_Calc']['sat_system'])) - resname = syssign + '-' + self.Dir_or_name_get(obspath,0) + 'sp' + resname = syssign + '-' + self.Dir_or_name_get(obspath,0) + 'ksln' respath = (directory + resname) ExecuteState.config(text='Processing...... file : %s' %resname) @@ -327,8 +331,10 @@ class CALLBACK: navpath.encode(), obspath.encode(), respath.encode(), - int(self.cfg_get['Options_Calc']['sat_system']), - int(self.cfg_get['Options_Calc']['elev_angle']) + int(self.cfg_get['Options_Calc']['Sat_system']), + int(self.cfg_get['Options_Calc']['Elev_angle']), + int(self.cfg_get['Options_Calc']['Iono_Model']), + int(self.cfg_get['Options_Calc']['Trop_Model']) ): case 0.0: ExecuteState.config(text='Generated successfully ! file : %s' %resname) @@ -356,4 +362,8 @@ class CALLBACK: NavSelectBoxVar, AskOrNotCheckVar, DirectorySelectBoxVar)) - T.start() \ No newline at end of file + T.start() + + + + diff --git a/app/Mainui.py b/app/Mainui.py deleted file mode 100644 index 48cf962..0000000 --- a/app/Mainui.py +++ /dev/null @@ -1,1601 +0,0 @@ -import math -import threading -import time - -import Trocor - -from base64 import b64decode -from ctypes import * -from tkinter import colorchooser -from tkinter import messagebox -from tkinter import filedialog -from tkinter import ttk -from PIL import ImageTk - -import tkinter.font as tkfont -import tkinter as tk -import matplotlib as mpl -import numpy as np - -mpl.use('TkAgg') -import matplotlib.pyplot as plt -from matplotlib.backends.backend_tkagg import ( - FigureCanvasTkAgg, NavigationToolbar2Tk) - -# -# -# -# Sat color -SatColor = ["#FF0000","#FFA500","#FFFF00","#00FF00","#00FFFF","#0000FF","#A020F0"] -# Color register part -enucolor = ["#0080FF","#0080FF","#0080FF"] -enucolormid = ["#0080FF","#0080FF","#0080FF"] -enulinew = [ "0.80", "0.80", "0.80"] -satncolor = ["#0080FF"] -satncolormid= ["#0080FF"] -satnlinew = [ "1.50"] -# Ion & tro register part -ioncormode = ['OFF', 'Ion-Free LC', 'Broadcast'] -ioncorstate = 0 -trocormode = ['OFF', 'Hopfield', 'Saastamoinen'] -trocorstate = 0 -h_anglemode = ['0','5','10','15','20','25','30','35','40','45','50'] -h_anglestate = 0 -#Sat system register part -satsysdict = {1: "G", 2:"C", 3:"E", 4:"R", 5:"S"} -satellite_system = 1 -##Combox Count-er -ComboxObsCount = 0 -Obsvalue = ('',) -ComboxNavCount = 0 -Navvalue = ('',) -ComboxOutCount = 0 -Outvalue = ('',) -# -version = 'ver 1.5.4.1' -# -# -# -def OptionsIN(hwnd): - OPTGUI(hwnd) - -def ExecutIN(hwnd): - EXECUDUI(hwnd) - -def ViewIN(hwnd): - VIEWGUI(hwnd) - -def Abo_windows(): - abo = tk.Toplevel(root) - abo.title("About") - abo.attributes('-toolwindow', 2) - Move_center(abo,200,100) - abo.minsize(200,100) - abo.maxsize(200,100) - - About = tk.Label(abo, text="\nKNZ_GeoTrackLab %s\n\nCopyright (c) 2024 by KenanZhu\nAll Right Reserved."%version) - About.pack(side=tk.TOP, expand=tk.YES) - -def Move_center(hwnd, win_x, win_y): - - position_x = int((hwnd.winfo_screenwidth() - win_x) / 2) - position_y = int((hwnd.winfo_screenheight() - win_y) / 2) - - hwnd.geometry(f'{win_x}x{win_y}+{position_x}+{position_y}') - -class FUNCTION: - - @staticmethod - def Colorchoose(hwnd,i, label, mode): - # Brief # choice to change the color of draw - # Param # i : for mode 0 & 1 - # Param # label : match the label with the button - # Param # mode : color register type - # undo choice == 0 & - # middle choice store == 1 & - # final confirm == 3 & - # satn color == 4 & - # satn undo == 5 - # Return# none - global enucolor - if mode == 0: - #enucolor = ["#0080FF", "#0080FF", "#0080FF"] - #satncolor[0] = "#0080FF" - label.config(bg=enucolor[i]) - elif mode == 1: - colorvalue = tk.colorchooser.askcolor(parent=hwnd) - if colorvalue[1] is not None: - enucolormid[i] = str(colorvalue[1]) - label.config(bg=str(colorvalue[1])) - else: - return - elif mode == 3: - enucolor[0] = enucolormid[0] - enucolor[1] = enucolormid[1] - enucolor[2] = enucolormid[2] - satncolor[0] = satncolormid[0] - elif mode == 4: - colorvalue = tk.colorchooser.askcolor(parent=hwnd) - if colorvalue[1] is not None: - satncolormid[0] = str(colorvalue[1]) - label.config(bg=str(colorvalue[1])) - else: - return - elif mode==5: - label.config(bg=satncolor[0]) - @staticmethod - def Linewchoose(entry0, entry1, entry2, mode): - # Brief # input to change the width of line - # Param # entry0 : the entry box of e - # Param # entry1 : the entry box of n - # Param # entry2 : the entry box of u - # Param # mode : width of line register type - # undo choice == 0 & - # final confirm == 1 - # Return# none - - global enulinew - if mode == 0: - enulinew = ["0.80", "0.80", "0.80"] - entry0.set(enulinew[0]) - entry1.set(enulinew[1]) - entry2.set(enulinew[2]) - - elif mode == 1: - if (0 < float(entry0.get()) <= 5 and - 0 < float(entry1.get()) <= 5 and - 0 < float(entry2.get()) <= 5): - - enulinew[0] = entry0.get() - enulinew[1] = entry1.get() - enulinew[2] = entry2.get() - elif (float(entry0.get()) <= 0 or - float(entry1.get()) <= 0 or - float(entry2.get()) <= 0): - while not messagebox.showerror("ERROR !", "The line width value is invalid !"): - break - enulinew = ["0.80", "0.80", "0.80"] - entry0.set(enulinew[0]) - entry1.set(enulinew[1]) - entry2.set(enulinew[2]) - - elif (5 < float(entry0.get()) or - 5 < float(entry1.get()) or - 5 < float(entry2.get())): - msg = messagebox.askyesno("NOTICE", "The width of the line is too large\n" - "affecting the mapping.\n" - "Are you sure to continue ?") - if not msg: - enulinew = ["0.80", "0.80", "0.80"] - entry0.set(enulinew[0]) - entry1.set(enulinew[1]) - entry2.set(enulinew[2]) - pass - elif msg: - enulinew[0] = entry0.get() - enulinew[1] = entry1.get() - enulinew[2] = entry2.get() - - def Calcu_confirm(self, v, cboxi, cboxt, cboxangle): - # Brief # choice to change the ion & tro correction && confirm the sat system - # Param # v sat system radio button value - # Param # cboxi the combo box of ion correction - # Param # cboxt the combo box of tro correction - # Return# none - global ioncorstate - global trocorstate - global h_anglestate - global satellite_system - - ioncorstate = self.ITA_cbox(cboxi, 0) - trocorstate = self.ITA_cbox(cboxt, 1) - h_anglestate = self.ITA_cbox(cboxangle, 2) - satellite_system = self.Satsys_button(v) - - print(ioncorstate, trocorstate, satellite_system) - - @staticmethod - def Satsys_button(v): - # Brief # get the value of radio button of sat system - # Param # v : the value of radio button - # Return# the sat system code - Systemdict = {1: "1", 2: "2", 3: "3", 4: "4", 5: "5"} - return int(Systemdict.get(v.get())) - - @staticmethod - def ITA_cbox(cbox, cortype): - # Brief # get the value of combo box - # Param # cortype: correction type of - # ion == 0 & - # tro == 1 & - # angle == 2 - # Param # cbox: - # Return# ion | tro state code - count = -1 - if cortype == 0: - for ionmode in ioncormode: - count += 1 - if cbox.get() == ionmode: - return count - - elif cortype == 1: - for tromode in trocormode: - count += 1 - if cbox.get() == tromode: - return count - - elif cortype == 2: - for h_angle in h_anglemode: - count += 1 - if cbox.get() == h_angle: - return count - - @staticmethod - def GetObsFilePath(hwnd, ObsFileSelectBox): - global ComboxObsCount - global Obsvalue - path = filedialog.askopenfilename(parent=hwnd, - title='RINEX OBS File', - filetypes=[('RINEX OBS File(*.o*.*.*obs.*.*d)', '*.*o;*.*obs;*.*d'), - ('All Files', '*.*')]) - if path and path not in ObsFileSelectBox['value']: - Obsvalue += (path,) - ObsFileSelectBox['value'] += (path,) - ComboxObsCount += 1 - ObsFileSelectBox.current(ComboxObsCount) - - @staticmethod - def GetNavFilePath(hwnd, NavFileSelectBox): - global ComboxNavCount - global Navvalue - path = filedialog.askopenfilename(parent=hwnd, - title='RINEX NAV File', - filetypes=[('RINEX NAV File(*.*nav.*.hnav.*.gnav.*.qnav.*.*n.*.*g.*.*h.*.*q.*.*p)', - '*.*nav;*.hnav;*.gnav;*.qnav;*.*n;*.*g;*.*h;*.*q;*.*p'), - ('All Files', '*.*')]) - if path and path not in NavFileSelectBox['value']: - Navvalue += (path,) - NavFileSelectBox['value'] += (path,) - ComboxNavCount += 1 - NavFileSelectBox.current(ComboxNavCount) - - @staticmethod - def AskDirectory(hwnd, AskDirectorySelectBox): - global ComboxOutCount - global Outvalue - path = filedialog.askdirectory(parent=hwnd) - if path and path not in AskDirectorySelectBox['value']: - Outvalue += (path,) - AskDirectorySelectBox['value'] += (path + "/*.sp",) - ComboxOutCount += 1 - AskDirectorySelectBox.current(ComboxOutCount) - - @staticmethod - def AskOrNotCheck(AskOrNotCheckVar, - AskDirectorySelectBox, - AskDirectorySelectButton): - - if AskOrNotCheckVar.get() == 0: - AskDirectorySelectBox.config(state=tk.DISABLED) - AskDirectorySelectButton.config(state=tk.DISABLED) - else: - AskDirectorySelectBox.config(state=tk.NORMAL) - AskDirectorySelectButton.config(state=tk.NORMAL) - - def ExecuteFile(self,ExecuteState, - ObsSelectBoxVar, - NavSelectBoxVar, - AskOrNotCheckVar, - DirectorySelectBoxVar): - obsfile = "" - res_path = "" - - state3 = ["","",""] - statemsg = "" - if not ObsSelectBoxVar.get(): - state3[0] = " obs file." - if not NavSelectBoxVar.get(): - state3[1] = " nav file." - if not DirectorySelectBoxVar.get(): - if AskOrNotCheckVar.get(): - state3[2] = " solution directory." - for state in state3: - statemsg += state - if statemsg: - ExecuteState.config(text='No file: %s !'%statemsg) - return 0 - - obs_path = ObsSelectBoxVar.get() - nav_path = NavSelectBoxVar.get() - DirectoryOut = DirectorySelectBoxVar.get() - # Get the obs file name---------------------------# - obspath = len(obs_path) - while obspath > 0: - flag = obs_path[obspath - 1:obspath] - if flag == "/": - obsfile = satsysdict.get(satellite_system) + "-" + obs_path[obspath:-4] - break - obspath -= 1 - # Get the file's father folder-------------------# - if DirectoryOut: - pathlon = len(DirectoryOut) - while pathlon - 3 > 0: - flag = DirectoryOut[pathlon - 3 - 1:pathlon - 3] - if flag == "/": - res_path = DirectoryOut[:pathlon - 3] + obsfile + ".sp" - break - pathlon -= 1 - else: - res_path = obs_path[0:obspath] + obsfile + ".sp" - # -----------------------------------------------# - - ExecuteState.config(text='Processing...... file : %s' % obs_path[obspath:]) - - dll = cdll.LoadLibrary('./brdm2pos.dll') - dll.brdm2pos.restype = c_double - match dll.brdm2pos(nav_path.encode(), obs_path.encode(), res_path.encode(), - satellite_system, int(h_anglemode[h_anglestate])): - case 0.0: - ExecuteState.config(text='Generated successfully ! file : %s' % obsfile + ".sp") - case -1.0: - ExecuteState.config(text='Error ! cant open nav file') - case -2.0: - ExecuteState.config(text='Error ! cant open obs file') - case -3.0: - ExecuteState.config(text='Error ! unsupported nav file') - case -4.0: - ExecuteState.config(text='Error ! no nav data') - case -5.0: - ExecuteState.config(text='Error ! unsupported obs file') - case -6.0: - ExecuteState.config(text='Error ! no obs data') - windll.kernel32.FreeLibrary('./brdm2pos.dll') - - def _ExecuteFile(self,ExecuteState, - ObsSelectBoxVar, - NavSelectBoxVar, - AskOrNotCheckVar, - DirectorySelectBoxVar): - T = threading.Thread(target=lambda: self.ExecuteFile(ExecuteState, - ObsSelectBoxVar, - NavSelectBoxVar, - AskOrNotCheckVar, - DirectorySelectBoxVar)) - T.start() - -class MAINGUI: - def __init__(self, hwnd): - - self.satvisb = None - self.sattrack = None - self.satn = None - self.canvas2 = None - self.canvas1 = None - self.canvas0 = None - self.ux = None - self.nx = None - self.ex = None - self.plotstate = None - self.initGUI(hwnd) - - self.Drawcards = tk.ttk.Notebook(hwnd) - - self.frmFigure0 = tk.Frame(hwnd) - self.frmFigure0.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) - - self.frmFigure1 = tk.Frame(hwnd) - self.frmFigure1.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) - - self.frmFigure2 = tk.Frame(hwnd) - self.frmFigure2.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) - - self.initTOPMENU(hwnd) - - self.initPLOT() - - self.Drawcards.add(self.frmFigure0, text='ENU-Draw') - self.Drawcards.add(self.frmFigure1, text='Sat Number') - self.Drawcards.add(self.frmFigure2, text='Sat Track') - self.Drawcards.pack(fill=tk.BOTH, expand=True, padx='2px', pady='0px') - - hwnd.protocol("WM_DELETE_WINDOW", hwnd.quit) - hwnd.mainloop() - - def initGUI(self, hwnd): - hwnd.title("KNZ_GeoTrackLab %s"%version) - Move_center(hwnd,1200,700) - hwnd.minsize(1200, 700) - - icon_img = (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_img = b64decode(icon_img) - icon_img = ImageTk.PhotoImage(data=icon_img) - hwnd.tk.call('wm', 'iconphoto', hwnd._w, icon_img) - - default_font = tkfont.nametofont("TkDefaultFont") - default_font.configure(family="Segoe UI", size=9) - - stateframe = tk.Frame(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 initTOPMENU(self, hwnd): - - topmenu = tk.Menu(hwnd) - filemenu = tk.Menu(topmenu, tearoff=False) - openmenu = tk.Menu(filemenu, tearoff=False) - openmenu.add_command(label="Open Pos Solution",command=lambda :self.PO_openfile(hwnd), accelerator='Ctrl+S') - openmenu.add_command(label="Open Sat Solution", command=lambda: self._SPP_calculat(hwnd), accelerator='Ctrl+S') - openmenu.add_command(label="Open RINEX",command=lambda :ExecutIN(hwnd), accelerator='Ctrl+P') - filemenu.add_cascade(label="Open...", menu=openmenu) - filemenu.add_command(label="Clear", command=self.Clear_canvas) - filemenu.add_command(label="View", command=lambda :ViewIN(hwnd)) - filemenu.add_command(label="Exit", command=hwnd.quit, accelerator='Ctrl+E') - topmenu.add_cascade(label="File", menu=filemenu) - - optmenu = tk.Menu(topmenu, tearoff=False) - optmenu.add_cascade(label="Options...",command=lambda :OptionsIN(hwnd)) - topmenu.add_cascade(label="Options", menu=optmenu) - - helpmenu = tk.Menu(topmenu, tearoff=False) - helpmenu.add_command(label="About", command=Abo_windows) - topmenu.add_cascade(label="Help", menu=helpmenu) - - hwnd.config(menu=topmenu) - - def initPLOT(self): - # -------------------------------------------------------------------------------- - 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.frmFigure0) - self.canvas0.draw() - self.canvas0.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) - - toolbar = NavigationToolbar2Tk(self.canvas0, self.frmFigure0, pack_toolbar=False) - toolbar.update() - toolbar.pack(side=tk.LEFT) - - # -------------------------------------------------------------------------------- - #-------------------------------------------------------------------------------- - 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.frmFigure1) - self.canvas1.draw() - self.canvas1.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) - - toolbar = NavigationToolbar2Tk(self.canvas1, self.frmFigure1, pack_toolbar=False) - toolbar.update() - toolbar.pack(side=tk.LEFT) - - # -------------------------------------------------------------------------------- - # -------------------------------------------------------------------------------- - plt.rc('font', family='Segoe UI') - fig = plt.figure() - self.sattrack = fig.add_subplot(projection='3d') - fig.subplots_adjust(left=0, bottom=0, right=1, top=1) - - for spine in ['right', 'left']: - self.sattrack.spines[spine].set_visible(False) - self.sattrack.set_facecolor('#f5f5f5') - - self.canvas2 = FigureCanvasTkAgg(fig, self.frmFigure2) - self.canvas2.draw() - self.canvas2.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) - - toolbar = NavigationToolbar2Tk(self.canvas2, self.frmFigure2, pack_toolbar=False) - toolbar.update() - toolbar.pack(side=tk.TOP, anchor='w') - - def Clear_canvas(self): - # Brief # clear the canvas - # Return# none - 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") - root.update() - - def PO_openfile(self, hwnd): - # Brief # read the .po file & draw in the canvas - # Return# none - ENU_O = np.empty((3, 0)) - # Sat numbers register part - satnumnarry = np.empty((1, 0)) - f_path = filedialog.askopenfilename(title='Pos Solution File', - filetypes=[('Pos Solution File(*.po)', '*.po'), - ('All Files', '*.*')]) - if not f_path.find(".po") >= 0: - self.plotstate.config(text="Error !: format is invalid.") - hwnd.update() - return - with open(f_path, 'r') as f: - while 1: - line = f.readline() - if line.find("X-rec") >= 0: - self.plotstate.config(text="Reading...") - hwnd.update() - while 1: - line = f.readline() - if line != "" and line[1:2] != "-": - E = float(line[45 + 22:55 + 22]) - N = float(line[56 + 22:66 + 22]) - U = float(line[67 + 22:77 + 22]) - satnum = int(line[64:67]) - - ENU_O = np.hstack((ENU_O, [[E], [N], [U]])) - satnumnarry = np.hstack((satnumnarry, [[satnum]])) - if line[1:2] == "-": - ENU_O = np.hstack((ENU_O, [[0], [0], [0]])) - satnumnarry = np.hstack((satnumnarry, [[0]])) - if line == "": - self.ex.clear() - self.nx.clear() - self.ux.clear() - self.ex.plot(ENU_O[0, :], color=enucolor[0], linewidth=enulinew[0], marker='.', linestyle=':', - ms=enulinew[0]) - self.ex.set_title(' E-W(m)', x=0.02, y=0, fontsize=8) - self.ex.grid(True, linestyle='--', alpha=0.7) - self.nx.plot(ENU_O[1, :], color=enucolor[1], linewidth=enulinew[1], marker='.', linestyle=':', - ms=enulinew[1]) - self.nx.set_title(' N-S(m)', x=0.02, y=0, fontsize=8) - self.nx.grid(True, linestyle='--', alpha=0.7) - self.ux.plot(ENU_O[2, :], color=enucolor[2], linewidth=enulinew[2], marker='.', linestyle=':', - ms=enulinew[2]) - self.ux.set_title(' U-D(m)', x=0.02, y=0, fontsize=8) - self.ux.grid(True, linestyle='--', alpha=0.7) - self.canvas0.draw() - - self.satn.clear() - self.satn.plot(satnumnarry[0, :], marker='|', ms=5, linestyle=None, color=satncolor[0], linewidth=0) - self.satn.set_title('Valid Sat Numbers', loc='left', fontsize=8) - self.satn.set_xlabel('Epochs') - self.satn.grid(True, linestyle='--', alpha=0.7) - self.canvas1.draw() - break - elif line == "": - self.plotstate.config(text="Plot form: %s" % f_path) - break - - def SPP_calculat(self, hwnd): - # Brief # read .sp file & draw in the canvas & output the .po file - # Return# none - # Const define - self.sattrack.clear() - C_V = 299792458 - - ENU_O = np.empty((3, 0)) - GDOP = np.empty((1, 0)) - # Sat numbers register part - satnumnarry = np.empty((1, 0)) - res_path = filedialog.askopenfilename(title='Sat Solution File', - filetypes=[('Sat Solution File(*.sp)', '*.sp'), - ('All Files', '*.*')]) - if not res_path.find(".sp") >= 0: - self.plotstate.config(text="Error !: format is invalid.") - hwnd.update() - return - with open(res_path, 'r') as f: - while 1: - line = f.readline() - if line.find("APPROX POSITION XYZ") >= 0: - apX = float(line[23:35]) - apY = float(line[36:48]) - apZ = float(line[49:61]) - elif line.find("APPROX POSITION BLH") >= 0: - apB = float(line[23:35]) - apL = float(line[36:48]) - apH = float(line[49:61]) - elif line.find("OBS FILE PATH") >= 0: - Obs = line[23:300] - elif line.find("NAV FILE PATH") >= 0: - pass - elif line.find("END OF HEADER") >= 0: - break - # Get the obs file name---------------------------# - obspath = len(Obs) - while obspath > 0: - flag = Obs[obspath - 1:obspath] - if flag == "/" or flag == "\\": - obsfile = satsysdict.get(satellite_system) + "-" + Obs[obspath:-4] - break - obspath -= 1 - # Get the file's father folder-------------------# - pathlon = len(res_path) - while pathlon - 3 > 0: - flag = res_path[pathlon - 3 - 1:pathlon - 3] - if flag == "/": - o_path = res_path[:pathlon - 3] + obsfile + "po" - break - pathlon -= 1 - # -----------------------------------------------# - - # Generate the data header-----------------------# - with open(o_path, 'w+') as of: # Initialize-------# - of.close() - of = open(o_path, 'a+') - print("@ GENERATE PROGRAM : KNZ_GeoTrackLab %s\n" - "@ GENERATE TYPE : Receiver Station Position\n" - "@ GENERATE TIME : %s\n" - "@ GENERATE SYS : %s\n" - "@ IONOS OPT : %s\n" - "@ TROPO OPT : %s\n" - "@\n\n" % ( version - , time.asctime(time.localtime()) - , satsysdict.get(satellite_system) - , ioncormode[ioncorstate] - , trocormode[trocorstate]), file=of) - print( - "GPST X-rec(m) Y-rec(m) Z-rec(m) Sn(n) dE(m) dN(m) dU(m) ", - file=of) - - # Coordinate transformation matrix---------------# - S = np.array([ - [-math.sin(apL) , math.cos(apL) , 0 ], - [-math.sin(apB) * math.cos(apL), -math.sin(apB) * math.sin(apL), math.cos(apB)], - [ math.cos(apB) * math.cos(apL), math.cos(apB) * math.sin(apL), math.sin(apB)] - ]) - # -----------------------------------------------# - self.plotstate.config(text="Reading...") - hwnd.update() - - global epoch_last - epoch_last = 0 - while 1: - line = f.readline() - if line == "": - break - flag = line[0: 1] - if flag == ">": - satnum = 0 - sPRN = [] - satX = np.empty((1, 0)) - satY = np.empty((1, 0)) - satZ = np.empty((1, 0)) - C1 = np.empty((1, 0)) - - ma = np.empty((1, 0)) - - Dt = np.empty((1, 0)) - - year = int(line[6:10]) - month = int(line[11:13]) - day = int(line[14:16]) - hour = int(line[17:19]) - min = int(line[20:22]) - sec = float(line[23:30]) - epoch = int(line[2:6]) - - count = 0 - while count < epoch - epoch_last - 1: - ENU_O = np.hstack((ENU_O, [[0], [0], [0]])) - satnumnarry = np.hstack((satnumnarry, [[0]])) - print("------------ MISSING EPOCH DATA", file=of) - count += 1 - epoch_last = epoch - while 1: - line = f.readline() - if line == "\n": - - if epoch % 15 == 0: - self.sattrack.scatter(satX[0,:], satY[0,:], satZ[0,:], s=5, zdir='z', c=SatColor[6] ) - - satnumnarry = np.hstack((satnumnarry, [[satnum]])) - - match satsysdict.get(satellite_system): - case 'G': - MINSAT = 4 - case 'E': - MINSAT = 4 - case 'R': - MINSAT = 5 - case 'C': - MINSAT = 4 - - if satnum >= MINSAT: - stop = 0 - Qtrace = 0 - X = ap_X = apX - Y = ap_Y = apY - Z = ap_Z = apZ - while math.fabs(ap_X - X) > 1.0e-7 or ap_X == X: - stop += 1 - if stop >= 4: - break - count = 0 - ap_X = X - ap_Y = Y - ap_Z = Z - Ptem = [] - B = np.empty((0, 4)) - L = np.empty((0, 1)) - while 1: - R = math.sqrt( - pow((satX[0, count] - ap_X), 2) + pow((satY[0, count] - ap_Y), 2) + pow( - (satZ[0, count] - ap_Z), 2)) - l = -((satX[0, count] - ap_X) / R) - m = -((satY[0, count] - ap_Y) / R) - n = -((satZ[0, count] - ap_Z) / R) - B = np.vstack((B, [l, m, n, 1])) - Ptem.append(pow(math.sin(math.radians(ma[0, count])), 2)) - # Get the tropsphere correction - match trocorstate: - case 0:Tro = 0 - case 1:Tro = Trocor.Hop_tro_cor(apH, ma[0, count]) - case 2:Tro = Trocor.Sas_tro_cor(apB, apH, ma[0, count]) - - L = np.vstack( - ( L, [C1[0, count] - R + C_V * Dt[0, count] - Tro] ) - ) - - count += 1 - if count == satnum: - break - - P = np.diag(Ptem) - BTP = np.dot(np.transpose(B), P) - BTPB = np.dot(BTP, B) - Q = np.linalg.inv(BTPB) - Qtrace = np.trace(Q) - D_X = np.dot(np.dot(np.dot(Q, np.transpose(B)), P), L) # Coordinate correction - X = D_X[0, 0] + ap_X - Y = D_X[1, 0] + ap_Y - Z = D_X[2, 0] + ap_Z - - DeltaXYZ = np.array([[X - apX], [Y - apY], [Z - apZ]]) - ENU = S @ DeltaXYZ - #if math.fabs(ENU[0, 0]) > 25 or math.fabs(ENU[1, 0]) > 25 or math.fabs(ENU[2, 0]) > 50: - # ENU_O = np.hstack((ENU_O, [[0], [0], [0]])) - # print("------------ ANOMALY RESOLUTION", file=of) - #else: - ENU_O = np.hstack((ENU_O, [[ENU[0, 0]], [ENU[1, 0]], [ENU[2, 0]]])) - GDOP = np.hstack((GDOP, [ [math.sqrt(Qtrace)] ])) - - print( - "%4d\\%02d\\%02d\\%02d\\%02d\\%04.1f %12.4f %12.4f %12.4f %3d %10.5f %10.5f %10.5f" - % (year, month, day, hour, min, sec, X, Y, Z, satnum, - float(ENU[0, 0]), - float(ENU[1, 0]), - float(ENU[2, 0]) ), file=of) - break - else: - break - - flag = line[0:1] - if flag == satsysdict.get(satellite_system): - satnum += 1 - sPRN.append(int(line[2:4])) - satX = np.hstack((satX, [[float(line[6:21])]])) - satY = np.hstack((satY, [[float(line[22:37])]])) - satZ = np.hstack((satZ, [[float(line[38:53])]])) - C1 = np.hstack((C1, [[float(line[55:69])]])) - ma = np.hstack((ma, [[float(line[71:85])]])) - Dt = np.hstack((Dt, [[float(line[86:102])]])) - - elif line.find("END") >= 0: - self.ex.clear() - self.nx.clear() - self.ux.clear() - - self.ex.plot(ENU_O[0, :], color=enucolor[0], linewidth=enulinew[0], marker='.', linestyle=':', - ms=enulinew[0]) - self.ex.plot( GDOP[0, :], color='#808080', alpha=0.5, linewidth=enulinew[0], marker='.', linestyle=':', - ms=enulinew[0]) - self.ex.set_title(' E-W(m)', x=0.02, y=0, fontsize=8) - self.ex.grid(True, linestyle='--', alpha=0.7) - - self.nx.plot(ENU_O[1, :], color=enucolor[1], linewidth=enulinew[1], marker='.', linestyle=':', - ms=enulinew[1]) - self.nx.set_title(' N-S(m)', x=0.02, y=0, fontsize=8) - self.nx.grid(True, linestyle='--', alpha=0.7) - - self.ux.plot(ENU_O[2, :], color=enucolor[2], linewidth=enulinew[2], marker='.', linestyle=':', - ms=enulinew[2]) - self.ux.set_title(' U-D(m)', x=0.02, y=0, fontsize=8) - self.ux.grid(True, linestyle='--', alpha=0.7) - - self.canvas0.draw() - - self.satn.clear() - self.satn.plot(satnumnarry[0, :], marker='|', ms=5, linestyle=None, color=satncolor[0], linewidth=0) - self.satn.set_title('Valid Satellite Numbers',loc='left', fontsize=8) - self.satn.set_xlabel('Epochs') - self.satn.grid(True, linestyle='--', alpha=0.7) - self.canvas1.draw() - self.canvas2.draw() - - f.close() - self.plotstate.config(text="Plot form: %s" % res_path) - break - - def _SPP_calculat(self, hwnd: object) -> object: - T = threading.Thread(target=lambda :self.SPP_calculat(hwnd)) - T.start() - -class OPTGUI: - def __init__(self,hwnd): - - self.ulinewidth = None - self.nlinewidth = None - self.elinewidth = None - self.Main2Frame0 = None - self.v = None - self.ctrobox = None - self.cionbox = None - self.Main1Frame0 = None - self.opthwnd = None - - self.initGUI(hwnd) - - self.Cmd = FUNCTION() - - def initGUI(self,hwnd): - self.opthwnd = tk.Toplevel(hwnd) - self.opthwnd.title("Options") - self.opthwnd.resizable(0,0) - Move_center(self.opthwnd,320,250) - self.opthwnd.minsize(320,250) - self.opthwnd.maxsize(320,250) - - icon_img2 = (b'AAABAAEAICAAAAAAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAADjsAAA47AAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'ABAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAACQAAABIAAAASAAAACQAAAAAAAAACAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAABwAAAJAAAADqAAAA7gAAAO4AAADqAAAAk' - b'QAAAAcAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAACQAAAA/wAAAPw' - b'AAAD/AAAA/wAAAPwAAAD/AAAAkAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAADAAAAAQAAAAEAAAAAA' - b'AAACwAAAOMAAAD/AAAA/AAAAP4AAAD+AAAA/AAAAP8AAADjAAAACgAAAAAAAAABAAAAAQAAAAMA' - b'AAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAA' - b'AAAAAAAABAAAABQAAAAAAAAATAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD+AAAA/wAAAO0AAAATAA' - b'AAAAAAAAUAAAABAAAAAAAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AABAAAAAAAAABEAAABTAAAAUQAAAA8AAAAAAAAAAAAAAEQAAAD/AAAA/gAAAP8AAAD/AAAA/wAA' - b'AP8AAAD+AAAA/wAAAEQAAAAAAAAAAAAAAA8AAABRAAAAUwAAABEAAAAAAAAAAQAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAgAAAAAAAAAwAAAA5QAAAP8AAAD/AAAA4QAAAHYAAAB2AAAA6QAAAP8AAA' - b'D+AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA6QAAAHYAAAB1AAAA4QAAAP8AAAD/AAAA5QAAA' - b'DAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAMoAAAD/AAAA+gAAAPwAAAD/AAAA' - b'/wAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/gAAAP4AAAD/AAAA/wAAAP8AAAD+AAAA/wAAAP8AAAD' - b'/AAAA/AAAAPoAAAD/AAAAywAAAAMAAAAAAAAAAQAAAAAAAAAAAAAAAwAAAAAAAABrAAAA/wAAAP' - b'oAAAD/AAAA/wAAAP0AAAD7AAAA+wAAAP4AAAD/AAAA/AAAAP0AAAD/AAAA/wAAAP0AAAD8AAAA/' - b'wAAAP4AAAD7AAAA+wAAAP0AAAD/AAAA/wAAAPoAAAD/AAAAawAAAAAAAAADAAAAAAAAAAEAAAAA' - b'AAAAAwAAANUAAAD/AAAA/QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAAD/AAAA/wAAAPI' - b'AAADyAAAA/wAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/QAAAP8AAADVAAAAAw' - b'AAAAAAAAABAAAAAQAAAAAAAAATAAAA7AAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9A' - b'AAA/wAAAK8AAAA8AAAAFQAAABUAAAA8AAAArgAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8A' - b'AAD+AAAA/wAAAOwAAAATAAAAAAAAAAEAAAAAAAAAAQAAAAAAAADBAAAA/wAAAPoAAAD/AAAA/wA' - b'AAP8AAAD/AAAA/QAAAP8AAAB3AAAAAAAAAAIAAAAAAAAAAAAAAAIAAAAAAAAAdwAAAP8AAAD9AA' - b'AA/wAAAP8AAAD/AAAA/wAAAPoAAAD/AAAAwQAAAAAAAAABAAAAAAAAAAAAAAACAAAAAAAAADEAA' - b'ADmAAAA/wAAAP0AAAD/AAAA/wAAAPwAAAD/AAAAqwAAAAAAAAAEAAAAAwAAAAEAAAABAAAABAAA' - b'AAQAAAAAAAAArAAAAP8AAAD8AAAA/wAAAP8AAAD9AAAA/wAAAOYAAAAwAAAAAAAAAAIAAAAAAAA' - b'AAAAAAAAAAAABAAAAAAAAAA0AAACuAAAA/wAAAP0AAAD/AAAA/QAAAP8AAABCAAAAAAAAAAMAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAABCAAAA/wAAAP0AAAD/AAAA/QAAAP8AAACvAAAADQAAA' - b'AAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAACAAAAD4AAAA/wAAAP0AAAD/AAAA' - b'8gAAABgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABgAAADyAAAA/wAAAP0AAAD' - b'/AAAA+AAAACAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAP' - b'gAAAD/AAAA/QAAAP8AAADyAAAAGAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAG' - b'AAAAPIAAAD/AAAA/QAAAP8AAAD4AAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB' - b'AAAAAAAAAA0AAACuAAAA/wAAAP0AAAD/AAAA/QAAAP8AAABCAAAAAAAAAAMAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAwAAAAAAAABCAAAA/wAAAP0AAAD/AAAA/QAAAP8AAACuAAAADQAAAAAAAAABAAAAAA' - b'AAAAAAAAAAAAAAAgAAAAAAAAAxAAAA5gAAAP8AAAD9AAAA/wAAAP8AAAD8AAAA/wAAAKsAAAAAA' - b'AAABAAAAAMAAAABAAAAAQAAAAMAAAAEAAAAAAAAAKsAAAD/AAAA/AAAAP8AAAD/AAAA/QAAAP8A' - b'AADmAAAAMAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAMEAAAD/AAAA+gAAAP8AAAD/AAAA/wA' - b'AAP8AAAD9AAAA/wAAAHcAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAB3AAAA/wAAAP0AAAD/AA' - b'AA/wAAAP8AAAD/AAAA+gAAAP8AAADBAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAATAAAA7AAAAP8AA' - b'AD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA/wAAAK4AAAA8AAAAFQAAABUAAAA8AAAArgAA' - b'AP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD+AAAA/wAAAOwAAAATAAAAAAAAAAEAAAABAAA' - b'AAAAAAAMAAADWAAAA/wAAAP0AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA/wAAAP8AAA' - b'DyAAAA8gAAAP8AAAD/AAAA/QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAAD/AAAA1QAAA' - b'AMAAAAAAAAAAQAAAAAAAAADAAAAAAAAAGsAAAD/AAAA+gAAAP8AAAD/AAAA/QAAAPsAAAD7AAAA' - b'/gAAAP8AAAD8AAAA/QAAAP8AAAD/AAAA/QAAAPwAAAD/AAAA/gAAAPsAAAD7AAAA/QAAAP8AAAD' - b'/AAAA+gAAAP8AAABrAAAAAAAAAAMAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAMsAAAD/AAAA+gAAAP' - b'wAAAD/AAAA/wAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/gAAAP4AAAD/AAAA/wAAAP8AAAD+AAAA/' - b'wAAAP8AAAD/AAAA/AAAAPoAAAD/AAAAywAAAAMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAA' - b'AAAAMQAAAOYAAAD/AAAA/wAAAOEAAAB2AAAAdgAAAOkAAAD/AAAA/gAAAP8AAAD/AAAA/wAAAP8' - b'AAAD+AAAA/wAAAOkAAAB2AAAAdgAAAOEAAAD/AAAA/wAAAOYAAAAxAAAAAAAAAAIAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEQAAAFQAAABRAAAADwAAAAAAAAAAAAAARAAAAP8AAAD+A' - b'AAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAARAAAAAAAAAAAAAAADwAAAFEAAABUAAAAEQAAAAAA' - b'AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAABAAAABQA' - b'AAAAAAAATAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD+AAAA/wAAAO0AAAATAAAAAAAAAAUAAAABAA' - b'AAAAAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAA' - b'AAEAAAABAAAAAEAAAABAAAAAAAAAAsAAADjAAAA/wAAAPwAAAD+AAAA/gAAAPwAAAD/AAAA4wAA' - b'AAoAAAAAAAAAAQAAAAEAAAAEAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAJAAAAD/AAAA/AAAAP8AAA' - b'D/AAAA/AAAAP8AAACQAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA' - b'BwAAAJAAAADqAAAA7gAAAO4AAADqAAAAkQAAAAcAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAkAAAASAAAAEgAAAAoAAAAAAAAAAgAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAM' - b'AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9GL//' - b'+kJf//kAn//5AJ/+ggBBfTIATLqCAEFZAAAAkgAAAEIAAABEAAAAJAAAACIAQgBKAIEAVQClAKq' - b'AmQFagJkBVQClAKoAgQBSAEIARAAAACQAAAAiAAAAQgAAAEkAAACaggBBXTIATL6CAEF/+QCf//' - b'kAn//6Ql///Ri/8=') - - icon_img2 = b64decode(icon_img2) - icon_img2 = ImageTk.PhotoImage(data=icon_img2) - self.opthwnd.tk.call('wm', 'iconphoto', self.opthwnd._w, icon_img2) - - Optionscards = tk.ttk.Notebook(self.opthwnd) - - self.initCARDCALCU() - self.initCARDDRAW() - - Optionscards.add(self.Main1Frame0, text='Calc options') - Optionscards.add(self.Main2Frame0, text='Draw options') - Optionscards.pack(fill=tk.BOTH, expand=True, padx='2px', pady='0px') - - self.initCONFIRM() - - def initCARDCALCU(self): - self.Main1Frame0 = tk.Frame(self.opthwnd) - - # ION correction# - TOP1Frame0 = ttk.Frame(self.Main1Frame0) - TOP1Frame0.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) - - ioncor = ttk.Label(TOP1Frame0, text='Ionosphere Correction') - ioncor.pack(side=tk.LEFT, anchor='w', padx='1px') - - self.cionbox = ttk.Combobox(TOP1Frame0, width=15, height=4) - self.cionbox['state'] = 'readonly' - self.cionbox['value'] = ('OFF', 'Ion-Free LC', 'Broadcast') - self.cionbox.current(ioncorstate) - self.cionbox.pack(side=tk.RIGHT, anchor='e') - - # TRO correction# - TOP2Frame0 = ttk.Frame(self.Main1Frame0) - TOP2Frame0.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) - - ioncor = ttk.Label(TOP2Frame0, text='Troposphere Correction') - ioncor.pack(side=tk.LEFT, anchor='w', padx='1px') - - self.ctrobox = ttk.Combobox(TOP2Frame0, width=15, height=4) - self.ctrobox['state'] = 'readonly' - self.ctrobox['value'] = ('OFF', 'Hopfield', 'Saastamoinen') - self.ctrobox.current(trocorstate) - self.ctrobox.pack(side=tk.RIGHT, anchor='e') - - - TOP3Frame0 = ttk.Frame(self.Main1Frame0) - TOP3Frame0.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) - - h_angle = ttk.Label(TOP3Frame0, text='Satellite Elevation(°) / #') - h_angle.pack(side=tk.LEFT, anchor='w', padx='1px') - - self.angleentry = ttk.Entry(TOP3Frame0, width=8) - self.angleentry.pack(side=tk.RIGHT, anchor='w') - - self.canglebox = ttk.Combobox(TOP3Frame0, width=6, height=10) - self.canglebox['state'] = 'readonly' - self.canglebox['value'] = ('0','5','10','15','20','25','30','35','40','45','50') - self.canglebox.current(h_anglestate) - self.canglebox.pack(side=tk.RIGHT, anchor='e') - - # GNSS Options# - TOP5Frame0 = ttk.LabelFrame(self.Main1Frame0, text='Satellite system', labelanchor='nw') - TOP5Frame0.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) - - satsys = [("GPS", 1), ("GLO", 4), ("BeiDou", 2), ("Galileo", 3), ("SBAS", 5)] - self.v = tk.IntVar() - - for sys, num in satsys: - radio_button = ttk.Radiobutton(TOP5Frame0, text=sys, variable=self.v, value=num) - radio_button.pack(side=tk.LEFT, padx='3px', anchor='w') - - self.v.set(satellite_system) - - def initCARDDRAW(self): - - self.Main2Frame0 = tk.Frame(self.opthwnd) - - self.initDRAWCOLOR() - self.initDRAWLINE() - - def initDRAWLINE(self): - # Line's weight options# - Right2Frame1 = ttk.LabelFrame(self.Main2Frame0, text='Draw configs', labelanchor='nw') - Right2Frame1.pack(side=tk.RIGHT, expand=tk.YES, padx='1px', pady='1px', fill=tk.Y) - - EFrameR2 = tk.Frame(Right2Frame1) - EFrameR2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') - elinewopt = tk.Label(EFrameR2, text='Eline:', width=5, height=1) - elinewopt.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') - self.elinewidth = ttk.Spinbox(EFrameR2, from_=0, to=10, increment=0.01, width=10) - self.elinewidth.set(enulinew[0]) - self.elinewidth.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') - - NFrameR2 = tk.Frame(Right2Frame1) - NFrameR2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') - nlinewopt = tk.Label(NFrameR2, text='Nline:', width=5, height=1) - nlinewopt.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') - self.nlinewidth = ttk.Spinbox(NFrameR2, from_=0, to=10, increment=0.01, width=10) - self.nlinewidth.set(enulinew[1]) - self.nlinewidth.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') - - UFrameR2 = tk.Frame(Right2Frame1) - UFrameR2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') - ulinewopt = tk.Label(UFrameR2, text='Uline:', width=5, height=1) - ulinewopt.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') - self.ulinewidth = ttk.Spinbox(UFrameR2, from_=0, to=10, increment=0.01, width=10) - self.ulinewidth.set(enulinew[2]) - self.ulinewidth.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') - - LineConR2 = tk.Frame(Right2Frame1) - LineConR2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') - linewre = ttk.Button(LineConR2, text='Undo', width=10, - command=lambda: self.Cmd.Linewchoose(self.elinewidth, - self.nlinewidth, - self.ulinewidth, 0)) - linewre.pack(side=tk.LEFT, expand=tk.YES, padx='1px') - - def initDRAWCOLOR(self): - - # Satnum plot options# - Buttom1Frame1 = ttk.LabelFrame(self.Main2Frame0, text='Satn configs', labelanchor='nw') - Buttom1Frame1.pack(side=tk.BOTTOM, expand=tk.YES, padx='1px', pady='1px', fill=tk.BOTH) - - SatnFrameB1 = tk.Frame(Buttom1Frame1) - SatnFrameB1.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - satncolopt = ttk.Button(SatnFrameB1, text='Satn Color', width=10, - command=lambda: self.Cmd.Colorchoose(self.opthwnd,0, satncollab, 4)) - satncolopt.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - satncollab = tk.Label(SatnFrameB1, width=5, height=1, bg=satncolor[0]) - satncollab.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - - LineConB1 = tk.Frame(Buttom1Frame1) - LineConB1.pack(side=tk.RIGHT, expand=tk.YES, padx='5px', pady='0px') - linewre = ttk.Button(LineConB1, text='Undo', width=10, - command=lambda: self.Cmd.Colorchoose(self.opthwnd,0, satncollab, 5)) - linewre.pack(side=tk.LEFT, expand=tk.YES, padx='1px') - - # Line's colors options# - Left2Frame1 = ttk.LabelFrame(self.Main2Frame0, text='ENU colors', labelanchor='nw') - Left2Frame1.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='1px', fill=tk.Y) - - EFrameL2 = tk.Frame(Left2Frame1) - EFrameL2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') - ecolopt = ttk.Button(EFrameL2, text='E Color', width=10, - command=lambda: self.Cmd.Colorchoose(self.opthwnd,0, ecollab, 1)) - ecolopt.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - ecollab = tk.Label(EFrameL2, width=5, height=1, bg=enucolor[0]) - ecollab.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - - NFrameL2 = tk.Frame(Left2Frame1) - NFrameL2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') - ncolopt = ttk.Button(NFrameL2, text='N Color', width=10, - command=lambda: self.Cmd.Colorchoose(self.opthwnd,1, ncollab, 1)) - ncolopt.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - ncollab = tk.Label(NFrameL2, width=5, height=1, bg=enucolor[1]) - ncollab.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - - UFrameL2 = tk.Frame(Left2Frame1) - UFrameL2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') - ucolopt = ttk.Button(UFrameL2, text='U Color', width=10, - command=lambda: self.Cmd.Colorchoose(self.opthwnd,2, ucollab, 1)) - ucolopt.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - ucollab = tk.Label(UFrameL2, width=5, height=1, bg=enucolor[2]) - ucollab.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - - ColorConL2 = tk.Frame(Left2Frame1) - ColorConL2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') - colorcon = ttk.Button(ColorConL2, text='Undo', width=10, - command=lambda: [self.Cmd.Colorchoose(self.opthwnd,0, ecollab, 0) - , self.Cmd.Colorchoose(self.opthwnd,1, ncollab, 0) - , self.Cmd.Colorchoose(self.opthwnd,2, ucollab, 0)]) - colorcon.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - - def initCONFIRM(self): - # TOTAL Confirm# - Bottom0Frame0 = ttk.Frame(self.opthwnd) - Bottom0Frame0.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='0px', fill=tk.Y) - TotalCancel = ttk.Button(Bottom0Frame0, text='Cancel', width=10, - command=lambda: [self.opthwnd.destroy()]) - TotalCancel.pack(side=tk.RIGHT, padx='1px', anchor='e') - TotalCon = ttk.Button(Bottom0Frame0, text='Confirm', width=10, - command=lambda: [self.Cmd.Colorchoose(self.opthwnd,0, None, 3), - self.Cmd.Linewchoose(self.elinewidth, - self.nlinewidth, - self.ulinewidth, 1), - self.Cmd.Calcu_confirm(self.v, self.cionbox, self.ctrobox, self.canglebox)]) - TotalCon.pack(side=tk.RIGHT, padx='1px', anchor='e') - -class EXECUDUI: - def __init__(self,hwnd): - self.exehwnd = None - self.initGUI(hwnd) - ##Combox Var - self.ObsSelectBoxVar = tk.StringVar() - self.NavSelectBoxVar = tk.StringVar() - self.DirectorySelectBoxVar = tk.StringVar() - ##CheckButton Var - self.AskOrNotCheckButtonVar = tk.IntVar() - - self.initIO() - - self.Cmd = FUNCTION() - - def initGUI(self,hwnd): - self.exehwnd = tk.Toplevel(hwnd) - self.exehwnd.title("RINEX Processor") - self.exehwnd.resizable(0,0) - Move_center(self.exehwnd,550,180) - self.exehwnd.minsize(550,180) - self.exehwnd.maxsize(550,180) - - global icon_img3 - icon_img3 = (b'AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAADjsAAA47AAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAEAAAAAQ' - b'AAAAAAAAAAAAAAAQAAAAQAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'QAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAAAAAABAAAADQAAAA0AAAABAAAA' - b'AAAAAAAAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAzAAAAlgAAANQAAADwAAAA8AAAANQAAACWAAAAMwAAAAAAAAADAA' - b'AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAAARAAAAEAAAABAAAAAPAAAAAQAAAAAAAAAAA' - b'AAAAQAAAAAAAAAIAAAAlwAAAP4AAAD/AAAA/wAAAPcAAAD3AAAA/wAAAP8AAAD+AAAAlwAAAAgAAAAAAAAAAQAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAgAAAAAAAABRAAAA5gAAAPIAAADwAAAA9gAAAOIAAAAQAAAAAAAAAAIAAAAAAAAACAAAALsAAAD' - b'/AAAA8gAAAIsAAAAyAAAAFAAAABQAAAAyAAAAiwAAAPIAAAD/AAAAuwAAAAgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAA' - b'AAAAAABgAAANwAAAD/AAAA8QAAAPEAAAD2AAAA4gAAABAAAAAAAAAABAAAAAAAAACWAAAA/wAAAN0AAAAuAAAAAAAAAAIAA' - b'AAAAAAAAAAAAAIAAAAAAAAALgAAAN0AAAD/AAAAlgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAARAAAA8AAAAPEA' - b'AAAfAAAADAAAABIAAAAPAAAAAQAAAAIAAAAAAAAANgAAAP8AAAD2AAAAMwAAAAAAAAAHAAAAAgAAAAAAAAAFAAAABAAAAAY' - b'AAAAAAAAAMwAAAPYAAAD/AAAANgAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAABAAAADxAAAA8gAAABAAAAAAAAAAAQAAAA' - b'AAAAAAAAAABAAAAAAAAACSAAAA/wAAAIoAAAAAAAAAAAAAABUAAACiAAAAJwAAAAAAAAADAAAAAwAAAAYAAAAAAAAAigAAA' - b'P8AAACSAAAAAAAAAAQAAAAAAAAAAAAAAAEAAAAAAAAAEAAAAPIAAADyAAAAEQAAAAAAAAACAAAAAQAAAAEAAAAAAAAAAAAA' - b'ANAAAAD/AAAANwAAAAAAAAAAAAAAEQAAAO8AAAD7AAAAfgAAAAgAAAAAAAAAAwAAAAAAAAA3AAAA/wAAANAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAQAAAAAAAAAQAAAA8gAAAPIAAAAQAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAOAAAA7QAAAPcAAAAWAAAAAA' - b'AAAAAAAAARAAAA6gAAAP8AAAD/AAAA5gAAAFYAAAAAAAAAAAAAABYAAAD3AAAA7QAAAA0AAAAAAAAAAQAAAAAAAAABAAAAA' - b'AAAABAAAADyAAAA8gAAABAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAA4AAADtAAAA9gAAABYAAAAAAAAAAAAAABEAAADqAAAA' - b'/wAAAP8AAADmAAAAVgAAAAAAAAAAAAAAFgAAAPcAAADtAAAADQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAEAAAAPIAAADyAAA' - b'AEAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAANAAAAD/AAAANgAAAAAAAAAAAAAAEQAAAO8AAAD7AAAAfgAAAAgAAAAAAA' - b'AAAwAAAAAAAAA3AAAA/wAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAQAAAA8gAAAPIAAAAQAAAAAAAAAAEAAAAAA' - b'AAAAAAAAAQAAAAAAAAAkgAAAP8AAACJAAAAAAAAAAAAAAAVAAAAogAAACcAAAAAAAAAAwAAAAMAAAAGAAAAAAAAAIoAAAD/' - b'AAAAkwAAAAAAAAAEAAAAAAAAAAAAAAABAAAAAAAAABAAAADyAAAA8gAAABAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAA' - b'2AAAA/wAAAPUAAAAyAAAAAAAAAAcAAAACAAAAAAAAAAUAAAAEAAAABgAAAAAAAAAyAAAA9gAAAP8AAAA2AAAAAAAAAAIAAA' - b'AAAAAAAAAAAAEAAAAAAAAAEAAAAPIAAADyAAAAEAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAAAAACWAAAA/wAAANwAA' - b'AAuAAAAAAAAAAIAAAAAAAAAAAAAAAIAAAAAAAAALgAAAN0AAAD/AAAAlgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAQAAAAAA' - b'AAAQAAAA8gAAAPIAAAAQAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAAC7AAAA/wAAAPEAAACKAAAAMgAAABQ' - b'AAAAUAAAAMgAAAIoAAADyAAAA/wAAALsAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAABAAAADyAAAA8gAAAB' - b'AAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAACXAAAA/wAAAP8AAAD/AAAA9gAAAPcAAAD/AAAA/wAAA' - b'P8AAACXAAAACAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEAAAAPIAAADyAAAAEQAAAAAAAAACAAAAAQAA' - b'AAEAAAABAAAAAQAAAAEAAAACAAAAAwAAAAAAAAA0AAAAlgAAANUAAADwAAAA8AAAANUAAACXAAAANAAAAAAAAAADAAAAAgA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAQAAAA8gAAAPIAAAAQAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAABAAAAAAAAABAAAADyAAAA8wAAAB8AAAAMAAAAEQAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAA' - b'EwAAABQAAAAQAAAADAAAAAwAAAAQAAAAFAAAABMAAAAQAAAAEgAAABAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAA' - b'AEQAAAO4AAAD/AAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPMAAADzAA' - b'AA8wAAAPMAAADyAAAA8gAAAPEAAADyAAAA3QAAABAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAARAAAA7gAAAP8AAADyA' - b'AAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADy' - b'AAAA8gAAAP8AAADuAAAAEQAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAABAAAADyAAAA8wAAAB8AAAAMAAAAEQAAABAAAAA' - b'QAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEQAAAAwAAAAfAAAA8gAAAPEAAA' - b'AQAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAEAAAAPIAAADyAAAAEAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABAAAADyAAAA8gAAABAAAAAAAAAAAQAAAAAA' - b'AAAAAAAAAQAAAAAAAAAQAAAA8QAAAPIAAAAQAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEAAAAPIAAADxAAAAEAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAB' - b'EAAADwAAAA8QAAAB8AAAAMAAAAEQAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAA' - b'BAAAAAQAAAAEQAAAAwAAAAfAAAA8QAAAPAAAAARAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAABgAAANwAAAD/AAAA8QAA' - b'APIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gA' - b'AAPEAAAD/AAAA3AAAAAYAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAUgAAAOYAAADyAAAA8gAAAPIAAADyAAAA8g' - b'AAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAOYAAABSAAAAA' - b'AAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAACAAAABEAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAA' - b'EAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAARAAAACAAAAAAAAAABAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAB' - b'AAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//2Mb+gSYZfS9IBLqBgABZAUAAmgFCEIoAhIhKFIhEShGMFGoVDAwqFQwMKhW' - b'MFGoUiERKFISIShZCEIoWQACaFoABWhAIBJoX+hf6AAAAWgAAAFoAAABaAAAAWhf/6FoX/+haAAAAWgAAAFkAAACagAABXS' - b'//9L6AAAF/////8=' -) - icon_img3 = b64decode(icon_img3) - icon_img3 = ImageTk.PhotoImage(data=icon_img3) - self.exehwnd.tk.call('wm', 'iconphoto', self.exehwnd._w, icon_img3) - - def initIO(self): - MainFrame0 = tk.Frame(self.exehwnd) - MainFrame0.pack() - TopFrame1 = ttk.Frame(MainFrame0) - TopFrame1.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='1px', fill=tk.X) - - # ----------------------------------------------------------------------------------- - ObsInFrame3 = ttk.LabelFrame(TopFrame1, text='RINEX Obs File') - ObsInFrame3.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='0px', fill=tk.X) - - ObsFileSelectBox = ttk.Combobox(ObsInFrame3, width=70, height=4, values=Obsvalue, - textvariable=self.ObsSelectBoxVar) - ObsFileSelectBox.current(ComboxObsCount) - ObsFileSelectBox.pack(side=tk.LEFT, anchor='w', padx='0px', pady='0px') - - ObsFileSelectButton = ttk.Button(ObsInFrame3, text='...', width=3, - command=lambda: self.Cmd.GetObsFilePath(self.exehwnd,ObsFileSelectBox)) - ObsFileSelectButton.pack(side=tk.RIGHT, anchor='e', padx='1px', pady='0px') - # ----------------------------------------------------------------------------------- - - #----------------------------------------------------------------------------------- - NavInFrame3 = ttk.LabelFrame(TopFrame1, text='RINEX Nav File') - NavInFrame3.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='0px', fill=tk.X) - - NavFileSelectBox = ttk.Combobox(NavInFrame3, width=70, height=4, values=Navvalue, - textvariable=self.NavSelectBoxVar) - NavFileSelectBox.current(ComboxNavCount) - NavFileSelectBox.pack(side=tk.LEFT, anchor='w', padx='0px', pady='0px') - - NavFileSelectButton = ttk.Button(NavInFrame3, text='...', width=3, - command=lambda: self.Cmd.GetNavFilePath(self.exehwnd,NavFileSelectBox)) - NavFileSelectButton.pack(side=tk.RIGHT, anchor='e', padx='1px', pady='0px') - # ----------------------------------------------------------------------------------- - - BottomFrame1 = ttk.Frame(MainFrame0) - BottomFrame1.pack(side=tk.BOTTOM, expand=tk.YES, padx='1px', pady='0px', fill=tk.X) - - FileOutFrame3 = ttk.LabelFrame(BottomFrame1, text='Output Directory') - FileOutFrame3.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='0px', fill=tk.X) - - ## CheckButton Initialize - AskOrNotCheckButton = ttk.Checkbutton(FileOutFrame3, text='Directory', - variable=self.AskOrNotCheckButtonVar, onvalue=1, offvalue=0, - command=lambda: self.Cmd.AskOrNotCheck( - self.AskOrNotCheckButtonVar, - AskDirectorySelectBox, - AskDirectorySelectButton)) - AskOrNotCheckButton.pack(side=tk.LEFT, anchor='w', padx='0px', pady='0px') - - ## SelectBox Initialize - AskDirectorySelectBox = ttk.Combobox(FileOutFrame3, width=60, height=4, values=Outvalue, - state=tk.DISABLED, textvariable=self.DirectorySelectBoxVar) - AskDirectorySelectBox.current(ComboxOutCount) - AskDirectorySelectBox.pack(side=tk.LEFT, anchor='w', padx='0px', pady='0px') - - ## SelectButton Initialize - AskDirectorySelectButton = ttk.Button(FileOutFrame3, text='...', width=3, state=tk.DISABLED, - command=lambda: self.Cmd.AskDirectory(self.exehwnd, AskDirectorySelectBox)) - AskDirectorySelectButton.pack(side=tk.RIGHT, anchor='e', padx='1px', pady='0px') - - ExeFrame3 = ttk.Frame(BottomFrame1) - ExeFrame3.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='0px', fill=tk.X) - - ExitButton = ttk.Button(ExeFrame3, text='Exit', width=10, - command=self.exehwnd.destroy) - ExitButton.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') - - ExecuteButton = ttk.Button(ExeFrame3, text='Execute', width=10, - command=lambda :self.Cmd._ExecuteFile(ExecuteState, - self.ObsSelectBoxVar, - self.NavSelectBoxVar, - self.AskOrNotCheckButtonVar, - self.DirectorySelectBoxVar)) - - ExecuteButton.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') - - # Execute state bar - StateFrame = ttk.Frame(BottomFrame1) - StateFrame.pack(side=tk.TOP, fill=tk.X, padx='1px', pady='0px') - ExecuteState = ttk.Label(StateFrame, text="None") - ExecuteState.pack(side=tk.LEFT, anchor='nw') - -def View_windowshow(text, view): - # Brief # get the file path of reading and show in the text ctr box - # Param # text : the show box of file of choice - # Param # view : the father window of text ctr box - # Return# none - f_path = filedialog.askopenfilename(parent=view) - if not f_path: return 0 - view.title('Viewing: %s' % f_path) - text.delete('1.0', 'end') - with open(f_path, 'r') as f: - fcon = f.read() - text.insert('insert', fcon) - text.config() - -class VIEWGUI: - def __init__(self, hwnd): - self.initGUI(hwnd) - - @staticmethod - def initGUI(hwnd): - view = tk.Toplevel(hwnd) - view.title("View") - Move_center(view,1000,600) - view.minsize(1000, 600) - - global icon_img1 - icon_img1 = (b'AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAACQAAPY6AQD2OgEAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAA' - b'ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAACAAAAAgAAAAAAAAABAAAADQAAABIAAAARAAAAEQAAABEAAAARAAAAEQAAAB' - b'EAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAASAAAAD' - b'QAAAAEAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAACQAAAHEAAADMAAAA6wAAAO8' - b'AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7g' - b'AAAO4AAADuAAAA7gAAAO4AAADvAAAA6wAAAMwAAAByAAAACQAAAAAAAAACAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAA' - b'AAAdAAAAzwAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wA' - b'AAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAAD/AA' - b'AA0AAAAB0AAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAADMAAAA/wAAAPoAAAD6AAAA/gAAAP8AAAD/AAAA/wAA' - b'AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAA' - b'A/wAAAP8AAAD/AAAA/gAAAPoAAAD6AAAA/wAAAMwAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAHIAAAD/AAAA+QAAA' - b'P8AAAD/AAAA9wAAAO0AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA' - b'7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADtAAAA9wAAAP8AAAD/AAAA+QAAAP8AAAB' - b'xAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAABAAAAAAAAAMcAAAD/AAAA+gAAAP8AAACtAAAAGQAAABEAAAASAAAAEQAAABEAAAARAAAAE' - b'QAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAAUAAAAFgAAABUAAAAR' - b'AAAAGQAAAK0AAAD/AAAA+gAAAP8AAADHAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAADQAAAOgAAAD/AAAA/wAAAPkAAAAjAAAAAA' - b'AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAACMAAAD5AAAA/wAAAP8AAADnAAAADQAAAAAA' - b'AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgA' - b'AAO0AAAD/AAAA/wAAAO0AAAATAAAAAAAAAAIAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAA' - b'AAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAABQAAAAAAAAA/AAAAkwAAAE0AAAAAAAAAAAAAABQAA' - b'ADtAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAEAAAAAAAAAEQAAAO0AAAD/AAAA/wAAAO4AAAASAAAAAAAAAAEAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAQAAAAEAAAABAAAAAIAAAAFAAAAAAAAAFsAAA' - b'D/AAAA/gAAAP8AAABNAAAAAAAAABUAAADuAAAA/wAAAP8AAADtAAAAEQAAAAAAAAABAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA' - b'/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAIAAAAAAAAAXAAAAP8AAAD9AAAA9QAAAP8AAACIAAAAAAAAABUAAADuAAAA/wAAAP' - b'8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAgAAAAIAAAAAAAAAKgAAAGcAAAB7AAAAaAAAAB0AAABaAAAA/wAAAP0AAAD8AAAA/QAAAP8' - b'AAAA/AAAAAAAAABQAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARA' - b'AAAAAAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAABYAAACrAAAA/gAAAP8AAAD+AAAA/wAAAPcA' - b'AAD4AAAA/gAAAP0AAAD9AAAA/wAAAFwAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgA' - b'AAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAA' - b'AAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAGAAAANgAA' - b'AD/AAAA/QAAAPkAAAD2AAAA+QAAAP8AAAD9AAAA/gAAAP8AAAD/AAAAXAAAAAAAAAAFAAAAAAAA' - b'ABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAA' - b'AAAAAAAAAAAAIAAAAAAAAArAAAAP8AAAD5AAAA/QAAAP8AAAD/AAAA/wAAAP0AAAD+AAAA/wAAA' - b'P8AAABbAAAAAAAAAAUAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD' - b'/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAwAAAA/gAAAP0AAAD+AAAA/wAAAM' - b'YAAACAAAAAygAAAP8AAAD9AAAA/wAAAPoAAAAmAAAAAAAAAAIAAAABAAAAAAAAABEAAADuAAAA/' - b'wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAABAAAAAA' - b'AAABqAAAA/wAAAPkAAAD/AAAAxQAAAAMAAAAAAAAABgAAAMsAAAD/AAAA+QAAAP8AAABkAAAAAA' - b'AAAAQAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4A' - b'AAARAAAAAAAAAAEAAAAAAAAABAAAAAAAAAB/AAAA/wAAAPcAAAD/AAAAggAAAAAAAAASAAAAAAA' - b'AAIoAAAD/AAAA9wAAAP8AAAB4AAAAAAAAAAQAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAA' - b'AAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAA' - b'AAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAABAAAAAAAAABrAAAA/wAA' - b'APkAAAD/AAAAwQAAAAAAAAAAAAAAAwAAAMcAAAD/AAAA+QAAAP8AAABkAAAAAAAAAAQAAAABAAA' - b'AAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAA' - b'AEAAAAAAAAAAgAAAAAAAAAyAAAA/wAAAP0AAAD+AAAA/wAAAMEAAAB4AAAAxAAAAP8AAAD+AAAA' - b'/gAAAPwAAAArAAAAAAAAAAIAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAA' - b'BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO' - b'0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAIAAAAAAAAAsAAAAP8AAAD5AAAA/' - b'QAAAP8AAAD/AAAA/wAAAP0AAAD5AAAA/wAAAKkAAAAAAAAAAgAAAAAAAAABAAAAAAAAABEAAADu' - b'AAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAA' - b'AAAAEAAAAAAAAAHAAAAN0AAAD/AAAA/AAAAPgAAAD2AAAA+AAAAPwAAAD/AAAA2AAAABgAAAAAA' - b'AAAAQAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wA' - b'AAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAABsAAAC0AAAA/wAAAP8AAAD+AA' - b'AA/wAAAP8AAACvAAAAGAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AA' - b'ADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAQAAAAEAAAABAAA' - b'AAwAAAAIAAAAAAAAAMQAAAG8AAACEAAAAbgAAAC8AAAAAAAAAAgAAAAMAAAABAAAAAQAAAAAAAA' - b'ABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAA' - b'AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAA' - b'AAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAE' - b'gAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAABAAAAEAAAABIAAAASAAAAEgAAABIAAAAS' - b'AAAAFAAAABYAAAAWAAAAFgAAABQAAAASAAAAEgAAABIAAAASAAAAEAAAAAEAAAABAAAAAAAAABE' - b'AAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAAQA' - b'AAA3QAAAPIAAADsAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAOwA' - b'AADyAAAA3QAAABAAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AA' - b'AA/wAAAO4AAAARAAAAAAAAAAAAAAASAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AA' - b'AD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA7QAAABIAAAAAAAAAAAAAABEAAADuAAAA/wAA' - b'AP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAASAAAA7QAAAP8AAA' - b'D+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA7QAAA' - b'BIAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAA' - b'RAAAAAAAAAAAAAAAQAAAA3QAAAPIAAADtAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO' - b'4AAADuAAAA7gAAAO0AAADyAAAA3QAAABAAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAE' - b'gAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA' - b'AAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAABAAAAEAAAABIAAAARAAAAEQAAABE' - b'AAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAASAAAAEAAAAAEAAAABAAAAAA' - b'AAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AA' - b'AD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABEAAADuAAA' - b'A/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAABAAAAEAAAA' - b'BIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAA' - b'EAAAAAEAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO' - b'4AAAARAAAAAAAAAAAAAAAQAAAA3QAAAPIAAADsAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7' - b'QAAAO0AAADtAAAA7QAAAOwAAADyAAAA3QAAABAAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADt' - b'AAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE' - b'AAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAASAAAA7QAAAP8AAAD+AAAA/w' - b'AAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA7QAAABIAAAAAA' - b'AAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAA' - b'AAAAAAAASAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AA' - b'AA/wAAAP4AAAD/AAAA7QAAABIAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAA' - b'AABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAA' - b'AO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAAQAAAA3QAAAPIAAADsAAAA7QAAAO0AAADtAAA' - b'A7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAOwAAADyAAAA3QAAABAAAAAAAAAAAAAAABEAAA' - b'DuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAEAAAAAAAAAEQAAAO0AAAD/AAAA/wAAAO4AAAASAAAAAAAAAAEAAAABAAAA' - b'EAAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAA' - b'SAAAAEAAAAAEAAAABAAAAAAAAABIAAADuAAAA/wAAAP8AAADtAAAAEQAAAAAAAAABAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/' - b'wAAAO0AAAATAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAABMAAADtAAAA/wAAAP8' - b'AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAEAAAAAAAAADQAAAOgAAAD/AAAA/wAAAPkAAAAjAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAACAAAAAAAAACMAAAD5AAAA/wAAAP8AAADnAAAADQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAMcAAAD/AAAA+gAAAP8AAACtAA' - b'AAGQAAABEAAAASAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAA' - b'AARAAAAEQAAABEAAAARAAAAEQAAABIAAAARAAAAGQAAAK0AAAD/AAAA+gAAAP8AAADHAAAAAAAA' - b'AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA' - b'AAAAAAHIAAAD/AAAA+QAAAP8AAAD/AAAA9wAAAO0AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAA' - b'DuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADtAAAA9wAAA' - b'P8AAAD/AAAA+QAAAP8AAABxAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAADMAAAA/wAAAPoAAAD6AAAA/gAAAP8AAAD' - b'/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP' - b'8AAAD/AAAA/wAAAP8AAAD/AAAA/gAAAPoAAAD5AAAA/wAAAMwAAAAIAAAAAAAAAAEAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAd' - b'AAAA0AAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8' - b'AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAAD/AAAA0A' - b'AAAB0AAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAACgAAAHIAAADNAAAA6wAAAO8AAADuAAAA7gAAAO4A' - b'AADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gA' - b'AAO4AAADvAAAA6wAAAM0AAAByAAAACgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAA' - b'AABAAAADQAAABIAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAA' - b'ABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAASAAAADQAAAAEAAAAAAAAAAgAAAAIAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAEAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/Rf/' - b'/ov8AAP6QAAAJfwAA/UAAAAK/AAD+gAAAAX8AAPkAAAAAnwAA+QAAAACfAAD5AAAAAJ8AAPoF//' - b'+gXwAA+gQABGBfAAD6BegIIF8AAPoF0pAgXwAA+gWkACBfAAD6BVAAYF8AAPoFIACgXwAA+gUgA' - b'SBfAAD6BUABIF8AAPoFQIEgXwAA+gVBQSBfAAD6BUCBIF8AAPoFQAEgXwAA+gUgAiBfAAD6BSAC' - b'IF8AAPoFUAUgXwAA+gQEECBfAAD6Bf//oF8AAPoEAAAgXwAA+gYAAGBfAAD6BgAAYF8AAPoGAAB' - b'gXwAA+gYAAGBfAAD6BAAAIF8AAPoF//+gXwAA+gX//6BfAAD6BAAAIF8AAPoGAABgXwAA+gYAAG' - b'BfAAD6BgAAYF8AAPoGAABgXwAA+gQAACBfAAD6BF/6IF8AAPoF//+gXwAA+QAAAACfAAD5AAAAA' - b'J8AAPkAAAAAnwAA/oAAAAF/AAD9QAAAAr8AAP6QAAAJfwAA/0X//6L/AAA=') - - icon_img1 = b64decode(icon_img1) - icon_img1 = ImageTk.PhotoImage(data=icon_img1) - view.tk.call('wm', 'iconphoto', view._w, icon_img1) - - # View window's menu - topmenu = tk.Menu(view) - filemenu = tk.Menu(topmenu, tearoff=False) - filemenu.add_command(label="Open File", - command=lambda: View_windowshow(text, view), accelerator='Ctrl+F') - filemenu.add_command(label="Exit", command=view.destroy, accelerator='Ctrl+E') - topmenu.add_cascade(label="File", menu=filemenu) - - view.config(menu=topmenu) - - ybar = tk.Scrollbar(view) - ybar.pack(side=tk.RIGHT, fill=tk.Y) - xbar = tk.Scrollbar(view, orient=tk.HORIZONTAL) - xbar.pack(side=tk.BOTTOM, fill=tk.X) - - text = tk.Text(view, xscrollcommand=xbar.set, yscrollcommand=ybar.set, height=500, width=1000, undo=True, - autoseparators=False, wrap='none') - text.pack(side=tk.TOP, fill=tk.BOTH) - - ybar.config(command=text.yview) - xbar.config(command=text.xview) - -if __name__ == "__main__": - - # Main window - root = tk.Tk() - MAIN = MAINGUI(root) - diff --git a/app/Trocor.py b/app/Trocor.py deleted file mode 100644 index 65f781d..0000000 --- a/app/Trocor.py +++ /dev/null @@ -1,36 +0,0 @@ -##Tro correct-Hopfield -import math -def Hop_tro_cor(H, ma): - global e - P0 = 1013.25 - e0 = 11.69 - T0 = 288.15 - p = P0 * pow((1.0 - 0.0068 / T0 / H) , 5) - T = 288.15 - 0.0068 * H - if H > 11000: - e = 0 - if H <= 11000: - e = e0 * pow( (1.0 - 0.0068 * H / T0) , 4) - deltaSd = 1.552e-5 * p * (40136 + 148.72 * (T - 273.16) - H) / T - deltaSw = 1.552e-5 * 4810 * e * (11000 - H) / pow(T , 2) - #Dry - dtropd = deltaSd / math.sqrt( math.sin( math.radians( math.degrees( pow(math.radians(ma) , 2) ) + 6.25) ) ) - #Wet - dtropw = deltaSw / math.sqrt( math.sin( math.radians( math.degrees( pow(math.radians(ma) , 2) ) + 6.25) ) ) - dtrop = dtropw + dtropd - return dtrop - -#Tro corrct-Saastamoinen -def Sas_tro_cor(B, H, ma): - global e - P0 = 1013.25 * pow( (1 - 2.2557 * 10e-5 * H), 5.2568) - e0 = 11.69 - T0 = 15 - 6.5 * 10e-3 * H + 273.15 - deltaSd = 2.2768e-3 * P0 / (1 - 2.66e-3 * math.cos(2 * B) - 2.8e-4 * H * 1e3) - deltaSw = 2.2768e-3 * (1255 / T0 + 0.05) * e0 - # Dry - dtropd = deltaSd / math.sqrt( math.sin( math.radians( math.degrees( pow(math.radians(ma), 2) ) + 6.25) ) ) - # Wet - dtropw = deltaSw / math.sqrt( math.sin( math.radians( math.degrees( pow(math.radians(ma), 2) ) + 6.25) ) ) - dtrop = dtropw + dtropd - return dtrop \ No newline at end of file diff --git a/app/Ui_about.py b/app/Ui_about.py index e7163d6..e5645de 100644 --- a/app/Ui_about.py +++ b/app/Ui_about.py @@ -13,9 +13,10 @@ import tkinter as tk class ABODUI: - def __init__(self, hwndparent, cfg_get): + def __init__(self, hwndparent, cfg_get, func): # init # ------------------------------------------------------------------------------- + self.func = func self.cfg_get = cfg_get self.hwndparent = hwndparent diff --git a/app/Ui_main.py b/app/Ui_main.py index 5dc2fff..2050324 100644 --- a/app/Ui_main.py +++ b/app/Ui_main.py @@ -18,6 +18,8 @@ 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 @@ -39,9 +41,27 @@ def instancePRO(hwndparent, cfg_get_, func_): def instanceVIE(hwndparent, func_): vie.VIEWGUI(hwndparent, func_) -def instanceABO(hwndparemt, cfg_get_): - abo.ABODUI(hwndparemt, cfg_get_) +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 @@ -230,7 +250,7 @@ class MAINGUI: ### Help > About helpmenu.add_command( label="About", - command=lambda :instanceABO(self.hwnd, cfg_get) + command=lambda :instanceABO(self.hwnd, cfg_get, self.func) ) topmenu.add_cascade(label="Help", menu=helpmenu) diff --git a/app/Ui_options.py b/app/Ui_options.py index 65111d8..2c85cbd 100644 --- a/app/Ui_options.py +++ b/app/Ui_options.py @@ -16,6 +16,8 @@ from base64 import b64decode import tkinter as tk + +# noinspection PyProtectedMember class OPTGUI: def __init__( self, diff --git a/app/Ui_processor.py b/app/Ui_processor.py index a4b2c3e..ac5c6ac 100644 --- a/app/Ui_processor.py +++ b/app/Ui_processor.py @@ -17,6 +17,7 @@ from base64 import b64decode import tkinter as tk +# noinspection PyProtectedMember class EXECUDUI: def __init__(self, hwndparent, cfg_get, func): # init diff --git a/app/Ui_view.py b/app/Ui_view.py index 0c195f7..26ee194 100644 --- a/app/Ui_view.py +++ b/app/Ui_view.py @@ -16,6 +16,8 @@ from tkinter import filedialog import tkinter as tk + +# noinspection PyProtectedMember class VIEWGUI: def __init__(self, hwndparent, func): # init diff --git a/src/brdm2pos.h b/src/brdm2pos.h index 1cae3d9..ef314f4 100644 --- a/src/brdm2pos.h +++ b/src/brdm2pos.h @@ -8,6 +8,9 @@ #include #endif // _BRDM2POS_H_ + +#define KNZ_GTL_VER "1.5.5.0" + /* CALCU CONST*/ #define C_V 299792458 /* Speed of light (m/s) */ #define GM 398600500000000 /* */ @@ -121,9 +124,6 @@ typedef struct stations{// double X; double Y; double Z; - double B; - double L; - double H; double delta_TR; }stations; @@ -306,32 +306,86 @@ typedef struct obs_body{//Body data of file of obs double obs_glo[30][26];/* GLONASS obs data */ }obs_body, * pobs_body; +typedef struct lsq_part { + double* l; + double* m; + double* n; + double* o; + double* B; + double* P; + double* L; + double* x; +}lsq_part; + +typedef struct acct_obs { + double Per1[30]; + double Per2[30]; + double sclk[30]; + int freq1; + int freq2; + + acct_obs() = default; +}acct_obs; + //Contain in timesys.cpp -extern double JDUTC2GPST(double); -extern double Time2GPST(int, int, int, double, int, double); -extern double UTCTime2JD(int, int, int, double, int, double); +extern double jdutc2gpst(double JD_UTCSU); +extern double time2gpst(int y, int m, int d, double h, int min, double sec); +extern double utctime2jd(int y, int m, int d, double h, int min, double sec); +//Contain in martix.cpp +extern double* mat(int n, int m); +extern int* imat(int n, int m); +extern double* zeros(int n, int m); +extern double* eye(int n); +extern double dot(const double* va, const double* vb, int n); +extern double norm(const double* va, int n); +extern void cross3(const double* va, const double* vb, double* vc); +extern int normv3(const double* va, double* vb); +extern void matcpy(double* A, const double* B, int n, int m); +extern void matmul(const char* tr, int n, int k, int m, double alpha, + const double* A, const double* B, double beta, double* C); +extern int matinv(double* A, int n); +extern int solve(const char* tr, const double* A, const double* Y, int n, + int m, double* X); +extern stations designmat(pobs_head obs_h, acct_obs obs, + double* l, double* m, double* n, double* o, + double* B, double* P, double* L, + double X, double Y, double Z, int satnum, int ionopt, int tropopt, + int GNSS); +extern int lsq(const double* BtP, const double* L, const double* B, int n, int m, double* x, + double* Q); +extern void matprint(const double A[], int n, int m, int p, int q); //Contain in coordtrans.cpp -extern double deg2rad(double); -extern double rad2deg(double); -extern rah rahcal(rah, double, double, double); -extern enu blh2enu(enu, double, double, double, double, double); -extern blh xyz2blh(blh, double, double, double); +extern double deg2rad(double deg); +extern double rad2deg(double rad); +extern rah rahcal(rah rah, double E, double N, double U); +extern enu blh2enu(enu enu, double stationB, double stationL, + double deltax, double deltay, double deltaz); +extern blh xyz2blh(blh blh, double X, double Y, double Z); +extern rah xyz2rah(pos_ts pos_t, pobs_head obs_h); +extern void pz90towgs84(double X, double Y, double Z); //Contain in readrnx.cpp -extern int getsatnum(FILE*); -extern int get_epochnum(FILE*); +extern int getsatnum(FILE*); +extern int get_epochnum(FILE*); extern void freeobs_e(pobs_epoch, pobs_body); -extern int type2code(int, char buff[MAXRINEX]); -extern int code2type(int, int, int typearr[36]); -extern int select_epoch(double, int, pnav_body, int, int); +extern int type2code(int, char buff[MAXRINEX]); +extern int code2type(int, int, int typearr[36]); +extern int select_epoch(double, int, pnav_body, int, int); //Contain in readrnx.cpp/read extern void read_n_h(FILE*, pnav_head); extern void read_n_b(FILE*, pnav_body); extern void read_o_h(FILE*, pobs_head); extern void read_o_eb(FILE*, pobs_head, pobs_epoch, pobs_body); //Contain in solutionout.cpp -extern FILE* outputheader(pobs_head, char obs_path[MAXPATH], char nav_path[MAXPATH], char res_path[MAXPATH]); -extern void outputbodydata(pobs_head, pobs_body, pos_ts, rah, FILE*, int, int, int); +extern FILE* headerout(pobs_head obs_h, char obs_path[MAXPATH], char nav_path[MAXPATH], char res_path[MAXPATH]); +extern void solution(FILE* res_file, pobs_head obs_h, double X, double Y, double Z); +extern void outdata(blh blh, FILE* res_file, int sPRN, int GNSS); //Entry function -extern "C" _declspec(dllexport) double brdm2pos(char nav_path[MAXPATH], char obs_path[MAXPATH], char res_path[MAXPATH], - int GNSS, int Hangle); +extern "C" _declspec(dllexport) double brdm2pos( + char nav_path[MAXPATH], + char obs_path[MAXPATH], + char res_path[MAXPATH], + int GNSS, + int Hangle, + int ionopt, + int tropopt); diff --git a/src/coords.cpp b/src/coords.cpp new file mode 100644 index 0000000..298a5df --- /dev/null +++ b/src/coords.cpp @@ -0,0 +1,134 @@ +#include "brdm2pos.h" +using namespace std; +/** + * Degree to radian. + * + * \param deg: Degree + * \return Radian + */ +double deg2rad(double deg) +{ + double rad = (PI / 180) * deg; + return rad; +} +/** + * Radian to degree . + * + * \param rad: Radian + * \return Degree + */ +double rad2deg(double rad) +{ + double deg = (180 / PI) * rad; + return deg; +} +/** + * Azimuth/Calculate. + * + * \param rah: Parameter transfer structure + * \param E: East + * \param N: North + * \param U: Up + * \return structure contain R, A, H members + */ +rah rahcal(rah rah, + double E, double N, double U) +{ + rah.H = atan2(U, sqrt(E * E + N * N)); + rah.A = atan2(E, U); + if (rah.A < 0) + rah.A += 2 * PI; + if (rah.A > 2 * PI) + rah.A -= 2 * PI; + rah.R = sqrt(E * E + N * N + U * U); + + return rah; +} +/** + * Convert BLH coordinates to ENU coordinates. + * + * \param enu: Parameter transfer structure + * \param stationB: Latitude of receiver station + * \param stationL: Longitude of receiver station + * \param deltax: Deltax X-coordinate difference of satellite arrival center + * \param deltay: Deltax Y-coordinate difference of satellite arrival center + * \param deltaz: Deltax Z-coordinate difference of satellite arrival center + * \return + */ +enu blh2enu(enu enu, + double stationB, double stationL, + double deltax, double deltay, double deltaz) +{ + double sinB = sin(stationB); + double cosB = cos(stationB); + double sinL = sin(stationL); + double cosL = cos(stationL); + enu.E = -sinL * (deltax) +cosL * (deltay); + enu.N = -sinB * cosL * (deltax)-sinB * sinL * (deltay)+cosB * (deltaz); + enu.U = cosB * cosL * (deltax)+cosB * sinL * (deltay)+sinB * (deltaz); + + return enu; +} +/** + * Convert ECEF geostationary coordinates to BLH coordinates. + * + * \param blh: Parameter transfer structure + * \param X: X coordinates of ECEF + * \param Y; Y coordinates of ECEF + * \param Z: Z coordinates of ECEF + * \return type of structure contain B, L, H members + */ +blh xyz2blh(blh blh, + double X, double Y, double Z) +{ + double B = 0.0, N = 0.0, H = 0.0, R0, R1, deltaH, deltaB; + R0 = sqrt(pow(X, 2) + pow(Y, 2)); + R1 = sqrt(pow(X, 2) + pow(Y, 2) + pow(Z, 2)); + blh.L = atan2(Y, X); + N = a; + H = R1 - a; + B = atan2(Z * (N + H), R0 * (N * (1 - e2) + H)); + do{ + deltaH = N; + deltaB = B; + N = a / sqrt(1 - e2 * pow(sin(B), 2)); + H = R0 / cos(B) - N; + B = atan2(Z * (N + H), R0 * (N * (1 - e2) + H)); + } while (fabs(deltaH - H) > 1.0e-3 && fabs(deltaB - B) > 1.0e-9); + blh.B = B; + blh.H = H; + + return blh; +} +rah xyz2rah(pos_ts pos_t, pobs_head obs_h) +{ + double + deltax, + deltay, + deltaz; + enu enu = { 0 }; + rah rah = { 0 }; + deltax = pos_t.X - obs_h->apX; + deltay = pos_t.Y - obs_h->apY; + deltaz = pos_t.Z - obs_h->apZ; + enu = blh2enu(enu, obs_h->apB, obs_h->apL, + deltax, deltay, deltaz); + //Satellite elevation Angle calculation + rah = rahcal(rah, enu.E, enu.N, enu.U); + + return rah; +} +/** + * Convert from PZ-90 to WGS-84. + * + * \param X: Coordinate in PZ-90 + */ +void pz90towgs84(double X, double Y, double Z) +{ + while (X || Y || Z) { + X = -0.47 + (X * 1 + Y * 1.728e-6 + Z * -0.017e-6) * (1 + 22e-9); + Y = -0.51 + (X * 1.728e-6 + Y * 1 + Z * -0.076e-6) * (1 + 22e-9); + Z = -1.56 + (X * 0.0178e-6 + Y * -0.076e-6 + Z * 1) * (1 + 22e-9);//PZ90 Convert to WGS-84 + break; + }return; +} diff --git a/src/coordtrans.cpp b/src/coordtrans.cpp deleted file mode 100644 index 7b840ac..0000000 --- a/src/coordtrans.cpp +++ /dev/null @@ -1,102 +0,0 @@ -#include "brdm2pos.h" -using namespace std; -/** - * Degree to radian. - * - * \param deg: Degree - * \return Radian - */ -double deg2rad(double deg) -{ - double rad = (PI / 180) * deg; - return rad; -} -/** - * Radian to degree . - * - * \param rad: Radian - * \return Degree - */ -double rad2deg(double rad) -{ - double deg = (180 / PI) * rad; - return deg; -} -/** - * Azimuth/Calculate. - * - * \param rah: Parameter transfer structure - * \param E: East - * \param N: North - * \param U: Up - * \return structure contain R, A, H members - */ -rah rahcal(rah rah, - double E, double N, double U) -{ - rah.H = atan2(U, sqrt(E * E + N * N)); - rah.A = atan2(E, U); - if (rah.A < 0) - rah.A += 2 * PI; - if (rah.A > 2 * PI) - rah.A -= 2 * PI; - rah.R = sqrt(E * E + N * N + U * U); - - return rah; -} -/** - * Convert BLH coordinates to ENU coordinates. - * - * \param enu: Parameter transfer structure - * \param stationB: Latitude of receiver station - * \param stationL: Longitude of receiver station - * \param deltax: Deltax X-coordinate difference of satellite arrival center - * \param deltay: Deltax Y-coordinate difference of satellite arrival center - * \param deltaz: Deltax Z-coordinate difference of satellite arrival center - * \return - */ -enu blh2enu(enu enu, - double stationB, double stationL, - double deltax, double deltay, double deltaz) -{ - double sinB = sin(stationB); - double cosB = cos(stationB); - double sinL = sin(stationL); - double cosL = cos(stationL); - enu.E = -sinL * (deltax) +cosL * (deltay); - enu.N = -sinB * cosL * (deltax)-sinB * sinL * (deltay)+cosB * (deltaz); - enu.U = cosB * cosL * (deltax)+cosB * sinL * (deltay)+sinB * (deltaz); - - return enu; -} -/** - * Convert ECEF geostationary coordinates to BLH coordinates. - * - * \param blh: Parameter transfer structure - * \param X: X coordinates of ECEF - * \param Y; Y coordinates of ECEF - * \param Z: Z coordinates of ECEF - * \return type of structure contain B, L, H members - */ -blh xyz2blh(blh blh, - double X, double Y, double Z) -{ - double B = 0.0, N = 0.0, H = 0.0, R0, R1, deltaH, deltaB; - R0 = sqrt(pow(X, 2) + pow(Y, 2)); - R1 = sqrt(pow(X, 2) + pow(Y, 2) + pow(Z, 2)); - blh.L = atan2(Y, X); - N = a; - H = R1 - a; - B = atan2(Z * (N + H), R0 * (N * (1 - e2) + H)); - do{ - deltaH = N; - deltaB = B; - N = a / sqrt(1 - e2 * pow(sin(B), 2)); - H = R0 / cos(B) - N; - B = atan2(Z * (N + H), R0 * (N * (1 - e2) + H)); - } while (fabs(deltaH - H) > 1.0e-3 && fabs(deltaB - B) > 1.0e-9); - blh.B = B; - blh.H = H; - - return blh; -} \ No newline at end of file diff --git a/src/matrix.cpp b/src/matrix.cpp new file mode 100644 index 0000000..22e6cec --- /dev/null +++ b/src/matrix.cpp @@ -0,0 +1,231 @@ +#include "brdm2pos.h" +/* new matrix ------------------------------------------------------------------ +* allocate memory of matrix +* args : int n,m I number of rows and columns of matrix +* return : matrix pointer (if n<=0 or m<=0, return NULL) +*-----------------------------------------------------------------------------*/ +double* mat(int n, int m) +{ + double* p; + + if (n <= 0 || m <= 0) return NULL; + if (!(p = (double*)malloc(sizeof(double) * n * m))) { + return NULL; + } + return p; +} +/* new integer matrix ---------------------------------------------------------- +* allocate memory of integer matrix +* args : int n,m I number of rows and columns of matrix +* return : matrix pointer (if n<=0 or m<=0, return NULL) +*-----------------------------------------------------------------------------*/ +int* imat(int n, int m) +{ + int* p; + + if (n <= 0 || m <= 0) return NULL; + if (!(p = (int*)malloc(sizeof(int) * n * m))) { + return NULL; + } + return p; +} +/* zero matrix ----------------------------------------------------------------- +* generate new zero matrix +* args : int n,m I number of rows and columns of matrix +* return : matrix pointer (if n<=0 or m<=0, return NULL) +*-----------------------------------------------------------------------------*/ +double* zeros(int n, int m) +{ + double* p; + +#if NOCALLOC + if ((p = mat(n, m))) for (n = n * m - 1; n >= 0; n--) p[n] = 0.0; +#else + if (n <= 0 || m <= 0) return NULL; + if (!(p = (double*)calloc(sizeof(double), n * m))) { + return NULL; + } +#endif + return p; +} +/* identity matrix ------------------------------------------------------------- +* generate new identity matrix +* args : int n I number of rows and columns of matrix +* return : matrix pointer (if n<=0, return NULL) +*-----------------------------------------------------------------------------*/ +double* eye(int n) +{ + double* p; + int i; + + if ((p = zeros(n, n))) for (i = 0; i < n; i++) p[i + i * n] = 1.0; + return p; +} +/* inner product --------------------------------------------------------------- +* inner product of vectors +* args : double *a,*b I vector a,b (n x 1) +* int n I size of vector a,b +* return : a'*b +*-----------------------------------------------------------------------------*/ +double dot(const double* va, const double* vb, int n) +{ + double c = 0.0; + + while (--n >= 0) c += va[n] * vb[n]; + return c; +} +/* euclid norm ----------------------------------------------------------------- +* euclid norm of vector +* args : double *a I vector a (n x 1) +* int n I size of vector a +* return : || a || +*-----------------------------------------------------------------------------*/ +double norm(const double* va, int n) +{ + return sqrt(dot(va, va, n)); +} +/* outer product of 3d vectors ------------------------------------------------- +* outer product of 3d vectors +* args : double *a,*b I vector a,b (3 x 1) +* double *c O outer product (a x b) (3 x 1) +* return : none +*-----------------------------------------------------------------------------*/ +void cross3(const double* va, const double* vb, double* vc) +{ + vc[0] = va[1] * vb[2] - va[2] * vb[1]; + vc[1] = va[2] * vb[0] - va[0] * vb[2]; + vc[2] = va[0] * vb[1] - va[1] * vb[0]; +} +/* normalize 3d vector --------------------------------------------------------- +* normalize 3d vector +* args : double *a I vector a (3 x 1) +* double *b O normlized vector (3 x 1) || b || = 1 +* return : status (1:ok,0:error) +*-----------------------------------------------------------------------------*/ +int normv3(const double* va, double* vb) +{ + double r; + if ((r = norm(va, 3)) <= 0.0) return 0; + vb[0] = va[0] / r; + vb[1] = va[1] / r; + vb[2] = va[2] / r; + return 1; +} +/* copy matrix ----------------------------------------------------------------- +* copy matrix +* args : double *A O destination matrix A (n x m) +* double *B I source matrix B (n x m) +* int n,m I number of rows and columns of matrix +* return : none +*-----------------------------------------------------------------------------*/ +void matcpy(double* A, const double* B, int n, int m) +{ + memcpy(A, B, sizeof(double) * n * m); +} +/*multiply matrix*/ +void matmul(const char* tr, int n, int k, int m, double alpha, + const double* A, const double* B, double beta, double* C) +{ + double d; + int i, j, x, f = tr[0] == 'N' ? (tr[1] == 'N' ? 1 : 2) : (tr[1] == 'N' ? 3 : 4); + + for (i = 0; i < n; i++) for (j = 0; j < k; j++) { + d = 0.0; + switch (f) { + case 1: for (x = 0; x < m; x++) d += A[i + x * n] * B[x + j * m]; break; + case 2: for (x = 0; x < m; x++) d += A[i + x * n] * B[j + x * k]; break; + case 3: for (x = 0; x < m; x++) d += A[x + i * m] * B[x + j * m]; break; + case 4: for (x = 0; x < m; x++) d += A[x + i * m] * B[j + x * k]; break; + } + if (beta == 0.0) C[i + j * n] = alpha * d; else C[i + j * n] = alpha * d + beta * C[i + j * n]; + } +} +/*LU decomposition*/ +static int ludcmp(double* A, int n, int* indx, double* d) +{ + double big, s, tmp, * vv = mat(n, 1); + int i, imax = 0, j, k; + + *d = 1.0; + for (i = 0; i < n; i++) { + big = 0.0; for (j = 0; j < n; j++) if ((tmp = fabs(A[i + j * n])) > big) big = tmp; + if (big > 0.0) vv[i] = 1.0 / big; else { free(vv); return -1; } + } + for (j = 0; j < n; j++) { + for (i = 0; i < j; i++) { + s = A[i + j * n]; for (k = 0; k < i; k++) s -= A[i + k * n] * A[k + j * n]; A[i + j * n] = s; + } + big = 0.0; + for (i = j; i < n; i++) { + s = A[i + j * n]; for (k = 0; k < j; k++) s -= A[i + k * n] * A[k + j * n]; A[i + j * n] = s; + if ((tmp = vv[i] * fabs(s)) >= big) { big = tmp; imax = i; } + } + if (j != imax) { + for (k = 0; k < n; k++) { + tmp = A[imax + k * n]; A[imax + k * n] = A[j + k * n]; A[j + k * n] = tmp; + } + *d = -(*d); vv[imax] = vv[j]; + } + indx[j] = imax; + if (A[j + j * n] == 0.0) { free(vv); return -1; } + if (j != n - 1) { + tmp = 1.0 / A[j + j * n]; for (i = j + 1; i < n; i++) A[i + j * n] *= tmp; + } + } + free(vv); + return 0; +} +/*LU back-substitution*/ +static void lubksb(const double* A, int n, const int* indx, double* b) +{ + double s; + int i, ii = -1, ip, j; + + for (i = 0; i < n; i++) { + ip = indx[i]; s = b[ip]; b[ip] = b[i]; + if (ii >= 0) for (j = ii; j < i; j++) s -= A[i + j * n] * b[j]; else if (s) ii = i; + b[i] = s; + } + for (i = n - 1; i >= 0; i--) { + s = b[i]; for (j = i + 1; j < n; j++) s -= A[i + j * n] * b[j]; b[i] = s / A[i + i * n]; + } +} +/*inverse of matrix*/ +int matinv(double* A, int n) +{ + double d, * B; + int i, j, * indx; + + indx = imat(n, 1); B = mat(n, n); matcpy(B, A, n, n); + if (ludcmp(B, n, indx, &d)) { free(indx); free(B); return -1; } + for (j = 0; j < n; j++) { + for (i = 0; i < n; i++) A[i + j * n] = 0.0; + A[j + j * n] = 1.0; + lubksb(B, n, indx, A + j * n); + } + free(indx); free(B); + return 0; +} +/*solve linear equation*/ +int solve(const char* tr, const double* A, const double* Y, int n, + int m, double* X) +{ + double* B = mat(n, n); + int info; + + matcpy(B, A, n, n); + if (!(info = matinv(B, n))) matmul(tr[0] == 'N' ? "NN" : "TN", n, m, n, 1.0, B, Y, 0.0, X); + free(B); + return info; +} +void matprint(const double A[], int n, int m, int p, int q) +{ + int i, j; + + for (i = 0; i < n; i++) { + for (j = 0; j < m; j++) printf(" %*.*f", p, q, A[i + j * n]); + printf("\n"); + } +} + + diff --git a/src/readrnx.cpp b/src/readrnx.cpp index ab51313..ebff3ae 100644 --- a/src/readrnx.cpp +++ b/src/readrnx.cpp @@ -64,8 +64,7 @@ int select_epoch(double SecofWeek, int sPRN, pnav_body nav_b, int satnum, int sy for (int i = 0; i < satnum; i++){ if (sPRN == nav_b[i].sPRN_GLO){ Min = fabs(SecofWeek - nav_b[i].TOE); - if (Min <= min) - { + if (Min <= min){ best_epoch = i; min = Min; } @@ -235,53 +234,45 @@ void read_n_h(FILE* fp_nav, pnav_head nav_h) if (strstr(lable, "RINEX VERSION / TYPE")) { nav_h->ver = strtonum(buff, 0, 9); strncpy((nav_h->type), buff + 20, 15); - continue; - } + continue;} else if (strstr(lable, "GPSA")) { nav_h->ION_GPSA[0] = strtonum(buff, 6, 12); nav_h->ION_GPSA[1] = strtonum(buff, 6 + 12, 12); nav_h->ION_GPSA[2] = strtonum(buff, 6 + 12 + 12, 12); nav_h->ION_GPSA[3] = strtonum(buff, 6 + 12 + 12 + 12, 12); - continue; - } + continue;} else if (strstr(lable, "GPSB")) { nav_h->ION_GPSB[0] = strtonum(buff, 6, 12); nav_h->ION_GPSB[1] = strtonum(buff, 6 + 12, 12); nav_h->ION_GPSB[2] = strtonum(buff, 6 + 12 + 12, 12); nav_h->ION_GPSB[3] = strtonum(buff, 6 + 12 + 12 + 12, 12); - continue; - } + continue;} else if (strstr(lable, "BDSA")) { nav_h->ION_BDSA[0] = strtonum(buff, 6, 12); nav_h->ION_BDSA[1] = strtonum(buff, 6 + 12, 12); nav_h->ION_BDSA[2] = strtonum(buff, 6 + 12 + 12, 12); nav_h->ION_BDSA[3] = strtonum(buff, 6 + 12 + 12 + 12, 12); - continue; - } + continue;} else if (strstr(lable, "BDSB")) { nav_h->ION_BDSB[0] = strtonum(buff, 6, 12); nav_h->ION_BDSB[1] = strtonum(buff, 6 + 12, 12); nav_h->ION_BDSB[2] = strtonum(buff, 6 + 12 + 12, 12); nav_h->ION_BDSB[3] = strtonum(buff, 6 + 12 + 12 + 12, 12); - continue; - } + continue;} else if (strstr(lable, "BDUT")) { nav_h->BDUT[0] = strtonum(buff, 5, 17); nav_h->BDUT[1] = strtonum(buff, 5 + 17, 16); nav_h->BDUT[2] = strtonum(buff, 5 + 17 + 16, 7); nav_h->BDUT[3] = strtonum(buff, 5 + 17 + 16 + 7, 5); - continue; - } + continue;} else if (strstr(lable, "GPUT")) { nav_h->GPUT[0] = strtonum(buff, 5, 17); nav_h->GPUT[1] = strtonum(buff, 5 + 17, 16); nav_h->GPUT[2] = strtonum(buff, 5 + 17 + 16, 7); nav_h->GPUT[3] = strtonum(buff, 5 + 17 + 16 + 7, 5); - continue; - } + continue;} else if (strstr(lable, "LEAP SECONDS")) { - nav_h->leap = (int)strtonum(buff, 4, 2); - } + nav_h->leap = (int)strtonum(buff, 4, 2);} else if (strstr(lable, "END OF HEADER")) break; } @@ -533,8 +524,8 @@ void read_n_b(FILE* fp_nav, pnav_body nav_b) nav_b[i_g].sa1 = strtonum(buff, 23 + 19, 19); nav_b[i_g].Dos = strtonum(buff, 23 + 19 + 19, 19); - nav_b[i_g].TOE = JDUTC2GPST( - UTCTime2JD(nav_b[i_g].TOC_Y, nav_b[i_g].TOC_M, nav_b[i_g].TOC_D, + nav_b[i_g].TOE = jdutc2gpst( + utctime2jd(nav_b[i_g].TOC_Y, nav_b[i_g].TOC_M, nav_b[i_g].TOC_D, nav_b[i_g].TOC_H, nav_b[i_g].TOC_Min, nav_b[i_g].TOC_Sec) ); fgets(buff, MAXRINEX, fp_nav); diff --git a/src/rnx2pos.cpp b/src/rnx2pos.cpp index 7874827..08eddf6 100644 --- a/src/rnx2pos.cpp +++ b/src/rnx2pos.cpp @@ -42,7 +42,7 @@ pos_ts glo_pos(int best_epoch, double Weeksec, { double X[6], acc[3]; double R = 0.0; double tdist = Weeksec - pos_t.delta_t - nav_b[best_epoch].TOE, tstep = 0.0; - pos_t.delta_clk = -nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * tdist; + pos_t.delta_clk = nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * tdist; X[0] = nav_b[best_epoch].SatX * 1e3; X[1] = nav_b[best_epoch].SatY * 1e3; @@ -56,22 +56,22 @@ pos_ts glo_pos(int best_epoch, double Weeksec, acc[1] = nav_b[best_epoch].SatYa * 1e3; acc[2] = nav_b[best_epoch].SatZa * 1e3;//Acclerate - for (tstep = tdist < 0.0 ? TSTEP : -TSTEP; fabs(tdist) > 1.0e-9; tdist += tstep) { - if (fabs(tdist) < TSTEP) tstep = -tdist; + for (tstep = tdist < 0.0 ? -TSTEP : TSTEP; fabs(tdist) > 1.0e-9; tdist -= tstep) { + if (fabs(tdist) < TSTEP) tstep = tdist; pz90pos(tstep, X, acc); } - X[0] = -0.47 + (X[0] * 1 + X[1] * 1.728e-6 + X[2] * -0.017e-6) * (1 + 22e-9); - X[1] = -0.51 + (X[0] * 1.728e-6 + X[1] * 1 + X[2] * -0.076e-6) * (1 + 22e-9); - X[2] = -1.56 + (X[0] * 0.0178e-6 + X[1] * -0.076e-6 + X[2] * 1) * (1 + 22e-9);//PZ90 Convert to WGS-84 + pz90towgs84(X[0], X[1], X[2]); pos_t.X = X[0]; pos_t.Y = X[1]; pos_t.Z = X[2]; - R = sqrt(pow(pos_t.X - obs_h->apX, 2) + pow(pos_t.Y - obs_h->apY, 2) + pow(pos_t.Z - obs_h->apZ, 2)); + R = sqrt(pow(pos_t.X - obs_h->apX, 2) + + pow(pos_t.Y - obs_h->apY, 2) + + pow(pos_t.Z - obs_h->apZ, 2)); pos_t.deltat = pos_t.delta_t; - pos_t.delta_t = R / C_V + pos_t.delta_clk; + pos_t.delta_t = R / C_V - pos_t.delta_clk; return pos_t; } @@ -103,11 +103,9 @@ pos_ts sat_pos(int sPRN, int best_epoch, double Weeksec, int GNSS, double sinfs = (sqrt(1 - pow(nav_b[best_epoch].e, 2)) * sin(Es)) / (1 - nav_b[best_epoch].e * cos(Es)); double fs = atan2(sinfs, cosfs); double u0 = fs + nav_b[best_epoch].omega; - double epsilon_u = nav_b[best_epoch].Cus * sin(2 * u0) + nav_b[best_epoch].Cuc * cos(2 * u0); double epsilon_r = nav_b[best_epoch].Crs * sin(2 * u0) + nav_b[best_epoch].Crc * cos(2 * u0); double epsilon_i = nav_b[best_epoch].Cis * sin(2 * u0) + nav_b[best_epoch].Cic * cos(2 * u0); - double u = u0 + epsilon_u; double r = pow(nav_b[best_epoch].sqrtA, 2) * (1 - nav_b[best_epoch].e * cos(Es)) + epsilon_r; double i = nav_b[best_epoch].i0 + epsilon_i + nav_b[best_epoch].IDOT * tk; @@ -129,7 +127,6 @@ pos_ts sat_pos(int sPRN, int best_epoch, double Weeksec, int GNSS, X = X * cos(p) + Y * sin(p) * cos(f) + Z * sin(p) * sin(f); Y = X * -sin(p) + Y * cos(p) * cos(f) + Z * cos(p) * sin(f); Z = Y * -sin(f) + Z * cos(f); - } else { l = nav_b[best_epoch].OMEGA + (nav_b[best_epoch].deltaomega - Earth_e) * tk - Earth_e * nav_b[best_epoch].TOE; @@ -147,13 +144,18 @@ pos_ts sat_pos(int sPRN, int best_epoch, double Weeksec, int GNSS, else if (GNSS == BDS) TGD = nav_b[best_epoch].TGD1; //Recalculate the diatance of satellite-receiver - double R = sqrt(pow(pos_t.X - obs_h->apX, 2) + pow(pos_t.Y - obs_h->apY, 2) + pow(pos_t.Z - obs_h->apZ, 2)); + double R = sqrt(pow(pos_t.X - obs_h->apX, 2) + + pow(pos_t.Y - obs_h->apY, 2) + + pow(pos_t.Z - obs_h->apZ, 2)); //Get relativistic effect correction double rela = 2 * sqrt(GM) * nav_b[best_epoch].e * nav_b[best_epoch].sqrtA * sin(Es) / pow(C_V, 2); - pos_t.delta_clk = nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * tk + nav_b[best_epoch].sa2 * pow(tk, 2) - rela + TGD; + pos_t.delta_clk = nav_b[best_epoch].sa0 + + nav_b[best_epoch].sa1 * tk + + nav_b[best_epoch].sa2 * pow(tk, 2) - + rela + TGD; pos_t.deltat = pos_t.delta_t; - pos_t.delta_t = R / C_V + pos_t.delta_clk; + pos_t.delta_t = R / C_V - pos_t.delta_clk; return pos_t; } @@ -171,29 +173,31 @@ pos_ts sat_pos(int sPRN, int best_epoch, double Weeksec, int GNSS, */ int sat_pos_cal(pobs_head obs_h, pobs_epoch obs_e, pobs_body obs_b, pnav_body nav_b, - FILE* res_file, - int GNSS, int satnum, int Hangle) + FILE* solu, + int GNSS, int satnum, int Hangle, int ionopt, int troopt) { + int y, m, d, min, epochcount, sat_num = 0, sPRN = 0; + double h, sec, detat_toc, beginsec, endinsec, Weeksec, PERS = 0; + double apX, apY, apZ, ap_X, ap_Y, ap_Z; + + stations sta = { 0 };rah in_rah = { 0 }; + enu in_enu = { 0 };blh in_blh = { 0 }; + lsq_part in_lsq = { 0 };pos_ts pos_t = { 0 }; + acct_obs obs = { 0 }; + //the beginning second of observation - double beginsec = Time2GPST(obs_h->f_y, obs_h->f_m, obs_h->f_d, obs_h->f_h, obs_h->f_min, obs_h->f_sec); - + beginsec = time2gpst(obs_h->f_y, obs_h->f_m, obs_h->f_d, + obs_h->f_h, obs_h->f_min, obs_h->f_sec); //the ending second of observation - double endinsec = Time2GPST(obs_h->l_y, obs_h->l_m, obs_h->l_d, obs_h->l_h, obs_h->l_min, obs_h->l_sec); + endinsec = time2gpst(obs_h->l_y, obs_h->l_m, obs_h->l_d, + obs_h->l_h, obs_h->l_min, obs_h->l_sec); - rah in_rah = { 0 }; rah tem_rah = { 0 }; - enu in_enu = { 0 }; enu tem_enu = { 0 }; - blh in_blh = { 0 }; blh tem_blh = { 0 }; - pos_ts pos_t = { 0 }; - - int y = obs_e->y; int m = obs_e->m; int d = obs_e->d; - double h = obs_e->h; int min = obs_e->min; double sec = obs_e->sec; + y = obs_e->y;m = obs_e->m;d = obs_e->d; + h = obs_e->h;min = obs_e->min;sec = obs_e->sec; - double Weeksec = Time2GPST(y, m, d, h, min, sec); - int epochcount = round((Weeksec - beginsec) / obs_h->interval) + 1; - fprintf(res_file, "\n>%04d %04d %02d %02d %02d %02d %07.04f" - , epochcount, obs_e->y, obs_e->m, obs_e->d, obs_e->h, obs_e->min, obs_e->sec); - int sat_num = 0, sPRN = 0, PERS = 0; - double detat_toc; + Weeksec = time2gpst(y, m, d, h, min, sec); + epochcount = round((Weeksec - beginsec) / obs_h->interval) + 1; + fprintf(solu, "\n>%05d lat/r lon/r alt/m", epochcount); //Match the system and assign the satellite number if (GNSS == GPS)sat_num = obs_e->gps_num; @@ -201,39 +205,39 @@ int sat_pos_cal(pobs_head obs_h, pobs_epoch obs_e, pobs_body obs_b, else if (GNSS == BDS)sat_num = obs_e->bds_num; else if (GNSS == GLO)sat_num = obs_e->glo_num; - for (int j = 0; j < sat_num; j++) { + in_lsq.l = mat(sat_num, 1); + in_lsq.m = mat(sat_num, 1); + in_lsq.n = mat(sat_num, 1); + in_lsq.o = mat(sat_num, 1); int k = 0; + for (int j = 0; j < sat_num; j++) { //Match system and assign the sPRN if (GNSS == GPS) { sPRN = obs_e->sPRN_GPS[j]; - PERS = obs_b->obs_gps[j][code2type(C1, obs_h->obstypenum_gps, obs_h->obscode_gps)] / C_V; - } + PERS = obs_b->obs_gps[j][ + code2type(C1, obs_h->obstypenum_gps, obs_h->obscode_gps)] / C_V;} else if (GNSS == GAL) { sPRN = obs_e->sPRN_GAL[j]; - PERS = obs_b->obs_gal[j][code2type(C1, obs_h->obstypenum_gal, obs_h->obscode_gal)] / C_V; - } + PERS = obs_b->obs_gal[j][ + code2type(C1, obs_h->obstypenum_gal, obs_h->obscode_gal)] / C_V;} else if (GNSS == BDS) { sPRN = obs_e->sPRN_BDS[j]; - PERS = obs_b->obs_bds[j][code2type(C2, obs_h->obstypenum_bds, obs_h->obscode_bds)] / C_V; - } + PERS = obs_b->obs_bds[j][ + code2type(C2, obs_h->obstypenum_bds, obs_h->obscode_bds)] / C_V;} else if (GNSS == GLO) { sPRN = obs_e->sPRN_GLO[j]; - PERS = obs_b->obs_glo[j][code2type(C1, obs_h->obstypenum_glo, obs_h->obscode_glo)] / C_V; - } + PERS = obs_b->obs_glo[j][ + code2type(C1, obs_h->obstypenum_glo, obs_h->obscode_glo)] / C_V;} //Match the nearest satellite of nav with this epoch int best_epoch = select_epoch(Weeksec, sPRN, nav_b, satnum, GNSS); - if (best_epoch == -1)//when the sPRN is not exist function will return -1 - break; - + if (best_epoch == -1) continue;//when the sPRN is not exist function will return -1 if (GNSS == BDS) detat_toc = Weeksec - nav_b[best_epoch].TOE - 14;//BDST = GPST + 14s - else detat_toc = Weeksec - nav_b[best_epoch].TOE; //Iterative approximate propagation time if (GNSS == GLO) { - //Get the approximately transit of signal pos_t.delta_t = PERS - 0 + nav_b[best_epoch].sa0 + @@ -247,7 +251,6 @@ int sat_pos_cal(pobs_head obs_h, pobs_epoch obs_e, pobs_body obs_b, } //Exclude GLONASS else { - //Get the approximately transit of signal pos_t.delta_t = PERS - 0 + nav_b[best_epoch].sa0 + @@ -260,31 +263,72 @@ int sat_pos_cal(pobs_head obs_h, pobs_epoch obs_e, pobs_body obs_b, pos_t = sat_pos(sPRN, best_epoch, Weeksec, GNSS, nav_b, obs_h, pos_t); } } - //Satellite blh position calculation - tem_blh = xyz2blh(tem_blh, pos_t.X, pos_t.Y, pos_t.Z); - in_blh.B = rad2deg(tem_blh.B); - in_blh.L = rad2deg(tem_blh.L); - in_blh.H = tem_blh.H; + //Satellite blh & rah position calculation + in_rah = xyz2rah(pos_t, obs_h); + in_blh = xyz2blh(in_blh, pos_t.X, pos_t.Y, pos_t.Z); + + if (in_blh.H < 0 || rad2deg(in_rah.H) < Hangle)continue; + else { + //Store the accept observation data + in_lsq.l[k] = pos_t.X, in_lsq.m[k] = pos_t.Y; + in_lsq.n[k] = pos_t.Z, in_lsq.o[k] = deg2rad(in_rah.H); + obs.sclk[k] = pos_t.delta_clk; - double deltax = pos_t.X - obs_h->apX; - double deltay = pos_t.Y - obs_h->apY; - double deltaz = pos_t.Z - obs_h->apZ; + switch (GNSS) { + case GPS: + obs.Per1[k] = obs_b->obs_gps[j][code2type(C1, obs_h->obstypenum_gps, obs_h->obscode_gps)]; + obs.Per2[k] = obs_b->obs_gps[j][code2type(C2, obs_h->obstypenum_gps, obs_h->obscode_gps)]; + obs.freq1 = FREQ1; obs.freq2 = FREQ2; break; + case BDS: + obs.Per1[k] = obs_b->obs_bds[j][code2type(C2, obs_h->obstypenum_bds, obs_h->obscode_bds)]; + obs.Per2[k] = obs_b->obs_bds[j][code2type(C7, obs_h->obstypenum_bds, obs_h->obscode_bds)]; + obs.freq1 = FREQ1_BDS; obs.freq2 = FREQ2_BDS; + break; + case GAL: + obs.Per1[k] = obs_b->obs_gal[j][code2type(C1, obs_h->obstypenum_gal, obs_h->obscode_gal)]; + obs.Per2[k] = obs_b->obs_gal[j][code2type(C2, obs_h->obstypenum_gal, obs_h->obscode_gal)]; + obs.freq1 = FREQ1; obs.freq2 = FREQ6; + break; + case GLO: + obs.Per1[k] = obs_b->obs_glo[j][code2type(C1, obs_h->obstypenum_glo, obs_h->obscode_glo)]; + obs.Per2[k] = obs_b->obs_glo[j][code2type(C2, obs_h->obstypenum_glo, obs_h->obscode_glo)]; + obs.freq1 = FREQ1_GLO; obs.freq2 = FREQ2_GLO; + break;} + + outdata(in_blh, solu, sPRN, GNSS); k++; + }; + } + //Solve the position + if (k >= 4) { + in_lsq.x = mat(4, 1); + in_lsq.B = mat(k, 4); + in_lsq.L = mat(k, 1); + in_lsq.P = zeros(k, k); + apX = 0; ap_X = obs_h->apX; + apY = 0; ap_Y = obs_h->apY; + apZ = 0; ap_Z = obs_h->apZ; + int stop = 0; + while (fabs(ap_X - apX) > 1e-6) { - tem_enu = blh2enu(tem_enu, obs_h->apB, obs_h->apL, deltax, deltay, deltaz); - in_enu.E = tem_enu.E; - in_enu.N = tem_enu.N; - in_enu.U = tem_enu.U; - - //Satellite elevation Angle calculation - tem_rah = rahcal(tem_rah, in_enu.E, in_enu.N, in_enu.U); - in_rah.R = tem_rah.R; - in_rah.A = rad2deg(tem_rah.A); - in_rah.H = rad2deg(tem_rah.H); - if (in_blh.H < 0 || in_rah.H < Hangle || nav_b[best_epoch].sHEA != 0) { - continue; - } - else outputbodydata(obs_h, obs_b, pos_t, in_rah, res_file, sPRN, j, GNSS); - }return 1; + if (stop == 3) break; + apX = ap_X; + apY = ap_Y; + apZ = ap_Z; + sta = designmat(obs_h, obs, + in_lsq.l, in_lsq.m, in_lsq.n, in_lsq.o, + in_lsq.B, in_lsq.P, in_lsq.L, + ap_X, ap_Y, ap_Z, k, + ionopt, troopt, GNSS); + ap_X += sta.X; + ap_Y += sta.Y; + ap_Z += sta.Z; + stop++; + }solution(solu, obs_h, ap_X, ap_Y, ap_Z); + } + else; + free(in_lsq.l); free(in_lsq.m); free(in_lsq.n); free(in_lsq.o); + free(in_lsq.B); free(in_lsq.P); free(in_lsq.L); + return 1; } /** * The entrance of function. @@ -303,8 +347,15 @@ int sat_pos_cal(pobs_head obs_h, pobs_epoch obs_e, pobs_body obs_b, * 0 ,Soulution generated completely * >0 ,Some epoch cant be calculate */ -double brdm2pos(char nav_path[MAXPATH], char obs_path[MAXPATH], char res_path[MAXPATH], - int GNSS, int Hangle) +double brdm2pos( + char nav_path[MAXPATH], + char obs_path[MAXPATH], + char res_path[MAXPATH], + int GNSS, + int Hangle, + int ionopt, + int tropopt +) { int satnum, epochnum, result = 0; pos_ts pos_t = { 0 }; @@ -354,14 +405,13 @@ double brdm2pos(char nav_path[MAXPATH], char obs_path[MAXPATH], char res_path[MA //Read the header of obs read_o_h(fp_obs, obs_h); - //Convert the approximately position (ECEF > LLA) + //Convert the approximately position (ECEF -> LLA) apblh = xyz2blh(apblh, obs_h->apX, obs_h->apY, obs_h->apZ); obs_h->apB = apblh.B; obs_h->apL = apblh.L; obs_h->apH = apblh.H; - //Output header of solution - FILE* result_file = outputheader(obs_h, obs_path, nav_path, res_path); + FILE* solu = headerout(obs_h, obs_path, nav_path, res_path); //Begin to calculate for (int i = 0; i < epochnum; i++) { @@ -375,17 +425,15 @@ double brdm2pos(char nav_path[MAXPATH], char obs_path[MAXPATH], char res_path[MA //Calculate the position of satellite result += sat_pos_cal(obs_h, obs_e, obs_b, nav_b, - result_file, - GNSS, satnum, Hangle); + solu, GNSS, satnum, Hangle, ionopt,tropopt); - - fprintf(result_file, "\n"); + fprintf(solu, "\n"); //Free epoch data freeobs_e(obs_e, obs_b); } //Output the signal of ending - fprintf(result_file, "\nEND"); fclose(result_file); + fprintf(solu, "\nEND"); fclose(solu); //free nav & obs memory of data free(obs_h); free(nav_h); free(nav_b); diff --git a/src/solutionout.cpp b/src/solutionout.cpp deleted file mode 100644 index ddb4179..0000000 --- a/src/solutionout.cpp +++ /dev/null @@ -1,103 +0,0 @@ -#include "brdm2pos.h" -using namespace std; - -/*Output the header data of satllite position solution*/ -FILE* outputheader(pobs_head obs_h, - char obs_path[MAXPATH], char nav_path[MAXPATH], char res_path[MAXPATH]) -{ - time_t gen_time; - time(&gen_time); - - FILE* result_file_clear = fopen(res_path, "w"); - fclose(result_file_clear); - FILE* result_file = fopen(res_path, "a+"); - fprintf(result_file, "@ GENERATE PROGRAM : KNZ_GeoTrackLab ver1.5.4.1\n"); - fprintf(result_file, "@ GENERATE TYPE : Satellite Position\n"); - fprintf(result_file, "@ GENERATE TIME : %s", ctime(&gen_time)); - fprintf(result_file, "@ OBS FILE PATH : %s\n", obs_path); - fprintf(result_file, "@ NAV FILE PATH : %s\n", nav_path); - fprintf(result_file, "@ TIME OF FIRST OBS : %4d %02d %02d %02d %02d %07.4f\n" - , obs_h->f_y, obs_h->f_m, obs_h->f_d, obs_h->f_h, obs_h->f_min, obs_h->f_sec); - fprintf(result_file, "@ TIME OF LAST OBS : %4d %02d %02d %02d %02d %07.4f\n" - , obs_h->l_y, obs_h->l_m, obs_h->l_d, obs_h->l_h, obs_h->l_min, obs_h->l_sec); - fprintf(result_file, "@ APPROX POSITION XYZ: %13.04f%13.04f%13.04f\n@ APPROX POSITION BLH: %12.07f %12.07f %12.07f\n" - , obs_h->apX, obs_h->apY, obs_h->apZ - , obs_h->apB, obs_h->apL, obs_h->apH); - fprintf(result_file, "END OF HEADER\n"); - - return result_file; -} -/*Ion correction by IF-IC*/ -static double ionofree(pobs_body obs_b, pobs_head obs_h, int j, int GNSS) -{ - double P1=0.0, P2=0.0, freq1=0.0, freq2=0.0; - //Match the code with system - switch (GNSS) { - case GPS: - P1 = obs_b->obs_gps[j][code2type(C1, obs_h->obstypenum_gps, obs_h->obscode_gps)]; - P2 = obs_b->obs_gps[j][code2type(C2, obs_h->obstypenum_gps, obs_h->obscode_gps)]; - freq1 = FREQ1; freq2 = FREQ2; - break; - case BDS: - P1 = obs_b->obs_bds[j][code2type(C2, obs_h->obstypenum_bds, obs_h->obscode_bds)]; - P2 = obs_b->obs_bds[j][code2type(C7, obs_h->obstypenum_bds, obs_h->obscode_bds)]; - freq1 = FREQ1_BDS; freq2 = FREQ2_BDS; - break; - case GAL: - P1 = obs_b->obs_gal[j][code2type(C1, obs_h->obstypenum_gal, obs_h->obscode_gal)]; - P2 = obs_b->obs_gal[j][code2type(C5, obs_h->obstypenum_gal, obs_h->obscode_gal)]; - freq1 = FREQ1; freq2 = FREQ6; - break; - case GLO: - P1 = obs_b->obs_glo[j][code2type(C1, obs_h->obstypenum_glo, obs_h->obscode_glo)]; - P2 = obs_b->obs_glo[j][code2type(C2, obs_h->obstypenum_glo, obs_h->obscode_glo)]; - freq1 = FREQ1_GLO; freq2 = FREQ2_GLO; - break; - } - //IF-IC - if (P1 != 0.0 && P2 != 0.0) { - P1 = (pow(freq1, 2) * P1) / (pow(freq1, 2) - pow(freq2, 2)) - - (pow(freq2, 2) * P2) / (pow(freq1, 2) - pow(freq2, 2)); - - return P1; - } - if (P1 == 0.0 || P2 == 0.0) { - if (P1 == 0.0 && P2 != 0.0) return P2; - if (P1 != 0.0 && P2 == 0.0) return P1; - return 0.0; - } -} -/*Output the satellite solution data*/ -void outputbodydata(pobs_head obs_h, pobs_body obs_b, - pos_ts pos_t, rah in_rah, FILE* res_file, - int sPRN, int j, int GNSS) -{ - double P = ionofree(obs_b, obs_h, j, GNSS); - - if (P == 0) return; - - switch (GNSS) { - case GPS: - fprintf(res_file, "\nG %02d| %15.05f %15.05f %15.05f %15.05f %15.05f %16.13f" - , sPRN, pos_t.X, pos_t.Y, pos_t.Z - , P, in_rah.H, pos_t.delta_clk); - break; - case BDS: - if (sPRN <= 5 || sPRN >= 59) break; - else; - fprintf(res_file, "\nC %02d| %15.05f %15.05f %15.05f %15.05f %15.05f %16.13f" - , sPRN, pos_t.X, pos_t.Y, pos_t.Z - , P, in_rah.H, pos_t.delta_clk); - break; - case GAL: - fprintf(res_file, "\nE %02d| %15.05f %15.05f %15.05f %15.05f %15.05f %16.13f" - , sPRN, pos_t.X, pos_t.Y, pos_t.Z - , P, in_rah.H, pos_t.delta_clk); - break; - case GLO: - fprintf(res_file, "\nR %02d| %15.05f %15.05f %15.05f %15.05f %15.05f %16.13f" - , sPRN, pos_t.X, pos_t.Y, pos_t.Z - , P, in_rah.H, pos_t.delta_clk); - break; - } -} \ No newline at end of file diff --git a/src/solutions.cpp b/src/solutions.cpp new file mode 100644 index 0000000..40598a3 --- /dev/null +++ b/src/solutions.cpp @@ -0,0 +1,214 @@ +#include "brdm2pos.h" +using namespace std; +/*Tropshere correction with saastamoinen model*/ +static double trosaastamoinen(pobs_head obs_h, double elev) +{ + double P0, e0, T0, deltaSd, deltaSw, dtropd, dtropw, dtrop; + double B = obs_h->apB, L = obs_h->apL, H = obs_h->apH; + + P0 = 1013.25 * pow((1 - 2.2557 * 10e-5 * H), 5.2568); + e0 = 11.69; + T0 = 15 - 6.5 * 10e-3 * H + 273.15; + deltaSd = 2.2768e-3 * P0 / (1 - 2.66e-3 * cos(2 * B) - 2.8e-4 * H * 1e3); + deltaSw = 2.2768e-3 * (1255 / T0 + 0.05) * e0; + // Dry + dtropd = deltaSd / sqrt( + sin( + deg2rad( + rad2deg( + pow(elev,2) + ) + 6.25 + ) + ) + ); + // Wet + dtropw = deltaSw / sqrt( + sin( + deg2rad( + rad2deg( + pow(elev,2) + ) + 6.25 + ) + ) + ); + dtrop = dtropw + dtropd; + return dtrop; +} +/*Tropshere correction with hopfiled model*/ +static double trohopfiled(pobs_head obs_h, double elev) +{ + double P0, e0, T0, deltaSd, deltaSw, dtropd, dtropw, dtrop; + double B = obs_h->apB, L = obs_h->apL, H = obs_h->apH; + + P0 = 1013.25 * pow((1 - 2.2557 * 10e-5 * H), 5.2568); + e0 = 11.69; + T0 = 15 - 6.5 * 10e-3 * H + 273.15; + deltaSd = 1.552e-5 * P0 * (40136 + 148.72 * (T0 - 273.16) - H) / T0; + deltaSw = 1.552e-5 * 4810 * e0 * (11000 - H) / pow(T0, 2); + // Dry delay component + dtropd = deltaSd / sqrt( + sin( + deg2rad( + rad2deg( + pow(deg2rad(elev), 2) + ) + 6.25 + ) + ) + ); + // Wet delay component + dtropw = deltaSw / sqrt( + sin( + deg2rad( + rad2deg( + pow(deg2rad(elev), 2) + ) + 6.25 + ) + ) + ); + dtrop = dtropw + dtropd; + return dtrop; +} +/*Iono correction by IF-IC*/ +static double ionofree(acct_obs obs, pobs_head obs_h, int k, int GNSS) +{ + double P1 = obs.Per1[k], P2 = obs.Per2[k], + freq1 = obs.freq1, freq2 = obs.freq2; + //IF-IC + if (P1 != 0.0 && P2 != 0.0) { + P1 = (pow(freq1, 2) * P1) / (pow(freq1, 2) - pow(freq2, 2)) + - (pow(freq2, 2) * P2) / (pow(freq1, 2) - pow(freq2, 2)); + + return P1; + } + if (P1 == 0.0 || P2 == 0.0) { + if (P1 == 0.0 && P2 != 0.0) return P2; + if (P1 != 0.0 && P2 == 0.0) return P1; + return 0.0; + } +} +/*Rest correction of observation*/ +static double restcorr(pobs_head obs_h, acct_obs obs, int ionopt, int tropopt, + int k, int GNSS, double elev) { + + double P = 0.0, diono = 0.0, dtrop = 0.0; + + switch (ionopt) { + case 0:P = obs.Per1[k]; break; + case 1:P = ionofree(obs, obs_h, k, GNSS); break; + case 2:break; + } + switch (tropopt) { + case 0:break; + case 1:dtrop = trohopfiled(obs_h, elev); break; + case 2:dtrop = trosaastamoinen(obs_h, elev); break; + } + P = P - diono - dtrop; + return P; +} +/*(Weighted)Least square estimate*/ +int lsq(const double* BtP, const double* L, const double* B, int n, int m, double* x, + double* Q) +{ + double* BtPL; + int info; + + if (m < n) return -1; + BtPL = mat(n, 1); + + matmul("NN", n, 1, m, 1.0, BtP, L, 0.0, BtPL); /* =B'*P*L */ + matmul("NN", n, n, m, 1.0, BtP, B, 0.0, Q); /* =B'*P*B */ + if (!(info = matinv(Q, n))) + matmul("NN", n, 1, n, 1.0, Q, BtPL, 0.0, x); /* x=Q^-1*(B'*P*L) */ + free(BtPL); + return info; +} +/*Construct into desgin matrix and solve the lsq*/ +stations designmat(pobs_head obs_h, acct_obs obs, + double *l, double* m, double* n, double* o, + double* B, double* P, double* L, + double X, double Y, double Z, + int satnum, int ionopt, int tropopt, int GNSS) +{ + stations sta; + double Q[16], dx[4], *BP, *PL; + BP = mat(satnum, 4); + PL = mat(satnum, 1); + + double R; + for (int i = 0; i < satnum; i++) { + R = sqrt( + pow(l[i] - X, 2) + + pow(m[i] - Y, 2) + + pow(n[i] - Z, 2)); + B[i + satnum * 0] = -(l[i] - X) / R; + B[i + satnum * 1] = -(m[i] - Y) / R; + B[i + satnum * 2] = -(n[i] - Z) / R; + B[i + satnum * 3] = 1; + P[i * (satnum) + i] = pow(sin(o[i]),2); + L[i] = restcorr(obs_h, obs, ionopt, tropopt, i, GNSS, o[i]) - + R + obs.sclk[i] * C_V; + } + matmul("TN", 4, satnum, satnum, 1.0, B, P, 0.0, BP);//B'*P + if (!lsq(BP, L, B, 4, satnum, dx, Q)) + sta.X = dx[0]; sta.Y = dx[1]; sta.Z = dx[2]; sta.delta_TR = dx[3]; + + free(BP); free(PL); + + return sta; +} +/*Output the header data of satllite position solution*/ +FILE* headerout(pobs_head obs_h, + char obs_path[MAXPATH], char nav_path[MAXPATH], char res_path[MAXPATH]) +{ + time_t gen_time; + time(&gen_time); + + FILE* result_file_clear = fopen(res_path, "w"); + fclose(result_file_clear); + FILE* result_file = fopen(res_path, "a+"); + fprintf(result_file, ">GENERATE PROGRAM : KNZ_GeoTrackLab ver%s\n", KNZ_GTL_VER); + fprintf(result_file, " GENERATE TYPE : Satellite Position\n"); + fprintf(result_file, " GENERATE TIME : %s", ctime(&gen_time)); + fprintf(result_file, " OBS FILE PATH : %s\n", obs_path); + fprintf(result_file, " NAV FILE PATH : %s\n", nav_path); + fprintf(result_file, " APPROX POSITION XYZ: %13.04f%13.04f%13.04f\n"\ + " APPROX POSITION BLH: %12.07f %12.07f %12.07f\n" + , obs_h->apX, obs_h->apY, obs_h->apZ + , obs_h->apB, obs_h->apL, obs_h->apH); + fprintf(result_file, " TIME OF FIRST OBS : %4d %02d %02d %02d %02d %07.4f\n" + , obs_h->f_y, obs_h->f_m, obs_h->f_d, obs_h->f_h, obs_h->f_min, obs_h->f_sec); + fprintf(result_file, " TIME OF LAST OBS : %4d %02d %02d %02d %02d %07.4f\n" + , obs_h->l_y, obs_h->l_m, obs_h->l_d, obs_h->l_h, obs_h->l_min, obs_h->l_sec); + fprintf(result_file, " INTERVAL : %5.02f\n",obs_h->interval); + fprintf(result_file, "apX; + deltay = Y - obs_h->apY; + deltaz = Z - obs_h->apZ; + fprintf(res_file, "\nRec:%9.4f %9.4f %9.4f", + deltax, deltay, deltaz); +} \ No newline at end of file diff --git a/src/timesys.cpp b/src/timesys.cpp index 4f14069..68f7994 100644 --- a/src/timesys.cpp +++ b/src/timesys.cpp @@ -11,7 +11,7 @@ using namespace std; * \param sec: Second of * \return GPS: Second of week */ -double Time2GPST(int y, int m, int d, double h, int min, double sec) +double time2gpst(int y, int m, int d, double h, int min, double sec) { if (m > 2) { @@ -38,7 +38,7 @@ double Time2GPST(int y, int m, int d, double h, int min, double sec) * \param JD_UTCSU: JD of UTC(SU) time * \return GPS: Second of week */ -double JDUTC2GPST(double JD_UTCSU) +double jdutc2gpst(double JD_UTCSU) { double n;//Leap second @@ -66,7 +66,7 @@ double JDUTC2GPST(double JD_UTCSU) * \param sec: Second of UTC time * \return JD: */ -double UTCTime2JD(int y, int m, int d, double h, int min, double sec) +double utctime2jd(int y, int m, int d, double h, int min, double sec) { if (m > 2) {