r354: Added Projection Polar conversions
[ctsim.git] / src / views.cpp
index 8f9b512f8e88aec0eca671f38afc0b3850b9aa4c..aba89cc3198de6c70e40e6b0c0ff058d65ff1fae 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: views.cpp,v 1.49 2001/01/02 15:58:18 kevin Exp $
+**  $Id: views.cpp,v 1.51 2001/01/04 21:28:41 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
@@ -170,6 +170,7 @@ EVT_MENU(IFMENU_FILE_EXPORT, ImageFileView::OnExport)
 EVT_MENU(IFMENU_FILE_PROPERTIES, ImageFileView::OnProperties)
 EVT_MENU(IFMENU_VIEW_SCALE_MINMAX, ImageFileView::OnScaleMinMax)
 EVT_MENU(IFMENU_VIEW_SCALE_AUTO, ImageFileView::OnScaleAuto)
+EVT_MENU(IFMENU_VIEW_SCALE_FULL, ImageFileView::OnScaleFull)
 EVT_MENU(IFMENU_COMPARE_IMAGES, ImageFileView::OnCompare)
 EVT_MENU(IFMENU_COMPARE_ROW, ImageFileView::OnCompareRow)
 EVT_MENU(IFMENU_COMPARE_COL, ImageFileView::OnCompareCol)
@@ -286,6 +287,16 @@ ImageFileView::OnScaleMinMax (wxCommandEvent& event)
   }
 }
 
+void 
+ImageFileView::OnScaleFull (wxCommandEvent& event)
+{
+  if (m_bMinSpecified || m_bMaxSpecified) {
+    m_bMinSpecified = false;
+    m_bMaxSpecified = false;
+    OnUpdate (this, NULL);
+  }
+}
+
 void
 ImageFileView::OnCompare (wxCommandEvent& event)
 {
@@ -304,7 +315,7 @@ ImageFileView::OnCompare (wxCommandEvent& event)
       std::ostringstream os;
       double min, max, mean, mode, median, stddev;
       rIF.statistics (min, max, mean, mode, median, stddev);
-      os << rIF.getFilename() << ": minimum=" << min << ", maximum=" << max << ", mean=" << mean << ", mode=" << mode << ", median=" << median << ", stddev=" << stddev << "\n";
+      os << GetFrame()->GetTitle().c_str() << ": minimum=" << min << ", maximum=" << max << ", mean=" << mean << ", mode=" << mode << ", median=" << median << ", stddev=" << stddev << "\n";
       rCompareIF.statistics (min, max, mean, mode, median, stddev);
       os << pCompareDoc->GetFirstView()->GetFrame()->GetTitle().c_str() << ": minimum=" << min << ", maximum=" << max << ", mean=" << mean << ", mode=" << mode << ", median=" << median << ", stddev=" << stddev << "\n";
       os << "\n";
@@ -326,7 +337,7 @@ ImageFileView::OnCompare (wxCommandEvent& event)
           return;
         }
         
-        wxString s = GetDocument()->GetFirstView()->GetFrame()->GetTitle() + ": ";
+        wxString s = GetFrame()->GetTitle() + ": ";
         differenceImage.labelsCopy (rIF, s.c_str());
         s = pCompareDoc->GetFirstView()->GetFrame()->GetTitle() + ": ";
         differenceImage.labelsCopy (rCompareIF, s.c_str());
@@ -561,7 +572,7 @@ ImageFileView::OnDivide (wxCommandEvent& event)
 }
 
 
-#ifdef HAVE_FFTW
+#ifdef HAVE_FFT
 void
 ImageFileView::OnFFT (wxCommandEvent& event)
 {
@@ -604,6 +615,7 @@ ImageFileView::OnFourier (wxCommandEvent& event)
     GetDocument()->Modify(TRUE);
   GetDocument()->UpdateAllViews(this);
 }
