RangeWindow.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  1. #include "RangeWindow.h"
  2. RangeWindow::RangeWindow(int w, int h, GBCSolution* inSLN):Fl_Window(w,h,inSLN->Name()){
  3. begin();
  4. menu = new Fl_Menu_Bar(0,0,w,30,"MENU");
  5. Sln=inSLN;
  6. Fl_Menu_Item items[]= {
  7. {"&File",0,0,0,FL_SUBMENU},
  8. {"Export Data",0,0,0,FL_SUBMENU},
  9. {"Comma delimited (.csv)",0,(Fl_Callback*)cb_ExportCSV,this,0},
  10. {"Excel Spreadsheet (.xls)",0,(Fl_Callback*)cb_ExportExcel,this,0},
  11. {"OpenOffice Spreadsheet (.ods)",0,(Fl_Callback*)cb_ExportOO,this,0},
  12. {"HTML Table (.html)",0,(Fl_Callback*)cb_ExportHTML,this,0},
  13. {"SQL Insert Statement (.sql)",0,(Fl_Callback*)cb_ExportSQL,this,0},
  14. {"XML File (.xml)",0,(Fl_Callback*)cb_ExportXML,this,0},
  15. {"PDF Document (.pdf)",0,(Fl_Callback*)cb_ExportPDF,this,0},
  16. {0},
  17. {"&Close",0,(Fl_Callback*)cb_Close,this,0},
  18. {0},
  19. {"&Minimum Range",0,0,0,FL_SUBMENU},
  20. {"0",0,(Fl_Callback*)cb_Min0,this,FL_MENU_RADIO|FL_MENU_VALUE},
  21. {"50",0,(Fl_Callback*)cb_Min50,this,FL_MENU_RADIO},
  22. {"100",0,(Fl_Callback*)cb_Min100,this,FL_MENU_RADIO},
  23. {"250",0,(Fl_Callback*)cb_Min250,this,FL_MENU_RADIO},
  24. {"500",0,(Fl_Callback*)cb_Min500,this,FL_MENU_RADIO},
  25. {"750",0,(Fl_Callback*)cb_Min750,this,FL_MENU_RADIO},
  26. {"1000",0,(Fl_Callback*)cb_Min1000,this,FL_MENU_RADIO},
  27. {"2000",0,(Fl_Callback*)cb_Min2000,this,FL_MENU_RADIO},
  28. {0},
  29. {"&Maximum Range",0,0,0,FL_SUBMENU},
  30. {"100",0,(Fl_Callback*)cb_Max100,this,FL_MENU_RADIO},
  31. {"250",0,(Fl_Callback*)cb_Max250,this,FL_MENU_RADIO},
  32. {"500",0,(Fl_Callback*)cb_Max500,this,FL_MENU_RADIO},
  33. {"750",0,(Fl_Callback*)cb_Max750,this,FL_MENU_RADIO},
  34. {"1000",0,(Fl_Callback*)cb_Max1000,this,FL_MENU_RADIO|FL_MENU_VALUE},
  35. {"1760",0,(Fl_Callback*)cb_Max1760,this,FL_MENU_RADIO},
  36. {"2000",0,(Fl_Callback*)cb_Max2000,this,FL_MENU_RADIO},
  37. {"MAX",0,(Fl_Callback*)cb_MaxMax,this,FL_MENU_RADIO},
  38. {0},
  39. {"&Step Size",0,0,0,FL_SUBMENU},
  40. {"1",0,(Fl_Callback*)cb_Step1,this,FL_MENU_RADIO},
  41. {"5",0,(Fl_Callback*)cb_Step5,this,FL_MENU_RADIO},
  42. {"10",0,(Fl_Callback*)cb_Step10,this,FL_MENU_RADIO|FL_MENU_VALUE},
  43. {"25",0,(Fl_Callback*)cb_Step25,this,FL_MENU_RADIO},
  44. {"50",0,(Fl_Callback*)cb_Step50,this,FL_MENU_RADIO},
  45. {"100",0,(Fl_Callback*)cb_Step100,this,FL_MENU_RADIO},
  46. {"250",0,(Fl_Callback*)cb_Step250,this,FL_MENU_RADIO},
  47. {0},
  48. {0}
  49. };
  50. menu->copy(items);
  51. tbl = new Fl_Browser(5,35,w-10,h-40,"Hello");
  52. colwidths = (int*)malloc(10*sizeof(int));
  53. colwidths[0]=70; // Range (yds)
  54. colwidths[1]=70; // Drop (in)
  55. colwidths[2]=70; // Drop (MOA)
  56. colwidths[3]=70; // Vel (ft/s)
  57. colwidths[4]=70; // Energy (ft-lb)
  58. colwidths[5]=70; // Winddrift (in)
  59. colwidths[6]=70; // Windage (ft)
  60. colwidths[7]=70; // Time (s)
  61. colwidths[8]=0;
  62. tbl->column_widths(colwidths);
  63. tbl->column_char('\t');
  64. min=0;
  65. max=1000;
  66. step=10;
  67. GenTable();
  68. end();
  69. show();
  70. }
  71. RangeWindow::~RangeWindow(){
  72. delete tbl;
  73. delete menu;
  74. free(colwidths);
  75. }
  76. void RangeWindow::GenTable(){
  77. double r,p,m,v,e,wi,wm,t;
  78. tbl->clear();
  79. int MIN=this->min;
  80. int MAX=this->max;
  81. int STEP=this->step;
  82. int num=Sln->MaxRows();
  83. // printf("NUM: %d",num);
  84. if (MAX>num) MAX=num;
  85. if (MIN>MAX) MIN=MAX;
  86. char* str = (char*)malloc(1024*sizeof(char));
  87. // Print some general information about the load.
  88. sprintf(str,"@b%s",Sln->Name()); tbl->add(str);
  89. sprintf(str,"Drag Coefficient: %.3f Projectile Weight: %d grains",Sln->BC(), Sln->Weight()); tbl->add(str);
  90. sprintf(str,"Initial Velocity: %d (ft/s) Zero Range: %d yards Shooting Angle: %d degrees",Sln->MuzzleVelocity(), Sln->ZeroRange(), Sln->ShootingAngle()); tbl->add(str);
  91. sprintf(str,"Wind Velocity: %d mph Wind Direction: %d degrees",Sln->WindSpeed(), Sln->WindAngle()); tbl->add(str);
  92. sprintf(str,"Altitude: %d feet Barometer: %.2f in-Hg Temperature: %d F Relative Humidity: %d%%",Sln->Altitude(), Sln->Pressure(), Sln->Temp(), Sln->Humidity()); tbl->add(str);
  93. tbl->add("");
  94. tbl->add("@b@cRange\t@b@cDrop\t@b@cDrop\t@b@cVelocity\t@b@cEnergy\t@b@cWind Drift\t@b@cWindage\t@b@cTime",0);
  95. tbl->add("@c(yards)\t@c(inches)\t@c(MOA)\t@c(ft/s)\t@c(ft-lb)\t@c(inches)\t@c(MOA)\t@c(s)",0);
  96. for (int n=MIN;n<=MAX;n=n+STEP){
  97. r=Sln->GetRange(n);
  98. p=Sln->GetPath(n);
  99. m=Sln->GetMOA(n);
  100. v=Sln->GetVelocity(n);
  101. wi=Sln->GetWindage(n);
  102. wm=Sln->GetWindageMOA(n);
  103. t=Sln->GetTime(n);
  104. e=Sln->Weight()*v*v/450436;
  105. sprintf(str,"@c%.0f\t@c%.2f\t@c%.2f\t@c%.0f\t@c%.0f\t@c%.2f\t@c%.2f\t@c%.2f",r,p,m,v,e,wi,wm,t);
  106. tbl->add(str,0);
  107. }
  108. }
  109. void RangeWindow::cb_Nothing(Fl_Widget* t, void* v){
  110. //exit(0);
  111. }
  112. void RangeWindow::cb_Min0(Fl_Widget* t, void* v){
  113. RangeWindow* T=(RangeWindow*)v;
  114. T->min=0;
  115. T->GenTable();
  116. }
  117. void RangeWindow::cb_Min50(Fl_Widget* t, void* v){
  118. RangeWindow* T=(RangeWindow*)v;
  119. T->min=50;
  120. T->GenTable();
  121. }
  122. void RangeWindow::cb_Min100(Fl_Widget* t, void* v){
  123. RangeWindow* T=(RangeWindow*)v;
  124. T->min=100;
  125. T->GenTable();
  126. }
  127. void RangeWindow::cb_Min250(Fl_Widget* t, void* v){
  128. RangeWindow* T=(RangeWindow*)v;
  129. T->min=250;
  130. T->GenTable();
  131. }
  132. void RangeWindow::cb_Min500(Fl_Widget* t, void* v){
  133. RangeWindow* T=(RangeWindow*)v;
  134. T->min=500;
  135. T->GenTable();
  136. }
  137. void RangeWindow::cb_Min750(Fl_Widget* t, void* v){
  138. RangeWindow* T=(RangeWindow*)v;
  139. T->min=750;
  140. T->GenTable();
  141. }
  142. void RangeWindow::cb_Min1000(Fl_Widget* t, void* v){
  143. RangeWindow* T=(RangeWindow*)v;
  144. T->min=1000;
  145. T->GenTable();
  146. }
  147. void RangeWindow::cb_Min2000(Fl_Widget* t, void* v){
  148. RangeWindow* T=(RangeWindow*)v;
  149. T->min=2000;
  150. T->GenTable();
  151. }
  152. void RangeWindow::cb_Max100(Fl_Widget* t, void* v){
  153. RangeWindow* T=(RangeWindow*)v;
  154. T->max=100;
  155. T->GenTable();
  156. }
  157. void RangeWindow::cb_Max250(Fl_Widget* t, void* v){
  158. RangeWindow* T=(RangeWindow*)v;
  159. T->max=250;
  160. T->GenTable();
  161. }
  162. void RangeWindow::cb_Max500(Fl_Widget* t, void* v){
  163. RangeWindow* T=(RangeWindow*)v;
  164. T->max=500;
  165. T->GenTable();
  166. }
  167. void RangeWindow::cb_Max750(Fl_Widget* t, void* v){
  168. RangeWindow* T=(RangeWindow*)v;
  169. T->max=750;
  170. T->GenTable();
  171. }
  172. void RangeWindow::cb_Max1000(Fl_Widget* t, void* v){
  173. RangeWindow* T=(RangeWindow*)v;
  174. T->max=1000;
  175. T->GenTable();
  176. }
  177. void RangeWindow::cb_Max1760(Fl_Widget* t, void* v){
  178. RangeWindow* T=(RangeWindow*)v;
  179. T->max=1760;
  180. T->GenTable();
  181. }
  182. void RangeWindow::cb_Max2000(Fl_Widget* t, void* v){
  183. RangeWindow* T=(RangeWindow*)v;
  184. T->max=2000;
  185. T->GenTable();
  186. }
  187. void RangeWindow::cb_MaxMax(Fl_Widget* t, void* v){
  188. RangeWindow* T=(RangeWindow*)v;
  189. int mr = T->Sln->MaxRows();
  190. T->max=mr;
  191. T->GenTable();
  192. }
  193. void RangeWindow::cb_Step1(Fl_Widget* t, void* v){
  194. RangeWindow* T=(RangeWindow*)v;
  195. T->step=1;
  196. T->GenTable();
  197. }
  198. void RangeWindow::cb_Step5(Fl_Widget* t, void* v){
  199. RangeWindow* T=(RangeWindow*)v;
  200. T->step=5;
  201. T->GenTable();
  202. }
  203. void RangeWindow::cb_Step10(Fl_Widget* t, void* v){
  204. RangeWindow* T=(RangeWindow*)v;
  205. T->step=10;
  206. T->GenTable();
  207. }
  208. void RangeWindow::cb_Step25(Fl_Widget* t, void* v){
  209. RangeWindow* T=(RangeWindow*)v;
  210. T->step=25;
  211. T->GenTable();
  212. }
  213. void RangeWindow::cb_Step50(Fl_Widget* t, void* v){
  214. RangeWindow* T=(RangeWindow*)v;
  215. T->step=50;
  216. T->GenTable();
  217. }
  218. void RangeWindow::cb_Step100(Fl_Widget* t, void* v){
  219. RangeWindow* T=(RangeWindow*)v;
  220. T->step=100;
  221. T->GenTable();
  222. }
  223. void RangeWindow::cb_Step250(Fl_Widget* t, void* v){
  224. RangeWindow* T=(RangeWindow*)v;
  225. T->step=250;
  226. T->GenTable();
  227. }
  228. void RangeWindow::cb_ExportCSV(Fl_Widget* f, void* vtt){
  229. RangeWindow* T = (RangeWindow*)vtt;
  230. char* fname=NULL;
  231. fname = fl_file_chooser("Please select a location and filename to export the CSV data.","*.csv","OutputData.csv",0);
  232. if (fname==NULL) return;
  233. FILE* ofile = fopen(fname,"w");
  234. // Print the output to a file.
  235. double r,p,m,v,e,wi,wm,t;
  236. int MIN=T->min;
  237. int MAX=T->max;
  238. int STEP=T->step;
  239. fprintf(ofile, "Range,Drop,Drop,Velocity,Energy,Wind Drift,Windage,Time");
  240. fprintf(ofile, "\n(yards),(inches),(MOA),(ft/s),(ft-lb),(inches),(MOA),(s)");
  241. int num=T->Sln->MaxRows();
  242. if (MAX>num) MAX=num;
  243. if (MIN>MAX) MIN=MAX;
  244. for (int n=MIN;n<=MAX;n=n+STEP){
  245. r=T->Sln->GetRange(n);
  246. p=T->Sln->GetPath(n);
  247. m=T->Sln->GetMOA(n);
  248. v=T->Sln->GetVelocity(n);
  249. e=0;
  250. wi=T->Sln->GetWindage(n);
  251. wm=T->Sln->GetWindageMOA(n);
  252. t=T->Sln->GetTime(n);
  253. e=T->Sln->Weight()*v*v/450436;
  254. fprintf(ofile,"\n%.0f,%.2f,%.2f,%.0f,%.2f,%.2f,%.2f,%.2f",r,p,m,v,e,wi,wm,t);
  255. }
  256. fclose(ofile);
  257. }
  258. void RangeWindow::cb_ExportExcel(Fl_Widget* f, void* vtt){
  259. RangeWindow* T = (RangeWindow*)vtt;
  260. char* fname=NULL;
  261. fname = fl_file_chooser("Please select a location and filename to export the Excel data.","*.xls","OutputData.xls",0);
  262. if (fname==NULL) return;
  263. FILE* ofile = fopen(fname,"w");
  264. // Print the output to a file.
  265. double r,p,m,v,e,wi,wm,t;
  266. int MIN=T->min;
  267. int MAX=T->max;
  268. int STEP=T->step;
  269. fprintf(ofile, "\n<html><head><title>$s</title></head>");
  270. fprintf(ofile, "\n\n<table><tr>");
  271. fprintf(ofile, "<td>Range</td>\
  272. <td>Drop</td>\
  273. <td>Drop</td>\
  274. <td>Velocity</td>\
  275. <td>Energy</td>\
  276. <td>Winddrift</td>\
  277. <td>Windage</td>\
  278. <td>Time</td></tr>"
  279. );
  280. fprintf(ofile,"\n<tr>");
  281. fprintf(ofile, "<td>(yards)</td>\
  282. <td>(inches)</td>\
  283. <td>(MOA)</td>\
  284. <td>(ft/s)</td>\
  285. <td>(ft-lb)</td>\
  286. <td>(inches)</td>\
  287. <td>(MOA)</td>\
  288. <td>(s)</td>"
  289. );
  290. int num=T->Sln->MaxRows();
  291. if (MAX>num) MAX=num;
  292. if (MIN>MAX) MIN=MAX;
  293. for (int n=MIN;n<=MAX;n=n+STEP){
  294. r=T->Sln->GetRange(n);
  295. p=T->Sln->GetPath(n);
  296. m=T->Sln->GetMOA(n);
  297. v=T->Sln->GetVelocity(n);
  298. e=0;
  299. wi=T->Sln->GetWindage(n);
  300. wm=T->Sln->GetWindageMOA(n);
  301. t=T->Sln->GetTime(n);
  302. e=T->Sln->Weight()*v*v/450436;
  303. fprintf(ofile,"\n<tr>\
  304. <td>%.0f</td>\
  305. <td>%.2f</td>\
  306. <td>%.2f</td>\
  307. <td>%.0f</td>\
  308. <td>%.2f</td>\
  309. <td>%.2f</td>\
  310. <td>%.2f</td>\
  311. <td>%.2f</td></tr>",
  312. r,p,m,v,e,wi,wm,t);
  313. }
  314. fprintf(ofile,"\n</table></html>");
  315. fclose(ofile);
  316. }
  317. void RangeWindow::cb_ExportOO(Fl_Widget* f, void* vtt){
  318. RangeWindow* T = (RangeWindow*)vtt;
  319. char* fname=NULL;
  320. fname = fl_file_chooser("Please select a location and filename to export the OpenOffice spreadsheet.","*.ods","OutputData.ods",0);
  321. if (fname==NULL) return;
  322. FILE* ofile = fopen(fname,"w");
  323. // Print the output to a file.
  324. double r,p,m,v,e,wi,wm,t;
  325. int MIN=T->min;
  326. int MAX=T->max;
  327. int STEP=T->step;
  328. fprintf(ofile, "\n<html><head><title>%s</title></head>","TO DO ");
  329. fprintf(ofile, "\n\n<table><tr>");
  330. fprintf(ofile, "\n<td>Range</td>\
  331. \n<td>Drop</td>\
  332. \n<td>Drop</td>\
  333. \n<td>Velocity</td>\
  334. \n<td>Energy</td>\
  335. \n<td>Winddrift</td>\
  336. \n<td>Windage</td>\
  337. \n<td>Time</td></tr>"
  338. );
  339. fprintf(ofile,"\n\n<tr>");
  340. fprintf(ofile, "\n<td>(yards)</td>\
  341. \n<td>(inches)</td>\
  342. \n<td>(MOA)</td>\
  343. \n<td>(ft/s)</td>\
  344. \n<td>(ft-lb)</td>\
  345. \n<td>(inches)</td>\
  346. \n<td>(MOA)</td>\
  347. \n<td>(s)</td>"
  348. );
  349. int num=T->Sln->MaxRows();
  350. if (MAX>num) MAX=num;
  351. if (MIN>MAX) MIN=MAX;
  352. for (int n=MIN;n<=MAX;n=n+STEP){
  353. r=T->Sln->GetRange(n);
  354. p=T->Sln->GetPath(n);
  355. m=T->Sln->GetMOA(n);
  356. v=T->Sln->GetVelocity(n);
  357. e=0;
  358. wi=T->Sln->GetWindage(n);
  359. wm=T->Sln->GetWindageMOA(n);
  360. t=T->Sln->GetTime(n);
  361. e=T->Sln->Weight()*v*v/450436;
  362. fprintf(ofile,"\n<tr>\
  363. \n<td>%.0f</td>\
  364. \n<td>%.2f</td>\
  365. \n<td>%.2f</td>\
  366. \n<td>%.0f</td>\
  367. \n<td>%.2f</td>\
  368. \n<td>%.2f</td>\
  369. \n<td>%.2f</td>\
  370. \n<td>%.2f</td></tr>",
  371. r,p,m,v,e,wi,wm,t);
  372. }
  373. fprintf(ofile,"\n</table></html>");
  374. fclose(ofile);
  375. }
  376. void RangeWindow::cb_ExportHTML(Fl_Widget* f , void* vtt){
  377. RangeWindow* T = (RangeWindow*)vtt;
  378. char* fname=NULL;
  379. fname = fl_file_chooser("Please select a location and filename to export the HTML data.","*.html","OutputData.html",0);
  380. if (fname==NULL) return;
  381. FILE* ofile = fopen(fname,"w");
  382. // Print the output to a file.
  383. double r,p,m,v,e,wi,wm,t;
  384. int MIN=T->min;
  385. int MAX=T->max;
  386. int STEP=T->step;
  387. fprintf(ofile, "\n<html><head><title>%s</title></head>","");
  388. fprintf(ofile, "\n\n<table width=560 bgcolor=black><tr>");
  389. fprintf(ofile, "\n<td width=70 bgcolor=white align=center><b>Range</b></td>\
  390. \n<td width=70 bgcolor=white align=center><b>Drop</b></td>\
  391. \n<td width=70 bgcolor=white align=center><b>Drop</b></td>\
  392. \n<td width=70 bgcolor=white align=center><b>Velocity</b></td>\
  393. \n<td width=70 bgcolor=white align=center><b>Energy</b></td>\
  394. \n<td width=70 bgcolor=white align=center><b>Winddrift</b></td>\
  395. \n<td width=70 bgcolor=white align=center><b>Windage</b></td>\
  396. \n<td width=70 bgcolor=white align=center><b>Time</b></td></tr>"
  397. );
  398. fprintf(ofile,"\n\n<tr>");
  399. fprintf(ofile, "\n<td width=70 bgcolor=white align=center><b>(yards)</b></td>\
  400. \n<td width=70 bgcolor=white align=center><b>(inches)</b></td>\
  401. \n<td width=70 bgcolor=white align=center><b>(MOA)</b></td>\
  402. \n<td width=70 bgcolor=white align=center><b>(ft/s)</b></td>\
  403. \n<td width=70 bgcolor=white align=center><b>(ft-lb)</b></td>\
  404. \n<td width=70 bgcolor=white align=center><b>(inches)</b></td>\
  405. \n<td width=70 bgcolor=white align=center><b>(MOA)</b></td>\
  406. \n<td width=70 bgcolor=white align=center><b>(s)</b></td>"
  407. );
  408. int num=T->Sln->MaxRows();
  409. if (MAX>num) MAX=num;
  410. if (MIN>MAX) MIN=MAX;
  411. for (int n=MIN;n<=MAX;n=n+STEP){
  412. r=T->Sln->GetRange(n);
  413. p=T->Sln->GetPath(n);
  414. m=T->Sln->GetMOA(n);
  415. v=T->Sln->GetVelocity(n);
  416. e=0;
  417. wi=T->Sln->GetWindage(n);
  418. wm=T->Sln->GetWindageMOA(n);
  419. t=T->Sln->GetTime(n);
  420. e=T->Sln->Weight()*v*v/450436;
  421. e=v*v/450436;
  422. fprintf(ofile,"\n\n<tr>\
  423. \n<td width=70 bgcolor=white align=center>%.0f</td>\
  424. \n<td width=70 bgcolor=white align=center>%.2f</td>\
  425. \n<td width=70 bgcolor=white align=center>%.2f</td>\
  426. \n<td width=70 bgcolor=white align=center>%.0f</td>\
  427. \n<td width=70 bgcolor=white align=center>%.2f</td>\
  428. \n<td width=70 bgcolor=white align=center>%.2f</td>\
  429. \n<td width=70 bgcolor=white align=center>%.2f</td>\
  430. \n<td width=70 bgcolor=white align=center>%.2f</td></tr>",
  431. r,p,m,v,e,wi,wm,t);
  432. }
  433. fprintf(ofile,"\n</table></html>");
  434. fclose(ofile);
  435. }
  436. void RangeWindow::cb_ExportSQL(Fl_Widget* f, void* vtt){
  437. RangeWindow* T = (RangeWindow*)vtt;
  438. char* fname=NULL;
  439. fname = fl_file_chooser("Please select a location and filename to export the SQL File.","*.sql","OutputData.sql",0);
  440. if (fname==NULL) return;
  441. FILE* ofile = fopen(fname,"w");
  442. // Print the output to a file.
  443. double r,p,m,v,e,wi,wm,t;
  444. int MIN=T->min;
  445. int MAX=T->max;
  446. int STEP=T->step;
  447. int num=T->Sln->MaxRows();
  448. if (MAX>num) MAX=num;
  449. if (MIN>MAX) MIN=MAX;
  450. for (int n=MIN;n<=MAX;n=n+STEP){
  451. r=T->Sln->GetRange(n);
  452. p=T->Sln->GetPath(n);
  453. m=T->Sln->GetMOA(n);
  454. v=T->Sln->GetVelocity(n);
  455. e=0;
  456. wi=T->Sln->GetWindage(n);
  457. wm=T->Sln->GetWindageMOA(n);
  458. t=T->Sln->GetTime(n);
  459. e=T->Sln->Weight()*v*v/450436;
  460. fprintf(ofile,"\nINSERT INTO BallisticData {range, drop, elevation, velocity, energy, winddrift, windage, time} VALUES\
  461. {%.0f,\
  462. %.2f, \
  463. %.2f,\
  464. %.0f,\
  465. %.2f,\
  466. %.2f,\
  467. %.2f,\
  468. %.2f};",
  469. r,p,m,v,e,wi,wm,t);
  470. }
  471. fclose(ofile);
  472. }
  473. void RangeWindow::cb_ExportXML(Fl_Widget* f, void* vtt){
  474. RangeWindow* T = (RangeWindow*)vtt;
  475. char* fname=NULL;
  476. fname = fl_file_chooser("Please select a location and filename to export the XML File.","*.xml","OutputData.xml",0);
  477. if (fname==NULL) return;
  478. FILE* ofile = fopen(fname,"w");
  479. // Print the output to a file.
  480. double r,p,m,v,e,wi,wm,t;
  481. int MIN=T->min;
  482. int MAX=T->max;
  483. int STEP=T->step;
  484. fprintf(ofile, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
  485. fprintf(ofile, "\n<SolutionTitle>%s</SolutionTitle>","TEST");
  486. fprintf(ofile, "\n\n<SolutionData>");
  487. int num=T->Sln->MaxRows();
  488. if (MAX>num) MAX=num;
  489. if (MIN>MAX) MIN=MAX;
  490. for (int n=MIN;n<=MAX;n=n+STEP){
  491. r=T->Sln->GetRange(n);
  492. p=T->Sln->GetPath(n);
  493. m=T->Sln->GetMOA(n);
  494. v=T->Sln->GetVelocity(n);
  495. e=0;
  496. wi=T->Sln->GetWindage(n);
  497. wm=T->Sln->GetWindageMOA(n);
  498. t=T->Sln->GetTime(n);
  499. e=T->Sln->Weight()*v*v/450436;
  500. fprintf(ofile,"\n<SolutionElement>\
  501. <Range>%.0f</Range>\
  502. <Drop>%.2f</Drop>\
  503. <Elevation>%.2f</Elevation>\
  504. <Velocity>%.0f</Velocity>\
  505. <Energy>%.2f</Energy>\
  506. <Winddrift>%.2f</Winddrift>\
  507. <Windage>%.2f</Windage>\
  508. <Time>%.2f</td></Time></SolutionElement>",
  509. r,p,m,v,e,wi,wm,t);
  510. }
  511. fprintf(ofile,"\n</SolutionData>");
  512. fclose(ofile);
  513. }
  514. void RangeWindow::cb_Close(Fl_Widget* f, void* v){
  515. RangeWindow* T = (RangeWindow*)v;
  516. T->~RangeWindow();
  517. }
  518. void RangeWindow::cb_ExportPDF(Fl_Widget*, void* vtt){
  519. RangeWindow* T = (RangeWindow*)vtt;
  520. char* fname=NULL;
  521. fname = fl_file_chooser("Please select a location and filename to save the PDF Document.","*.pdf","OutputData.pdf ",0);
  522. if (fname==NULL) return;
  523. const char *page_title = T->Sln->Name();
  524. HPDF_Doc pdf;
  525. HPDF_Page page;
  526. HPDF_Font def_font;
  527. HPDF_REAL tw;
  528. HPDF_REAL height;
  529. HPDF_REAL width;
  530. pdf = HPDF_New (NULL, NULL);
  531. /* Add a new page object. */
  532. page = HPDF_AddPage (pdf);
  533. height = HPDF_Page_GetHeight (page);
  534. width = HPDF_Page_GetWidth (page);
  535. /* Print the title of the page (with positioning center). */
  536. def_font = HPDF_GetFont (pdf, "Helvetica", NULL);
  537. HPDF_Page_SetFontAndSize (page, def_font, 16);
  538. tw = HPDF_Page_TextWidth (page, page_title);
  539. HPDF_Page_BeginText (page);
  540. HPDF_Page_TextOut (page, (width - tw) / 2, height - 50, page_title);
  541. HPDF_Page_EndText (page);
  542. HPDF_Page_SetFontAndSize(page,def_font,8);
  543. tw = HPDF_Page_TextWidth(page,"GNU Exterior Ballistics, v1.05");
  544. HPDF_Page_BeginText(page);
  545. HPDF_Page_TextOut (page, (width-tw)/2, height-62, "GNU Exterior Ballistics, v1.05");
  546. HPDF_Page_EndText(page);
  547. /* output Row Data. */
  548. int margin=50;
  549. int colsize=62;
  550. int rowheight=10;
  551. int footer=50;
  552. HPDF_Page_SetFontAndSize (page, def_font, 10);
  553. HPDF_Page_BeginText (page);
  554. // First print the weather condition data and such.
  555. char* str = (char*)malloc(1024*sizeof(char));
  556. // Print some general information about the load.
  557. sprintf(str,"Drag Coefficient: %.3f Projectile Weight: %d grains",T->Sln->BC(), T->Sln->Weight());
  558. HPDF_Page_TextOut (page,margin+0*colsize, height - 80 - rowheight*0, str);
  559. sprintf(str,"Initial Velocity: %d (ft/s) Zero Range: %d yards Shooting Angle: %d degrees",T->Sln->MuzzleVelocity(), T->Sln->ZeroRange(), T->Sln->ShootingAngle());
  560. HPDF_Page_TextOut (page,margin+0*colsize, height - 80 - rowheight*1, str);
  561. sprintf(str,"Wind Velocity: %d mph Wind Direction: %d degrees",T->Sln->WindSpeed(), T->Sln->WindAngle());
  562. HPDF_Page_TextOut (page,margin+0*colsize, height - 80 - rowheight*2, str);
  563. sprintf(str,"Altitude: %d feet Barometer: %.2f in-Hg Temperature: %d F Relative Humidity: %d%%",T->Sln->Altitude(), T->Sln->Pressure(), T->Sln->Temp(), T->Sln->Humidity());
  564. HPDF_Page_TextOut (page,margin+0*colsize, height - 80 - rowheight*3, str);
  565. HPDF_Page_TextOut (page,margin+0*colsize, height - 80 - rowheight*5, "Range");
  566. HPDF_Page_TextOut(page,margin+1*colsize,height-80- rowheight*5, "Drop");
  567. HPDF_Page_TextOut(page,margin+2*colsize,height-80- rowheight*5,"Elevation");
  568. HPDF_Page_TextOut(page,margin+3*colsize,height-80- rowheight*5,"Velocity");
  569. HPDF_Page_TextOut(page,margin+4*colsize,height-80- rowheight*5,"Energy");
  570. HPDF_Page_TextOut(page,margin+5*colsize,height-80- rowheight*5,"Wind Drift");
  571. HPDF_Page_TextOut(page,margin+6*colsize,height-80- rowheight*5,"Windage");
  572. HPDF_Page_TextOut(page,margin+7*colsize,height-80- rowheight*5,"Time");
  573. HPDF_Page_TextOut (page,margin+0*colsize, height - 80 - rowheight*6, "(yards)");
  574. HPDF_Page_TextOut(page,margin+1*colsize,height-80- rowheight*6, "(inches)");
  575. HPDF_Page_TextOut(page,margin+2*colsize,height-80- rowheight*6,"(MOA)");
  576. HPDF_Page_TextOut(page,margin+3*colsize,height-80- rowheight*6,"(ft/s)");
  577. HPDF_Page_TextOut(page,margin+4*colsize,height-80- rowheight*6,"(ft-lb)");
  578. HPDF_Page_TextOut(page,margin+5*colsize,height-80- rowheight*6,"(inches)");
  579. HPDF_Page_TextOut(page,margin+6*colsize,height-80- rowheight*6,"(MOA)");
  580. HPDF_Page_TextOut(page,margin+7*colsize,height-80- rowheight*6,"(seconds)");
  581. HPDF_Page_EndText (page);
  582. // Print the rows iteratively
  583. double r,p,m,v,e,wi,wm,t;
  584. int MIN=T->min;
  585. int MAX=T->max;
  586. int STEP=T->step;
  587. int row=8;
  588. HPDF_Page_SetFontAndSize (page, def_font, 8);
  589. for (int n=MIN;n<=MAX;n=n+STEP){
  590. r=T->Sln->GetRange(n);
  591. p=T->Sln->GetPath(n);
  592. m=T->Sln->GetMOA(n);
  593. v=T->Sln->GetVelocity(n);
  594. e=0;
  595. wi=T->Sln->GetWindage(n);
  596. wm=T->Sln->GetWindageMOA(n);
  597. t=T->Sln->GetTime(n);
  598. e=T->Sln->Weight()*v*v/450436;
  599. // Print the row.
  600. HPDF_Page_BeginText (page);
  601. sprintf(str,"%.0f",r); HPDF_Page_TextOut (page,margin+0*colsize, height - 80 - rowheight*row,str);
  602. sprintf(str,"%.2f",p); HPDF_Page_TextOut (page,margin+1*colsize, height - 80 - rowheight*row,str);
  603. sprintf(str,"%.2f",m); HPDF_Page_TextOut (page,margin+2*colsize, height - 80 - rowheight*row,str);
  604. sprintf(str,"%.0f",v); HPDF_Page_TextOut (page,margin+3*colsize, height - 80 - rowheight*row,str);
  605. sprintf(str,"%.0f",e); HPDF_Page_TextOut (page,margin+4*colsize, height - 80 - rowheight*row,str);
  606. sprintf(str,"%.2f",wi); HPDF_Page_TextOut (page,margin+5*colsize, height - 80 - rowheight*row,str);
  607. sprintf(str,"%.2f",wm); HPDF_Page_TextOut (page,margin+6*colsize, height - 80 - rowheight*row,str);
  608. sprintf(str,"%.2f",t); HPDF_Page_TextOut (page,margin+7*colsize, height - 80 - rowheight*row,str);
  609. HPDF_Page_EndText (page);
  610. row++;
  611. if ((height-80-rowheight*row)<footer){
  612. // Insert a new page, we have come to the end of this one.
  613. page = HPDF_AddPage (pdf);
  614. HPDF_Page_SetFontAndSize (page, def_font, 10);
  615. HPDF_Page_BeginText (page);
  616. HPDF_Page_TextOut (page,margin+0*colsize, height - 80 - rowheight*2, "Range");
  617. HPDF_Page_TextOut(page,margin+1*colsize,height-80- rowheight*2, "Drop");
  618. HPDF_Page_TextOut(page,margin+2*colsize,height-80- rowheight*2,"Elevation");
  619. HPDF_Page_TextOut(page,margin+3*colsize,height-80- rowheight*2,"Velocity");
  620. HPDF_Page_TextOut(page,margin+4*colsize,height-80- rowheight*2,"Energy");
  621. HPDF_Page_TextOut(page,margin+5*colsize,height-80- rowheight*2,"Wind Drift");
  622. HPDF_Page_TextOut(page,margin+6*colsize,height-80- rowheight*2,"Windage");
  623. HPDF_Page_TextOut(page,margin+7*colsize,height-80- rowheight*2,"Time");
  624. HPDF_Page_TextOut (page,margin+0*colsize, height - 80 - rowheight*3, "(yards)");
  625. HPDF_Page_TextOut(page,margin+1*colsize,height-80- rowheight*3, "(inches)");
  626. HPDF_Page_TextOut(page,margin+2*colsize,height-80- rowheight*3,"(MOA)");
  627. HPDF_Page_TextOut(page,margin+3*colsize,height-80- rowheight*3,"(ft/s)");
  628. HPDF_Page_TextOut(page,margin+4*colsize,height-80- rowheight*3,"(ft-lb)");
  629. HPDF_Page_TextOut(page,margin+5*colsize,height-80- rowheight*3,"(inches)");
  630. HPDF_Page_TextOut(page,margin+6*colsize,height-80- rowheight*3,"(MOA)");
  631. HPDF_Page_TextOut(page,margin+7*colsize,height-80- rowheight*3,"(seconds)");
  632. HPDF_Page_EndText (page);
  633. HPDF_Page_SetFontAndSize (page, def_font, 8);
  634. row=5;
  635. }
  636. }
  637. free(str);
  638. HPDF_SaveToFile (pdf, fname);
  639. /* clean up */
  640. HPDF_Free (pdf);
  641. }