** 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
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)
}
}
+void
+ImageFileView::OnScaleFull (wxCommandEvent& event)
+{
+ if (m_bMinSpecified || m_bMaxSpecified) {
+ m_bMinSpecified = false;
+ m_bMaxSpecified = false;
+ OnUpdate (this, NULL);
+ }
+}
+
void
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";
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());
}
-#ifdef HAVE_FFTW
+#ifdef HAVE_FFT
void
ImageFileView::OnFFT (wxCommandEvent& event)
{
GetDocument()->Modify(TRUE);
GetDocument()->UpdateAllViews(this);
}
+
void
ImageFileView::OnInverseFourier (wxCommandEvent& event)
{
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");
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");
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;
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)
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)
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);
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();
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);
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)
}
}
+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)
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");