** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: dialogs.cpp,v 1.2 2000/07/18 14:51:06 kevin Exp $
+** $Id: dialogs.cpp,v 1.3 2000/07/19 04:33:27 kevin Exp $
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License (version 2) as
#include <sstream>
#include "ctsupport.h"
#include "scanner.h"
+#include "phantom.h"
+#include "filter.h"
+#include "backprojectors.h"
+
+
+DialogGetPhantom::DialogGetPhantom (wxFrame* pParent, const char* szDefaultPhantom = NULL)
+ : wxDialog (pParent, -1, "Select Phantom", wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxCAPTION)
+{
+ m_sDefaultPhantom = szDefaultPhantom;
+
+ wxBoxSizer* pTopSizer = new wxBoxSizer (wxVERTICAL);
+
+ pTopSizer->Add (new wxStaticText (this, -1, "Select Phantom"), 0, wxALIGN_CENTER | wxTOP | wxLEFT | wxRIGHT, 5);
+
+ pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
+
+ wxString aListPhantomTitle [5];
+ aListPhantomTitle[0] = Phantom::PHM_HERMAN_TITLE_STR;
+ aListPhantomTitle[1] = Phantom::PHM_BHERMAN_TITLE_STR;
+ aListPhantomTitle[2] = Phantom::PHM_ROWLAND_TITLE_STR;
+ aListPhantomTitle[3] = Phantom::PHM_BROWLAND_TITLE_STR;
+ aListPhantomTitle[4] = Phantom::PHM_UNITPULSE_TITLE_STR;
+ m_pListBoxPhantom = new wxListBox (this, -1, wxDefaultPosition, wxDefaultSize, 5, aListPhantomTitle, wxLB_SINGLE | wxLB_NEEDED_SB);
+ pTopSizer->Add (m_pListBoxPhantom, 0, wxALL | wxALIGN_CENTER | wxEXPAND);
+
+ pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
+
+ wxBoxSizer* pButtonSizer = new wxBoxSizer (wxHORIZONTAL);
+ wxButton* pButtonOk = new wxButton (this, wxID_OK, "Okay");
+ wxButton* pButtonCancel = new wxButton (this, wxID_CANCEL, "Cancel");
+ pButtonSizer->Add (pButtonOk, 0, wxEXPAND | wxALL, 10);
+ pButtonSizer->Add (pButtonCancel, 0, wxEXPAND | wxALL, 10);
+
+ pTopSizer->Add (pButtonSizer, 0, wxALIGN_CENTER);
+
+ SetAutoLayout (true);
+ SetSizer (pTopSizer);
+ pTopSizer->Fit (this);
+ pTopSizer->SetSizeHints (this);
+}
+
+string
+DialogGetPhantom::getPhantom(void)
+{
+ string aListPhantom [5];
+ aListPhantom[0] = Phantom::PHM_HERMAN_STR;
+ aListPhantom[1] = Phantom::PHM_BHERMAN_STR;
+ aListPhantom[2] = Phantom::PHM_ROWLAND_STR;;
+ aListPhantom[3] = Phantom::PHM_BROWLAND_STR;
+ aListPhantom[4] = Phantom::PHM_UNITPULSE_STR;
+
+ int selection = m_pListBoxPhantom->GetSelection();
+ if (selection >= 0)
+ return (aListPhantom[selection]);
+
+ return (m_sDefaultPhantom);
+}
+
DialogGetImageMinMax::DialogGetImageMinMax (wxFrame* pParent, const ImageFile& rImagefile, double dDefaultMin = 0., double dDefaultMax = 0.)
: wxDialog (pParent, -1, "Set Image Display Minimum & Maximum", wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxCAPTION)
/////////////////////////////////////////////////////////////////////
// CLASS IDENTIFICATION
//
-// DialogGetProjectionsParameters
+// DialogGetProjectionParameters
/////////////////////////////////////////////////////////////////////
DialogGetProjectionParameters::DialogGetProjectionParameters (wxFrame* pParent, int iDefaultNDet = 0, int iDefaultNView = 0, int iDefaultNSamples = 1, double dDefaultRotAngle = 1., const char* szDefaultGeometry = NULL)
{
return m_sDefaultGeometry;
}
+
+
+
+/////////////////////////////////////////////////////////////////////
+// CLASS IDENTIFICATION
+//
+// DialogGetReconstructionParameters
+/////////////////////////////////////////////////////////////////////
+
+DialogGetReconstructionParameters::DialogGetReconstructionParameters (wxFrame* pParent, int iDefaultXSize = 0, int iDefaultYSize = 0, const char* szDefaultFilterName = NULL, double dDefaultFilterParam = 1., const char* szDefaultFilterMethodName = NULL, int iDefaultZeropad = 3, const char* szDefaultInterpName = NULL, int iDefaultInterpParam = 1, const char* szDefaultBackprojName = NULL)
+ : wxDialog (pParent, -1, "Set Reconstruction Parameters", wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxCAPTION)
+{
+ wxBoxSizer* pTopSizer = new wxBoxSizer (wxVERTICAL);
+
+ pTopSizer->Add (new wxStaticText (this, -1, "Set Reconstruction Parameters"), 0, wxALIGN_CENTER | wxTOP | wxLEFT | wxRIGHT, 5);
+
+ pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
+
+ ostringstream os;
+ os << iDefaultXSize;
+ m_pTextCtrlXSize = new wxTextCtrl (this, -1, os.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
+ ostringstream osYSize;
+ osYSize << iDefaultYSize;
+ m_pTextCtrlYSize = new wxTextCtrl (this, -1, osYSize.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
+ ostringstream osFilterParam;
+ osFilterParam << dDefaultFilterParam;
+ m_pTextCtrlFilterParam = new wxTextCtrl (this, -1, osFilterParam.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
+ ostringstream osZeropad;
+ osZeropad << iDefaultZeropad;
+ m_pTextCtrlZeropad = new wxTextCtrl (this, -1, osZeropad.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
+ ostringstream osInterpParam;
+ osInterpParam << iDefaultInterpParam;
+ m_pTextCtrlInterpParam = new wxTextCtrl (this, -1, osInterpParam.str().c_str(), wxDefaultPosition, wxSize(100, 25), 0);
+
+ wxGridSizer *pGridSizer = new wxGridSizer (2, 5, 5);
+ pGridSizer->Add (new wxStaticText (this, -1, "X Size"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
+ pGridSizer->Add (m_pTextCtrlXSize, 0, wxALIGN_CENTER_VERTICAL);
+ pGridSizer->Add (new wxStaticText (this, -1, "Y Size"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
+ pGridSizer->Add (m_pTextCtrlYSize, 0, wxALIGN_CENTER_VERTICAL);
+ pGridSizer->Add (new wxStaticText (this, -1, "Filter Parameter"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
+ pGridSizer->Add (m_pTextCtrlFilterParam, 0, wxALIGN_CENTER_VERTICAL);
+ pGridSizer->Add (new wxStaticText (this, -1, "Zeropad"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
+ pGridSizer->Add (m_pTextCtrlZeropad, 0, wxALIGN_CENTER_VERTICAL);
+ pGridSizer->Add (new wxStaticText (this, -1, "Interpolation Parameter"), 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
+ pGridSizer->Add (m_pTextCtrlInterpParam, 0, wxALIGN_CENTER_VERTICAL);
+ pTopSizer->Add (pGridSizer, 1, wxALL, 10);
+
+ wxString aTitlesFilter[4];
+ aTitlesFilter[0] = "Abs * Bandlimit";
+ aTitlesFilter[1] = "Abs * Hamming";
+ aTitlesFilter[2] = "Abs * Hanning";
+ aTitlesFilter[3] = "Abs * Cosine";
+
+ m_pListBoxFilter = new wxListBox (this, -1, wxDefaultPosition, wxSize(-1,-1), 4, aTitlesFilter, wxLB_SINGLE | wxLB_NEEDED_SB);
+ pTopSizer->Add (m_pListBoxFilter);
+
+ m_sDefaultFilterName = szDefaultFilterName;
+ m_sDefaultFilterMethodName = szDefaultFilterMethodName;
+ m_sDefaultInterpName = szDefaultInterpName;
+ m_sDefaultBackprojName = szDefaultBackprojName;
+
+ pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
+
+ wxBoxSizer* pButtonSizer = new wxBoxSizer (wxHORIZONTAL);
+ wxButton* pButtonOk = new wxButton (this, wxID_OK, "Okay");
+ wxButton* pButtonCancel = new wxButton (this, wxID_CANCEL, "Cancel");
+ pButtonSizer->Add (pButtonOk, 0, wxEXPAND | wxALL, 10);
+ pButtonSizer->Add (pButtonCancel, 0, wxEXPAND | wxALL, 10);
+
+ pTopSizer->Add (pButtonSizer, 0, wxALIGN_CENTER);
+
+ SetAutoLayout (true);
+ SetSizer (pTopSizer);
+ pTopSizer->Fit (this);
+ pTopSizer->SetSizeHints (this);
+}
+
+DialogGetReconstructionParameters::~DialogGetReconstructionParameters (void)
+{
+}
+
+
+unsigned int
+DialogGetReconstructionParameters::getXSize (void)
+{
+ wxString strCtrl = m_pTextCtrlXSize->GetValue();
+ unsigned long lValue;
+ if (strCtrl.ToULong (&lValue))
+ return lValue;
+ else
+ return (m_iDefaultXSize);
+}
+
+unsigned int
+DialogGetReconstructionParameters::getYSize (void)
+{
+ wxString strCtrl = m_pTextCtrlYSize->GetValue();
+ unsigned long lValue;
+ if (strCtrl.ToULong (&lValue))
+ return lValue;
+ else
+ return (m_iDefaultYSize);
+}
+
+unsigned int
+DialogGetReconstructionParameters::getZeropad (void)
+{
+ wxString strCtrl = m_pTextCtrlZeropad->GetValue();
+ unsigned long lValue;
+ if (strCtrl.ToULong (&lValue))
+ return lValue;
+ else
+ return (m_iDefaultZeropad);
+}
+
+
+unsigned int
+DialogGetReconstructionParameters::getInterpParam (void)
+{
+ wxString strCtrl = m_pTextCtrlInterpParam->GetValue();
+ unsigned long lValue;
+ if (strCtrl.ToULong (&lValue))
+ return lValue;
+ else
+ return (m_iDefaultInterpParam);
+}
+
+double
+DialogGetReconstructionParameters::getFilterParam (void)
+{
+ wxString strCtrl = m_pTextCtrlFilterParam->GetValue();
+ double dValue;
+ if (strCtrl.ToDouble (&dValue))
+ return (dValue);
+ else
+ return (m_dDefaultFilterParam);
+}
+
+const string&
+DialogGetReconstructionParameters::getFilterName (void)
+{
+ return m_sDefaultFilterName;
+}
+
+const string&
+DialogGetReconstructionParameters::getFilterMethodName (void)
+{
+ return m_sDefaultFilterMethodName;
+}
+
+const string&
+DialogGetReconstructionParameters::getInterpName (void)
+{
+ return m_sDefaultInterpName;
+}
+
+const string&
+DialogGetReconstructionParameters::getBackprojName (void)
+{
+ return m_sDefaultBackprojName;
+}
** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: views.cpp,v 1.5 2000/07/18 16:20:53 kevin Exp $
+** $Id: views.cpp,v 1.6 2000/07/19 04:33:27 kevin Exp $
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License (version 2) as
#include "views.h"
#include "dialogs.h"
#include <sstream>
+#include "backprojectors.h"
// ImageFileCanvas
void
ProjectionFileView::OnReconstruct (wxCommandEvent& event)
{
- int xSize, ySize;
- xSize = 256;
- ySize = 256;
- const char* optFilterName = "abs_bandlimit";
- double optFilterParam = 1.;
- const char*optFilterMethodName = "convolution";
- int optZeropad = 3;
- const char* optInterpName = "linear";
- int optInterpParam = 1;
- const char* optBackprojectName = "idiff3";
- if (xSize > 0 && ySize > 0) {
- ImageFileDocument* pReconDoc = dynamic_cast<ImageFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT));
- ImageFile& imageFile = pReconDoc->getImageFile();
- const Projections& rProj = GetDocument()->getProjections();
- imageFile.setArraySize (xSize, ySize);
- rProj.reconstruct (imageFile, optFilterName, optFilterParam, optFilterMethodName, optZeropad, optInterpName, optInterpParam, optBackprojectName, TRACE_NONE);
- pReconDoc->Modify(true);
- pReconDoc->UpdateAllViews(this);
- ostringstream os;
- os << "Reconstruct " << rProj.getFilename() << ": xSize=" << xSize << ", ySize=" << ySize << ", Filter=" << optFilterName << ", FilterParam=" << optFilterParam << ", FilterMethod=" << optFilterMethodName << ", Zeropad=" << optZeropad << ", Interpolation=" << optInterpName << ", InterpolationParam=" << optInterpParam << ", Backprojection=" << optBackprojectName << "\n";
- *theApp->getLog() << os.str().c_str();
+ DialogGetReconstructionParameters dialogReconstruction (m_frame, 256, 256, SignalFilter::FILTER_ABS_BANDLIMIT_STR, 1., SignalFilter::FILTER_METHOD_CONVOLUTION_STR, 3, Backprojector::INTERP_LINEAR_STR, 1, Backprojector::BPROJ_IDIFF3_STR);
+ int retVal = dialogReconstruction.ShowModal();
+ if (retVal == wxID_OK) {
+ int xSize = dialogReconstruction.getXSize();
+ int ySize = dialogReconstruction.getYSize();
+ string optFilterName = dialogReconstruction.getFilterName();
+ double optFilterParam = dialogReconstruction.getFilterParam();
+ string optFilterMethodName = dialogReconstruction.getFilterMethodName();
+ int optZeropad = dialogReconstruction.getZeropad();
+ string optInterpName = dialogReconstruction.getInterpName();
+ int optInterpParam = dialogReconstruction.getInterpParam();
+ string optBackprojectName = dialogReconstruction.getBackprojName();
+ if (xSize > 0 && ySize > 0) {
+ ImageFileDocument* pReconDoc = dynamic_cast<ImageFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT));
+ ImageFile& imageFile = pReconDoc->getImageFile();
+ const Projections& rProj = GetDocument()->getProjections();
+ imageFile.setArraySize (xSize, ySize);
+ rProj.reconstruct (imageFile, optFilterName.c_str(), optFilterParam, optFilterMethodName.c_str(), optZeropad, optInterpName.c_str(), optInterpParam, optBackprojectName.c_str(), TRACE_NONE);
+ pReconDoc->Modify(true);
+ pReconDoc->UpdateAllViews(this);
+ ostringstream os;
+ os << "Reconstruct " << rProj.getFilename() << ": xSize=" << xSize << ", ySize=" << ySize << ", Filter=" << optFilterName << ", FilterParam=" << optFilterParam << ", FilterMethod=" << optFilterMethodName << ", Zeropad=" << optZeropad << ", Interpolation=" << optInterpName << ", InterpolationParam=" << optInterpParam << ", Backprojection=" << optBackprojectName << "\n";
+ *theApp->getLog() << os.str().c_str();
+ }
}
}