From aba6c009abdd4b3efa065d0f88183f866b1f655d Mon Sep 17 00:00:00 2001 From: KenanZhu111 <3471685733@qq.com> Date: Mon, 14 Oct 2024 21:24:01 +0800 Subject: [PATCH] SUPPORT: 1. be able to calculate the sat pos of BDS & Galileo 2. be able to Single postiting by GPS & Galileo --- SPP_calculate.c | 47 +- headers/2gpst.h | 18 +- headers/blh2enu.h | 17 +- headers/cal_mod.h | 548 ++++++++++++++++------ headers/deg2dms.h | 17 +- headers/degRrad.h | 9 +- headers/public.h | 327 +++++++------ headers/rahcal.h | 13 +- headers/read.h | 528 +++++++++++---------- headers/select_epo.h | 62 ++- headers/type2code.h | 105 +++-- headers/xyz2blh.h | 21 +- plot/Mainui.py | 1065 ++++++++++++++++++++++++++++++------------ 13 files changed, 1830 insertions(+), 947 deletions(-) diff --git a/SPP_calculate.c b/SPP_calculate.c index 311b4e7..55c6e56 100644 --- a/SPP_calculate.c +++ b/SPP_calculate.c @@ -46,7 +46,7 @@ char nav_f[MAX_PATH] = { 0 }; char path[MAX_PATH]; const wchar_t wpath[MAX_PATH];//PROGRAM'S FOLDER -static void ProgressBar(HWND hwnd, int BEG, int DES) +static void ProgressBar(HWND hwnd, int BEG, int DES)//PROGRESS BAR FUNCTION { PBRANGE range; SendMessage(hwnd, PBM_SETRANGE, (WPARAM)FALSE, (LPARAM)(MAKELPARAM(0, 100))); @@ -200,6 +200,7 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){ TCHAR* SATSYS[5] = { TEXT("GPS"),TEXT("GLO"),TEXT("BeiDou"),TEXT("Galileo"),TEXT("SBAS") }; static HWND hwndPB; static int cxchar, cychar; + static int gnssencode;//GNSS SET STATE CODE switch (msg) { @@ -216,8 +217,8 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){ InitCommonControls(); hwndPB = CreateWindowEx(0, PROGRESS_CLASS, NULL, WS_CHILD | WS_VISIBLE, - 0.5 * cxchar, 12.25 * cychar, - 47 * cxchar, 1 * cychar, + 0.5 * cxchar, 12.5 * cychar, + 47 * cxchar, 3 * cychar/4, hwnd, (HMENU)PROGRESS, ((LPCREATESTRUCT)lParam)->hInstance, NULL); //CREATE THE BUTTONS @@ -305,7 +306,7 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){ { read_o_h(fp_obs, obs_h); ProgressBar(hwndPB, PBSTATENONE, PBSTATEHALF); - read_o_b(fp_obs, obs_e, obs_b, obs_h->obstypenum_gps, obs_h->obstypenum_bds); + read_o_b(fp_obs, obs_e, obs_b, obs_h); } fclose(fp_obs); @@ -421,37 +422,29 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){ int ALLSTATE = 0x0000; for (int i = 0; i < 5; i++){ALLSTATE += SendMessage(hwndb[i + 5], BM_GETCHECK, wParam, lParam);} if (ALLSTATE == 0x0000) - { - while (MessageBox(hwnd, TEXT("No GNSS is choosen\nPlease Retry"), TEXT("STOP"), MB_ICONERROR | MB_RETRYCANCEL) == IDRETRY) + { while (MessageBox(hwnd, TEXT("No GNSS is choosen\nPlease Retry"), TEXT("STOP"), MB_ICONERROR | MB_RETRYCANCEL) == IDRETRY) { - break; - } - - } + break;}} + else - { - FileSaveDialog(wres_file); + { FileSaveDialog(wres_file); wcstombs(res_file, wres_file, MAX_PATH); if (res_file[0] == '\0') - { - while (MessageBox(hwnd, TEXT("Failed to select a save path.\nThe data has been cleared !"), TEXT("WARNING"), MB_ICONWARNING | MB_OK) == IDOK) - { - break; - } - } + { while (MessageBox(hwnd, TEXT("Failed to select a save path.\nThe data has been cleared !"), TEXT("WARNING"), MB_ICONWARNING | MB_OK) == IDOK) + { break;}} + else - { - if (SendMessage(hwndb[5], BM_GETCHECK, wParam, lParam) == BST_CHECKED) - { + { gnssencode = pow(GPS, SendMessage(hwndb[5], BM_GETCHECK, wParam, lParam)) + * pow(GLO, SendMessage(hwndb[6], BM_GETCHECK, wParam, lParam)) + * pow(BDS, SendMessage(hwndb[7], BM_GETCHECK, wParam, lParam)) + * pow(GAL, SendMessage(hwndb[8], BM_GETCHECK, wParam, lParam)) + * pow(SBAS, SendMessage(hwndb[9], BM_GETCHECK, wParam, lParam)); - sat_gps_pos_clac(result_file, hwndPB, + sat_pos_clac(result_file, hwndPB, nav_b, obs_e, obs_b, obs_h, - o_epochnum, satnum, + o_epochnum, satnum, gnssencode, res_file, obs_f, nav_f, - ionoption, trooption); - - } - + ionoption, trooption); } free(obs_h); free(obs_e); free(obs_b); free(nav_h); free(nav_b); fp_nav = NULL; fp_obs = NULL; result_file = NULL; diff --git a/headers/2gpst.h b/headers/2gpst.h index 2bd8b18..6dfec1c 100644 --- a/headers/2gpst.h +++ b/headers/2gpst.h @@ -2,16 +2,16 @@ #define _2GPST_H_ /* -------------------------------------------------------------------------- */ -/// @brief 将世界协调时转换为GPS周内秒 -/// @param y 年 -/// @param m 月 -/// @param d 日 -/// @param h 时 -/// @param min 分 -/// @param sec 秒 -/// @return 返回GPS周内秒 +/// @brief convert UTC to GPS Second of week +/// @param y year +/// @param m month +/// @param d day +/// @param h hour +/// @param min minute +/// @param sec second +/// @return return GPS Second of week /* -------------------------------------------------------------------------- */ -double Time2GPSsec(int y, int m, int d, double h, int min, double sec) +double Time2Weeksec(int y, int m, int d, double h, int min, double sec) { if (m > 2) { diff --git a/headers/blh2enu.h b/headers/blh2enu.h index 5690b96..4073f08 100644 --- a/headers/blh2enu.h +++ b/headers/blh2enu.h @@ -10,16 +10,15 @@ typedef struct double N; double U; }blh2enu; - /* -------------------------------------------------------------------------- */ -/// @brief 将大地高坐标转换为站心坐标 -/// @param blh2enu 自定义结构体类型用来传参 -/// @param stationB 站心纬度 -/// @param stationL 站心经度 -/// @param deltax 卫星到站心的x坐标差值 -/// @param deltay 卫星到站心的y坐标差值 -/// @param deltaz 卫星到站心的z坐标差值 -/// @return 返回自定义结构体类型包含E, N, U成员 +/// @brief convert BLH coordinates to ENU coordinates +/// @param blh2enu parameter transfer structure +/// @param stationB latitude of receiver station +/// @param stationL longitude of receiver station +/// @param deltax X-coordinate difference of satellite arrival center +/// @param deltay Y-coordinate difference of satellite arrival center +/// @param deltaz Z-coordinate difference of satellite arrival center +/// @return return type of structure contain E, N, U members /* -------------------------------------------------------------------------- */ blh2enu BLH2ENU(blh2enu blh2enu, double stationB, double stationL, diff --git a/headers/cal_mod.h b/headers/cal_mod.h index 9b03ea1..824434c 100644 --- a/headers/cal_mod.h +++ b/headers/cal_mod.h @@ -17,167 +17,300 @@ #include"type2code.h" #include"select_epo.h" -/* ------------------------------- GPS卫星位置计算函数 ------------------------------ */ +/* -------------------- GPS Satellite position calculate -------------------- */ pos_ts gps_pos(int sPRN, int best_epoch, double GPSsec, - pnav_body nav_b, pobs_head obs_h, pos_ts pos_t) - { - double T_S = GPSsec - pos_t.delta_t[sPRN];//计算信号发射时刻 - double n_0 = sqrt(GM) / pow(nav_b[best_epoch].sqrtA,3); - double n = n_0 + nav_b[best_epoch].deltan; //计算卫星运行平均角速度 - double tk = T_S - nav_b[best_epoch].TOE;//计算归化时间 - if (tk > 32400)tk -= 604800; - else if (tk < -32400)tk += 604800;//归化时间改正 - double Ms = nav_b[best_epoch].M0 + n * tk;//计算卫星发射时卫星的平近角M - double Es = Ms, E0;//迭代计算偏近点角 - do - { - E0 = Es; - Es = Ms + nav_b[best_epoch].e * sin(Es); - } while (fabs(Es - E0) > 1.0e-5);//迭代计算偏近点角 - //计算真近点角 - double cosfs = (cos(Es) - nav_b[best_epoch].e) / (1 - nav_b[best_epoch].e * cos(Es)); - 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;//改正后的轨道倾角 - double x = r * cos(u); - double y = r * sin(u);//卫星在轨道平面坐标系中的坐标 - double l = nav_b[best_epoch].OMEGA + (nav_b[best_epoch].deltaomega - Earth_e) * tk - Earth_e * nav_b[best_epoch].TOE; - //计算升交点经度 - double X = x * cos(l) - y * cos(i) * sin(l); - double Y = x * sin(l) + y * cos(i) * cos(l); - double Z = y * sin(i);//卫星在地固系下的直角坐标 - pos_t.X[sPRN] = cos(Earth_e * pos_t.delta_t[sPRN]) * X + sin(Earth_e * pos_t.delta_t[sPRN]) * Y; - pos_t.Y[sPRN] = -sin(Earth_e * pos_t.delta_t[sPRN]) * X + cos(Earth_e * pos_t.delta_t[sPRN]) * Y; - pos_t.Z[sPRN] = Z; - double R = sqrt(pow(pos_t.X[sPRN] - obs_h->apX, 2) + pow(pos_t.Y[sPRN] - obs_h->apY, 2) + pow(pos_t.Z[sPRN] - obs_h->apZ, 2)); - pos_t.deltat[sPRN] = pos_t.delta_t[sPRN]; - 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[sPRN] = nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * tk + nav_b[best_epoch].sa2 * pow(tk,2) - rela; - pos_t.delta_t[sPRN] = R / C_V + pos_t.delta_clk[sPRN]; - return pos_t; - } -/* -------------------------------------------------------------------------- */ + pnav_body nav_b, pobs_head obs_h, pos_ts pos_t) +{ double T_S = GPSsec - pos_t.delta_t; + double n_0 = sqrt(GM) / pow(nav_b[best_epoch].sqrtA,3); + double n = n_0 + nav_b[best_epoch].deltan; + double tk = T_S - nav_b[best_epoch].TOE; + + if (tk > 32400)tk -= 604800; + else if (tk < -32400)tk += 604800; + + double Ms = nav_b[best_epoch].M0 + n * tk; + + double Es = Ms, E0; + do + { + E0 = Es; + Es = Ms + nav_b[best_epoch].e * sin(Es); + } while (fabs(Es - E0) > 1.0e-10); + + double cosfs = (cos(Es) - nav_b[best_epoch].e) / (1 - nav_b[best_epoch].e * cos(Es)); + 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; + + double x = r * cos(u); + double y = r * sin(u); + + double l = nav_b[best_epoch].OMEGA + (nav_b[best_epoch].deltaomega - Earth_e) * tk - Earth_e * nav_b[best_epoch].TOE; + double X = x * cos(l) - y * cos(i) * sin(l); + double Y = x * sin(l) + y * cos(i) * cos(l); + double Z = y * sin(i); + + pos_t.X = cos(Earth_e * pos_t.delta_t) * X + sin(Earth_e * pos_t.delta_t) * Y; + pos_t.Y = -sin(Earth_e * pos_t.delta_t) * X + cos(Earth_e * pos_t.delta_t) * Y; + pos_t.Z = Z;//Correction of earth rotation + + 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)); + pos_t.deltat = pos_t.delta_t; + double rela = 2*sqrt(GM) * nav_b[best_epoch].e * nav_b[best_epoch].sqrtA * sin(Es)/pow(C_V,2);//Relativistic effect + pos_t.delta_clk = nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * tk + nav_b[best_epoch].sa2 * pow(tk,2) - rela - nav_b[best_epoch].TGD; + pos_t.delta_t = R / C_V + pos_t.delta_clk; + + return pos_t;} -/* ------------------------------- GPS卫星位置计算&输出 ------------------------------ */ -void sat_gps_pos_clac(FILE* result_file,HWND hwndPB, +/* -------------------- GAL Satellite position calculate -------------------- */ +pos_ts gal_pos(int sPRN, int best_epoch, double GALsec, + pnav_body nav_b, pobs_head obs_h, pos_ts pos_t) +{ double T_S = GALsec - pos_t.delta_t; + double n_0 = sqrt(GM) / pow(nav_b[best_epoch].sqrtA, 3); + double n = n_0 + nav_b[best_epoch].deltan; + double tk = T_S - nav_b[best_epoch].TOE; + + if (tk > 32400)tk -= 604800; + else if (tk < -32400)tk += 604800; + + double Ms = nav_b[best_epoch].M0 + n * tk; + + double Es = Ms, E0; + do + { + E0 = Es; + Es = Ms + nav_b[best_epoch].e * sin(Es); + } while (fabs(Es - E0) > 1.0e-10); + + double cosfs = (cos(Es) - nav_b[best_epoch].e) / (1 - nav_b[best_epoch].e * cos(Es)); + 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; + + double x = r * cos(u); + double y = r * sin(u); + + double l = nav_b[best_epoch].OMEGA + (nav_b[best_epoch].deltaomega - Earth_e) * tk - Earth_e * nav_b[best_epoch].TOE; + double X = x * cos(l) - y * cos(i) * sin(l); + double Y = x * sin(l) + y * cos(i) * cos(l); + double Z = y * sin(i); + + pos_t.X = cos(Earth_e * pos_t.delta_t) * X + sin(Earth_e * pos_t.delta_t) * Y; + pos_t.Y = -sin(Earth_e * pos_t.delta_t) * X + cos(Earth_e * pos_t.delta_t) * Y; + pos_t.Z = Z;//Correction of earth rotation + + 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)); + pos_t.deltat = pos_t.delta_t; + double rela = 2 * sqrt(GM) * nav_b[best_epoch].e * nav_b[best_epoch].sqrtA * sin(Es) / pow(C_V, 2);//Relativistic effect + pos_t.delta_clk = nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * tk + nav_b[best_epoch].sa2 * pow(tk, 2) - rela - nav_b[best_epoch].BGDa; + pos_t.delta_t = R / C_V + pos_t.delta_clk; + + return pos_t;} + + +/* -------------------- BDS Satellite position calculate -------------------- */ +pos_ts bds_pos(int sPRN, int best_epoch, double BDSsec, + pnav_body nav_b, pobs_head obs_h, pos_ts pos_t) +{ double T_S = BDSsec - pos_t.delta_t; + double n_0 = sqrt(GM) / pow(nav_b[best_epoch].sqrtA, 3); + double n = n_0 + nav_b[best_epoch].deltan; + double tk = T_S - nav_b[best_epoch].TOE - 14; + + if (tk > 32400)tk -= 604800; + else if (tk < -32400)tk += 604800; + double Ms = nav_b[best_epoch].M0 + n * tk; + + double Es = Ms, E0; + do + { + E0 = Es; + Es = Ms + nav_b[best_epoch].e * sin(Es); + } while (fabs(Es - E0) > 1.0e-10); + + double cosfs = (cos(Es) - nav_b[best_epoch].e) / (1 - nav_b[best_epoch].e * cos(Es)); + 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; + + double x = r * cos(u); + double y = r * sin(u); + + double l, X, Y, Z; + if (sPRN > 5 && sPRN < 59) //BDS IGSO & MEO Satellites + { + l = nav_b[best_epoch].OMEGA + (nav_b[best_epoch].deltaomega - Earth_e) * tk - Earth_e * nav_b[best_epoch].TOE; + X = x * cos(l) - y * cos(i) * sin(l); + Y = x * sin(l) + y * cos(i) * cos(l); + Z = y * sin(i);} + + else // BDS GEO Satellites + { + l = nav_b[best_epoch].OMEGA + nav_b[best_epoch].deltaomega * tk - Earth_e * nav_b[best_epoch].TOE; + X = x * cos(l) - y * cos(i) * sin(l); + Y = x * sin(l) + y * cos(i) * cos(l); + Z = y * sin(i); + + double f = deg2rad(-5); + double p = Earth_e * tk; + + 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);} + + pos_t.X = cos(Earth_e * pos_t.delta_t) * X + sin(Earth_e * pos_t.delta_t) * Y; + pos_t.Y = -sin(Earth_e * pos_t.delta_t) * X + cos(Earth_e * pos_t.delta_t) * Y; + pos_t.Z = Z;//Correction of earth rotation + + double rela = 2 * sqrt(GM) * nav_b[best_epoch].e * nav_b[best_epoch].sqrtA * sin(Es) / pow(C_V, 2);//Relativistic effect + pos_t.delta_clk = nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * tk + nav_b[best_epoch].sa2 * pow(tk, 2) - rela; + 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)); + pos_t.deltat = pos_t.delta_t; + pos_t.delta_t = R / C_V + pos_t.delta_clk; + return pos_t;} + + +/* -------------------------------- Satellite position calculate & Output -------------------------------- */ +void sat_pos_clac(FILE* result_file,HWND hwndPB, pnav_body nav_b, pobs_epoch obs_e, pobs_body obs_b,pobs_head obs_h, - int o_epochnum, int satnum, + int o_epochnum, int satnum, int gnssdecode, char res_file[MAX_PATH], char obs_file[MAX_PATH], char nav_file[MAX_PATH], int ionoption, int trooption) { - PBRANGE range; - SendMessage(hwndPB, PBM_SETRANGE, (WPARAM)FALSE, (LPARAM)(MAKELPARAM(0, 100))); - SendMessage(hwndPB, PBM_GETRANGE, (WPARAM)TRUE, (LPARAM)&range); + PBRANGE range; + SendMessage(hwndPB, PBM_SETRANGE, (WPARAM)FALSE, (LPARAM)(MAKELPARAM(0, 100))); + SendMessage(hwndPB, PBM_GETRANGE, (WPARAM)TRUE, (LPARAM)&range); - time_t gen_time; - time(&gen_time); - stations station = { 0 }; - xyz2blh tem2 = { 0 }; - tem2 = XYZ2BLH(tem2, obs_h->apX, obs_h->apY, obs_h->apZ); - station.B = tem2.B; - station.L = tem2.L; - station.H = tem2.H; - result_file = fopen(res_file, "w"); - fclose(result_file); - result_file = fopen(res_file, "a+"); - fprintf(result_file, "@ GENERATE PROGRAM : KNZ_Calculate v0.9.7\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_file); - fprintf(result_file, "@ NAV FILE PATH : %s\n", nav_file); - fprintf(result_file, "@ TIME OF FIRST OBS : %4d %02d %02d %02d %02d %07.4f\n" + time_t gen_time;time(&gen_time);stations station = { 0 };xyz2blh tem2 = { 0 }; + tem2 = XYZ2BLH(tem2, obs_h->apX, obs_h->apY, obs_h->apZ); + station.B = tem2.B; + station.L = tem2.L; + station.H = tem2.H; + + result_file = fopen(res_file, "w"); + fclose(result_file); + result_file = fopen(res_file, "a+"); + fprintf(result_file, "@ GENERATE PROGRAM : KNZ_Calculate v1.2.2\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_file); + fprintf(result_file, "@ NAV FILE PATH : %s\n", nav_file); + 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" + 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" + 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 , station.B, station.L, station.H); - if (ionoption == 0) { fprintf(result_file, "@ IONOS OPT : NULL\n"); } - if (ionoption == 1) { fprintf(result_file, "@ IONOS OPT : DEFAULT\n"); } - if (trooption == 0) { fprintf(result_file, "@ TROPO OPT : NULL\n@\n\n"); } - if (trooption == 1) { fprintf(result_file, "@ TROPO OPT : DEFAULT\n@\n\n"); } + + if (ionoption == 0) { fprintf(result_file, "@ IONOS OPT : NULL\n"); } + if (ionoption == 1) { fprintf(result_file, "@ IONOS OPT : DEFAULT\n"); } + if (trooption == 0) { fprintf(result_file, "@ TROPO OPT : NULL\n@\n\n"); } + if (trooption == 1) { fprintf(result_file, "@ TROPO OPT : DEFAULT\n@\n\n"); } + fclose(result_file); + + //the beginning second of observation + double beginsec = Time2Weeksec(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 = Time2Weeksec(obs_h->l_y, obs_h->l_m, obs_h->l_d, obs_h->l_h, obs_h->l_min, obs_h->l_sec); + + for (int i = 0; i < o_epochnum; i++) + { int y = obs_e[i].y; + int m = obs_e[i].m; + int d = obs_e[i].d; + double h = obs_e[i].h; + int min = obs_e[i].min; + double sec = obs_e[i].sec; + + xyz2blh tem1 = { 0 }; + blh2enu tem3 = { 0 }; + rahcal tem4 = { 0 }; + deg2dms temb = { 0 }; + deg2dms teml = { 0 }; + + blhs blh = { 0 }; + enus enu = { 0 }; + rahs rah = { 0 }; + pos_ts pos_t = { 0 }; + + double Weeksec = Time2Weeksec(y, m, d, h, min, sec); + int epochcount = round((Weeksec - beginsec) / obs_h->interval) + 1; + + result_file = fopen(res_file, "a+"); + fprintf(result_file, "\n>%04d %04d %02d %02d %02d %02d %07.04f" + , epochcount, obs_e[i].y, obs_e[i].m, obs_e[i].d, obs_e[i].h, obs_e[i].min, obs_e[i].sec); fclose(result_file); - double beginsec = Time2GPSsec(obs_h->f_y, obs_h->f_m, obs_h->f_d, obs_h->f_h, obs_h->f_min, obs_h->f_sec); - double endinsec = Time2GPSsec(obs_h->l_y, obs_h->l_m, obs_h->l_d, obs_h->l_h, obs_h->l_min, obs_h->l_sec); - - for (int i = 0; i < o_epochnum; i++) + if (gnssdecode % GPS == 0)//Be judged as GPS { - int y = obs_e[i].y; - int m = obs_e[i].m; - int d = obs_e[i].d; - double h = obs_e[i].h; - int min = obs_e[i].min; - double sec = obs_e[i].sec; - - xyz2blh tem1 = { 0 }; - blh2enu tem3 = { 0 }; - rahcal tem4 = { 0 }; - deg2dms temb = { 0 }; - deg2dms teml = { 0 }; - - blhs blh = { 0 }; - enus enu = { 0 }; - rahs rah = { 0 }; - pos_ts pos_t = { 0 }; - - double GPSsec = Time2GPSsec(y, m, d, h, min, sec);//转换为GPS周内秒 - int epochsignal = round((GPSsec - beginsec) / obs_h->interval) + 1; - - result_file = fopen(res_file, "a+"); - fprintf(result_file, "\n>%04d %04d %02d %02d %02d %02d %07.04f" - , epochsignal, obs_e[i].y, obs_e[i].m, obs_e[i].d, obs_e[i].h, obs_e[i].min, obs_e[i].sec); - fclose(result_file); - - for (int j = 0; j < obs_e[i].gps_num; j++)//第j颗GPS卫星 + for (int j = 0; j < obs_e[i].gps_num; j++) { int sPRN = obs_e[i].sPRN_GPS[j]; - int best_epoch = select_epoch(GPSsec, sPRN, nav_b, satnum, GPS); //遍历N文件GPS卫星数据块,寻找最佳历元 - double detat_toc = GPSsec - nav_b[best_epoch].TOE;//观测时刻 - 参考时刻 - //计算近似的信号传播时间,接收机钟差已初始化为0(伪距/光速-接收机钟差+卫星钟差) - pos_t.delta_t[sPRN] = (obs_b[i].obs_gps[j][Code2Type(C1C, obs_h->obstypenum_gps, obs_h->obscode_gps)] / C_V) - station.delta_TR + nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * detat_toc + nav_b[best_epoch].sa2 * pow(detat_toc, 2); - pos_t.deltat[sPRN] = 0.0;//判断收敛 - while (fabs(pos_t.delta_t[sPRN] - pos_t.deltat[sPRN]) > 1.0e-9) { + int best_epoch = select_epoch(Weeksec, sPRN, nav_b, satnum, GPS); - pos_t = gps_pos(sPRN, best_epoch, GPSsec, nav_b, obs_h, pos_t); + if (best_epoch == -1)//when the sPRN is not exist func will return -1 + break; + + double detat_toc = Weeksec - nav_b[best_epoch].TOE; + + //Iterative approximate propagation time + pos_t.delta_t = (obs_b[i].obs_gps[j][Code2Type(C1C, obs_h->obstypenum_gps, obs_h->obscode_gps)] / C_V) + - station.delta_TR + nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * detat_toc + nav_b[best_epoch].sa2 * pow(detat_toc, 2); + pos_t.deltat = 0.0; + while (fabs(pos_t.delta_t - pos_t.deltat) > 1.0e-9) + { + pos_t = gps_pos(sPRN, best_epoch, Weeksec, nav_b, obs_h, pos_t); } - /* ----------------------------- 地固坐标系转经纬大地高坐标系 ----------------------------- */ - tem1 = XYZ2BLH(tem1, pos_t.X[sPRN], pos_t.Y[sPRN], pos_t.Z[sPRN]); + tem1 = XYZ2BLH(tem1, pos_t.X, pos_t.Y, pos_t.Z); blh.B = rad2deg(tem1.B); blh.L = rad2deg(tem1.L); blh.H = tem1.H; - /* -------------------------------------------------------------------------- */ - /* ----------------------------- 经纬大地高坐标系转站心坐标系 ----------------------------- */ - double deltax = pos_t.X[sPRN] - obs_h->apX; - double deltay = pos_t.Y[sPRN] - obs_h->apY; - double deltaz = pos_t.Z[sPRN] - obs_h->apZ; + double deltax = pos_t.X - obs_h->apX; + double deltay = pos_t.Y - obs_h->apY; + double deltaz = pos_t.Z - obs_h->apZ; tem3 = BLH2ENU(tem3, station.B, station.L, deltax, deltay, deltaz); enu.E = tem3.E; enu.N = tem3.N; enu.U = tem3.U; - /* -------------------------------------------------------------------------- */ - /* ---------------------------- 卫星方位角a,高度角h,向径r计算 --------------------------- */ + //Satellite altitude Angle calculation tem4 = RAHCAL(tem4, enu.E, enu.N, enu.U); rah.R = tem4.R; rah.A = rad2deg(tem4.A); rah.H = rad2deg(tem4.H); - /* -------------------------------------------------------------------------- */ + if (blh.H < 0 || rah.H < 10 || nav_b[best_epoch].sHEA != 0) { continue; } + else { temb = DEG2DMS(temb, blh.B); @@ -191,23 +324,168 @@ void sat_gps_pos_clac(FILE* result_file,HWND hwndPB, blh.L_s = teml.S; result_file = fopen(res_file, "a+"); - fprintf(result_file, "\nG%02d | %15.05f %15.05f %15.05f %15.05f %15.05f %15.05f %15.12f %16.13f" - , sPRN, pos_t.X[sPRN], pos_t.Y[sPRN], pos_t.Z[sPRN] - , obs_b[i].obs_gps[j][Code2Type(C1C, obs_h->obstypenum_gps, obs_h->obscode_gps)] - , obs_b[i].obs_gps[j][Code2Type(C2L, obs_h->obstypenum_gps, obs_h->obscode_gps)] - , rah.H, nav_b[best_epoch].TGD, pos_t.delta_clk[sPRN]); + fprintf(result_file, "\nG %02d| %15.05f %15.05f %15.05f %15.05f %15.05f %15.05f %16.13f" + , sPRN, pos_t.X, pos_t.Y, pos_t.Z + , obs_b[i].obs_gps[j][Code2Type(C1C, obs_h->obstypenum_gps, obs_h->obscode_gps)] + , obs_b[i].obs_gps[j][Code2Type(C2L, obs_h->obstypenum_gps, obs_h->obscode_gps)] + , rah.H, pos_t.delta_clk);//GPS satellite fclose(result_file); } } - result_file = fopen(res_file, "a+"); - fprintf(result_file, "\n"); - fclose(result_file); - SendMessage(hwndPB, PBM_SETPOS, (WPARAM)((int)(i * 100 / o_epochnum)), (LPARAM)0); - } + + if (gnssdecode % BDS == 0)//Be judged as BeiDou + { + for (int j = 0; j < obs_e[i].bds_num; j++) + { + int sPRN = obs_e[i].sPRN_BDS[j]; + int best_epoch = select_epoch(Weeksec, sPRN, nav_b, satnum, BDS); + + if (best_epoch == -1)//when the sPRN is not exist func will return -1 + break; + + double detat_toc = Weeksec - nav_b[best_epoch].TOE - 14;//BDST - GPST = 14s + + //Iterative approximate propagation time + pos_t.delta_t = (obs_b[i].obs_bds[j][Code2Type(C2I, obs_h->obstypenum_bds, obs_h->obscode_bds)] / C_V) + - station.delta_TR + nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * detat_toc + nav_b[best_epoch].sa2 * pow(detat_toc, 2); + pos_t.deltat = 0.0; + while (fabs(pos_t.delta_t - pos_t.deltat) > 1.0e-9) + { + pos_t = bds_pos(sPRN, best_epoch, Weeksec, nav_b, obs_h, pos_t); + } + + tem1 = XYZ2BLH(tem1, pos_t.X, pos_t.Y, pos_t.Z); + blh.B = rad2deg(tem1.B); + blh.L = rad2deg(tem1.L); + blh.H = tem1.H; + + double deltax = pos_t.X - obs_h->apX; + double deltay = pos_t.Y - obs_h->apY; + double deltaz = pos_t.Z - obs_h->apZ; + + tem3 = BLH2ENU(tem3, station.B, station.L, deltax, deltay, deltaz); + enu.E = tem3.E; + enu.N = tem3.N; + enu.U = tem3.U; + + //Satellite altitude Angle calculation + tem4 = RAHCAL(tem4, enu.E, enu.N, enu.U); + rah.R = tem4.R; + rah.A = rad2deg(tem4.A); + rah.H = rad2deg(tem4.H); + + if (blh.H < 0 || rah.H < 10 || nav_b[best_epoch].sHEA != 0){ + continue; + } + + else{ + temb = DEG2DMS(temb, blh.B); + blh.B_d = temb.D; + blh.B_m = temb.M; + blh.B_s = temb.S; + + teml = DEG2DMS(teml, blh.L); + blh.L_d = teml.D; + blh.L_m = teml.M; + blh.L_s = teml.S; + + result_file = fopen(res_file, "a+"); + if (sPRN >= 19) { + fprintf(result_file, "\nCC%02d| %15.05f %15.05f %15.05f %15.05f %15.05f %15.05f %16.13f" + , sPRN, pos_t.X, pos_t.Y, pos_t.Z + , obs_b[i].obs_bds[j][Code2Type(C2I, obs_h->obstypenum_bds, obs_h->obscode_bds)] + , obs_b[i].obs_bds[j][Code2Type(C7I, obs_h->obstypenum_bds, obs_h->obscode_bds)] + , rah.H, pos_t.delta_clk);//BDS-3 satellite + } + else { + fprintf(result_file, "\nCB%02d| %15.05f %15.05f %15.05f %15.05f %15.05f %15.05f %16.13f" + , sPRN, pos_t.X, pos_t.Y, pos_t.Z + , obs_b[i].obs_bds[j][Code2Type(C2I, obs_h->obstypenum_bds, obs_h->obscode_bds)] + , obs_b[i].obs_bds[j][Code2Type(C7I, obs_h->obstypenum_bds, obs_h->obscode_bds)] + , rah.H, pos_t.delta_clk);//BDS-2 satellite + } + fclose(result_file); + } + } + } + + if (gnssdecode % GAL == 0)//Be judged as Galileo + { + for (int j = 0; j < obs_e[i].gal_num; j++) + { + int sPRN = obs_e[i].sPRN_GAL[j]; + int best_epoch = select_epoch(Weeksec, sPRN, nav_b, satnum, GAL); + + if (best_epoch == -1)//when the sPRN is not exist func will return -1 + break; + + double detat_toc = Weeksec - nav_b[best_epoch].TOE; + + //Iterative approximate propagation time + pos_t.delta_t = (obs_b[i].obs_gal[j][Code2Type(C1C, obs_h->obstypenum_gal, obs_h->obscode_gal)] / C_V) + - station.delta_TR + nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * detat_toc + nav_b[best_epoch].sa2 * pow(detat_toc, 2); + pos_t.deltat = 0.0; + while (fabs(pos_t.delta_t - pos_t.deltat) > 1.0e-9) + { + pos_t = gal_pos(sPRN, best_epoch, Weeksec, nav_b, obs_h, pos_t); + } + + tem1 = XYZ2BLH(tem1, pos_t.X, pos_t.Y, pos_t.Z); + blh.B = rad2deg(tem1.B); + blh.L = rad2deg(tem1.L); + blh.H = tem1.H; + + double deltax = pos_t.X - obs_h->apX; + double deltay = pos_t.Y - obs_h->apY; + double deltaz = pos_t.Z - obs_h->apZ; + + tem3 = BLH2ENU(tem3, station.B, station.L, deltax, deltay, deltaz); + enu.E = tem3.E; + enu.N = tem3.N; + enu.U = tem3.U; + + //Satellite altitude Angle calculation + tem4 = RAHCAL(tem4, enu.E, enu.N, enu.U); + rah.R = tem4.R; + rah.A = rad2deg(tem4.A); + rah.H = rad2deg(tem4.H); + + if (blh.H < 0 || rah.H < 10 || nav_b[best_epoch].sHEA != 0) + { continue;} + + else + { + temb = DEG2DMS(temb, blh.B); + blh.B_d = temb.D; + blh.B_m = temb.M; + blh.B_s = temb.S; + + teml = DEG2DMS(teml, blh.L); + blh.L_d = teml.D; + blh.L_m = teml.M; + blh.L_s = teml.S; + + result_file = fopen(res_file, "a+"); + fprintf(result_file, "\nE %02d| %15.05f %15.05f %15.05f %15.05f %15.05f %15.05f %16.13f" + , sPRN, pos_t.X, pos_t.Y, pos_t.Z + , obs_b[i].obs_gal[j][Code2Type(C1C, obs_h->obstypenum_gps, obs_h->obscode_gps)] + , obs_b[i].obs_gal[j][Code2Type(C6C, obs_h->obstypenum_gps, obs_h->obscode_gps)] + , rah.H, pos_t.delta_clk);//Galileo satellite + fclose(result_file); + } + } + } + result_file = fopen(res_file, "a+"); - fprintf(result_file, "\nEND"); + fprintf(result_file, "\n"); fclose(result_file); - SendMessage(hwndPB, PBM_SETPOS, (WPARAM)range.iHigh, (LPARAM)0); + SendMessage(hwndPB, PBM_SETPOS, (WPARAM)((int)(i * 100 / o_epochnum)), (LPARAM)0); + + } + result_file = fopen(res_file, "a+"); + fprintf(result_file, "\nEND"); + fclose(result_file); + SendMessage(hwndPB, PBM_SETPOS, (WPARAM)range.iHigh, (LPARAM)0); } #endif \ No newline at end of file diff --git a/headers/deg2dms.h b/headers/deg2dms.h index 87a8f1c..7417771 100644 --- a/headers/deg2dms.h +++ b/headers/deg2dms.h @@ -10,20 +10,19 @@ typedef struct double M; double S; }deg2dms; - /* -------------------------------------------------------------------------- */ -/// @brief 将十进制的度数转换为度分秒形式 -/// @param deg2dms 结构体传递参数 -/// @param D 要转换度数 -/// @return 返回自定义结构体包含度,分,秒成员 +/// @brief Converts decimal degrees to degree minutes and seconds +/// @param deg2dms Parameter transfer structure +/// @param D The number of degrees to convert +/// @return return structure contain degree minute second /* -------------------------------------------------------------------------- */ deg2dms DEG2DMS(deg2dms deg2dms, double D) { - int sig = D / fabs(D);//符号判断 - deg2dms.D = (int)(D);//转换为度分秒 - deg2dms.M = (int)((D - deg2dms.D) * 60);//分秒去除符号格式 - deg2dms.S = (int)(((D - deg2dms.D) * 60 - deg2dms.M) * 60); + int sig = D / fabs(D);//sign judgment + deg2dms.D = (int)(D);//to degree + deg2dms.M = (int)((D - deg2dms.D) * 60);//to minute + deg2dms.S = (int)(((D - deg2dms.D) * 60 - deg2dms.M) * 60);//to second deg2dms.M = deg2dms.M * sig; deg2dms.S = deg2dms.S * sig; diff --git a/headers/degRrad.h b/headers/degRrad.h index 19522e1..0cf8f1d 100644 --- a/headers/degRrad.h +++ b/headers/degRrad.h @@ -2,11 +2,10 @@ #define _DEGRRAD_H_ #include"public.h" - /* -------------------------------------------------------------------------- */ -/// @brief 角度转弧度 +/// @brief degree to radian /// @param deg -/// @return 返回弧度 +/// @return return radian /* -------------------------------------------------------------------------- */ double deg2rad(double deg) { @@ -15,9 +14,9 @@ double deg2rad(double deg) } /* -------------------------------------------------------------------------- */ -/// @brief 弧度转角度 +/// @brief radian to degree /// @param rad -/// @return 返回角度 +/// @return return degree /* -------------------------------------------------------------------------- */ double rad2deg(double rad) { diff --git a/headers/public.h b/headers/public.h index 281d473..75b7572 100644 --- a/headers/public.h +++ b/headers/public.h @@ -1,6 +1,7 @@ #ifndef _PUBLIC_H_ #define _PUBLIC_H_ -/*---------------------------------- FOR UI ----------------------------------*/ + +/* --------------------------------- FOR UI --------------------------------- */ //FILE SELECT DIALOGS #define FILEEXOP TEXT("RINEX OBS(*.o*.*.*obs.*.*d)\0*.*o;*.*obs;*.*d\0"\ "All Files(*.*)\0*.*\0\0"); @@ -50,104 +51,130 @@ #define Earth_e 7.2921151467e-5 -/* ----------------------------- GPS OBSERV TYPE ---------------------------- */ -#define C1C 1 -#define C1S 2 -#define C1L 3 -#define C1X 4 -#define C1P 5 -#define C1W 6 -#define C1Y 7 -#define C1M 8 +/* ----------------------------- GNSS OBSERV TYPE --------------------------- */ +#define C1C 100 +#define C1S 101 +#define C1L 102 +#define C1X 103 +#define C1P 104 +#define C1W 105 +#define C1Y 106 +#define C1M 107 +#define C1A 108 +#define C1B 109 +#define C1Z 110 -#define C2C 9 -#define C2S 10 -#define C2L 11 -#define C2X 12 -#define C2P 13 -#define C2W 14 -#define C2Y 15 -#define C2M 16 +#define C2C 200 +#define C2S 201 +#define C2L 202 +#define C2X 203 +#define C2P 204 +#define C2W 205 +#define C2Y 206 +#define C2M 207 +#define C2I 208 +#define C2Q 209 +#define C2X 210 -#define C5I 17 -#define C5Q 18 -#define C5X 19 +#define C5I 500 +#define C5Q 501 +#define C5X 502 +#define C6A 600 +#define C6B 601 +#define C6C 602 +#define C6X 603 +#define C6Z 604 + +#define C7I 700 +#define C7Q 701 +#define C7X 702 +#define C7D 703 +#define C7P 704 +#define C7Z 705 + +#define C8I 800 +#define C8Q 801 +#define C8X 802 /* ------------------------------- GNSS CODE -------------------------------- */ -#define GPS 0 -#define BDS 1 -#define CAL 2 -#define GLO 3 -#define SBAS 4 +#define GPS 03 +#define BDS 07 +#define GAL 11 +#define GLO 13 +#define SBAS 17 /* ------------------------------ FOR CALMOD.H ------------------------------ */ #define MAXRINEX 1000 #define DAYSEC 86400 - //卫星位置结构体 - typedef struct - { - double X[36]; - double Y[36]; - double Z[36]; - double deltat[36];//改正前的信号传播时间 - double delta_t[36];//改正后的信号传播时间 - double delta_clk[36]; - }pos_ts; +//satellite position & clock bias structure +typedef struct +{ + double X; + double Y; + double Z; + double deltat; + double delta_t; + double delta_clk; +}pos_ts; - //测站位置结构体 - typedef struct - { - double X; - double Y; - double Z; - double B; - double L; - double H; - double delta_TR; - }stations; - //经纬高结构体 - typedef struct - { - double B; - int B_d; - int B_m; - int B_s; - double L; - int L_d; - int L_m; - int L_s; - double H; - }blhs; - //东北天结构体 - typedef struct - { - double E; - double N; - double U; - }enus; - //高度方位角结构体 - typedef struct - { - double R; - double A; - double H; - }rahs; +//receiver station position & clock bias structure +typedef struct +{ + double X; + double Y; + double Z; + double B; + double L; + double H; + double delta_TR; +}stations; + +//longitude & latitude structure +typedef struct +{ + double B; + int B_d; + int B_m; + int B_s; + double L; + int L_d; + int L_m; + int L_s; + double H; +}blhs; + +//local Cartesian coordinates coordinate system structure +typedef struct +{ + double E; + double N; + double U; +}enus; + +//satellite azimuth angle structure +typedef struct +{ + double R; + double A; + double H; +}rahs; /* ------------------------------- FOR READ.H ------------------------------- */ -//导航头文件结构体 + +//header data of file of nav typedef struct nav_head { - double ver;//rinex 版本号 - char type[20];//读取的数据类型 - double ION_GPSA[4];//8个电离层参数 + double ver;//rinex + char type[20]; + double ION_GPSA[4]; double ION_GPSB[4]; - double ION_BDSA[4];//8个电离层参数 + double ION_BDSA[4]; double ION_BDSB[4]; - double ION_QZSA[4];//8个电离层参数 + double ION_QZSA[4]; double ION_QZSB[4]; - double ION_IRNA[4];//8个电离层参数 + double ION_IRNA[4]; double ION_IRNB[4]; double GPUT[4]; double GLUT[4]; @@ -159,76 +186,76 @@ typedef struct nav_head int leap; }nav_head, *pnav_head; -//导航数据结构体 +//body data of file of nav: GPS BeiDou Galileo typedef struct nav_body { - - int sPRN_GPS;//GPS卫星PRN - int sPRN_BDS;//GPS卫星PRN - int TOC_Y;//年 - int TOC_M;//月 - int TOC_D;//日 - int TOC_H;//时 - int TOC_Min;//分 - int TOC_Sec;//秒 - double sa0;//卫星钟差 - double sa1;//卫星钟偏 - double sa2;//卫星钟漂 + int sPRN_GPS; int sPRN_BDS; int sPRN_GAL; + int TOC_Y; + int TOC_M; + int TOC_D; + int TOC_H; + int TOC_Min; + int TOC_Sec; + double sa0; + double sa1; + double sa2; - double IODE;//数据、星历发布时间(数据期龄) - double Crs;//轨道半径的正弦调和改正项的振幅(单位:m) - double deltan;//卫星平均运动速率与计算值之差(rad/s) - double M0;//参考时间的平近点角(rad) + double IODE; double AODE; + double Crs; + double deltan; + double M0; - double Cuc;//维度幅角的余弦调和改正项的振幅(rad) - double e;//轨道偏心率 - double Cus;//轨道幅角的正弦调和改正项的振幅(rad) - double sqrtA;//长半轴平方根 + double Cuc; + double e; + double Cus; + double sqrtA; - double TOE;//星历的参考时刻(GPS周内秒) - double Cic;//轨道倾角的余弦调和改正项的振幅(rad) - double OMEGA;//参考时刻的升交点赤经 - double Cis;//维度倾角的正弦调和改正项的振幅(rad) + double TOE; + double Cic; + double OMEGA; + double Cis; - double i0;//参考时间的轨道倾角(rad) - double Crc;//轨道平径的余弦调和改正项的振幅(m) - double omega;//近地点角距 - double deltaomega;//升交点赤经变化率(rad) + double i0; + double Crc; + double omega; + double deltaomega; - double IDOT;//近地点角距(rad/s) - double L2code;//L2上的码 - double GPSweek;//GPS周,于TOE一同表示 - double L2Pflag;//L2,p码数据标记 + double IDOT; + double L2code; int Datasource; + double GPSweek; double BDTweek; double GALweek; + double L2Pflag; - double sACC;//卫星精度 - double sHEA;//卫星健康状态 - double TGD;//sec - double IODC;//钟的数据龄期 + double sACC; + double sHEA; + double TGD; double TGD1; double BGDa; + double IODC; double TGD2; double BGDb; - double TTN;//电文发送时间 - double fit;//拟合区间 - double spare1;//空 - double spare2;//空 + double TTN; + double fit; double AODC; + double spare1; + double spare2; }nav_body, *pnav_body; -//观测值头文件结构体 +//header data of file of obs typedef struct obs_head { - double ver;//RINEX文件版本号 - char type[30];//文件类型 - double apX;//测站近似位置XYZ(WGS84) + double ver; + char type[30]; + double apX; double apY; double apZ; - double ANTH;//天线高 - double ANTdeltaE;//天线中心对于测站标志在东方向上的偏移量 - double ANTdeltaN;//天线中心对于测站标志在北方向上的偏移量 - int obstypenum_gps;//GPS观测值类型数量 + double ANTH; + double ANTdeltaE; + double ANTdeltaN; + int obstypenum_gps; int obstypenum_bds; - int obscode_gps[36];//rinex3.04GPS观测值类型列表 - int obscode_bds[36]; - double interval;//观测值的历元间隔 - int f_y;//第一个观测记录的时刻 + int obstypenum_gal; + int obscode_gps[26]; + int obscode_bds[26]; + int obscode_gal[26]; + double interval; + int f_y; int f_m; int f_d; int f_h; @@ -240,35 +267,35 @@ typedef struct obs_head int l_h; int l_min; double l_sec; - char tsys[5];//时间系统 + char tsys[5];//time system }obs_head,*pobs_head; - -//观测值历元数据结构体 +//epoch data of file of obs typedef struct obs_epoch { - //观测历元时刻 int y; int m; int d; int h; int min; - double sec; - int p_flag;//历元标志 - int sat_num;//当前历元所观测到的卫星数量 - int gps_num;//当前历元所观测到的GPS卫星数量 - int bds_num;//当前历元所观测到的BDS卫星数量 - int sPRN[84];//当前历元所能观测到的卫星的PRN列表 - int sPRN_GPS[25]; - int sPRN_BDS[36]; + double sec;//epoch time + int p_flag;//epoch flag + int sat_num;//the total number of obsable sat + int gps_num;//the total gps sat + int bds_num;//the total bds sat + int gal_num;//the total galileo sat + int sPRN[84];//total sprn of obs sat + int sPRN_GPS[30]; + int sPRN_BDS[60]; + int sPRN_GAL[30]; }obs_epoch,*pobs_epoch; - -//观测值数据结构体 +//body data of file of obs typedef struct obs_body { - double obs_gps[100][24];//GPS观测值 - double obs_bds[100][24];//BDS观测值 + double obs_gps[30][26];//GPS obs data + double obs_bds[60][26];//BDS obs data + double obs_gal[30][26];//GALILEO obs data }obs_body,*pobs_body; /* -------------------------------------------------------------------------- */ diff --git a/headers/rahcal.h b/headers/rahcal.h index 38faf89..e90828f 100644 --- a/headers/rahcal.h +++ b/headers/rahcal.h @@ -12,14 +12,13 @@ typedef struct double A; double H; }rahcal; - /* -------------------------------------------------------------------------- */ -/// @brief 计算站心坐标系下的卫星高度方位角 -/// @param rahcal 自定义结构体变量用于传参 -/// @param E 站心坐标东 -/// @param N 站心坐标北 -/// @param U 站心坐标天 -/// @return 返回自定义结构体变量包含R, A, H成员 +/// @brief satellite azimuth angle calculation +/// @param rahcal parameter transfer structure +/// @param E east +/// @param N north +/// @param U up +/// @return return structure contain R, A, H members /* -------------------------------------------------------------------------- */ rahcal RAHCAL(rahcal rahcal, double E, double N, double U) diff --git a/headers/read.h b/headers/read.h index 3bd5315..f0bf23f 100644 --- a/headers/read.h +++ b/headers/read.h @@ -5,192 +5,191 @@ #include"public.h" #include"type2code.h" -/* ------------------------ 将字符串转换为浮点数,i起始位置,n输入多少个字符 ----------------------- */ + + static double strtonum(const char* buff, int i, int n) { double value = 0.0; char str[256] = { 0 }; char* p = str; - /************************************ - * 当出现以下三种情况报错,返回0.0 - * 1.起始位置<0 - * 2.读取字符串个数= 0; buff++) { - //三目操作符:D和d为文件中科学计数法部分,将其转换成二进制能读懂的e *p++ = ((*buff == 'D' || *buff == 'd') ? 'e' : *buff); } *p = '\0'; - //三目操作符,将str中存放的数以格式化读取到value中。 + return sscanf(str, "%lf", &value) == 1 ? value : 0.0; } +/* -------------------------- Read the file of obs -------------------------- */ /* -------------------------------------------------------------------------- */ -/* 读取O文件 +/// @brief get the total number of epoch of obs +/// @param fp_obs the file pointer of obs +/// @return epoch number /* -------------------------------------------------------------------------- */ - -/* -------------------------------- 获取O文件历元数 -------------------------------- */ extern int get_epochnum(FILE* fp_obs) { - int n = 0;//记录历元数 - int satnum = 0;//记录每个历元的卫星数 - char flag;//存放标志符号'>' - char buff[MAXRINEX];//存放读取的字符串 + int n = 0; + int satnum = 0; + char flag; + char buff[MAXRINEX]; while (fgets(buff, MAXRINEX, fp_obs)) - { - satnum = (int)strtonum(buff, 33, 2); + { satnum = (int)strtonum(buff, 33, 2); strncpy(&flag, buff + 0, 1); if (flag == '>') - { - n++; - } + { n++;} } return n; } - -/* -------------------------------- 读取O文件数据头 -------------------------------- */ +/* ------------------- Read the header data of file of obs ------------------ */ extern void read_o_h(FILE* fp_obs, pobs_head obs_h) { - obs_h->f_y = obs_h->f_m = obs_h->f_d = obs_h->f_h = obs_h->f_min = obs_h->f_sec = 0; - obs_h->l_y = obs_h->l_m = obs_h->l_d = obs_h->l_h = obs_h->l_min = obs_h->l_sec = 0; - obs_h->interval = 30; - memset(obs_h->obscode_gps, 0, sizeof(obs_h->obscode_gps)); - memset(obs_h->obscode_bds, 0, sizeof(obs_h->obscode_bds)); char buff[MAXRINEX] = { 0 }; char flag = { 0 }; char* lable = buff + 60; int i = 0; int j = 0; + + obs_h->interval = 30; + obs_h->f_y = obs_h->f_m = obs_h->f_d = obs_h->f_h = obs_h->f_min = obs_h->f_sec = 0; + obs_h->l_y = obs_h->l_m = obs_h->l_d = obs_h->l_h = obs_h->l_min = obs_h->l_sec = 0; + memset(obs_h->obscode_gps, 0, sizeof(obs_h->obscode_gps)); + memset(obs_h->obscode_bds, 0, sizeof(obs_h->obscode_bds)); + memset(obs_h->obscode_gal, 0, sizeof(obs_h->obscode_gal)); + while (fgets(buff, MAXRINEX, fp_obs)) - { - if (strstr(lable, "RINEX VERSION / TYPE")) - { - obs_h->ver = strtonum(buff, 0, 9); + { if (strstr(lable, "RINEX VERSION / TYPE")) + { obs_h->ver = strtonum(buff, 0, 9); strncpy(obs_h->type, buff + 20, 30); - continue; - } + continue;} + else if (strstr(lable, "APPROX POSITION XYZ")) - { - obs_h->apX = strtonum(buff, 0, 14); + { obs_h->apX = strtonum(buff, 0, 14); obs_h->apY = strtonum(buff, 0 + 14, 14); obs_h->apZ = strtonum(buff, 0 + 14 + 14, 14); - continue; - } + continue;} + else if (strstr(lable, "ANTENNA: DELTA H/E/N")) - { - obs_h->ANTH = strtonum(buff, 0, 14); + { obs_h->ANTH = strtonum(buff, 0, 14); obs_h->ANTdeltaE = strtonum(buff, 14, 14); obs_h->ANTdeltaN = strtonum(buff, 14 + 14, 14); - continue; - } + continue;} + else if (strstr(lable, "SYS / # / OBS TYPES")) - { - char flag = {0}; + { char flag = {0}; strncpy(&flag, buff + 0, 1); + if (flag == 'G') - { - obs_h->obstypenum_gps = (int)strtonum(buff, 4, 2); + { obs_h->obstypenum_gps = (int)strtonum(buff, 4, 2); + if (obs_h->obstypenum_gps <= 13) - { - for (i = 0; i < obs_h->obstypenum_gps; i++) - { - obs_h->obscode_gps[i + 1] = Type2Code(i, buff); - } - } + { for (i = 0; i < obs_h->obstypenum_gps; i++) + { obs_h->obscode_gps[i + 1] = Type2Code(i, buff);}} + else if (obs_h->obstypenum_gps > 13) - { - for (i = 0; i < 13; i++) - { - obs_h->obscode_gps[i] = Type2Code(i, buff); - } + { for (i = 0; i < 13; i++) + { obs_h->obscode_gps[i] = Type2Code(i, buff);} + fgets(buff, MAXRINEX, fp_obs); + for (i = 0; i < obs_h->obstypenum_gps - 13; i++) - { - obs_h->obscode_gps[i + 13] = Type2Code(i, buff); - } - } - continue; - } - if (flag == 'C') - { - obs_h->obstypenum_bds = (int)strtonum(buff, 4, 2); + { obs_h->obscode_gps[i + 13] = Type2Code(i, buff);}} + + continue;} + + else if (flag == 'C') + { obs_h->obstypenum_bds = (int)strtonum(buff, 4, 2); + if (obs_h->obstypenum_bds <= 13) - { - for (i = 0; i < obs_h->obstypenum_bds; i++) - { - obs_h->obscode_bds[i] = Type2Code(i, buff); - } - } + { for (i = 0; i < obs_h->obstypenum_bds; i++) + { obs_h->obscode_bds[i] = Type2Code(i, buff);}} + else if (obs_h->obstypenum_bds > 13) - { - for (i = 0; i < 13; i++) - { - obs_h->obscode_bds[i] = Type2Code(i, buff); - } + { for (i = 0; i < 13; i++) + { obs_h->obscode_bds[i] = Type2Code(i, buff);} + fgets(buff, MAXRINEX, fp_obs); + for (i = 0; i < obs_h->obstypenum_bds - 13; i++) - { - obs_h->obscode_bds[i + 13] = Type2Code(i, buff); - } - } - continue; - } - } + { obs_h->obscode_bds[i + 13] = Type2Code(i, buff);}} + continue;} + + else if (flag == 'E') + { obs_h->obstypenum_gal = (int)strtonum(buff, 4, 2); + + if (obs_h->obstypenum_gal <= 13) + { for (i = 0; i < obs_h->obstypenum_gal; i++) + {obs_h->obscode_gal[i] = Type2Code(i, buff);}} + + else if (obs_h->obstypenum_gal > 13) + { for (i = 0; i < 13; i++) + {obs_h->obscode_gal[i] = Type2Code(i, buff);} + + fgets(buff, MAXRINEX, fp_obs); + + for (i = 0; i < obs_h->obstypenum_gal - 13; i++) + {obs_h->obscode_gal[i + 13] = Type2Code(i, buff);}} + continue;} + + continue;} + else if (strstr(lable, "INTERVAL")) - { - obs_h->interval = strtonum(buff, 0, 10); - continue; - } + { obs_h->interval = strtonum(buff, 0, 10); + continue;} + else if (strstr(lable, "TIME OF FIRST OBS")) - { - obs_h->f_y = (int)strtonum(buff, 2, 4); + { obs_h->f_y = (int)strtonum(buff, 2, 4); obs_h->f_m = (int)strtonum(buff, 2 + 6, 4); obs_h->f_d = (int)strtonum(buff, 2 + 6 + 6, 4); obs_h->f_h = (int)strtonum(buff, 2 + 6 + 6 + 6, 4); obs_h->f_min = (int)strtonum(buff, 2 + 6 + 6 + 6 + 6, 4); obs_h->f_sec = strtonum(buff, 2 + 6 + 6 + 6 + 6 + 6, 9); strncpy(obs_h->tsys, buff + 6 + 6 + 6 + 6 + 6 + 18, 3); - continue; - } + continue;} + else if (strstr(lable, "TIME OF LAST OBS")) - { - obs_h->l_y = (int)strtonum(buff, 2, 4); + { obs_h->l_y = (int)strtonum(buff, 2, 4); obs_h->l_m = (int)strtonum(buff, 2 + 6, 4); obs_h->l_d = (int)strtonum(buff, 2 + 6 + 6, 4); obs_h->l_h = (int)strtonum(buff, 2 + 6 + 6 + 6, 4); obs_h->l_min = (int)strtonum(buff, 2 + 6 + 6 + 6 + 6, 4); obs_h->l_sec = strtonum(buff, 2 + 6 + 6 + 6 + 6 + 6, 9); - continue; - } + continue;} + else if (strstr(lable, "END OF HEADER")) - break; + { break;} } } - -/* -------------------------------- 读取O文件数据块 -------------------------------- */ -extern void read_o_b(FILE* fp_obs, pobs_epoch obs_e, pobs_body obs_b, int type_gps, int type_bds) +/* -------------------- Read the body data of file of obs ------------------- */ +extern void read_o_b(FILE* fp_obs, pobs_epoch obs_e, pobs_body obs_b, pobs_head obs_h) { - int n = 0;//历元数 + int n = 0; char buff[MAXRINEX] = { 0 }; - char flag = { 0 };//判断符号 + char flag = { 0 }; + while (fgets(buff, MAXRINEX, fp_obs)) { - int i = 0;//第i颗卫星 - int j_g = 0;//第j颗GPS卫星 - int k_g = 0;//第j颗GPS卫星的第k个观测值 - int j_c = 0;//第j颗BDS卫星 - int k_c = 0;//第j颗BDS卫星的第k个观测值 + int i = 0; + int j_g = 0; + int k_g = 0; + int j_c = 0; + int k_c = 0; + int j_ga = 0; + int k_ga = 0; obs_e[n].gps_num = 0; obs_e[n].bds_num = 0; + obs_e[n].gal_num = 0; - //按照格式将历元参考时间依次存入 - //除秒以外,均转换成整型 obs_e[n].y = (int)strtonum(buff, 2, 4); obs_e[n].m = (int)strtonum(buff, 7, 2); obs_e[n].d = (int)strtonum(buff, 10, 2); @@ -198,99 +197,93 @@ extern void read_o_b(FILE* fp_obs, pobs_epoch obs_e, pobs_body obs_b, int type_g obs_e[n].min = (int)strtonum(buff, 16, 2); obs_e[n].sec = strtonum(buff, 19, 10); obs_e[n].p_flag = (int)strtonum(buff, 31, 1); - //输入卫星数 obs_e[n].sat_num = strtonum(buff, 33, 3); strncpy(&flag, buff + 0, 1); memset(obs_e[n].sPRN, 0, sizeof(obs_e[n].sPRN)); memset(obs_e[n].sPRN_GPS, 0, sizeof(obs_e[n].sPRN_GPS)); memset(obs_e[n].sPRN_BDS, 0, sizeof(obs_e[n].sPRN_BDS)); + memset(obs_e[n].sPRN_GAL, 0, sizeof(obs_e[n].sPRN_GAL)); memset(obs_b[n].obs_gps, 0, sizeof(obs_b[n].obs_gps)); memset(obs_b[n].obs_bds, 0, sizeof(obs_b[n].obs_bds)); + memset(obs_b[n].obs_gal, 0, sizeof(obs_b[n].obs_gal)); for (i = 0; i < obs_e[n].sat_num; i++) { - //判断是否为GPS卫星 - if (flag == 'G')//获取flag标识,判断GPS卫星为真,读取该卫星PRN号 - { - obs_e[n].sPRN[i] = strtonum(buff, 1, 2);//将卫星编号存储到第n个历元中,第i个PRN位置 - obs_e[n].sPRN_GPS[j_g] = obs_e[n].sPRN[i];//将GPS卫星编号与总观测卫星号关联 - for (k_g = 0; k_g < type_gps; k_g++) - { - obs_b[n].obs_gps[j_g][k_g] = strtonum(buff, 3 + 16 * k_g, 14); - } + if (flag == 'G') + { obs_e[n].sPRN[i] = strtonum(buff, 1, 2); + obs_e[n].sPRN_GPS[j_g] = obs_e[n].sPRN[i]; + + for (k_g = 0; k_g < obs_h->obstypenum_gps; k_g++) + { obs_b[n].obs_gps[j_g][k_g] = strtonum(buff, 3 + 16 * k_g, 14);} + obs_e[n].gps_num++; j_g++; fgets(buff, MAXRINEX, fp_obs); - strncpy(&flag, buff + 0, 1); - } + strncpy(&flag, buff + 0, 1);} - else if (flag != 'G')//获取flag标识,判断GPS卫星为否 - { - //判断是否为BDS卫星 - if (flag == 'C')//获取flag标识,判断BDS卫星为真,读取该卫星PRN号 - { - obs_e[n].sPRN[i] = strtonum(buff, 1, 2);//将卫星编号存储到第n个历元中,第i个PRN位置 - obs_e[n].sPRN_BDS[j_c] = obs_e[n].sPRN[i];//将BDS卫星编号与总观测卫星号关联 - for (k_c = 0; k_c < type_bds; k_c++) - { - obs_b[n].obs_bds[j_c][k_c] = strtonum(buff, 3 + 16 * k_c, 14); - } - obs_e[n].bds_num++; j_c++; - fgets(buff, MAXRINEX, fp_obs); - strncpy(&flag, buff + 0, 1); - } + else if (flag == 'C') + { obs_e[n].sPRN[i] = strtonum(buff, 1, 2); + obs_e[n].sPRN_BDS[j_c] = obs_e[n].sPRN[i]; - else if (flag != 'C')//获取flag标识,判断BDS卫星为真,读取该卫星PRN号 - { - fgets(buff, MAXRINEX, fp_obs); - strncpy(&flag, buff + 0, 1); - } + for (k_c = 0; k_c < obs_h->obstypenum_bds; k_c++) + { obs_b[n].obs_bds[j_c][k_c] = strtonum(buff, 3 + 16 * k_c, 14);} + + obs_e[n].bds_num++; j_c++; + fgets(buff, MAXRINEX, fp_obs); + strncpy(&flag, buff + 0, 1); + } + + else if (flag == 'E') + { obs_e[n].sPRN[i] = strtonum(buff, 1, 2); + obs_e[n].sPRN_GAL[j_ga] = obs_e[n].sPRN[i]; + + for (k_ga = 0; k_ga < obs_h->obstypenum_gal; k_ga++) + { obs_b[n].obs_gal[j_ga][k_ga] = strtonum(buff, 3 + 16 * k_ga, 14);} + + obs_e[n].gal_num++; j_ga++; + fgets(buff, MAXRINEX, fp_obs); + strncpy(&flag, buff + 0, 1); + } + + else if (flag != 'G'&& flag != 'C'&& flag != 'E') + { + fgets(buff, MAXRINEX, fp_obs); + strncpy(&flag, buff + 0, 1); } } n++; } } - +/* -------------------------- Read the file of nav -------------------------- */ /* -------------------------------------------------------------------------- */ -/* 读取N文件 +/// @brief get the total number of satellite boardcast data of nav file +/// @param fp_nav the file pointer of nav file +/// @return total number of satellite boardcast data /* -------------------------------------------------------------------------- */ - -/* ---------------------- 获取文件数据块行数,从END OF HEADER后开始起算 --------------------- */ -int getsatnum(FILE* fp_nav) +static int getsatnum(FILE* fp_nav) { int satnum = 0; int flag = 0; - char buff[MAXRINEX];//用来存放读取到的字符串 + char buff[MAXRINEX]; char satvar; char* lable = buff + 60; - //fgets函数,读取一行,当读取结束后返回NULL指针,格式如下: - //wchar_t * fgets ( wchar_t * str, int num, FILE * stream ); + while (fgets(buff, MAXRINEX, fp_nav)) - { - if (strstr(lable, "END OF HEADER")) - { - flag = 1; - } + { if (strstr(lable, "END OF HEADER")) + { flag = 1;} + if (flag == 1) - { - while (fgets(buff, MAXRINEX, fp_nav)) - { - strncpy(&satvar, buff + 0, 1); + { while (fgets(buff, MAXRINEX, fp_nav)) + { strncpy(&satvar, buff + 0, 1); if (satvar == 'G' || satvar == 'E' || satvar == 'R' || satvar == 'S' || satvar == 'C' || satvar == 'I' || satvar == 'J') - { - satnum++; - } + { satnum++;} + else - { - continue; - } - } - } - } + { continue;}}}} + return satnum; } - -/* -------------------------------- 读取N文件数据头 -------------------------------- */ +/* ------------------- Read the header data of file of nav ------------------ */ void read_n_h(FILE* fp_nav, pnav_head nav_h) { char buff[MAXRINEX] = { 0 }; @@ -300,88 +293,79 @@ void read_n_h(FILE* fp_nav, pnav_head nav_h) while (fgets(buff, MAXRINEX, fp_nav)) { if (strstr(lable, "RINEX VERSION / TYPE")) - { - nav_h->ver = strtonum(buff, 0, 9); + { 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[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[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[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[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[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[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); - } - else if (strstr(lable, "END OF HEADER"))//头文件读取结束 + { nav_h->leap = (int)strtonum(buff, 4, 2);} + + else if (strstr(lable, "END OF HEADER")) break; } } - -/* -------------------------------- 读取N文件数据块 -------------------------------- */ +/* -------------------- Read the body data of file of nav ------------------- */ void read_n_b(FILE* fp_nav, pnav_body nav_b) { - int i_g = 0;//第i_g个卫星数据 + int i_g = 0; char buff[MAXRINEX] = { 0 }; - char flag = { 0 };//判断符号 + char flag = { 0 }; while (fgets(buff, MAXRINEX, fp_nav)) { - int j_g = 0;//数据块的第j_g行数据 - int j_c = 0;//数据块的第j_c行数据 + int j_g = 0; + int j_c = 0; + int j_ga = 0; + int j_gl = 0; strncpy(&flag, buff + 0, 1); if(flag == 'G') - { - for (j_g = 0; j_g < 8; j_g++)//读取总计第i_g颗 GPS卫星广播星历("总共包含8行数据") 数据块的第j_g行数据 - { - switch (j_g) + { for (j_g = 0; j_g < 8; j_g++) + { switch (j_g) { case 0: - nav_b[i_g].sPRN_BDS = 0; + nav_b[i_g].sPRN_BDS = -1; + nav_b[i_g].sPRN_GAL = -1; nav_b[i_g].sPRN_GPS = (int)strtonum(buff, 1, 2); nav_b[i_g].TOC_Y = (int)strtonum(buff, 4, 4); nav_b[i_g].TOC_M = (int)strtonum(buff, 9, 2); @@ -439,22 +423,20 @@ void read_n_b(FILE* fp_nav, pnav_body nav_b) case 7: nav_b[i_g].TTN = strtonum(buff, 4, 19); nav_b[i_g].fit = strtonum(buff, 4 + 19, 19); - nav_b[i_g].spare1 = strtonum(buff, 4 + 19 + 19, 19); - nav_b[i_g].spare2 = strtonum(buff, 4 + 19 + 19 + 19, 19); + //nav_b[i_g].spare1 = strtonum(buff, 4 + 19 + 19, 19); + //nav_b[i_g].spare2 = strtonum(buff, 4 + 19 + 19 + 19, 19); break; - } - } + }} i_g++; - continue; - } - else if(flag == 'C') - { - for (j_c = 0; j_c < 8; j_c++)//读取总计第i_g颗 BDS卫星广播星历("总共包含8行数据") 数据块的第j_c行数据 - { - switch (j_c) + continue;} + + if(flag == 'C') + { for (j_c = 0; j_c < 8; j_c++) + { switch (j_c) { case 0: - nav_b[i_g].sPRN_GPS = 0; + nav_b[i_g].sPRN_GPS = -1; + nav_b[i_g].sPRN_GAL = -1; nav_b[i_g].sPRN_BDS = (int)strtonum(buff, 1, 2); nav_b[i_g].TOC_Y = (int)strtonum(buff, 4, 4); nav_b[i_g].TOC_M = (int)strtonum(buff, 9, 2); @@ -467,6 +449,77 @@ void read_n_b(FILE* fp_nav, pnav_body nav_b) nav_b[i_g].sa2 = strtonum(buff, 23 + 19 + 19, 19); fgets(buff, MAXRINEX, fp_nav); break; + case 1: + nav_b[i_g].AODE = strtonum(buff, 4, 19); + nav_b[i_g].Crs = strtonum(buff, 4 + 19, 19); + nav_b[i_g].deltan = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].M0 = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 2: + nav_b[i_g].Cuc = strtonum(buff, 4, 19); + nav_b[i_g].e = strtonum(buff, 4 + 19, 19); + nav_b[i_g].Cus = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].sqrtA = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 3: + nav_b[i_g].TOE = strtonum(buff, 4, 19); + nav_b[i_g].Cic = strtonum(buff, 4 + 19, 19); + nav_b[i_g].OMEGA = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].Cis = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 4: + nav_b[i_g].i0 = strtonum(buff, 4, 19); + nav_b[i_g].Crc = strtonum(buff, 4 + 19, 19); + nav_b[i_g].omega = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].deltaomega = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 5: + nav_b[i_g].IDOT = strtonum(buff, 4, 19); + //nav_b[i_g].L2code = strtonum(buff, 4 + 19, 19); + nav_b[i_g].BDTweek = strtonum(buff, 4 + 19 + 19, 19); + //nav_b[i_g].L2Pflag = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 6: + nav_b[i_g].sACC = strtonum(buff, 4, 19); + nav_b[i_g].sHEA = strtonum(buff, 4 + 19, 19); + nav_b[i_g].TGD1 = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].TGD2 = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 7: + //nav_b[i_g].TTN = strtonum(buff, 4, 19); + nav_b[i_g].AODC = strtonum(buff, 4 + 19, 19); + //nav_b[i_g].spare1 = strtonum(buff, 4 + 19 + 19, 19); + //nav_b[i_g].spare2 = strtonum(buff, 4 + 19 + 19 + 19, 19); + break; + }} + i_g++; + continue;} + + if (flag == 'E') + { for (j_ga = 0; j_ga < 8; j_ga++) + { switch (j_ga) + { + case 0: + nav_b[i_g].sPRN_BDS = -1; + nav_b[i_g].sPRN_GPS = -1; + nav_b[i_g].sPRN_GAL = (int)strtonum(buff, 1, 2); + nav_b[i_g].TOC_Y = (int)strtonum(buff, 4, 4); + nav_b[i_g].TOC_M = (int)strtonum(buff, 9, 2); + nav_b[i_g].TOC_D = (int)strtonum(buff, 12, 2); + nav_b[i_g].TOC_H = (int)strtonum(buff, 15, 2); + nav_b[i_g].TOC_Min = (int)strtonum(buff, 18, 2); + nav_b[i_g].TOC_Sec = strtonum(buff, 21, 2); + nav_b[i_g].sa0 = strtonum(buff, 23, 19); + nav_b[i_g].sa1 = strtonum(buff, 23 + 19, 19); + nav_b[i_g].sa2 = strtonum(buff, 23 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; case 1: nav_b[i_g].IODE = strtonum(buff, 4, 19); nav_b[i_g].Crs = strtonum(buff, 4 + 19, 19); @@ -497,31 +550,28 @@ void read_n_b(FILE* fp_nav, pnav_body nav_b) break; case 5: nav_b[i_g].IDOT = strtonum(buff, 4, 19); - nav_b[i_g].L2code = strtonum(buff, 4 + 19, 19); - nav_b[i_g].GPSweek = strtonum(buff, 4 + 19 + 19, 19); - nav_b[i_g].L2Pflag = strtonum(buff, 4 + 19 + 19 + 19, 19); + //nav_b[i_g].L2code = strtonum(buff, 4 + 19, 19); + nav_b[i_g].GALweek = strtonum(buff, 4 + 19 + 19, 19); + //nav_b[i_g].L2Pflag = strtonum(buff, 4 + 19 + 19 + 19, 19); fgets(buff, MAXRINEX, fp_nav); break; case 6: nav_b[i_g].sACC = strtonum(buff, 4, 19); nav_b[i_g].sHEA = strtonum(buff, 4 + 19, 19); - nav_b[i_g].TGD = strtonum(buff, 4 + 19 + 19, 19); - nav_b[i_g].IODC = strtonum(buff, 4 + 19 + 19 + 19, 19); + nav_b[i_g].BGDa = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].BGDb = strtonum(buff, 4 + 19 + 19 + 19, 19); fgets(buff, MAXRINEX, fp_nav); break; case 7: - nav_b[i_g].TTN = strtonum(buff, 4, 19); - nav_b[i_g].fit = strtonum(buff, 4 + 19, 19); - nav_b[i_g].spare1 = strtonum(buff, 4 + 19 + 19, 19); - nav_b[i_g].spare2 = strtonum(buff, 4 + 19 + 19 + 19, 19); + //nav_b[i_g].TTN = strtonum(buff, 4, 19); + //nav_b[i_g].fit = strtonum(buff, 4 + 19, 19); + //nav_b[i_g].spare1 = strtonum(buff, 4 + 19 + 19, 19); + //nav_b[i_g].spare2 = strtonum(buff, 4 + 19 + 19 + 19, 19); break; - } - } + }} i_g++; - continue; - } + continue;} } } -/* -------------------------------------------------------------------------- */ - +/* ------------------------------ END OF READ_H ----------------------------- */ #endif \ No newline at end of file diff --git a/headers/select_epo.h b/headers/select_epo.h index 10d1a4e..4679fa0 100644 --- a/headers/select_epo.h +++ b/headers/select_epo.h @@ -4,37 +4,55 @@ #include #include"public.h" - /* -------------------------------------------------------------------------- */ -/// @brief 寻找与观测历元最近的卫星广播历元 -/// @param SecofWeek 计算得到的观测历元的周内秒 -/// @param sPRN 需要匹配的该历元卫星号 -/// @param nav_b 导航文件数据块结构体,与卫星号匹配 -/// @param satnum 广播星历卫星数量 -/// @param syscode 卫星系统代码,详情见PPUBLIC.H -/// @return 返回最佳历元的绝对历元序号 +/// @brief find the nearest obs epoch with boardcast +/// @param SecofWeek second of week of obs epoch time +/// @param sPRN the satellite PRN which need to match +/// @param nav_b nav data file structure +/// @param satnum total number of boardcast satellite +/// @param syscode GNSS code, more on PPUBLIC.H +/// @return Return the absolute epoch number of the best epoch +/// When there is no matching satellite number, the function returns -1 /* -------------------------------------------------------------------------- */ extern int select_epoch(double SecofWeek, int sPRN, pnav_body nav_b, int satnum, int syscode) { - int best_epoch = 0; - double min = 10000;//初始化最小值 + int best_epoch = -1; + double min = 10000;//Initialize the minimum value double Min; - if (syscode == GPS) - { - for (int i = 0; i < satnum; i++) - { - if (sPRN == nav_b[i].sPRN_GPS) - { - Min = fabs(SecofWeek - nav_b[i].TOE); + if (syscode == GPS)//Be judged as GPS + { for (int i = 0; i < satnum; i++) + { if (sPRN == nav_b[i].sPRN_GPS) + { Min = fabs(SecofWeek - nav_b[i].TOE); if (Min <= min) { best_epoch = i; min = Min; - } - } - } - } + }}} + return best_epoch;} + + if (syscode == BDS)//Be judged as BeiDou + { for (int i = 0; i < satnum; i++) + { if (sPRN == nav_b[i].sPRN_BDS) + { Min = fabs(SecofWeek - nav_b[i].TOE); + if (Min <= min) + { + best_epoch = i; + min = Min; + }}} + return best_epoch;} + + if (syscode == GAL)//Be judged as Galileo + {for (int i = 0; i < satnum; i++) + { if (sPRN == nav_b[i].sPRN_GAL) + { Min = fabs(SecofWeek - nav_b[i].TOE); + if (Min <= min) + { + best_epoch = i; + min = Min; + }}} + return best_epoch;} + return best_epoch; } - +/* --------------------------- END OF SELECT_EPO_H -------------------------- */ #endif \ No newline at end of file diff --git a/headers/type2code.h b/headers/type2code.h index ce3221d..884beda 100644 --- a/headers/type2code.h +++ b/headers/type2code.h @@ -5,12 +5,11 @@ #include #include"public.h" - /* -------------------------------------------------------------------------- */ -/// @brief 将观测值类型转换为PUBLIC.H中定义的数字代码 -/// @param i 读取循环中传入的循环次数 -/// @param buff 传入的观测值类型 -/// @return 返回观测值代码 +/// @brief converts the observation type to the numeric code defined in PUBLIC.H +/// @param i reads the number of incoming loops in the loop +/// @param buff type of incoming observation +/// @return Returns the obs code /* -------------------------------------------------------------------------- */ int Type2Code(int i, char buff[1000]) { @@ -18,41 +17,91 @@ int Type2Code(int i, char buff[1000]) char code_contrast[4]; char code_original[4]; - for(int j = 0; j < 19; j++) - { - memset(code_contrast,0,sizeof(code_contrast)); + const char L1codeindex[] = "C1CC1SC1LC1XC1PC1WC1YC1MC1AC1BC1Z";//obs type of different frequency + const char L2codeindex[] = "C2CC2SC2LC2XC2PC2WC2YC2MC2IC2QC2X"; + const char L5codeindex[] = "C5IC5QC5X"; + const char L6codeindex[] = "C6AC6BC6CC6XC6Z"; + const char L7codeindex[] = "C7IC7QC7XC7DC7PC7Z"; + const char L8codeindex[] = "C8JC8QC8X"; + + for(int j = 0; j < (strlen(L1codeindex)/3); j++) + { memset(code_contrast,0,sizeof(code_contrast)); memset(code_original,0,sizeof(code_original)); - const char codeindex[]="C1CC1SC1LC1XC1PC1WC1YC1M" - "C2CC2SC2LC2XC2PC2WC2YC2M" - "C5IC5QC5X"; - strncpy(code_contrast, codeindex + 0 + j * 3 , 3); + strncpy(code_contrast, L1codeindex + 0 + j * 3 , 3); strncpy(code_original, buff + 7 + 4 * i , 3); if(strcmp(code_contrast,code_original) == 0) - { - code_return = j + 1; - break; - } - } + { code_return = j + 100; + return code_return; + break;}} + + for (int j = 0; j < (strlen(L2codeindex) / 3); j++) + { memset(code_contrast, 0, sizeof(code_contrast)); + memset(code_original, 0, sizeof(code_original)); + strncpy(code_contrast, L2codeindex + 0 + j * 3, 3); + strncpy(code_original, buff + 7 + 4 * i, 3); + if (strcmp(code_contrast, code_original) == 0) + { code_return = j + 200; + return code_return; + break;}} + + for (int j = 0; j < (strlen(L5codeindex) / 3); j++) + { memset(code_contrast, 0, sizeof(code_contrast)); + memset(code_original, 0, sizeof(code_original)); + strncpy(code_contrast, L5codeindex + 0 + j * 3, 3); + strncpy(code_original, buff + 7 + 4 * i, 3); + if (strcmp(code_contrast, code_original) == 0) + { code_return = j + 500; + return code_return; + break;}} + + for (int j = 0; j < (strlen(L6codeindex) / 3); j++) + { memset(code_contrast, 0, sizeof(code_contrast)); + memset(code_original, 0, sizeof(code_original)); + strncpy(code_contrast, L6codeindex + 0 + j * 3, 3); + strncpy(code_original, buff + 7 + 4 * i, 3); + if (strcmp(code_contrast, code_original) == 0) + { code_return = j + 600; + return code_return; + break;}} + + for (int j = 0; j < (strlen(L7codeindex) / 3); j++) + { memset(code_contrast, 0, sizeof(code_contrast)); + memset(code_original, 0, sizeof(code_original)); + strncpy(code_contrast, L7codeindex + 0 + j * 3, 3); + strncpy(code_original, buff + 7 + 4 * i, 3); + if (strcmp(code_contrast, code_original) == 0) + { code_return = j + 700; + return code_return; + break;}} + + for (int j = 0; j < (strlen(L8codeindex) / 3); j++) + { memset(code_contrast, 0, sizeof(code_contrast)); + memset(code_original, 0, sizeof(code_original)); + strncpy(code_contrast, L8codeindex + 0 + j * 3, 3); + strncpy(code_original, buff + 7 + 4 * i, 3); + if (strcmp(code_contrast, code_original) == 0) + { code_return = j + 800; + return code_return; + break;}} + return code_return; } /* -------------------------------------------------------------------------- */ -/// @brief 将读取的观测值类型匹配类型代码存储数组 -/// @param typecode 希望匹配的观测值 -/// @param typenum 观测值类型总数量 -/// @param typearr 类型代码存储数组 -/// @return 返回对应的观测值类型代码的数组位置 +/// @brief the type of the obs value read matches the type code stored in an array +/// @param typecode obs type that you want to match +/// @param typenum the total number of obs types +/// @param typearr type codes store arrays +/// @return returns the array position of the corresponding obs type code /* -------------------------------------------------------------------------- */ int Code2Type(int typecode, int typenum, int typearr[36]) { int pos; for (pos = 0; pos < typenum; pos++) - { - if (typearr[pos] == typecode) - { - break; - } - } + { if (typearr[pos] == typecode) + { break; + return pos;}} + return pos; } diff --git a/headers/xyz2blh.h b/headers/xyz2blh.h index 2fcbf76..90c9d48 100644 --- a/headers/xyz2blh.h +++ b/headers/xyz2blh.h @@ -12,16 +12,15 @@ typedef struct double L; double H; }xyz2blh; - /* -------------------------------------------------------------------------- */ -/// @brief 将ECEF地心地固坐标转换为经纬高坐标 -/// @param xyz2blh 自定义结构体类型,用来传参 -/// @param X ECEF的X坐标 -/// @param Y ECEF的Y坐标 -/// @param Z ECEF的Z坐标 -/// @param a 椭球的长半轴 -/// @param e2 椭球的第一偏心率平方 -/// @return 返回自定义结构体类型包含B,L,H成员 +/// @brief Convert ECEF geostationary coordinates to BLH coordinates +/// @param xyz2blh parameter transfer structure +/// @param X X coordinates of ECEF +/// @param Y Y coordinates of ECEF +/// @param Z Z coordinates of ECEF +/// @param a major semiaxis of WGS-84 ellipsoid +/// @param e2 the square of the first eccentricity of WGS-84 ellipsoid +/// @return return type of structure contain B, L, H members /* -------------------------------------------------------------------------- */ xyz2blh XYZ2BLH(xyz2blh xyz2blh, double X, double Y, double Z) @@ -30,15 +29,13 @@ xyz2blh XYZ2BLH(xyz2blh xyz2blh, 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)); - //经度直接求解 xyz2blh.L = atan2(Y, X); - //迭代求大地维度和大地高 N = a; H = R1 - a; B = atan2(Z * (N + H), R0 * (N * (1 - e2) + H)); do { - deltaH = N;//判断收敛所用 + deltaH = N; deltaB = B; N = a / sqrt(1 - e2 * pow(sin(B), 2)); H = R0 / cos(B) - N; diff --git a/plot/Mainui.py b/plot/Mainui.py index c7f9ab0..2756599 100644 --- a/plot/Mainui.py +++ b/plot/Mainui.py @@ -16,29 +16,69 @@ import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import ( FigureCanvasTkAgg, NavigationToolbar2Tk) -enucolor = ["#0080FF","#0080FF","#0080FF"] -enulinew = [ "2.0", "2.0", "2.0"] +# 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 + +#Sat system register part +satsysdict = {0: "G", 1:"R", 2:"C", 3:"E", 4:"S"} +satellite_system = 0 + def Colorchoose(i, label, mode): + #Brief # choice to change the color of draw + #Param # i : only for mode 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 + #Return# none global enucolor if mode == 0: enucolor = ["#0080FF", "#0080FF", "#0080FF"] + satncolor[0] = "#0080FF" label.config(bg=enucolor[0]) elif mode == 1: colorvalue = tk.colorchooser.askcolor() - enucolor[i] = str(colorvalue[1]) - label.config(bg=enucolor[i]) + enucolormid[i] = str(colorvalue[1]) + label.config(bg=str(colorvalue[1])) + 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() + satncolormid[0] = str(colorvalue[1]) + label.config(bg=str(colorvalue[1])) 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 = ["2.0", "2.0", "2.0"] - entry0.delete(0, "end") - entry0.insert(0, enulinew[0]) - entry1.delete(0, "end") - entry1.insert(0, enulinew[1]) - entry2.delete(0, "end") - entry2.insert(0, enulinew[2]) + 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 @@ -53,13 +93,10 @@ def Linewchoose(entry0, entry1, entry2, mode): float(entry2.get()) <= 0 ): while not messagebox.showerror("ERROR !", "The line width value is invalid !"): break - enulinew = ["2.0", "2.0", "2.0"] - entry0.delete(0, "end") - entry0.insert(0, enulinew[0]) - entry1.delete(0, "end") - entry1.insert(0, enulinew[1]) - entry2.delete(0, "end") - entry2.insert(0, enulinew[2]) + 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 @@ -68,116 +105,297 @@ def Linewchoose(entry0, entry1, entry2, mode): "affecting the mapping.\n" "Are you sure to continue ?") if msg == False: - enulinew = ["2.0", "2.0", "2.0"] - entry0.delete(0, "end") - entry0.insert(0, enulinew[0]) - entry1.delete(0, "end") - entry1.insert(0, enulinew[1]) - entry2.delete(0, "end") - entry2.insert(0, enulinew[2]) + enulinew = ["0.80", "0.80", "0.80"] + entry0.set(enulinew[0]) + entry1.set(enulinew[1]) + entry2.set(enulinew[2]) pass elif msg == True: enulinew[0] = entry0.get() enulinew[1] = entry1.get() enulinew[2] = entry2.get() +def Calcu_confirm(v, cboxi, cboxt): + #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 satellite_system + + ioncorstate = Ion_and_Trocbox(cboxi, 0) + trocorstate = Ion_and_Trocbox(cboxt, 1) + satellite_system = Satsys_button(v) + + print(ioncorstate,trocorstate,satellite_system) + +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 = {0: "0", 1: "1", 2: "2", 3: "3", 4: "4"} + return int(Systemdict.get(v.get())) + +def Ion_and_Trocbox(cbox, cortype): + #Brief # get the value of combo box + #Param # cortype: correction type of + # ion == 0 & + # tro == 1 + #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 + def Opt_windows(): opt = tk.Toplevel(root) opt.title("Options") opt.geometry('350x200+250+200') - opt.minsize(350,230) - opt.maxsize(350,230) + opt.minsize(320,250) + opt.maxsize(320,250) global icon_img2 - icon_img2 = (b'AAABAAEAICAAAAAAIACoEAAAFgAAA' - b'CgAAAAgAAAAQAAAAAEAIAAAAAAAABAAADjsAAA47AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAACQAAABIAAAASAAAACQAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAABwAAAJAAAADqAAAA7gAAAO4AAADqAAAAkQAAAAcAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAACQAAAA/wAAAPwAAAD/AAAA/wAAAPwAAAD/AAAAkAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAADAAAAAQAAAAEAAAAAAAAACwAAAOMAAAD/AAAA/AAAAP4AAAD+AAAA/AAAAP8AAADjAAAACgAAAAAAAAABAAAAAQAAAAMAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAABAAAABQAAAAAAAAATAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD+AAAA/wAAAO0AAAATAAAAAAAAAAUAAAABAAAAAAAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABEAAABTAAAAUQAAAA8AAAAAAAAAAAAAAEQAAAD/AAAA/gAAAP8AAAD/AAAA/wAAAP8AAAD+AAAA/wAAAEQAAAAAAAAAAAAAAA8AAABRAAAAUwAAABEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAwAAAA5QAAAP8AAAD/AAAA4QAAAHYAAAB2AAAA6QAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA6QAAAHYAAAB1AAAA4QAAAP8AAAD/AAAA5QAAADAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAMoAAAD/AAAA+gAAAPwAAAD/AAAA/wAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/gAAAP4AAAD/AAAA/wAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/AAAAPoAAAD/AAAAywAAAAMAAAAAAAAAAQAAAAAAAAAAAAAAAwAAAAAAAABrAAAA/wAAAPoAAAD/AAAA/wAAAP0AAAD7AAAA+wAAAP4AAAD/AAAA/AAAAP0AAAD/AAAA/wAAAP0AAAD8AAAA/wAAAP4AAAD7AAAA+wAAAP0AAAD/AAAA/wAAAPoAAAD/AAAAawAAAAAAAAADAAAAAAAAAAEAAAAAAAAAAwAAANUAAAD/AAAA/QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAAD/AAAA/wAAAPIAAADyAAAA/wAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/QAAAP8AAADVAAAAAwAAAAAAAAABAAAAAQAAAAAAAAATAAAA7AAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA/wAAAK8AAAA8AAAAFQAAABUAAAA8AAAArgAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD+AAAA/wAAAOwAAAATAAAAAAAAAAEAAAAAAAAAAQAAAAAAAADBAAAA/wAAAPoAAAD/AAAA/wAAAP8AAAD/AAAA/QAAAP8AAAB3AAAAAAAAAAIAAAAAAAAAAAAAAAIAAAAAAAAAdwAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAPoAAAD/AAAAwQAAAAAAAAABAAAAAAAAAAAAAAACAAAAAAAAADEAAADmAAAA/wAAAP0AAAD/AAAA/wAAAPwAAAD/AAAAqwAAAAAAAAAEAAAAAwAAAAEAAAABAAAABAAAAAQAAAAAAAAArAAAAP8AAAD8AAAA/wAAAP8AAAD9AAAA/wAAAOYAAAAwAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAABAAAAAAAAAA0AAACuAAAA/wAAAP0AAAD/AAAA/QAAAP8AAABCAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAABCAAAA/wAAAP0AAAD/AAAA/QAAAP8AAACvAAAADQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAACAAAAD4AAAA/wAAAP0AAAD/AAAA8gAAABgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABgAAADyAAAA/wAAAP0AAAD/AAAA+AAAACAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAPgAAAD/AAAA/QAAAP8AAADyAAAAGAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAGAAAAPIAAAD/AAAA/QAAAP8AAAD4AAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAA0AAACuAAAA/wAAAP0AAAD/AAAA/QAAAP8AAABCAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAABCAAAA/wAAAP0AAAD/AAAA/QAAAP8AAACuAAAADQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAxAAAA5gAAAP8AAAD9AAAA/wAAAP8AAAD8AAAA/wAAAKsAAAAAAAAABAAAAAMAAAABAAAAAQAAAAMAAAAEAAAAAAAAAKsAAAD/AAAA/AAAAP8AAAD/AAAA/QAAAP8AAADmAAAAMAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAMEAAAD/AAAA+gAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA/wAAAHcAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAB3AAAA/wAAAP0AAAD/AAAA/wAAAP8AAAD/AAAA+gAAAP8AAADBAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAATAAAA7AAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA/wAAAK4AAAA8AAAAFQAAABUAAAA8AAAArgAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD+AAAA/wAAAOwAAAATAAAAAAAAAAEAAAABAAAAAAAAAAMAAADWAAAA/wAAAP0AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA/wAAAP8AAADyAAAA8gAAAP8AAAD/AAAA/QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAAD/AAAA1QAAAAMAAAAAAAAAAQAAAAAAAAADAAAAAAAAAGsAAAD/AAAA+gAAAP8AAAD/AAAA/QAAAPsAAAD7AAAA/gAAAP8AAAD8AAAA/QAAAP8AAAD/AAAA/QAAAPwAAAD/AAAA/gAAAPsAAAD7AAAA/QAAAP8AAAD/AAAA+gAAAP8AAABrAAAAAAAAAAMAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAMsAAAD/AAAA+gAAAPwAAAD/AAAA/wAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/gAAAP4AAAD/AAAA/wAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/AAAAPoAAAD/AAAAywAAAAMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAMQAAAOYAAAD/AAAA/wAAAOEAAAB2AAAAdgAAAOkAAAD/AAAA/gAAAP8AAAD/AAAA/wAAAP8AAAD+AAAA/wAAAOkAAAB2AAAAdgAAAOEAAAD/AAAA/wAAAOYAAAAxAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEQAAAFQAAABRAAAADwAAAAAAAAAAAAAARAAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAARAAAAAAAAAAAAAAADwAAAFEAAABUAAAAEQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAABAAAABQAAAAAAAAATAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD+AAAA/wAAAO0AAAATAAAAAAAAAAUAAAABAAAAAAAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAABAAAAAEAAAABAAAAAAAAAAsAAADjAAAA/wAAAPwAAAD+AAAA/gAAAPwAAAD/AAAA4wAAAAoAAAAAAAAAAQAAAAEAAAAEAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAJAAAAD/AAAA/AAAAP8AAAD/AAAA/AAAAP8AAACQAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAABwAAAJAAAADqAAAA7gAAAO4AAADqAAAAkQAAAAcAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAkAAAASAAAAEgAAAAoAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9GL//+kJf//kAn//5AJ/+ggBBfTIATLqCAEFZAAAAkgAAAEIAAABEAAAAJAAAACIAQgBKAIEAVQClAKqAmQFagJkBVQClAKoAgQBSAEIARAAAACQAAAAiAAAAQgAAAEkAAACaggBBXTIATL6CAEF/+QCf//kAn//6Ql///Ri/8=') + 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) opt.tk.call('wm', 'iconphoto', opt._w, icon_img2) - MainFrame0 = tk.Frame(opt) - MainFrame0.pack() + Optionscards = tk.ttk.Notebook(opt) + #Calculate Options card---------------------------------------------------------# + Main1Frame0 = tk.Frame(opt) -#Line's colors options-------------------------------------------------------------# - LeftFrame1 = ttk.LabelFrame(MainFrame0, text='ENU colors', labelanchor='nw') - LeftFrame1.pack(side=tk.LEFT, expand=tk.YES, padx='2px', pady='0px', fill=tk.Y) + #ION correction# + TOP1Frame0 = ttk.Frame(Main1Frame0) + TOP1Frame0.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) - EFrameL2 = tk.Frame(LeftFrame1) - EFrameL2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='2px') + ioncor = ttk.Label(TOP1Frame0, text='Ionosphere Correction') + ioncor.pack(side=tk.LEFT, anchor='w', padx='1px') + + cionbox = ttk.Combobox(TOP1Frame0, width=15, height=4) + cionbox['state'] = 'readonly' + cionbox['value'] = ('OFF', 'Ion-Free LC', 'Broadcast') + cionbox.current(ioncorstate) + cionbox.pack(side=tk.RIGHT, anchor='e') + + #TRO correction# + TOP2Frame0 = ttk.Frame(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') + + ctrobox = ttk.Combobox(TOP2Frame0, width=15, height=4) + ctrobox['state'] = 'readonly' + ctrobox['value'] = ('OFF', 'Hopfield', 'Saastamoinen') + ctrobox.current(trocorstate) + ctrobox.pack(side=tk.RIGHT, anchor='e') + + #GNSS Options# + TOP5Frame0 = ttk.LabelFrame(Main1Frame0, text='Satellite system', labelanchor='nw') + TOP5Frame0.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) + + satsys = [("GPS", 0),("GLO", 1),("BeiDou", 2),("Galileo", 3),("SBAS", 4)] + v = tk.IntVar() + + for sys, num in satsys: + radio_button = ttk.Radiobutton(TOP5Frame0, text=sys, variable=v, value=num) + radio_button.pack(side=tk.LEFT, padx='3px', anchor='w') + + v.set(satellite_system) + + #Drawing Options card-----------------------------------------------------------# + Main2Frame0 = tk.Frame(opt) + + # Satnum plot options# + Buttom1Frame1 = ttk.LabelFrame(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: Colorchoose(0, satncollab, 4)) + satncolopt.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') + satncollab = tk.Label(SatnFrameB1, width=5, height=1, bg=satncolormid[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: Colorchoose(0, satncollab, 0)) + linewre.pack(side=tk.LEFT, expand=tk.YES, padx='1px') + + #Line's colors options# + Left2Frame1 = ttk.LabelFrame(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: Colorchoose(0, ecollab, 1)) - ecolopt.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='2px') + 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='2px') + ecollab.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - NFrameL2 = tk.Frame(LeftFrame1) - NFrameL2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='2px') + 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: Colorchoose(1, ncollab,1)) - ncolopt.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='2px') + 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='2px') + ncollab.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - UFrameL2 = tk.Frame(LeftFrame1) - UFrameL2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='2px') + 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: Colorchoose(2, ucollab,1)) - ucolopt.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='2px') + 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='2px') + ucollab.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - ColorConL2 = tk.Frame(LeftFrame1) - ColorConL2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='2px') + 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: [Colorchoose(0, ecollab,0),Colorchoose(0, ncollab,0),Colorchoose(0, ucollab,0)]) - colorcon.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='2px') + command=lambda: [Colorchoose(0, ecollab,0) + ,Colorchoose(0, ncollab,0) + ,Colorchoose(0, ucollab,0)]) + colorcon.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - ColorConL2 = tk.Frame(LeftFrame1) - ColorConL2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='2px') - colorcon = ttk.Button(ColorConL2, text='Confirm', width=10) - colorcon.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='2px') -# ---------------------------------------------------------------------------------# + #Line's weight options# + Right2Frame1 = ttk.LabelFrame(Main2Frame0, text='Draw configs', labelanchor='nw') + Right2Frame1.pack(side=tk.RIGHT, expand=tk.YES , padx='1px', pady='1px', fill=tk.Y) - -#Line's weight options-------------------------------------------------------------# - RightFrame1 = ttk.LabelFrame(MainFrame0, text='Draw configs', labelanchor='nw') - RightFrame1.pack(side=tk.RIGHT, expand=tk.YES , padx='2px', pady='0px', fill=tk.Y) - - EFrameR2 = tk.Frame(RightFrame1) - EFrameR2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='2px') + 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='4px') - elinewidth = ttk.Entry(EFrameR2, width=10) - elinewidth.delete(0, "end") - elinewidth.insert(0, enulinew[0]) - elinewidth.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='2px') + elinewopt.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') + elinewidth = ttk.Spinbox(EFrameR2, from_=0, to=10,increment=0.01, width=10) + elinewidth.set(enulinew[0]) + elinewidth.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') - NFrameR2 = tk.Frame(RightFrame1) - NFrameR2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='2px') + 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='4px') - nlinewidth = ttk.Entry(NFrameR2, width=10) - nlinewidth.delete(0, "end") - nlinewidth.insert(0, enulinew[1]) - nlinewidth.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='2px') + nlinewopt.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') + nlinewidth = ttk.Spinbox(NFrameR2, from_=0, to=10,increment=0.01, width=10) + nlinewidth.set(enulinew[1]) + nlinewidth.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') - UFrameR2 = tk.Frame(RightFrame1) - UFrameR2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='2px') + 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='4px') - ulinewidth = ttk.Entry(UFrameR2, width=10) - ulinewidth.delete(0, "end") - ulinewidth.insert(0, enulinew[2]) - ulinewidth.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='2px') + ulinewopt.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') + ulinewidth = ttk.Spinbox(UFrameR2, from_=0, to=10,increment=0.01, width=10) + ulinewidth.set(enulinew[2]) + ulinewidth.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') - LineReR2 = tk.Frame(RightFrame1) - LineReR2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='2px') - linewre = ttk.Button(LineReR2, text='Undo', width=10, command=lambda: Linewchoose(elinewidth, nlinewidth, ulinewidth, 0)) - linewre.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='2px') + 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: Linewchoose(elinewidth, nlinewidth, ulinewidth, 0)) + linewre.pack(side=tk.LEFT, expand=tk.YES, padx='1px') + + Optionscards.add(Main1Frame0, text='Calc options') + Optionscards.add(Main2Frame0, text='Draw options') + Optionscards.pack(fill=tk.BOTH, expand=True, padx='2px', pady='0px') + + #TOTAL Confirm# + Bottom0Frame0 = ttk.Frame(opt) + 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: [opt.destroy()]) + TotalCancel.pack(side=tk.RIGHT, padx='1px', anchor='e') + TotalCon = ttk.Button(Bottom0Frame0, text='Confirm', width=10, + command=lambda: [Colorchoose(0, ecollab,3), + Linewchoose(elinewidth,nlinewidth,ulinewidth,1), + Calcu_confirm(v, cionbox, ctrobox), + opt.destroy()]) + TotalCon.pack(side=tk.RIGHT, padx='1px', anchor='e') - LineConR2 = tk.Frame(RightFrame1) - LineConR2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='2px') - linewcon = ttk.Button(LineConR2, text='Confirm', width=10, command=lambda: Linewchoose(elinewidth,nlinewidth,ulinewidth,1)) - linewcon.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='2px') -#---------------------------------------------------------------------------------# def Abo_windows(): abo = tk.Toplevel(root) abo.title("About") @@ -186,19 +404,189 @@ def Abo_windows(): abo.minsize(200, 100) abo.maxsize(200, 100) - About = tk.Label(abo, text="\\( ̄︶ ̄*\\))\n\nKNZ_plot ver 0.5.1\nCopyright (c) 2024 by KenanZhu\nAll Right Reserved.") + About = tk.Label(abo, text="\\( ̄︶ ̄*\\))\n\nKNZ_plot ver 1.2.1\nCopyright (c) 2024 by KenanZhu\nAll Right Reserved.") About.pack(side=tk.TOP, expand=tk.YES) def View_windows(): - f_path = "" - view = tk.Toplevel() + view = tk.Toplevel(root) view.title("KNZ_View") view.geometry('900x600') view.minsize(1000, 600) global icon_img1 - icon_img1 = (b'AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAACQA' - b'APY6AQD2OgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAABAAAADQAAABIAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAASAAAADQAAAAEAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAACQAAAHEAAADMAAAA6wAAAO8AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADvAAAA6wAAAMwAAAByAAAACQAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAdAAAAzwAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAAD/AAAA0AAAAB0AAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAADMAAAA/wAAAPoAAAD6AAAA/gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/gAAAPoAAAD6AAAA/wAAAMwAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAHIAAAD/AAAA+QAAAP8AAAD/AAAA9wAAAO0AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADtAAAA9wAAAP8AAAD/AAAA+QAAAP8AAABxAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAMcAAAD/AAAA+gAAAP8AAACtAAAAGQAAABEAAAASAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAAUAAAAFgAAABUAAAARAAAAGQAAAK0AAAD/AAAA+gAAAP8AAADHAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAADQAAAOgAAAD/AAAA/wAAAPkAAAAjAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAACMAAAD5AAAA/wAAAP8AAADnAAAADQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO0AAAATAAAAAAAAAAIAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAABQAAAAAAAAA/AAAAkwAAAE0AAAAAAAAAAAAAABQAAADtAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEQAAAO0AAAD/AAAA/wAAAO4AAAASAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAQAAAAEAAAABAAAAAIAAAAFAAAAAAAAAFsAAAD/AAAA/gAAAP8AAABNAAAAAAAAABUAAADuAAAA/wAAAP8AAADtAAAAEQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAXAAAAP8AAAD9AAAA9QAAAP8AAACIAAAAAAAAABUAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAKgAAAGcAAAB7AAAAaAAAAB0AAABaAAAA/wAAAP0AAAD8AAAA/QAAAP8AAAA/AAAAAAAAABQAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAABYAAACrAAAA/gAAAP8AAAD+AAAA/wAAAPcAAAD4AAAA/gAAAP0AAAD9AAAA/wAAAFwAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAGAAAANgAAAD/AAAA/QAAAPkAAAD2AAAA+QAAAP8AAAD9AAAA/gAAAP8AAAD/AAAAXAAAAAAAAAAFAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAIAAAAAAAAArAAAAP8AAAD5AAAA/QAAAP8AAAD/AAAA/wAAAP0AAAD+AAAA/wAAAP8AAABbAAAAAAAAAAUAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAwAAAA/gAAAP0AAAD+AAAA/wAAAMYAAACAAAAAygAAAP8AAAD9AAAA/wAAAPoAAAAmAAAAAAAAAAIAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAABAAAAAAAAABqAAAA/wAAAPkAAAD/AAAAxQAAAAMAAAAAAAAABgAAAMsAAAD/AAAA+QAAAP8AAABkAAAAAAAAAAQAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAABAAAAAAAAAB/AAAA/wAAAPcAAAD/AAAAggAAAAAAAAASAAAAAAAAAIoAAAD/AAAA9wAAAP8AAAB4AAAAAAAAAAQAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAABAAAAAAAAABrAAAA/wAAAPkAAAD/AAAAwQAAAAAAAAAAAAAAAwAAAMcAAAD/AAAA+QAAAP8AAABkAAAAAAAAAAQAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAyAAAA/wAAAP0AAAD+AAAA/wAAAMEAAAB4AAAAxAAAAP8AAAD+AAAA/gAAAPwAAAArAAAAAAAAAAIAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAIAAAAAAAAAsAAAAP8AAAD5AAAA/QAAAP8AAAD/AAAA/wAAAP0AAAD5AAAA/wAAAKkAAAAAAAAAAgAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAHAAAAN0AAAD/AAAA/AAAAPgAAAD2AAAA+AAAAPwAAAD/AAAA2AAAABgAAAAAAAAAAQAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAABsAAAC0AAAA/wAAAP8AAAD+AAAA/wAAAP8AAACvAAAAGAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAQAAAAEAAAABAAAAAwAAAAIAAAAAAAAAMQAAAG8AAACEAAAAbgAAAC8AAAAAAAAAAgAAAAMAAAABAAAAAQAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAABAAAAEAAAABIAAAASAAAAEgAAABIAAAASAAAAFAAAABYAAAAWAAAAFgAAABQAAAASAAAAEgAAABIAAAASAAAAEAAAAAEAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAAQAAAA3QAAAPIAAADsAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAOwAAADyAAAA3QAAABAAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAASAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA7QAAABIAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAASAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA7QAAABIAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAAQAAAA3QAAAPIAAADtAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO0AAADyAAAA3QAAABAAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAABAAAAEAAAABIAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAASAAAAEAAAAAEAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAABAAAAEAAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEAAAAAEAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAAQAAAA3QAAAPIAAADsAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAOwAAADyAAAA3QAAABAAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAASAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA7QAAABIAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAASAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA7QAAABIAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAAQAAAA3QAAAPIAAADsAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAOwAAADyAAAA3QAAABAAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEQAAAO0AAAD/AAAA/wAAAO4AAAASAAAAAAAAAAEAAAABAAAAEAAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEAAAAAEAAAABAAAAAAAAABIAAADuAAAA/wAAAP8AAADtAAAAEQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO0AAAATAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAABMAAADtAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAADQAAAOgAAAD/AAAA/wAAAPkAAAAjAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAACMAAAD5AAAA/wAAAP8AAADnAAAADQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAMcAAAD/AAAA+gAAAP8AAACtAAAAGQAAABEAAAASAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABIAAAARAAAAGQAAAK0AAAD/AAAA+gAAAP8AAADHAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAHIAAAD/AAAA+QAAAP8AAAD/AAAA9wAAAO0AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADtAAAA9wAAAP8AAAD/AAAA+QAAAP8AAABxAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAADMAAAA/wAAAPoAAAD6AAAA/gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/gAAAPoAAAD5AAAA/wAAAMwAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAdAAAA0AAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAAD/AAAA0AAAAB0AAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAACgAAAHIAAADNAAAA6wAAAO8AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADvAAAA6wAAAM0AAAByAAAACgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAABAAAADQAAABIAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAASAAAADQAAAAEAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/Rf//ov8AAP6QAAAJfwAA/UAAAAK/AAD+gAAAAX8AAPkAAAAAnwAA+QAAAACfAAD5AAAAAJ8AAPoF//+gXwAA+gQABGBfAAD6BegIIF8AAPoF0pAgXwAA+gWkACBfAAD6BVAAYF8AAPoFIACgXwAA+gUgASBfAAD6BUABIF8AAPoFQIEgXwAA+gVBQSBfAAD6BUCBIF8AAPoFQAEgXwAA+gUgAiBfAAD6BSACIF8AAPoFUAUgXwAA+gQEECBfAAD6Bf//oF8AAPoEAAAgXwAA+gYAAGBfAAD6BgAAYF8AAPoGAABgXwAA+gYAAGBfAAD6BAAAIF8AAPoF//+gXwAA+gX//6BfAAD6BAAAIF8AAPoGAABgXwAA+gYAAGBfAAD6BgAAYF8AAPoGAABgXwAA+gQAACBfAAD6BF/6IF8AAPoF//+gXwAA+QAAAACfAAD5AAAAAJ8AAPkAAAAAnwAA/oAAAAF/AAD9QAAAAr8AAP6QAAAJfwAA/0X//6L/AAA=') + 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) @@ -224,7 +612,12 @@ def View_windows(): xbar.config(command=text.xview) 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() + view.title('KNZ_Viewing: %s' %(f_path)) text.delete('1.0', 'end') with open(f_path, 'r') as f: lines = f.readlines() @@ -232,46 +625,90 @@ def View_windowshow(text, view): text.insert('insert', line) text.config() +def Clear_canvas(): + #Brief # clear the canvas + #Return# none + ex.clear() + nx.clear() + ux.clear() + satn.clear() + canvas0.draw() + canvas1.draw() + plotstate.config(text="None") + root.update() + def PO_openfile(): + #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() + if not f_path.find(".po") >= 0: + plotstate.config(text="Error !: format is invalid.") + root.update() + return with open(f_path, 'r') as f: while 1: line = f.readline() if line.find("X-rec") >= 0: + plotstate.config(text="Reading...") + root.update() while 1: line = f.readline() - if line != "": + 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] ] )) - elif line == "": + 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 == "": ex.clear() nx.clear() ux.clear() - ex.plot(ENU_O[0, :], color=enucolor[0], linewidth=enulinew[0]) + ex.plot(ENU_O[0, :], color=enucolor[0], linewidth=enulinew[0], marker='.', linestyle=':', ms=enulinew[0]) ex.set_title('E-W(m)', loc='left', fontsize=8) ex.grid(True, linestyle='--', alpha=0.7) - nx.plot(ENU_O[1, :], color=enucolor[1], linewidth=enulinew[1]) + nx.plot(ENU_O[1, :], color=enucolor[1], linewidth=enulinew[1], marker='.', linestyle=':', ms=enulinew[1]) nx.set_title('N-S(m)', loc='left', fontsize=8) nx.grid(True, linestyle='--', alpha=0.7) - ux.plot(ENU_O[2, :], color=enucolor[2], linewidth=enulinew[2]) + ux.plot(ENU_O[2, :], color=enucolor[2], linewidth=enulinew[2], marker='.', linestyle=':', ms=enulinew[2]) ux.set_title('U-D(m)', loc='left', fontsize=8) ux.set_xlabel('Epochs') ux.grid(True, linestyle='--', alpha=0.7) - canvas.draw() + canvas0.draw() + + satn.clear() + satn.plot(satnumnarry[0, :], color=satncolor[0], linewidth=satnlinew[0]) + satn.set_title('Valid Sat Numbers', loc='left', fontsize=8) + satn.set_xlabel('Epochs') + satn.grid(True, linestyle='--', alpha=0.7) + canvas1.draw() break elif line == "": + plotstate.config(text="Plot form: %s" % (f_path)) break def SPP_calculat(): + # Brief # read .sp file & draw in the canvas & output the .po file + # Return# none # Const define C_V = 299792458 f1 = 1575.42 f2 = 1227.60 ENU_O = np.empty((3,0)) + #Sat numbers register part + satnumnarry = np.empty((1, 0)) f_path = filedialog.askopenfilename() + if not f_path.find(".sp") >= 0: + plotstate.config(text="Error !: format is invalid.") + root.update() + return with open(f_path, 'r') as f: while 1: line = f.readline() @@ -297,7 +734,7 @@ def SPP_calculat(): while obspath > 0: flag = Obs[obspath - 1:obspath] if flag == "\\": - obsfile = Obs[obspath:-4] + obsfile = satsysdict.get(satellite_system) + "-" + Obs[obspath:-4] break obspath -= 1 # Get the file's father folder-------------------# @@ -314,246 +751,261 @@ def SPP_calculat(): with open(o_path, 'w+') as of:# Initialize-------# of.close() with open(o_path, 'a+') as of: - print("@ GENERATE PROGRAM : KNZ_Plot v0.5.1\n" + print("@ GENERATE PROGRAM : KNZ_Plot v1.2.1\n" "@ GENERATE TYPE : Receiver Station Position\n" "@ GENERATE TIME : %s\n" - "@ IONOS OPT : %s" - "@ TROPO OPT : %s" - "@\n\n" % (time.asctime(time.localtime()),ION,TRO), file=of) + "@ GENERATE SYS : %s\n" + "@ IONOS OPT : %s\n" + "@ TROPO OPT : %s\n" + "@\n\n" % ( 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) of.close() - #Coordinate transformation matrix---------------# + #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)] ]) - #-----------------------------------------------# + #-----------------------------------------------# + plotstate.config(text="Reading...") + root.update() + global epoch_last + epoch_last = 0 while 1: line = f.readline() + if line == "": + break flag = line[0: 1] if flag == ">": satnum = 0 - B = np.empty((0, 4)) - P = np.empty(( )) - L = np.empty((0, 1)) - Ptem = [] + satX = np.empty((1, 0)) + satY = np.empty((1, 0)) + satZ = np.empty((1, 0)) + C1 = np.empty((1, 0)) + C2 = np.empty((1, 0)) + ma = np.empty((1, 0)) + TGD = np.empty((1, 0)) + Dt = np.empty((1, 0)) - y = int(line[6:10]) - m = int(line[11:13]) - d = int(line[14:16]) - h = int(line[17:19]) + 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]])) + with open(o_path, 'a+') as of: + print("------------Missing data------------Missing data------------Missing data------------Missing data------------", file=of) + of.close() + count += 1 + epoch_last = epoch while 1: line = f.readline() - flag = line[0:1] - if flag == "G": - satnum += 1 - satX = float(line[6:21]) - satY = float(line[22:37]) - satZ = float(line[38:53]) - C1 = float(line[55:69]) - C2 = float(line[71:85]) - ma = float(line[86:101]) - TGD = float(line[102:117]) - Dt = float(line[118:134]) - R = math.sqrt(pow((satX - apX), 2) + pow((satY - apY), 2) + pow((satZ - apZ), 2)) - l = -((satX - apX) / R) - m = -((satY - apY) / R) - n = -((satZ - apZ) / R) - B = np.vstack((B, [l, m, n, 1])) - Ptem.append(pow(math.sin(math.radians(ma)), 2)) - if C2 != 0: - Pl = (f1 * f1 * C1) / (f1 * f1 - f2 * f2) - (f2 * f2 * C2) / (f1 * f1 - f2 * f2) - elif C2 == 0: - Pl = C1 - L = np.vstack((L, [Pl - R + C_V * Dt - Trocor.def_tro_cor(apH, ma)])) - elif flag != "G": + if line == "\n": + satnumnarry = np.hstack(( satnumnarry, [ [satnum] ] )) if satnum >= 4: - P = np.diag(Ptem) - Q = np.linalg.inv(np.transpose(B) @ P @ B) - D_X = Q @ np.transpose(B) @ P @ L #Coordinate correction - X = D_X[0, 0] + apX - Y = D_X[1, 0] + apY - Z = D_X[2, 0] + apZ - DeltaXYZ = np.array([[D_X[0, 0]],[D_X[1, 0]],[D_X[2, 0]]]) + stop = 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)) + if C2[0,count] != 0 and C1[0,count] != C2[0,count]: + Pl = (f1 * f1 * C1[0,count]) / (f1 * f1 - f2 * f2) - (f2 * f2 * C2[0,count]) / (f1 * f1 - f2 * f2) + else: + Pl = C1[0,count] + L = np.vstack((L, [Pl - R + C_V * Dt[0,count] - Trocor.def_tro_cor(apH, ma[0,count])])) + + 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 ) + 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 - ENU_O = np.hstack((ENU_O,[ [ENU[0, 0]],[ENU[1, 0]],[ENU[2, 0]] ])) + if ENU[0, 0] > 25 or ENU[1, 0] > 25 or ENU[2, 0] > 50: + ENU_O = np.hstack((ENU_O, [[0], [0], [0]])) + else: + ENU_O = np.hstack((ENU_O,[ [ENU[0, 0]],[ENU[1, 0]],[ENU[2, 0]] ])) with open(o_path, 'a+') as of: print("%4d\\%02d\\%02d\\%02d\\%02d\\%04.1f %12.4f %12.4f %12.4f %3d %10.5f %10.5f %10.5f" - %(y, m, d, h, min, sec, X, Y, Z, satnum, ENU[0, 0], ENU[1, 0], ENU[2, 0]),file = of) + %(year, month, day, hour, min, sec, X, Y, Z, satnum, ENU[0, 0], ENU[1, 0], ENU[2, 0]),file = of) of.close() break else: break + + flag = line[0:1] + if flag == satsysdict.get(satellite_system): + satnum += 1 + 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])] ] )) + C2 = np.hstack(( C2, [ [float(line[71:85])] ] )) + ma = np.hstack(( ma, [ [float(line[86:101])] ] )) + Dt = np.hstack(( Dt, [ [float(line[102:118])] ] )) + + elif line.find("END") >= 0: ex.clear() nx.clear() ux.clear() - ex.plot(ENU_O[0, :], color=enucolor[0], linewidth=enulinew[0]) + ex.plot(ENU_O[0, :], color=enucolor[0], linewidth=enulinew[0], marker='.', linestyle=':', ms=enulinew[0]) ex.set_title('E-W(m)', loc='left', fontsize=8) ex.grid(True, linestyle='--', alpha=0.7) - nx.plot(ENU_O[1, :], color=enucolor[1], linewidth=enulinew[1]) + nx.plot(ENU_O[1, :], color=enucolor[1], linewidth=enulinew[1], marker='.', linestyle=':', ms=enulinew[1]) nx.set_title('N-S(m)', loc='left', fontsize=8) nx.grid(True, linestyle='--', alpha=0.7) - ux.plot(ENU_O[2, :], color=enucolor[2], linewidth=enulinew[2]) + ux.plot(ENU_O[2, :], color=enucolor[2], linewidth=enulinew[2], marker='.', linestyle=':', ms=enulinew[2]) ux.set_title('U-D(m)', loc='left', fontsize=8) ux.set_xlabel('Epochs') ux.grid(True, linestyle='--', alpha=0.7) - canvas.draw() + canvas0.draw() + + satn.clear() + satn.plot(satnumnarry[0, :], color=satncolor[0], linewidth=satnlinew[0]) + satn.set_title('Valid Sat Numbers', loc='left', fontsize=8) + satn.set_xlabel('Epochs') + satn.grid(True, linestyle='--', alpha=0.7) + canvas1.draw() + f.close() + plotstate.config(text="Plot form: %s" % (f_path)) break root = tk.Tk() root.title("KNZ_Plot") root.geometry('900x450') -root.minsize(300,500) +root.minsize(500,500) + +icon_img = (b'AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAANIAAADSAAAAAAA' + b'AAAAAAAAEAQOcBAEDtQQBA6UEAQN6BAEDPgQBAwgEAQMABAEDAQQBAwMEAQMBBAEDAAQBAwAEAQ' + b'MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBA60EAQP/BAED/QQBA/8EAQP+BAED3AQBA4cEAQMeBAED' + b'AAQBAwMEAQMCBAEDAAQBAwAEAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEDBwQBA8wEAQP/BAED+gQBA/' + b'4EAQP+BAED/wQBA/cEAQOCBAEDBgQCAwAEAQMBBAEDAAQBAwAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAQMA' + b'BAEDVQQBA/8EAQP8BAED/wQBA/0EAQP7BAED/AQBA/8EAQPEBAEDFAQBAwAEAQMBBAEDAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAQBAwAEAQMOBAED5wQBA/8EAQP+BAED/wQBA/8EAQP+BAED+QQBA/8EAQO7B' + b'AEDAAQBAwAEAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEDAgQBAwAEAQO5BAED/wQBA/wEAQP/BAED/wQ' + b'BA/8EAQP/BAED/AQBA/8EAQMzBAEDAAQBAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAQMEBAEDAAQBA5MEA' + b'QP/BAED+wQBA/8EAQP/BAED/wQBA/8EAQP9BAED/wQBAz8EAQMABAEDBQQBAwAEAQMABAEDAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAQBAwQEAQMABAEDaAQBA/8EAQP7BAED/wQBA/8EAQP/BAED/gQBA/8EAQPqBAEDFAQBAwAEAQ' + b'MBBAEDAwQBAwAEAQMABAEDAAYAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAABAEDAgQBAwAEAQMnBAED+QQBA/4EAQP8BAED/gQBA/wEAQP5BAED' + b'/wQBA38EAQMABAEDOgQBAzsEAQMABAEDBAQBAwEEAQMABAEDAAMBAgAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAQMABAEDAwQBAwAEAQOIBAED/wQBA/' + b'wEAQP/BAED/QQBA/8EAQOhBAIDAAMBBAEEAQPIBAED/wQBA2UEAQMABAEDAwQBAwEEAQMABAEDA' + b'AQBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBAwAEAQMA' + b'BAEDAQUAAgAEAQN8BAED6QQBA/QEAQPVBAEDZgQBAwMEAQMABAEDkAQBA/8EAQP5BAED/wQBA5Q' + b'EAwUABAEDAgQBAwEEAQMABAEDAAQBAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAABAEDAAQBAwAEAQMABAEDAgQBAwAEAQMLBAEDGAQBAwQEAQMABAEDBAQBA5QEAQP/B' + b'AED/AQBA/4EAQP6BAED/wQBA6oEAQMDBAEDAQQBAwEEAQMABAEDAAQABAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEDAAQBAwAEAQMBBAEDAwQBAwAEAQMCBAEDAAQ' + b'BAz8EAQPVBAED/wQBA/wEAQP/BAED/wQBA/8EAQP6BAED/wQBA64EAQMDBAEDAQQBAwEEAQMABA' + b'EDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEDAAQBAgAEA' + b'QIABAEDAQQBAwQEAQMABAEDRQQBA/8EAQP6BAED/gQBA/8EAQP/BAED/wQBA/8EAQP6BAED/wQB' + b'A6YEAQQABAEDAgQBAwEEAQMABAEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEDAAQBAwMEAQMABAEDbAQBA/8EAQP7BAED/wQBA/8EAQ' + b'P/BAED/wQBA/8EAQP6BAED/wQBA5UEAQMABAEDAwQBAwAEAQMABAEDAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBAwAEAQMABAEDAAQBAwMEAQMABAED' + b'kQQBA/8EAQP6BAED/wQBA/8EAQP/BAED/wQBA/8EAQP7BAED/wQBA38EAQMABAEDBAQAAAAEAQM' + b'ABAEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBAw' + b'AEAQMABAEDAQQBAwIEAQMABAEDnwQBA/8EAQP6BAED/wQBA/8EAQP/BAED/wQBA/8EAQP8BAED/' + b'wQBA2QEAQMABAEDBAQBAwAEAQMABAEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAQBAwAEAQMABAEDAQQBAwIHAQQABAEDnQQBA/8EAQP6BAED/gQBA/8' + b'EAQP/BAED/wQBA/4EAQP+BAED/QQBA0cEAQMABAEDBAQBAwAEAQMABAECAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEBAAQBAwAEAQMABAEDAQQBAwMEAQMAB' + b'AEDjAQBA/8EAQP7BAED/gQBA/8EAQP/BAED/wQBA/0EAQP/BAED7gQBAysEAQMABAEDAwQBAwAE' + b'AQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgECAAQ' + b'BAwAEAQMABAEDAQQBAwQEAQMABAEDcwQBA/8EAQP9BAED/QQBA/8EAQP/BAED/wQBA/wEAQP/BA' + b'ED1gQBAxIEAQMABAEDAgQBAwAEAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAwECAAQBAwAEAQMABAEDAQQBAwQEAQMABAEDVQQBA/cEAQP/BAED/AQB' + b'A/8EAQP/BAED/wQBA/sEAQP/BAEDtQAAAAAEAQMCBAEDAQQBBAAEAQMAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBAwAEAQMABAEDAAQBAwQEAQ' + b'MABAEDNgQBA+QEAQP/BAED+wQBA/8EAQP/BAED/wQBA/sEAQP/BAEDjAQBAwAEAQMEBAEEAAQBA' + b'wAEAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAQBAwAEAQMABAADAAQBAwQEAQMABAEDGgQBA8cEAQP/BAED+wQBA/4EAQP/BAED/wQBA/wEAQP' + b'/BAEDXgQBAwAEAQMEBAEDAAQBAwAEAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAQBAwAEAQMABAEDAAQBAwMEAwIABAEDBQQBA54EAQP/BAED/' + b'AQBA/0EAQP/BAED/gQBA/8EAQP0BAEDMQQBAwAEAQMDBAEDAAQBAwAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBAwAEAQMABAEDAAQBAwI' + b'EAQMDBAEDAAQBA20EAQP8BAED/wQBA/wEAQP/BAED/AQBA/8EAQPTBAEDDQQBAwAEAQMBBAEDAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAQBAwAEAQMABAEDAAQBAwEEAQMEBAEDAAQBAz0EAQPkBAED/wQBA/sEAQP+BAED+wQBA/8E' + b'AQOgBAEDAAQBAwMEAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMBAgAEAQMABAEDAAQBAwAEAQMEBAEDAAQBAxUEAQO4BA' + b'ED/wQBA/sEAQP9BAED/AQBA/8EAQNhBAEDAAQBAwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAQMABAEDAAQB' + b'AwAEAQMDBAEDAQQBBAAEAQN6BAED/QQBA/8EAQP6BAED/wQBA+8EAQMiBAEDAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAEAQMABAEDAAQBAwAEAQMCBAEDBAQBAwAEAQM6BAED2wQBA/8EAQP4BAED/wQBA' + b'60EAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAQMABAEDAAQBAwAEAQMBBAEDBAQBAwAEAQM' + b'MBAEDlgQBA/8EAQP+BAED/wQBA1UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEDA' + b'AQBAwAEAQMABAEDAwQBAwMEAQMABAEDPAQBA8kEAQP/BAED1wAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAABAEDAAQBAwAEAQMABAEDAQQBAwQEAQMABAEDAwQBA18EAQOvAi///w' + b'CX//8AC///gBP//4AT//9AC///QAp//0AIv/9AEl//ICEv/wAgl/9IgAv/oQAF/9kAEv/8gAl//' + b'EAEf/0gAr/+kAFf/0gAr/+kAFf/0gAD/+kAK//0gBX/+QAK//6QBP//SAT//6QC///JAf//9IH/' + b'//pA///8kP///0g=') -icon_img = (b'AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAI' - b'AAAAAAAABAAANIAAADSAAAAAAAAAAAAAAAEAQOcBAEDtQQBA6' - b'UEAQN6BAEDPgQBAwgEAQMABAEDAQQBAwMEAQMBBAEDAAQBAwA' - b'EAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAQBA60EAQP/BAED/QQBA/8EAQP+BAED3AQBA4cEAQ' - b'MeBAEDAAQBAwMEAQMCBAEDAAQBAwAEAQMAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEDBwQBA8wEAQP/B' - b'AED+gQBA/4EAQP+BAED/wQBA/cEAQOCBAEDBgQCAwAEAQMBBA' - b'EDAAQBAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAEAQMABAEDVQQBA/8EAQP8BAED/wQBA/0EAQP7BAED/' - b'AQBA/8EAQPEBAEDFAQBAwAEAQMBBAEDAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBAwAEAQMOBAED5wQB' - b'A/8EAQP+BAED/wQBA/8EAQP+BAED+QQBA/8EAQO7BAEDAAQBA' - b'wAEAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAABAEDAgQBAwAEAQO5BAED/wQBA/wEAQP/BAED/wQBA/8E' - b'AQP/BAED/AQBA/8EAQMzBAEDAAQBAwIAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAQMEBAEDAAQBA5MEAQP' - b'/BAED+wQBA/8EAQP/BAED/wQBA/8EAQP9BAED/wQBAz8EAQMA' - b'BAEDBQQBAwAEAQMABAEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAQBAwQEAQMABAEDaAQBA/8EAQP7BAED/wQBA/8EAQP/BAE' - b'D/gQBA/8EAQPqBAEDFAQBAwAEAQMBBAEDAwQBAwAEAQMABAED' - b'AAYAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAABAEDAgQBAwAEAQMnBAED+Q' - b'QBA/4EAQP8BAED/gQBA/wEAQP5BAED/wQBA38EAQMABAEDOgQ' - b'BAzsEAQMABAEDBAQBAwEEAQMABAEDAAMBAgAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAEAQMABAEDAwQBAwAEAQOIBAED/wQBA/wEAQP/BAED/QQBA/' - b'8EAQOhBAIDAAMBBAEEAQPIBAED/wQBA2UEAQMABAEDAwQBAwE' - b'EAQMABAEDAAQBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAQBAwAEAQMABAEDAQUAAgAEA' - b'QN8BAED6QQBA/QEAQPVBAEDZgQBAwMEAQMABAEDkAQBA/8EAQ' - b'P5BAED/wQBA5QEAwUABAEDAgQBAwEEAQMABAEDAAQBAwAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'BAEDAAQBAwAEAQMABAEDAgQBAwAEAQMLBAEDGAQBAwQEAQMAB' - b'AEDBAQBA5QEAQP/BAED/AQBA/4EAQP6BAED/wQBA6oEAQMDBA' - b'EDAQQBAwEEAQMABAEDAAQABAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEDAAQBAwAEAQMBBAED' - b'AwQBAwAEAQMCBAEDAAQBAz8EAQPVBAED/wQBA/wEAQP/BAED/' - b'wQBA/8EAQP6BAED/wQBA64EAQMDBAEDAQQBAwEEAQMABAEDAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAABAEDAAQBAgAEAQIABAEDAQQBAwQEAQMABAEDRQQB' - b'A/8EAQP6BAED/gQBA/8EAQP/BAED/wQBA/8EAQP6BAED/wQBA' - b'6YEAQQABAEDAgQBAwEEAQMABAEDAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAABAEDAAQBAwMEAQMABAEDbAQBA/8EAQP7BAED/wQBA/8E' - b'AQP/BAED/wQBA/8EAQP6BAED/wQBA5UEAQMABAEDAwQBAwAEA' - b'QMABAEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAQBAwAEAQMABAEDAAQBAwMEAQM' - b'ABAEDkQQBA/8EAQP6BAED/wQBA/8EAQP/BAED/wQBA/8EAQP7' - b'BAED/wQBA38EAQMABAEDBAQAAAAEAQMABAEDAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAQBAwAEAQMABAEDAQQBAwIEAQMABAEDnwQBA/8EAQP6BAE' - b'D/wQBA/8EAQP/BAED/wQBA/8EAQP8BAED/wQBA2QEAQMABAED' - b'BAQBAwAEAQMABAEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBAwAEAQMABAEDAQ' - b'QBAwIHAQQABAEDnQQBA/8EAQP6BAED/gQBA/8EAQP/BAED/wQ' - b'BA/4EAQP+BAED/QQBA0cEAQMABAEDBAQBAwAEAQMABAECAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAgEBAAQBAwAEAQMABAEDAQQBAwMEAQMABAEDjAQBA/' - b'8EAQP7BAED/gQBA/8EAQP/BAED/wQBA/0EAQP/BAED7gQBAys' - b'EAQMABAEDAwQBAwAEAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgECAAQBAwAEA' - b'QMABAEDAQQBAwQEAQMABAEDcwQBA/8EAQP9BAED/QQBA/8EAQ' - b'P/BAED/wQBA/wEAQP/BAED1gQBAxIEAQMABAEDAgQBAwAEAQM' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAwECAAQBAwAEAQMABAEDAQQBAwQEAQMAB' - b'AEDVQQBA/cEAQP/BAED/AQBA/8EAQP/BAED/wQBA/sEAQP/BA' - b'EDtQAAAAAEAQMCBAEDAQQBBAAEAQMAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAQBAwAEAQMABAEDAAQBAwQEAQMABAEDNgQBA+QEAQP/BAED+' - b'wQBA/8EAQP/BAED/wQBA/sEAQP/BAEDjAQBAwAEAQMEBAEEAA' - b'QBAwAEAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBAwAEAQMABAADAAQB' - b'AwQEAQMABAEDGgQBA8cEAQP/BAED+wQBA/4EAQP/BAED/wQBA' - b'/wEAQP/BAEDXgQBAwAEAQMEBAEDAAQBAwAEAAMAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAQBAwAEAQMABAEDAAQBAwMEAwIABAEDBQQBA54E' - b'AQP/BAED/AQBA/0EAQP/BAED/gQBA/8EAQP0BAEDMQQBAwAEA' - b'QMDBAEDAAQBAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBAwAEAQM' - b'ABAEDAAQBAwIEAQMDBAEDAAQBA20EAQP8BAED/wQBA/wEAQP/' - b'BAED/AQBA/8EAQPTBAEDDQQBAwAEAQMBBAEDAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAQBAwAEAQMABAEDAAQBAwEEAQMEBAE' - b'DAAQBAz0EAQPkBAED/wQBA/sEAQP+BAED+wQBA/8EAQOgBAED' - b'AAQBAwMEAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'MBAgAEAQMABAEDAAQBAwAEAQMEBAEDAAQBAxUEAQO4BAED/wQ' - b'BA/sEAQP9BAED/AQBA/8EAQNhBAEDAAQBAwQAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAQMABAEDAAQBAw' - b'AEAQMDBAEDAQQBBAAEAQN6BAED/QQBA/8EAQP6BAED/wQBA+8' - b'EAQMiBAEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAEAQMABAEDAAQBAwAEAQMCBAEDBAQBAwAEAQ' - b'M6BAED2wQBA/8EAQP4BAED/wQBA60EAQMAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAQMAB' - b'AEDAAQBAwAEAQMBBAEDBAQBAwAEAQMMBAEDlgQBA/8EAQP+BA' - b'ED/wQBA1UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAABAEDAAQBAwAEAQMABAEDA' - b'wQBAwMEAQMABAEDPAQBA8kEAQP/BAED1wAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAABAEDAAQBAwAEAQMABAEDAQQBAwQEAQMABAEDAwQBA' - b'18EAQOvAi///wCX//8AC///gBP//4AT//9AC///QAp//0AIv/' - b'9AEl//ICEv/wAgl/9IgAv/oQAF/9kAEv/8gAl//EAEf/0gAr/' - b'+kAFf/0gAr/+kAFf/0gAD/+kAK//0gBX/+QAK//6QBP//SAT/' - b'/6QC///JAf//9IH///pA///8kP///0g=') icon_img = b64decode(icon_img) icon_img = ImageTk.PhotoImage(data=icon_img) root.tk.call('wm', 'iconphoto', root._w, icon_img) +Drawcards = tk.ttk.Notebook(root) + default_font = tkFont.nametofont("TkDefaultFont") -default_font.configure(family="Segoe UI", size=10) +default_font.configure(family="Segoe UI", size=9) -frmFigure = tk.Frame(root) -frmFigure.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) +stateframe = tk.Frame(root) +stateframe.pack(side=tk.BOTTOM, fill=tk.X) +plotstate = ttk.Label(stateframe,text="None") +plotstate.pack(side=tk.LEFT, anchor='w') -inter = ttk.Label(root,text=' Interval:') -inter.pack(side=tk.LEFT, anchor='e') - -cboxi = ttk.Combobox(root, width=8, height=10) -cboxi['value'] = ('0','0.05','0.1','0.2','0.25','0.5','1','5','10','15','30','60') -cboxi.current(10) -cboxi.pack(side=tk.LEFT, anchor='e') - -plottype = ttk.Label(root,text=' Plot types:') -plottype.pack(side=tk.LEFT, anchor='e') - -cboxe = ttk.Combobox(root, width=8) -cboxe['state'] = 'readonly' -cboxe['value'] = ('ENU','Satn') -cboxe.current(0) -cboxe.pack(side=tk.LEFT, anchor='e') +Tooptions = tk.Frame(root) +Tooptions.pack(side=tk.TOP, fill=tk.X) topmenu = tk.Menu(root) filemenu = tk.Menu(topmenu, tearoff=False) @@ -561,12 +1013,13 @@ openmenu = tk.Menu(filemenu, tearoff=False) openmenu.add_command(label="Open.sp", command=SPP_calculat, accelerator='Ctrl+S') openmenu.add_command(label="Open.po", command=PO_openfile, accelerator='Ctrl+P') filemenu.add_cascade(label="Open...", menu=openmenu) +filemenu.add_command(label="Clear", command=Clear_canvas) filemenu.add_command(label="View", command=View_windows) filemenu.add_command(label="Exit", command=root.quit, accelerator='Ctrl+E') topmenu.add_cascade(label="File", menu=filemenu) optmenu = tk.Menu(topmenu, tearoff=False) -optmenu.add_cascade(label="Draw options...", command=Opt_windows) +optmenu.add_cascade(label="Options...", command=Opt_windows) topmenu.add_cascade(label="Options", menu=optmenu) helpmenu = tk.Menu(topmenu, tearoff=False) @@ -575,16 +1028,38 @@ topmenu.add_cascade(label="Help", menu=helpmenu) root.config(menu=topmenu) +frmFigure0 = tk.Frame(root) +frmFigure0.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) + +frmFigure1 = tk.Frame(root) +frmFigure1.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) + plt.rc('font',family='Segoe UI') fig, (ex, nx, ux) = plt.subplots(3, 1, figsize=(10, 0) ,sharex=True) -fig.subplots_adjust(left=0.045, bottom=0.12, right=0.97, top=0.95) -canvas = FigureCanvasTkAgg(fig,frmFigure) -canvas.draw() -canvas.get_tk_widget().pack(side=tk.BOTTOM,fill=tk.BOTH,expand=tk.YES) -toolbar = NavigationToolbar2Tk(canvas,frmFigure,pack_toolbar=False) +fig.subplots_adjust(left=0.06, bottom=0.115, right=0.97, top=0.95) +canvas0 = FigureCanvasTkAgg(fig,frmFigure0) +canvas0.draw() +canvas0.get_tk_widget().pack(side=tk.BOTTOM,fill=tk.BOTH,expand=tk.YES) + +toolbar = NavigationToolbar2Tk(canvas0,frmFigure0,pack_toolbar=False) toolbar.update() toolbar.pack(side=tk.LEFT) +plt.rc('font',family='Segoe UI') +fig, (satn) = plt.subplots(1, 1, figsize=(10, 0) ,sharex=True) +fig.subplots_adjust(left=0.06, bottom=0.115, right=0.97, top=0.95) +canvas1 = FigureCanvasTkAgg(fig,frmFigure1) +canvas1.draw() +canvas1.get_tk_widget().pack(side=tk.BOTTOM,fill=tk.BOTH,expand=tk.YES) + +toolbar = NavigationToolbar2Tk(canvas1,frmFigure1,pack_toolbar=False) +toolbar.update() +toolbar.pack(side=tk.LEFT) + +Drawcards.add(frmFigure0, text='ENU-draw') +Drawcards.add(frmFigure1, text='Sat num') +Drawcards.pack(fill=tk.BOTH, expand=True, padx='2px', pady='0px') + root.protocol("WM_DELETE_WINDOW", root.quit) root.mainloop() \ No newline at end of file