1 /*****************************************************************************
5 ** Purpose: Dialog routines for CTSim program
6 ** Programmer: Kevin Rosenberg
7 ** Date Started: July 2000
9 ** This is part of the CTSim program
10 ** Copyright (C) 1983-2000 Kevin Rosenberg
12 ** $Id: dialogs.cpp,v 1.18 2000/12/20 20:08:48 kevin Exp $
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.
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.
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 ******************************************************************************/
29 // #pragma implementation
32 // For compilers that support precompilation, includes "wx/wx.h".
33 #include "wx/wxprec.h"
43 #if !wxUSE_DOC_VIEW_ARCHITECTURE
44 #error You must set wxUSE_DOC_VIEW_ARCHITECTURE to 1 in setup.h!
47 #include "wx/statline.h"
50 #include "ctsupport.h"
55 #include "backprojectors.h"
57 #if defined(MSVC) || HAVE_SSTREAM
\r
60 #include <sstream_subst>
\r
64 StringValueAndTitleListBox::StringValueAndTitleListBox (wxDialog* pParent, int nChoices, const char* aszTitle[], const char* aszValue[])
67 wxString* psTitle = new wxString [nChoices];
68 for (int i = 0; i < nChoices; i++)
69 psTitle[i] = aszTitle[i];
71 Create (pParent, -1, wxDefaultPosition, wxSize(200,-1), nChoices, psTitle, wxLB_SINGLE | wxLB_NEEDED_SB);
73 m_ppszValues = aszValue;
\r
78 StringValueAndTitleListBox::getSelectionStringValue (void) const
80 return m_ppszValues[GetSelection()];
85 DialogGetPhantom::DialogGetPhantom (wxFrame* pParent, int iDefaultPhantom)
86 : wxDialog (pParent, -1, "Select Phantom", wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxCAPTION)
88 wxBoxSizer* pTopSizer = new wxBoxSizer (wxVERTICAL);
90 pTopSizer->Add (new wxStaticText (this, -1, "Select Phantom"), 0, wxALIGN_CENTER | wxALL, 5);
92 pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxALL, 5);
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);
98 pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
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);
106 pTopSizer->Add (pButtonSizer, 0, wxALIGN_CENTER);
108 SetAutoLayout (true);
109 SetSizer (pTopSizer);
110 pTopSizer->Fit (this);
111 pTopSizer->SetSizeHints (this);
115 DialogGetPhantom::getPhantom(void)
117 return m_pListBoxPhantom->getSelectionStringValue();
121 /////////////////////////////////////////////////////////////////////
\r
122 // CLASS DiaglogGetMinMax Implementation
\r
123 /////////////////////////////////////////////////////////////////////
\r
125 DialogGetMinMax::DialogGetMinMax (wxFrame* pParent, const char* const pszTitle, double dDefaultMin, double dDefaultMax)
126 : wxDialog (pParent, -1, pszTitle, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxCAPTION)
128 wxBoxSizer* pTopSizer = new wxBoxSizer (wxVERTICAL);
130 pTopSizer->Add (new wxStaticText (this, -1, pszTitle), 0, wxALIGN_CENTER | wxTOP | wxLEFT | wxRIGHT, 5);
132 pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
134 std::ostringstream os;
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);
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);
148 pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
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);
156 pTopSizer->Add (pButtonSizer, 0, wxALIGN_CENTER);
158 SetAutoLayout (true);
159 SetSizer (pTopSizer);
160 pTopSizer->Fit (this);
161 pTopSizer->SetSizeHints (this);
164 DialogGetMinMax::~DialogGetMinMax (void)
169 DialogGetMinMax::getMinimum (void)
171 wxString strCtrl = m_pTextCtrlMin->GetValue();
173 if (strCtrl.ToDouble (&dValue))
176 return (m_dDefaultMin);
180 DialogGetMinMax::getMaximum (void)
182 wxString strCtrl = m_pTextCtrlMax->GetValue();
184 if (strCtrl.ToDouble (&dValue))
187 return (m_dDefaultMax);
191 /////////////////////////////////////////////////////////////////////
\r
192 // CLASS DialogAutoScaleParameters IMPLEMENTATION
\r
193 /////////////////////////////////////////////////////////////////////
\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
198 wxBoxSizer* pTopSizer = new wxBoxSizer (wxVERTICAL);
\r
200 pTopSizer->Add (new wxStaticText (this, -1, "Auto Scale Parameters"), 0, wxALIGN_CENTER | wxTOP | wxLEFT | wxRIGHT, 5);
\r
202 pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
\r
204 wxString asTitle[3];
\r
205 asTitle[0] = "Median";
\r
206 asTitle[1] = "Mode";
\r
207 asTitle[2] = "Mean";
\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
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
221 pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
\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
229 pTopSizer->Add (pButtonSizer, 0, wxALIGN_CENTER);
\r
231 SetAutoLayout (true);
\r
232 SetSizer (pTopSizer);
\r
233 pTopSizer->Fit (this);
\r
234 pTopSizer->SetSizeHints (this);
\r
238 DialogAutoScaleParameters::getMinMax (double* pMin, double* pMax)
\r
240 int iCenter = m_pListBoxCenter->GetSelection();
\r
241 double dCenter = m_dMedian;
\r
244 else if (iCenter == 2)
\r
247 wxString sStddevFactor = m_pTextCtrlStdDevFactor->GetValue();
\r
249 if (! sStddevFactor.ToDouble (&dValue)) {
\r
250 *theApp->getLog() << "Error: Non-numeric Standard Deviation Factor of " << sStddevFactor << "\n";
\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
262 DialogAutoScaleParameters::getAutoScaleFactor ()
\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
274 /////////////////////////////////////////////////////////////////////
275 // CLASS IDENTIFICATION
277 // DialogGetRasterParameters
278 /////////////////////////////////////////////////////////////////////
280 DialogGetRasterParameters::DialogGetRasterParameters (wxFrame* pParent, int iDefaultXSize, int iDefaultYSize, int iDefaultNSamples)
281 : wxDialog (pParent, -1, "Set Rasterization Parameters", wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxCAPTION)
283 wxBoxSizer* pTopSizer = new wxBoxSizer (wxVERTICAL);
285 pTopSizer->Add (new wxStaticText (this, -1, "Set Rasterization Parameters"), 0, wxALIGN_CENTER | wxTOP | wxLEFT | wxRIGHT, 5);
287 pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
289 std::ostringstream os;
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);
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);
308 pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
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);
316 pTopSizer->Add (pButtonSizer, 0, wxALIGN_CENTER);
318 SetAutoLayout (true);
319 SetSizer (pTopSizer);
320 pTopSizer->Fit (this);
321 pTopSizer->SetSizeHints (this);
324 DialogGetRasterParameters::~DialogGetRasterParameters (void)
330 DialogGetRasterParameters::getXSize (void)
332 wxString strCtrl = m_pTextCtrlXSize->GetValue();
333 unsigned long lValue;
334 if (strCtrl.ToULong (&lValue))
337 return (m_iDefaultXSize);
341 DialogGetRasterParameters::getYSize (void)
343 wxString strCtrl = m_pTextCtrlYSize->GetValue();
344 unsigned long lValue;
345 if (strCtrl.ToULong (&lValue))
348 return (m_iDefaultYSize);
353 DialogGetRasterParameters::getNSamples (void)
355 wxString strCtrl = m_pTextCtrlNSamples->GetValue();
356 unsigned long lValue;
357 if (strCtrl.ToULong (&lValue))
360 return (m_iDefaultNSamples);
365 /////////////////////////////////////////////////////////////////////
366 // CLASS IDENTIFICATION
368 // DialogGetProjectionParameters
369 /////////////////////////////////////////////////////////////////////
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)
375 wxBoxSizer* pTopSizer = new wxBoxSizer (wxVERTICAL);
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;
386 pTopSizer->Add (new wxStaticText (this, -1, "Set Projection Parameters"), 0, wxALIGN_CENTER | wxTOP | wxLEFT | wxRIGHT, 5);
388 pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
390 std::ostringstream os;
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);
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);
414 pGridSizer->Add (m_pListBoxGeometry, 0, wxALL | wxALIGN_CENTER | wxEXPAND);
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);
429 m_pListBoxTrace = new StringValueAndTitleListBox (this, Trace::getTraceCount(), Trace::getTraceTitleArray(), Trace::getTraceNameArray());
430 m_pListBoxTrace->SetSelection (iDefaultTrace);
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);
436 pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
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);
444 pTopSizer->Add (pButtonSizer, 0, wxALIGN_CENTER);
446 SetAutoLayout (true);
447 SetSizer (pTopSizer);
448 pTopSizer->Fit (this);
449 pTopSizer->SetSizeHints (this);
452 DialogGetProjectionParameters::~DialogGetProjectionParameters (void)
458 DialogGetProjectionParameters::getNDet (void)
460 wxString strCtrl = m_pTextCtrlNDet->GetValue();
461 unsigned long lValue;
462 if (strCtrl.ToULong (&lValue))
465 return (m_iDefaultNDet);
469 DialogGetProjectionParameters::getNView (void)
471 wxString strCtrl = m_pTextCtrlNView->GetValue();
472 unsigned long lValue;
473 if (strCtrl.ToULong (&lValue))
476 return (m_iDefaultNView);
481 DialogGetProjectionParameters::getNSamples (void)
483 wxString strCtrl = m_pTextCtrlNSamples->GetValue();
484 unsigned long lValue;
485 if (strCtrl.ToULong (&lValue))
488 return (m_iDefaultNSamples);
492 DialogGetProjectionParameters::getRotAngle (void)
494 wxString strCtrl = m_pTextCtrlRotAngle->GetValue();
496 if (strCtrl.ToDouble (&dValue))
497 return (dValue * PI);
499 return (m_dDefaultRotAngle);
503 DialogGetProjectionParameters::getFocalLengthRatio (void)
505 wxString strCtrl = m_pTextCtrlFocalLength->GetValue();
507 if (strCtrl.ToDouble (&dValue))
510 return (m_dDefaultFocalLength);
514 DialogGetProjectionParameters::getFieldOfViewRatio (void)
516 wxString strCtrl = m_pTextCtrlFieldOfView->GetValue();
518 if (strCtrl.ToDouble (&dValue))
521 return (m_dDefaultFieldOfView);
525 DialogGetProjectionParameters::getGeometry (void)
527 return m_pListBoxGeometry->getSelectionStringValue();
531 DialogGetProjectionParameters::getTrace (void)
533 return Trace::convertTraceNameToID(m_pListBoxTrace->getSelectionStringValue());
538 /////////////////////////////////////////////////////////////////////
539 // CLASS IDENTIFICATION
541 // DialogGetReconstructionParameters
542 /////////////////////////////////////////////////////////////////////
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)
548 wxBoxSizer* pTopSizer = new wxBoxSizer (wxVERTICAL);
550 pTopSizer->Add (new wxStaticText (this, -1, "Set Reconstruction Parameters"), 0, wxALIGN_CENTER | wxTOP | wxLEFT | wxRIGHT, 5);
552 pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
554 std::ostringstream os;
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);
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);
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);
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);
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);
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);
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
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);
617 pTopSizer->Add (pGridSizer, 1, wxALL, 3);
619 pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
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);
627 pTopSizer->Add (pButtonSizer, 0, wxALIGN_CENTER);
629 SetAutoLayout (true);
630 SetSizer (pTopSizer);
632 pTopSizer->Fit (this);
633 pTopSizer->SetSizeHints (this);
636 DialogGetReconstructionParameters::~DialogGetReconstructionParameters (void)
642 DialogGetReconstructionParameters::getXSize (void)
644 wxString strCtrl = m_pTextCtrlXSize->GetValue();
645 unsigned long lValue;
646 if (strCtrl.ToULong (&lValue))
649 return (m_iDefaultXSize);
653 DialogGetReconstructionParameters::getYSize (void)
655 wxString strCtrl = m_pTextCtrlYSize->GetValue();
656 unsigned long lValue;
657 if (strCtrl.ToULong (&lValue))
660 return (m_iDefaultYSize);
664 DialogGetReconstructionParameters::getZeropad (void)
666 wxString strCtrl = m_pTextCtrlZeropad->GetValue();
667 unsigned long lValue;
668 if (strCtrl.ToULong (&lValue))
671 return (m_iDefaultZeropad);
676 DialogGetReconstructionParameters::getInterpParam (void)
678 wxString strCtrl = m_pTextCtrlInterpParam->GetValue();
679 unsigned long lValue;
680 if (strCtrl.ToULong (&lValue))
683 return (m_iDefaultInterpParam);
687 DialogGetReconstructionParameters::getFilterParam (void)
689 wxString strCtrl = m_pTextCtrlFilterParam->GetValue();
691 if (strCtrl.ToDouble (&dValue))
694 return (m_dDefaultFilterParam);
698 DialogGetReconstructionParameters::getFilterName (void)
700 return m_pListBoxFilter->getSelectionStringValue();
704 DialogGetReconstructionParameters::getFilterMethodName (void)
706 return m_pListBoxFilterMethod->getSelectionStringValue();
710 DialogGetReconstructionParameters::getInterpName (void)
712 return m_pListBoxInterp->getSelectionStringValue();
716 DialogGetReconstructionParameters::getTrace (void)
719 if (strcmp("full", m_pListBoxTrace->getSelectionStringValue()) == 0)
720 iTrace = Trace::TRACE_PLOT;
725 DialogGetReconstructionParameters::getBackprojectName (void)
727 return m_pListBoxBackproject->getSelectionStringValue();
731 DialogGetReconstructionParameters::getFilterGenerationName (void)
733 return m_pListBoxFilterGeneration->getSelectionStringValue();