+
 void
 ImageFileView::OnInverseFourier (wxCommandEvent& event)
 {
@@ -717,6 +729,7 @@ ImageFileView::CreateChildFrame(wxDocument *doc, wxView *view)
   wxMenu *view_menu = new wxMenu;
   view_menu->Append(IFMENU_VIEW_SCALE_MINMAX, "Display Scale &Set...");
   view_menu->Append(IFMENU_VIEW_SCALE_AUTO, "Display Scale &Auto...");
+  view_menu->Append(IFMENU_VIEW_SCALE_FULL, "Display &Full Scale");
   
   wxMenu* filter_menu = new wxMenu;
   filter_menu->Append (IFMENU_FILTER_INVERTVALUES, "&Invert Values");
@@ -725,7 +738,7 @@ ImageFileView::CreateChildFrame(wxDocument *doc, wxView *view)
   filter_menu->Append (IFMENU_FILTER_LOG, "&Log");
   filter_menu->Append (IFMENU_FILTER_EXP, "&Exp");
   filter_menu->AppendSeparator();
-#ifdef HAVE_FFTW
+#ifdef HAVE_FFT
   filter_menu->Append (IFMENU_FILTER_FFT, "&FFT");
   filter_menu->Append (IFMENU_FILTER_IFFT, "&IFFT");
   filter_menu->Append (IFMENU_FILTER_FOURIER, "F&ourier");
@@ -1283,7 +1296,7 @@ PhantomView::PhantomView(void)
   m_iDefaultNDet = 367;
   m_iDefaultNView = 320;
   m_iDefaultNSample = 2;
-  m_dDefaultRotation = 2;
+  m_dDefaultRotation = 1;
   m_dDefaultFocalLength = 2;
   m_dDefaultFieldOfView = 1;
   m_iDefaultGeometry = Scanner::GEOMETRY_PARALLEL;
@@ -1593,7 +1606,9 @@ IMPLEMENT_DYNAMIC_CLASS(ProjectionFileView, wxView)
 
 BEGIN_EVENT_TABLE(ProjectionFileView, wxView)
 EVT_MENU(PJMENU_FILE_PROPERTIES, ProjectionFileView::OnProperties)
-EVT_MENU(PJMENU_PROCESS_RECONSTRUCT, ProjectionFileView::OnReconstruct)
+EVT_MENU(PJMENU_RECONSTRUCT_FBP, ProjectionFileView::OnReconstructFBP)
+EVT_MENU(PJMENU_CONVERT_POLAR, ProjectionFileView::OnConvertPolar)
+EVT_MENU(PJMENU_CONVERT_FFT_POLAR, ProjectionFileView::OnConvertFFTPolar)
 END_EVENT_TABLE()
 
 ProjectionFileView::ProjectionFileView(void) 
@@ -1615,6 +1630,11 @@ ProjectionFileView::ProjectionFileView(void)
   m_iDefaultInterpolation = Backprojector::INTERP_LINEAR;
   m_iDefaultInterpParam = 1;
   m_iDefaultTrace = Trace::TRACE_NONE;
+
+  m_iDefaultPolarNX = 256;
+  m_iDefaultPolarNY = 256;
+  m_iDefaultPolarInterpolation = Projections::POLAR_INTERP_BILINEAR;
+  m_iDefaultPolarZeropad = 1;
 }
 
 ProjectionFileView::~ProjectionFileView(void)
@@ -1634,7 +1654,79 @@ ProjectionFileView::OnProperties (wxCommandEvent& event)
 
 
 void
