622efb29f56773e553b41ab8b7c6f486ee091345
[ctsim.git] / src / dialogs.cpp
1 /*****************************************************************************
2 ** FILE IDENTIFICATION
3 **
4 **   Name:          dialogs.cpp
5 **   Purpose:       Dialog routines for CTSim program
6 **   Programmer:    Kevin Rosenberg
7 **   Date Started:  July 2000
8 **
9 **  This is part of the CTSim program
10 **  Copyright (C) 1983-2000 Kevin Rosenberg
11 **
12 **  $Id: dialogs.cpp,v 1.18 2000/12/20 20:08:48 kevin Exp $
13 **
14 **  This program is free software; you can redistribute it and/or modify
15 **  it under the terms of the GNU General Public License (version 2) as
16 **  published by the Free Software Foundation.
17 **
18 **  This program is distributed in the hope that it will be useful,
19 **  but WITHOUT ANY WARRANTY; without even the implied warranty of
20 **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 **  GNU General Public License for more details.
22 **
23 **  You should have received a copy of the GNU General Public License
24 **  along with this program; if not, write to the Free Software
25 **  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26 ******************************************************************************/
27
28 #ifdef __GNUG__
29 // #pragma implementation
30 #endif
31
32 // For compilers that support precompilation, includes "wx/wx.h".
33 #include "wx/wxprec.h"
34
35 #ifdef __BORLANDC__
36 #pragma hdrstop
37 #endif
38
39 #ifndef WX_PRECOMP
40 #include "wx/wx.h"
41 #endif
42
43 #if !wxUSE_DOC_VIEW_ARCHITECTURE
44 #error You must set wxUSE_DOC_VIEW_ARCHITECTURE to 1 in setup.h!
45 #endif
46
47 #include "wx/statline.h"
48 #include "wx/sizer.h"
49 #include "dialogs.h"
50 #include "ctsupport.h"
51 #include "ctsim.h"
52 #include "scanner.h"
53 #include "phantom.h"
54 #include "filter.h"
55 #include "backprojectors.h"
56
57 #if defined(MSVC) || HAVE_SSTREAM\r
58 #include <sstream>\r
59 #else\r
60 #include <sstream_subst>\r
61 #endif\r
62 \r
63
64 StringValueAndTitleListBox::StringValueAndTitleListBox (wxDialog* pParent, int nChoices, const char* aszTitle[], const char* aszValue[])
65   : wxListBox ()
66 {
67     wxString* psTitle = new wxString [nChoices];
68     for (int i = 0; i < nChoices; i++)
69         psTitle[i] = aszTitle[i];
70
71     Create (pParent, -1, wxDefaultPosition, wxSize(200,-1), nChoices, psTitle, wxLB_SINGLE | wxLB_NEEDED_SB);
72
73     m_ppszValues = aszValue;\r
74         delete [] psTitle;
75 };
76
77 const char*
78 StringValueAndTitleListBox::getSelectionStringValue (void) const
79 {
80   return m_ppszValues[GetSelection()];
81 }
82
83
84
85 DialogGetPhantom::DialogGetPhantom (wxFrame* pParent, int iDefaultPhantom)
86     : wxDialog (pParent, -1, "Select Phantom", wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxCAPTION)
87 {
88   wxBoxSizer* pTopSizer = new wxBoxSizer (wxVERTICAL);
89
90   pTopSizer->Add (new wxStaticText (this, -1, "Select Phantom"), 0, wxALIGN_CENTER | wxALL, 5);
91                    
92   pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxALL, 5);
93
94   m_pListBoxPhantom = new StringValueAndTitleListBox (this, Phantom::getPhantomCount(), Phantom::getPhantomTitleArray(), Phantom::getPhantomNameArray());
95   m_pListBoxPhantom->SetSelection (iDefaultPhantom);
96   pTopSizer->Add (m_pListBoxPhantom, 0, wxALL | wxALIGN_CENTER | wxEXPAND);
97
98   pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
99
100   wxBoxSizer* pButtonSizer = new wxBoxSizer (wxHORIZONTAL);
101   wxButton* pButtonOk = new wxButton (this, wxID_OK, "Okay");
102   wxButton* pButtonCancel = new wxButton (this, wxID_CANCEL, "Cancel");
103   pButtonSizer->Add (pButtonOk, 0, wxEXPAND | wxALL, 10);
104   pButtonSizer->Add (pButtonCancel, 0, wxEXPAND | wxALL, 10);
105
106   pTopSizer->Add (pButtonSizer, 0, wxALIGN_CENTER);
107
108   SetAutoLayout (true);
109   SetSizer (pTopSizer);
110   pTopSizer->Fit (this);
111   pTopSizer->SetSizeHints (this);
112 }
113
114 const char*
115 DialogGetPhantom::getPhantom(void)
116 {
117     return m_pListBoxPhantom->getSelectionStringValue();
118 }
119
120 \r
121 /////////////////////////////////////////////////////////////////////\r
122 // CLASS DiaglogGetMinMax Implementation\r
123 /////////////////////////////////////////////////////////////////////\r
124
125 DialogGetMinMax::DialogGetMinMax (wxFrame* pParent, const char* const pszTitle, double dDefaultMin, double dDefaultMax)
126     : wxDialog (pParent, -1, pszTitle, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxCAPTION)
127 {
128   wxBoxSizer* pTopSizer = new wxBoxSizer (wxVERTICAL);
129
130   pTopSizer->Add (new wxStaticText (this, -1, pszTitle), 0, wxALIGN_CENTER | wxTOP | wxLEFT | wxRIGHT, 5);
131                    
132   pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
133
134   std::ostringstream os;
135   os << dDefaultMin;
136   m_pTextCtrlMin = new wxTextCtrl (this, -1, os.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
137   std::ostringstream osMax;
138   osMax << dDefaultMax;
139   m_pTextCtrlMax = new wxTextCtrl (this, -1, osMax.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
140
141   wxFlexGridSizer *pGridSizer = new wxFlexGridSizer (2);
142   pGridSizer->Add (new wxStaticText (this, -1, "Minimum"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
143   pGridSizer->Add (m_pTextCtrlMin, 0, wxALIGN_CENTER_VERTICAL);
144   pGridSizer->Add (new wxStaticText (this, -1, "Maximum"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
145   pGridSizer->Add (m_pTextCtrlMax, 0, wxALIGN_CENTER_VERTICAL);
146   pTopSizer->Add (pGridSizer, 1, wxALL, 10);
147
148   pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
149
150   wxBoxSizer* pButtonSizer = new wxBoxSizer (wxHORIZONTAL);
151   wxButton* pButtonOk = new wxButton (this, wxID_OK, "Okay");
152   wxButton* pButtonCancel = new wxButton (this, wxID_CANCEL, "Cancel");
153   pButtonSizer->Add (pButtonOk, 0, wxEXPAND | wxALL, 10);
154   pButtonSizer->Add (pButtonCancel, 0, wxEXPAND | wxALL, 10);
155
156   pTopSizer->Add (pButtonSizer, 0, wxALIGN_CENTER);
157
158   SetAutoLayout (true);
159   SetSizer (pTopSizer);
160   pTopSizer->Fit (this);
161   pTopSizer->SetSizeHints (this);
162 }
163
164 DialogGetMinMax::~DialogGetMinMax (void)
165 {
166 }
167
168 double
169 DialogGetMinMax::getMinimum (void)
170 {
171     wxString strCtrl = m_pTextCtrlMin->GetValue();
172     double dValue;
173     if (strCtrl.ToDouble (&dValue))
174         return dValue;
175     else
176         return (m_dDefaultMin);
177 }
178
179 double
180 DialogGetMinMax::getMaximum (void)
181 {
182     wxString strCtrl = m_pTextCtrlMax->GetValue();
183     double dValue;
184     if (strCtrl.ToDouble (&dValue))
185         return dValue;
186     else
187         return (m_dDefaultMax);
188 }
189
190
191 /////////////////////////////////////////////////////////////////////\r
192 // CLASS DialogAutoScaleParameters IMPLEMENTATION\r
193 /////////////////////////////////////////////////////////////////////\r
194 \r
195 DialogAutoScaleParameters::DialogAutoScaleParameters (wxFrame *pParent, double mean, double mode, double median, double stddev, double dDefaultScaleFactor)\r
196   : wxDialog (pParent, -1, "Auto Scale Parameters", wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxCAPTION), m_dMean(mean), m_dMode(mode), m_dMedian(median), m_dStdDev(stddev)\r
197 {\r
198   wxBoxSizer* pTopSizer = new wxBoxSizer (wxVERTICAL);\r
199 \r
200   pTopSizer->Add (new wxStaticText (this, -1, "Auto Scale Parameters"), 0, wxALIGN_CENTER | wxTOP | wxLEFT | wxRIGHT, 5);\r
201                    \r
202   pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);\r
203 \r
204   wxString asTitle[3];\r
205   asTitle[0] = "Median";\r
206   asTitle[1] = "Mode";\r
207   asTitle[2] = "Mean";\r
208 \r
209   m_pListBoxCenter = new wxListBox (this, -1, wxDefaultPosition, wxDefaultSize, 3, asTitle, wxLB_SINGLE | wxLB_NEEDED_SB);\r
210   m_pListBoxCenter->SetSelection (0);\r
211   pTopSizer->Add (m_pListBoxCenter, 0, wxALL | wxALIGN_CENTER | wxEXPAND);\r
212 \r
213   wxGridSizer *pGridSizer = new wxGridSizer (2);\r
214   pGridSizer->Add (new wxStaticText (this, -1, "Standard Deviation Factor"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);\r
215   std::ostringstream osDefaultFactor;\r
216   osDefaultFactor << dDefaultScaleFactor;\r
217   m_pTextCtrlStdDevFactor = new wxTextCtrl (this, -1, osDefaultFactor.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);\r
218   pGridSizer->Add (m_pTextCtrlStdDevFactor, 0, wxALIGN_CENTER_VERTICAL);\r
219   pTopSizer->Add (pGridSizer, 1, wxALL, 10);\r
220 \r
221   pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);\r
222 \r
223   wxBoxSizer* pButtonSizer = new wxBoxSizer (wxHORIZONTAL);\r
224   wxButton* pButtonOk = new wxButton (this, wxID_OK, "Okay");\r
225   wxButton* pButtonCancel = new wxButton (this, wxID_CANCEL, "Cancel");\r
226   pButtonSizer->Add (pButtonOk, 0, wxEXPAND | wxALL, 10);\r
227   pButtonSizer->Add (pButtonCancel, 0, wxEXPAND | wxALL, 10);\r
228 \r
229   pTopSizer->Add (pButtonSizer, 0, wxALIGN_CENTER);\r
230 \r
231   SetAutoLayout (true);\r
232   SetSizer (pTopSizer);\r
233   pTopSizer->Fit (this);\r
234   pTopSizer->SetSizeHints (this);\r
235 }\r
236 \r
237 bool\r
238 DialogAutoScaleParameters::getMinMax (double* pMin, double* pMax)\r
239 {\r
240   int iCenter = m_pListBoxCenter->GetSelection();\r
241   double dCenter = m_dMedian;\r
242   if (iCenter == 1)\r
243     dCenter = m_dMode;\r
244   else if (iCenter == 2)\r
245     dCenter = m_dMode;\r
246   \r
247   wxString sStddevFactor = m_pTextCtrlStdDevFactor->GetValue();\r
248   double dValue;\r
249   if (! sStddevFactor.ToDouble (&dValue)) {\r
250     *theApp->getLog() << "Error: Non-numeric Standard Deviation Factor of " << sStddevFactor << "\n";\r
251         return false;\r
252   }\r
253   double dHalfWidth = dValue * m_dStdDev / 2;\r
254   *pMin = dCenter - dHalfWidth;\r
255   *pMax = dCenter + dHalfWidth;\r
256   *theApp->getLog() << "Setting minimum to " << *pMin << " and maximum to " << *pMax << "\n";\r
257 \r
258   return true;\r
259 }\r
260 \r
261 double\r
262 DialogAutoScaleParameters::getAutoScaleFactor ()\r
263 {\r
264   wxString sStddevFactor = m_pTextCtrlStdDevFactor->GetValue();\r
265   double dValue = 1.;\r
266   if (! sStddevFactor.ToDouble (&dValue)) {\r
267     *theApp->getLog() << "Error: Non-numeric Standard Deviation Factor of " << sStddevFactor << "\n";\r
268   }\r
269 \r
270   return dValue;\r
271 }\r
272 \r
273 \r
274 /////////////////////////////////////////////////////////////////////
275 // CLASS IDENTIFICATION
276 //
277 // DialogGetRasterParameters
278 /////////////////////////////////////////////////////////////////////
279
280 DialogGetRasterParameters::DialogGetRasterParameters (wxFrame* pParent, int iDefaultXSize, int iDefaultYSize, int iDefaultNSamples)
281     : wxDialog (pParent, -1, "Set Rasterization Parameters", wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxCAPTION)
282 {
283   wxBoxSizer* pTopSizer = new wxBoxSizer (wxVERTICAL);
284
285   pTopSizer->Add (new wxStaticText (this, -1, "Set Rasterization Parameters"), 0, wxALIGN_CENTER | wxTOP | wxLEFT | wxRIGHT, 5);
286                    
287   pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
288
289   std::ostringstream os;
290   os << iDefaultXSize;
291   m_pTextCtrlXSize = new wxTextCtrl (this, -1, os.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
292   std::ostringstream osYSize;
293   osYSize << iDefaultYSize;
294   m_pTextCtrlYSize = new wxTextCtrl (this, -1, osYSize.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
295   std::ostringstream osNSamples;
296   osNSamples << iDefaultNSamples;
297   m_pTextCtrlNSamples = new wxTextCtrl (this, -1, osNSamples.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
298
299   wxFlexGridSizer *pGridSizer = new wxFlexGridSizer (2);
300   pGridSizer->Add (new wxStaticText (this, -1, "X Size"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
301   pGridSizer->Add (m_pTextCtrlXSize, 0, wxALIGN_CENTER_VERTICAL);
302   pGridSizer->Add (new wxStaticText (this, -1, "Y Size"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
303   pGridSizer->Add (m_pTextCtrlYSize, 0, wxALIGN_CENTER_VERTICAL);
304   pGridSizer->Add (new wxStaticText (this, -1, "Samples per Pixel"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
305   pGridSizer->Add (m_pTextCtrlNSamples, 0, wxALIGN_CENTER_VERTICAL);
306   pTopSizer->Add (pGridSizer, 1, wxALL, 10);
307
308   pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
309
310   wxBoxSizer* pButtonSizer = new wxBoxSizer (wxHORIZONTAL);
311   wxButton* pButtonOk = new wxButton (this, wxID_OK, "Okay");
312   wxButton* pButtonCancel = new wxButton (this, wxID_CANCEL, "Cancel");
313   pButtonSizer->Add (pButtonOk, 0, wxEXPAND | wxALL, 10);
314   pButtonSizer->Add (pButtonCancel, 0, wxEXPAND | wxALL, 10);
315
316   pTopSizer->Add (pButtonSizer, 0, wxALIGN_CENTER);
317
318   SetAutoLayout (true);
319   SetSizer (pTopSizer);
320   pTopSizer->Fit (this);
321   pTopSizer->SetSizeHints (this);
322 }
323
324 DialogGetRasterParameters::~DialogGetRasterParameters (void)
325 {
326 }
327
328
329 unsigned int
330 DialogGetRasterParameters::getXSize (void)
331 {
332     wxString strCtrl = m_pTextCtrlXSize->GetValue();
333     unsigned long lValue;
334     if (strCtrl.ToULong (&lValue))
335         return lValue;
336     else
337         return (m_iDefaultXSize);
338 }
339
340 unsigned int
341 DialogGetRasterParameters::getYSize (void)
342 {
343     wxString strCtrl = m_pTextCtrlYSize->GetValue();
344     unsigned long lValue;
345     if (strCtrl.ToULong (&lValue))
346         return lValue;
347     else
348         return (m_iDefaultYSize);
349 }
350
351
352 unsigned int
353 DialogGetRasterParameters::getNSamples (void)
354 {
355     wxString strCtrl = m_pTextCtrlNSamples->GetValue();
356     unsigned long lValue;
357     if (strCtrl.ToULong (&lValue))
358         return lValue;
359     else
360         return (m_iDefaultNSamples);
361 }
362
363
364
365 /////////////////////////////////////////////////////////////////////
366 // CLASS IDENTIFICATION
367 //
368 // DialogGetProjectionParameters
369 /////////////////////////////////////////////////////////////////////
370
371
372 DialogGetProjectionParameters::DialogGetProjectionParameters (wxFrame* pParent, int iDefaultNDet, int iDefaultNView, int iDefaultNSamples, double dDefaultRotAngle, double dDefaultFocalLength, double dDefaultFieldOfView, int iDefaultGeometry, int iDefaultTrace)
373   : wxDialog (pParent, -1, "Set Projection Parameters", wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxCAPTION)
374 {
375   wxBoxSizer* pTopSizer = new wxBoxSizer (wxVERTICAL);
376
377   m_dDefaultRotAngle = dDefaultRotAngle;
378   m_dDefaultFocalLength = dDefaultFocalLength;
379   m_dDefaultFieldOfView = dDefaultFieldOfView;
380   m_iDefaultNSamples = iDefaultNSamples;
381   m_iDefaultNView = iDefaultNView;
382   m_iDefaultNDet = iDefaultNDet;
383   m_iDefaultTrace = iDefaultTrace;
384   m_iDefaultGeometry = iDefaultGeometry;
385
386   pTopSizer->Add (new wxStaticText (this, -1, "Set Projection Parameters"), 0, wxALIGN_CENTER | wxTOP | wxLEFT | wxRIGHT, 5);
387                    
388   pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
389
390   std::ostringstream os;
391   os << iDefaultNDet;
392   m_pTextCtrlNDet = new wxTextCtrl (this, -1, os.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
393   std::ostringstream osNView;
394   osNView << iDefaultNView;
395   m_pTextCtrlNView = new wxTextCtrl (this, -1, osNView.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
396   std::ostringstream osNSamples;
397   osNSamples << iDefaultNSamples;
398   m_pTextCtrlNSamples = new wxTextCtrl (this, -1, osNSamples.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
399   std::ostringstream osRotAngle;
400   osRotAngle << dDefaultRotAngle;
401   m_pTextCtrlRotAngle = new wxTextCtrl (this, -1, osRotAngle.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
402   std::ostringstream osFocalLength;
403   osFocalLength << dDefaultFocalLength;
404   m_pTextCtrlFocalLength = new wxTextCtrl (this, -1, osFocalLength.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
405   std::ostringstream osFieldOfView;
406   osFieldOfView << dDefaultFieldOfView;
407   m_pTextCtrlFieldOfView = new wxTextCtrl (this, -1, osFieldOfView.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
408
409   wxFlexGridSizer* pGridSizer = new wxFlexGridSizer (2);
410   pGridSizer->Add (new wxStaticText (this, -1, "Scanner Geometry"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
411   m_pListBoxGeometry = new StringValueAndTitleListBox (this, Scanner::getGeometryCount(), Scanner::getGeometryTitleArray(), Scanner::getGeometryNameArray());
412   m_pListBoxGeometry->SetSelection (iDefaultGeometry);
413
414   pGridSizer->Add (m_pListBoxGeometry, 0, wxALL | wxALIGN_CENTER | wxEXPAND);
415
416   pGridSizer->Add (new wxStaticText (this, -1, "Detectors"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
417   pGridSizer->Add (m_pTextCtrlNDet, 0, wxALIGN_CENTER_VERTICAL);
418   pGridSizer->Add (new wxStaticText (this, -1, "Views"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
419   pGridSizer->Add (m_pTextCtrlNView, 0, wxALIGN_CENTER_VERTICAL);
420   pGridSizer->Add (new wxStaticText (this, -1, "Samples per Detector"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
421   pGridSizer->Add (m_pTextCtrlNSamples, 0, wxALIGN_CENTER_VERTICAL);
422   pGridSizer->Add (new wxStaticText (this, -1, "Rotation Angle (PI units)"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
423   pGridSizer->Add (m_pTextCtrlRotAngle, 0, wxALIGN_CENTER_VERTICAL);
424   pGridSizer->Add (new wxStaticText (this, -1, "Focal Length Ratio (phantom radius units)"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
425   pGridSizer->Add (m_pTextCtrlFocalLength, 0, wxALIGN_CENTER_VERTICAL);
426   pGridSizer->Add (new wxStaticText (this, -1, "Field of View (phantom diameter units)"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
427   pGridSizer->Add (m_pTextCtrlFieldOfView, 0, wxALIGN_CENTER_VERTICAL);
428
429   m_pListBoxTrace = new StringValueAndTitleListBox (this, Trace::getTraceCount(), Trace::getTraceTitleArray(), Trace::getTraceNameArray());
430   m_pListBoxTrace->SetSelection (iDefaultTrace);
431
432   pGridSizer->Add (new wxStaticText (this, -1, "Trace Level"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
433   pGridSizer->Add (m_pListBoxTrace, 0, wxALL | wxALIGN_CENTER | wxEXPAND);
434   pTopSizer->Add (pGridSizer, 1, wxALL, 10);
435
436   pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
437
438   wxBoxSizer* pButtonSizer = new wxBoxSizer (wxHORIZONTAL);
439   wxButton* pButtonOk = new wxButton (this, wxID_OK, "Okay");
440   wxButton* pButtonCancel = new wxButton (this, wxID_CANCEL, "Cancel");
441   pButtonSizer->Add (pButtonOk, 0, wxEXPAND | wxALL, 10);
442   pButtonSizer->Add (pButtonCancel, 0, wxEXPAND | wxALL, 10);
443
444   pTopSizer->Add (pButtonSizer, 0, wxALIGN_CENTER);
445
446   SetAutoLayout (true);
447   SetSizer (pTopSizer);
448   pTopSizer->Fit (this);
449   pTopSizer->SetSizeHints (this);
450 }
451
452 DialogGetProjectionParameters::~DialogGetProjectionParameters (void)
453 {
454 }
455
456
457 unsigned int
458 DialogGetProjectionParameters::getNDet (void)
459 {
460     wxString strCtrl = m_pTextCtrlNDet->GetValue();
461     unsigned long lValue;
462     if (strCtrl.ToULong (&lValue))
463         return lValue;
464     else
465         return (m_iDefaultNDet);
466 }
467
468 unsigned int
469 DialogGetProjectionParameters::getNView (void)
470 {
471     wxString strCtrl = m_pTextCtrlNView->GetValue();
472     unsigned long lValue;
473     if (strCtrl.ToULong (&lValue))
474         return lValue;
475     else
476         return (m_iDefaultNView);
477 }
478
479
480 unsigned int
481 DialogGetProjectionParameters::getNSamples (void)
482 {
483     wxString strCtrl = m_pTextCtrlNSamples->GetValue();
484     unsigned long lValue;
485     if (strCtrl.ToULong (&lValue))
486         return lValue;
487     else
488         return (m_iDefaultNSamples);
489 }
490
491 double
492 DialogGetProjectionParameters::getRotAngle (void)
493 {
494     wxString strCtrl = m_pTextCtrlRotAngle->GetValue();
495     double dValue;
496     if (strCtrl.ToDouble (&dValue))
497         return (dValue * PI);
498     else
499       return (m_dDefaultRotAngle);
500 }
501
502 double
503 DialogGetProjectionParameters::getFocalLengthRatio (void)
504 {
505     wxString strCtrl = m_pTextCtrlFocalLength->GetValue();
506     double dValue;
507     if (strCtrl.ToDouble (&dValue))
508         return (dValue);
509     else
510       return (m_dDefaultFocalLength);
511 }
512
513 double
514 DialogGetProjectionParameters::getFieldOfViewRatio (void)
515 {
516     wxString strCtrl = m_pTextCtrlFieldOfView->GetValue();
517     double dValue;
518     if (strCtrl.ToDouble (&dValue))
519         return (dValue);
520     else
521       return (m_dDefaultFieldOfView);
522 }
523
524 const char*
525 DialogGetProjectionParameters::getGeometry (void)
526 {
527   return m_pListBoxGeometry->getSelectionStringValue();
528 }
529
530 int
531 DialogGetProjectionParameters::getTrace (void)
532 {
533   return Trace::convertTraceNameToID(m_pListBoxTrace->getSelectionStringValue());
534 }
535
536
537
538 /////////////////////////////////////////////////////////////////////
539 // CLASS IDENTIFICATION
540 //
541 // DialogGetReconstructionParameters
542 /////////////////////////////////////////////////////////////////////
543
544
545 DialogGetReconstructionParameters::DialogGetReconstructionParameters (wxFrame* pParent, int iDefaultXSize, int iDefaultYSize, int iDefaultFilterID, double dDefaultFilterParam,  int iDefaultFilterMethodID, int iDefaultFilterGenerationID, int iDefaultZeropad, int iDefaultInterpID, int iDefaultInterpParam, int iDefaultBackprojectID, int iTrace)
546     : wxDialog (pParent, -1, "Set Reconstruction Parameters", wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxCAPTION)
547 {
548   wxBoxSizer* pTopSizer = new wxBoxSizer (wxVERTICAL);
549
550   pTopSizer->Add (new wxStaticText (this, -1, "Set Reconstruction Parameters"), 0, wxALIGN_CENTER | wxTOP | wxLEFT | wxRIGHT, 5);
551                    
552   pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
553
554   std::ostringstream os;
555   os << iDefaultXSize;
556   m_pTextCtrlXSize = new wxTextCtrl (this, -1, os.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
557   std::ostringstream osYSize;
558   osYSize << iDefaultYSize;
559   m_pTextCtrlYSize = new wxTextCtrl (this, -1, osYSize.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
560   std::ostringstream osFilterParam;
561   osFilterParam << dDefaultFilterParam;
562   m_pTextCtrlFilterParam = new wxTextCtrl (this, -1, osFilterParam.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
563   std::ostringstream osZeropad;
564   osZeropad << iDefaultZeropad;
565   m_pTextCtrlZeropad = new wxTextCtrl (this, -1, osZeropad.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
566   std::ostringstream osInterpParam;
567   osInterpParam << iDefaultInterpParam;
568   m_pTextCtrlInterpParam = new wxTextCtrl (this, -1, osInterpParam.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
569
570   wxFlexGridSizer* pGridSizer = new wxFlexGridSizer (6);
571   pGridSizer->Add (new wxStaticText (this, -1, "Filter"), 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT | wxALL, 5);
572   m_pListBoxFilter = new StringValueAndTitleListBox (this, SignalFilter::getFilterCount(), SignalFilter::getFilterTitleArray(), SignalFilter::getFilterNameArray());
573   m_pListBoxFilter->SetSelection (iDefaultFilterID);
574   pGridSizer->Add (m_pListBoxFilter, 0, wxALL | wxALIGN_LEFT | wxEXPAND);
575
576   m_pListBoxFilterMethod = new StringValueAndTitleListBox (this, ProcessSignal::getFilterMethodCount(), ProcessSignal::getFilterMethodTitleArray(), ProcessSignal::getFilterMethodNameArray());
577   m_pListBoxFilterMethod->SetSelection (iDefaultFilterMethodID);
578   pGridSizer->Add (new wxStaticText (this, -1, "Filter Method"), 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT | wxALL, 5);
579   pGridSizer->Add (m_pListBoxFilterMethod, 0, wxALL | wxALIGN_LEFT | wxEXPAND);
580
581   m_pListBoxFilterGeneration = new StringValueAndTitleListBox (this, ProcessSignal::getFilterGenerationCount(), ProcessSignal::getFilterGenerationTitleArray(), ProcessSignal::getFilterGenerationNameArray());
582   m_pListBoxFilterGeneration->SetSelection (iDefaultFilterGenerationID);
583   pGridSizer->Add (new wxStaticText (this, -1, "Filter Generation"), 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT | wxALL, 5);
584   pGridSizer->Add (m_pListBoxFilterGeneration, 0, wxALL | wxALIGN_LEFT | wxEXPAND);
585 \r
586   
587   m_pListBoxBackproject = new StringValueAndTitleListBox (this, Backprojector::getBackprojectCount(), Backprojector::getBackprojectTitleArray(), Backprojector::getBackprojectNameArray());
588   m_pListBoxBackproject->SetSelection (iDefaultBackprojectID);
589   pGridSizer->Add (new wxStaticText (this, -1, "Backprojection"), 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT | wxALL, 5);
590   pGridSizer->Add (m_pListBoxBackproject, 0, wxALL | wxALIGN_RIGHT | wxEXPAND);
591
592   m_pListBoxInterp = new StringValueAndTitleListBox (this, Backprojector::getInterpCount(), Backprojector::getInterpTitleArray(), Backprojector::getInterpNameArray());
593   m_pListBoxInterp->SetSelection (iDefaultInterpID);
594   pGridSizer->Add (new wxStaticText (this, -1, "Interpolation"), 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT | wxALL, 5);
595   pGridSizer->Add (m_pListBoxInterp, 0, wxALL | wxALIGN_RIGHT | wxEXPAND);
596
597
598   pGridSizer->Add (new wxStaticText (this, -1, "Trace Level"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);\r
599   static const char* aszTraceTitle[] = {"None", "Full"};\r
600   static const char* aszTraceName[] = {"none", "full"};\r
601   m_pListBoxTrace = new StringValueAndTitleListBox (this, 2, aszTraceTitle, aszTraceName);\r
602   iTrace = clamp(iTrace, 0, 1);\r
603   m_pListBoxTrace->SetSelection (iTrace);\r
604   pGridSizer->Add (m_pListBoxTrace);\r
605 \r
606   pGridSizer->Add (new wxStaticText (this, -1, "X Size"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
607   pGridSizer->Add (m_pTextCtrlXSize, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
608   pGridSizer->Add (new wxStaticText (this, -1, "Y Size"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
609   pGridSizer->Add (m_pTextCtrlYSize, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
610   pGridSizer->Add (new wxStaticText (this, -1, "Filter Parameter"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
611   pGridSizer->Add (m_pTextCtrlFilterParam, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
612   pGridSizer->Add (new wxStaticText (this, -1, "Zeropad"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
613   pGridSizer->Add (m_pTextCtrlZeropad, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
614   pGridSizer->Add (new wxStaticText (this, -1, "Interpolation Parameter"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
615   pGridSizer->Add (m_pTextCtrlInterpParam, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
616
617   pTopSizer->Add (pGridSizer, 1, wxALL, 3);
618
619   pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
620
621   wxBoxSizer* pButtonSizer = new wxBoxSizer (wxHORIZONTAL);
622   wxButton* pButtonOk = new wxButton (this, wxID_OK, "Okay");
623   wxButton* pButtonCancel = new wxButton (this, wxID_CANCEL, "Cancel");
624   pButtonSizer->Add (pButtonOk, 0, wxEXPAND | wxALL, 10);
625   pButtonSizer->Add (pButtonCancel, 0, wxEXPAND | wxALL, 10);
626
627   pTopSizer->Add (pButtonSizer, 0, wxALIGN_CENTER);
628
629   SetAutoLayout (true);
630   SetSizer (pTopSizer);
631   pTopSizer->Layout();
632   pTopSizer->Fit (this);
633   pTopSizer->SetSizeHints (this);
634 }
635
636 DialogGetReconstructionParameters::~DialogGetReconstructionParameters (void)
637 {
638 }
639
640
641 unsigned int
642 DialogGetReconstructionParameters::getXSize (void)
643 {
644     wxString strCtrl = m_pTextCtrlXSize->GetValue();
645     unsigned long lValue;
646     if (strCtrl.ToULong (&lValue))
647         return lValue;
648     else
649         return (m_iDefaultXSize);
650 }
651
652 unsigned int
653 DialogGetReconstructionParameters::getYSize (void)
654 {
655     wxString strCtrl = m_pTextCtrlYSize->GetValue();
656     unsigned long lValue;
657     if (strCtrl.ToULong (&lValue))
658         return lValue;
659     else
660         return (m_iDefaultYSize);
661 }
662
663 unsigned int
664 DialogGetReconstructionParameters::getZeropad (void)
665 {
666     wxString strCtrl = m_pTextCtrlZeropad->GetValue();
667     unsigned long lValue;
668     if (strCtrl.ToULong (&lValue))
669         return lValue;
670     else
671         return (m_iDefaultZeropad);
672 }
673
674
675 unsigned int
676 DialogGetReconstructionParameters::getInterpParam (void)
677 {
678     wxString strCtrl = m_pTextCtrlInterpParam->GetValue();
679     unsigned long lValue;
680     if (strCtrl.ToULong (&lValue))
681         return lValue;
682     else
683         return (m_iDefaultInterpParam);
684 }
685
686 double
687 DialogGetReconstructionParameters::getFilterParam (void)
688 {
689     wxString strCtrl = m_pTextCtrlFilterParam->GetValue();
690     double dValue;
691     if (strCtrl.ToDouble (&dValue))
692         return (dValue);
693     else
694       return (m_dDefaultFilterParam);
695 }
696
697 const char*
698 DialogGetReconstructionParameters::getFilterName (void)
699 {
700   return m_pListBoxFilter->getSelectionStringValue();
701 }
702
703 const char*
704 DialogGetReconstructionParameters::getFilterMethodName (void)
705 {
706   return m_pListBoxFilterMethod->getSelectionStringValue();
707 }
708
709 const char*
710 DialogGetReconstructionParameters::getInterpName (void)
711 {
712   return m_pListBoxInterp->getSelectionStringValue();
713 }
714
715 int
716 DialogGetReconstructionParameters::getTrace (void)
717 {
718   int iTrace = 0;
719   if (strcmp("full", m_pListBoxTrace->getSelectionStringValue()) == 0)
720       iTrace = Trace::TRACE_PLOT;
721   return iTrace;
722 }
723
724 const char*
725 DialogGetReconstructionParameters::getBackprojectName (void)
726 {
727   return m_pListBoxBackproject->getSelectionStringValue();
728 }
729
730 const char*
731 DialogGetReconstructionParameters::getFilterGenerationName (void)
732 {
733   return m_pListBoxFilterGeneration->getSelectionStringValue();
734 }
735
736 \r