** This is part of the CTSim program
** Copyright (c) 1983-2001 Kevin Rosenberg
**
-** $Id: views.cpp,v 1.131 2001/03/10 23:56:58 kevin Exp $
+** $Id: views.cpp,v 1.133 2001/03/11 15:27:30 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
EVT_MENU(PJMENU_RECONSTRUCT_FOURIER, ProjectionFileView::OnReconstructFourier)
EVT_MENU(PJMENU_CONVERT_POLAR, ProjectionFileView::OnConvertPolar)
EVT_MENU(PJMENU_CONVERT_FFT_POLAR, ProjectionFileView::OnConvertFFTPolar)
+EVT_MENU(PJMENU_CONVERT_PARALLEL, ProjectionFileView::OnConvertParallel)
EVT_MENU(PJMENU_PLOT_TTHETA_SAMPLING, ProjectionFileView::OnPlotTThetaSampling)
+EVT_MENU(PJMENU_ARTIFACT_REDUCTION, ProjectionFileView::OnArtifactReduction)
END_EVENT_TABLE()
+
ProjectionFileView::ProjectionFileView()
: wxView(), m_pFrame(0), m_pCanvas(0), m_pFileMenu(0)
{
ImageFile* pIF = new ImageFile (m_iDefaultPolarNX, m_iDefaultPolarNY);
m_iDefaultPolarInterpolation = Projections::convertInterpNameToID (strInterpolation.c_str());
- if (! rProj.convertPolar (*pIF, m_iDefaultPolarInterpolation)) {
+ if (! rProj.convertPolar (*pIF, m_iDefaultPolarInterpolation)) {
delete pIF;
*theApp->getLog() << "Error converting to Polar\n";
return;
}
-
pPolarDoc = theApp->newImageDoc ();
if (! pPolarDoc) {
sys_error (ERR_SEVERE, "Unable to create image file");
return;
}
+void
+ProjectionFileView::OnConvertParallel (wxCommandEvent& event)
+{
+ Projections& rProj = GetDocument()->getProjections();
+ if (rProj.geometry() == Scanner::GEOMETRY_PARALLEL) {
+ wxMessageBox ("Projections are already parallel", "Error");
+ return;
+ }
+ wxProgressDialog dlgProgress (wxString("Convert to Parallel"), wxString("Conversion Progress"), 1, getFrameForChild(), wxPD_APP_MODAL);
+ Projections* pProjNew = rProj.interpolateToParallel();
+ ProjectionFileDocument* pProjDocNew = theApp->newProjectionDoc();
+ pProjDocNew->setProjections (pProjNew);
+
+ if (ProjectionFileView* projView = pProjDocNew->getView()) {
+ projView->OnUpdate (projView, NULL);
+ if (projView->getCanvas())
+ projView->getCanvas()->SetClientSize (pProjNew->nDet(), pProjNew->nView());
+ if (wxFrame* pFrame = projView->getFrame()) {
+ pFrame->Show(true);
+ pFrame->SetFocus();
+ pFrame->Raise();
+ }
+ GetDocumentManager()->ActivateView (projView, true, false);
+ }
+ if (theApp->getAskDeleteNewDocs())
+ pProjDocNew-> Modify(true);
+ pProjDocNew->UpdateAllViews (this);
+}
+
void
ProjectionFileView::OnReconstructFourier (wxCommandEvent& event)
{
void
ProjectionFileView::OnReconstructFBP (wxCommandEvent& event)
{
+ const Projections& rProj = GetDocument()->getProjections();
+ ReconstructionROI defaultROI;
+ defaultROI.m_dXMin = -rProj.phmLen() / 2;
+ defaultROI.m_dXMax = defaultROI.m_dXMin + rProj.phmLen();
+ defaultROI.m_dYMin = -rProj.phmLen() / 2;
+ defaultROI.m_dYMax = defaultROI.m_dYMin + rProj.phmLen();
+
DialogGetReconstructionParameters dialogReconstruction (getFrameForChild(), m_iDefaultNX, m_iDefaultNY,
m_iDefaultFilter, m_dDefaultFilterParam, m_iDefaultFilterMethod, m_iDefaultFilterGeneration,
m_iDefaultZeropad, m_iDefaultInterpolation, m_iDefaultInterpParam, m_iDefaultBackprojector,
- m_iDefaultTrace);
+ m_iDefaultTrace, &defaultROI);
int retVal = dialogReconstruction.ShowModal();
if (retVal != wxID_OK)
wxString optBackprojectName = dialogReconstruction.getBackprojectName();
m_iDefaultBackprojector = Backprojector::convertBackprojectNameToID (optBackprojectName.c_str());
m_iDefaultTrace = dialogReconstruction.getTrace();
-
+ dialogReconstruction.getROI (&defaultROI);
+
if (m_iDefaultNX <= 0 && m_iDefaultNY <= 0)
return;
- const Projections& rProj = GetDocument()->getProjections();
std::ostringstream os;
os << "Reconstruct " << rProj.getFilename() << ": xSize=" << m_iDefaultNX << ", ySize=" << m_iDefaultNY << ", Filter=" << optFilterName.c_str() << ", FilterParam=" << m_dDefaultFilterParam << ", FilterMethod=" << optFilterMethodName.c_str() << ", FilterGeneration=" << optFilterGenerationName.c_str() << ", Zeropad=" << m_iDefaultZeropad << ", Interpolation=" << optInterpName.c_str() << ", InterpolationParam=" << m_iDefaultInterpParam << ", Backprojection=" << optBackprojectName.c_str();
pImageFile = new ImageFile (m_iDefaultNX, m_iDefaultNY);
Reconstructor* pReconstructor = new Reconstructor (rProj, *pImageFile, optFilterName.c_str(),
m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(),
- optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), m_iDefaultTrace);
+ optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), m_iDefaultTrace, &defaultROI);
ReconstructDialog* pDlgReconstruct = new ReconstructDialog (*pReconstructor, rProj, *pImageFile, m_iDefaultTrace, getFrameForChild());
for (int iView = 0; iView < rProj.nView(); iView++) {
ReconstructorSupervisorThread* pReconstructor = new ReconstructorSupervisorThread (this,
m_iDefaultNX, m_iDefaultNY, optFilterName.c_str(),
m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(),
- optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), os.str().c_str());
+ optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), os.str().c_str(), &defaultROI);
if (pReconstructor->Create() != wxTHREAD_NO_ERROR) {
sys_error (ERR_SEVERE, "Error creating reconstructor thread");
delete pReconstructor;
pImageFile = new ImageFile (m_iDefaultNX, m_iDefaultNY);
Reconstructor* pReconstructor = new Reconstructor (rProj, *pImageFile, optFilterName.c_str(),
m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(),
- optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), m_iDefaultTrace);
+ optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), m_iDefaultTrace, &defaultROI);
wxProgressDialog dlgProgress (wxString("Reconstruction"), wxString("Reconstruction Progress"), rProj.nView() + 1, getFrameForChild(), wxPD_CAN_ABORT );
for (int iView = 0; iView < rProj.nView(); iView++) {
}
+void
+ProjectionFileView::OnArtifactReduction (wxCommandEvent& event)
+{
+}
+
+
ProjectionFileCanvas*
ProjectionFileView::CreateCanvas (wxFrame *parent)
{
wxMenu *convert_menu = new wxMenu;
convert_menu->Append (PJMENU_CONVERT_POLAR, "&Polar Image...\tCtrl-L");
convert_menu->Append (PJMENU_CONVERT_FFT_POLAR, "&FFT->Polar Image...\tCtrl-M");
+ convert_menu->AppendSeparator();
+ convert_menu->Append (PJMENU_CONVERT_PARALLEL, "&Interpolate to Parallel");
+
+ wxMenu* filter_menu = new wxMenu;
+ filter_menu->Append (PJMENU_ARTIFACT_REDUCTION, "&Artifact Reduction");
wxMenu* analyze_menu = new wxMenu;
analyze_menu->Append (PJMENU_PLOT_TTHETA_SAMPLING, "&Plot T-Theta Sampling\tCtrl-T");
menu_bar->Append (m_pFileMenu, "&File");
menu_bar->Append (convert_menu, "&Convert");
+ menu_bar->Append (filter_menu, "Fi<er");
menu_bar->Append (analyze_menu, "&Analyze");
menu_bar->Append (reconstruct_menu, "&Reconstruct");
menu_bar->Append (help_menu, "&Help");