-ProjectionFileView::OnReconstruct (wxCommandEvent& event)
+ProjectionFileView::OnConvertPolar (wxCommandEvent& event)
+{
+  Projections& rProj = GetDocument()->getProjections();
+  DialogGetConvertPolarParameters dialogPolar (m_frame, "Convert Polar", m_iDefaultPolarNX, m_iDefaultPolarNY,
+    m_iDefaultPolarInterpolation, -1);
+  if (dialogPolar.ShowModal() == wxID_OK) {
+    wxString strInterpolation (dialogPolar.getInterpolationName());
+    m_iDefaultPolarNX = dialogPolar.getXSize();
+    m_iDefaultPolarNY = dialogPolar.getYSize();
+    ImageFileDocument* pPolarDoc = dynamic_cast<ImageFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT));
+    ImageFile& rIF = pPolarDoc->getImageFile();
+    if (! pPolarDoc) {
+      sys_error (ERR_SEVERE, "Unable to create image file");
+      return;
+    }
+    rIF.setArraySize (m_iDefaultPolarNX, m_iDefaultPolarNY);
+    m_iDefaultPolarInterpolation = Projections::convertInterpNameToID (strInterpolation.c_str());
+    rProj.convertPolar (rIF, m_iDefaultPolarInterpolation);
+    rIF.labelAdd (rProj.getLabel().getLabelString().c_str(), rProj.calcTime());
+    std::ostringstream os;
+    os << "Convert projection file " << GetFrame()->GetTitle().c_str() << " to polar image: xSize=" 
+      << m_iDefaultPolarNX << ", ySize=" << m_iDefaultPolarNY << ", interpolation=" 
+      << strInterpolation.c_str();
+    *theApp->getLog() << os.str().c_str() << "\n";
+    rIF.labelAdd (os.str().c_str());
+    if (theApp->getSetModifyNewDocs())
+      pPolarDoc->Modify(true);
+    pPolarDoc->UpdateAllViews();
+    pPolarDoc->GetFirstView()->OnUpdate (this, NULL);
+  }
+}
+
+void
+ProjectionFileView::OnConvertFFTPolar (wxCommandEvent& event)
+{
+  Projections& rProj = GetDocument()->getProjections();
+  DialogGetConvertPolarParameters dialogPolar (m_frame, "Convert to FFT Polar", m_iDefaultPolarNX, m_iDefaultPolarNY,
+    m_iDefaultPolarInterpolation, m_iDefaultPolarZeropad);
+  if (dialogPolar.ShowModal() == wxID_OK) {
+    wxString strInterpolation (dialogPolar.getInterpolationName());
+    m_iDefaultPolarNX = dialogPolar.getXSize();
+    m_iDefaultPolarNY = dialogPolar.getYSize();
+    m_iDefaultPolarZeropad = dialogPolar.getZeropad();
+    ImageFileDocument* pPolarDoc = dynamic_cast<ImageFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT));
+    ImageFile& rIF = pPolarDoc->getImageFile();
+    if (! pPolarDoc) {
+      sys_error (ERR_SEVERE, "Unable to create image file");
+      return;
+    }
+    rIF.setArraySize (m_iDefaultPolarNX, m_iDefaultPolarNY);
+    m_iDefaultPolarInterpolation = Projections::convertInterpNameToID (strInterpolation.c_str());
+    rProj.convertFFTPolar (rIF, m_iDefaultPolarInterpolation, m_iDefaultPolarZeropad);
+    rIF.labelAdd (rProj.getLabel().getLabelString().c_str(), rProj.calcTime());
+    std::ostringstream os;
+    os << "Convert projection file " << GetFrame()->GetTitle().c_str() << " to FFT polar image: xSize=" 
+      << m_iDefaultPolarNX << ", ySize=" << m_iDefaultPolarNY << ", interpolation=" 
+      << strInterpolation.c_str() << ", zeropad=" << m_iDefaultPolarZeropad;
+    *theApp->getLog() << os.str().c_str() << "\n";
+    rIF.labelAdd (os.str().c_str());
+    if (theApp->getSetModifyNewDocs())
+      pPolarDoc->Modify(true);
+    pPolarDoc->UpdateAllViews();
+    pPolarDoc->GetFirstView()->OnUpdate (this, NULL);
+  }}
+
+void
+ProjectionFileView::OnReconstructFourier (wxCommandEvent& event)
+{
+  wxMessageBox ("Fourier Reconstruction is not yet supported", "Unimplemented function");
+}
+
+void
+ProjectionFileView::OnReconstructFBP (wxCommandEvent& event)
 {
   DialogGetReconstructionParameters dialogReconstruction (m_frame, m_iDefaultNX, m_iDefaultNY, m_iDefaultFilter, m_dDefaultFilterParam, m_iDefaultFilterMethod, m_iDefaultFilterGeneration, m_iDefaultZeropad, m_iDefaultInterpolation, m_iDefaultInterpParam, m_iDefaultBackprojector, m_iDefaultTrace);
   
@@ -1761,9 +1853,14 @@ ProjectionFileView::CreateChildFrame(wxDocument *doc, wxView *view)
   file_menu->Append(wxID_PRINT_SETUP, "Print &Setup...");
   file_menu->Append(wxID_PREVIEW, "Print Pre&view");
   
-  wxMenu *process_menu = new wxMenu;
-  process_menu->Append(PJMENU_PROCESS_RECONSTRUCT, "R&econstruct...");
+  wxMenu *convert_menu = new wxMenu;
+  convert_menu->Append (PJMENU_CONVERT_POLAR, "&Polar Image...");
+  convert_menu->Append (PJMENU_CONVERT_FFT_POLAR, "&FFT->Polar Image...");
   
+  wxMenu *reconstruct_menu = new wxMenu;
+  reconstruct_menu->Append (PJMENU_RECONSTRUCT_FBP, "&Filtered Backprojection...");
+  reconstruct_menu->Append (PJMENU_RECONSTRUCT_FOURIER, "&Fourier...");
+
   wxMenu *help_menu = new wxMenu;
   help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents");
   help_menu->AppendSeparator();
@@ -1771,9 +1868,10 @@ ProjectionFileView::CreateChildFrame(wxDocument *doc, wxView *view)
   
   wxMenuBar *menu_bar = new wxMenuBar;
   
-  menu_bar->Append(file_menu, "&File");
-  menu_bar->Append(process_menu, "&Process");
-  menu_bar->Append(help_menu, "&Help");
+  menu_bar->Append (file_menu, "&File");
+  menu_bar->Append (convert_menu, "&Convert");
+  menu_bar->Append (reconstruct_menu, "&Reconstruct");
+  menu_bar->Append (help_menu, "&Help");
   
   subframe->SetMenuBar(menu_bar);
   
@@ -1911,6 +2009,7 @@ BEGIN_EVENT_TABLE(PlotFileView, wxView)
 EVT_MENU(PJMENU_FILE_PROPERTIES, PlotFileView::OnProperties)
 EVT_MENU(PLOTMENU_VIEW_SCALE_MINMAX, PlotFileView::OnScaleMinMax)
 EVT_MENU(PLOTMENU_VIEW_SCALE_AUTO, PlotFileView::OnScaleAuto)
+EVT_MENU(PLOTMENU_VIEW_SCALE_FULL, PlotFileView::OnScaleFull)
 END_EVENT_TABLE()
 
 PlotFileView::PlotFileView(void) 
@@ -1990,6 +2089,16 @@ PlotFileView::OnScaleMinMax (wxCommandEvent& event)
   }
 }
 
+void 
+PlotFileView::OnScaleFull (wxCommandEvent& event)
+{
+  if (m_bMinSpecified || m_bMaxSpecified) {
+    m_bMinSpecified = false;
+    m_bMaxSpecified = false;
+    OnUpdate (this, NULL);
+  }
+}
+
 
 PlotFileCanvas* 
 PlotFileView::CreateCanvas (wxView *view, wxFrame *parent)
@@ -2031,6 +2140,7 @@ PlotFileView::CreateChildFrame(wxDocument *doc, wxView *view)
   wxMenu *view_menu = new wxMenu;
   view_menu->Append(PLOTMENU_VIEW_SCALE_MINMAX, "Display Scale &Set...");
   view_menu->Append(PLOTMENU_VIEW_SCALE_AUTO, "Display Scale &Auto...");
+  view_menu->Append(PLOTMENU_VIEW_SCALE_FULL, "Display &Full Scale");
   
   wxMenu *help_menu = new wxMenu;
   help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents");