X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=src%2Fviews.cpp;h=7c47aa6415671807810ac4274111fdee5f3d90de;hp=f7d8a1f1407469442860b4d9657c150f6fa68563;hb=c6cda8844a491b71759e5dd5edba830d0b809cfd;hpb=0eb095f799dd4222e6eb9b1db9e8c6f2831a1540 diff --git a/src/views.cpp b/src/views.cpp index f7d8a1f..7c47aa6 100644 --- a/src/views.cpp +++ b/src/views.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: views.cpp,v 1.50 2001/01/03 22:00:46 kevin Exp $ +** $Id: views.cpp,v 1.52 2001/01/06 15:33:15 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) @@ -187,14 +188,22 @@ EVT_MENU(IFMENU_IMAGE_SUBTRACT, ImageFileView::OnSubtract) EVT_MENU(IFMENU_IMAGE_MULTIPLY, ImageFileView::OnMultiply) EVT_MENU(IFMENU_IMAGE_DIVIDE, ImageFileView::OnDivide) EVT_MENU(IFMENU_IMAGE_SCALESIZE, ImageFileView::OnScaleSize) -#ifdef HAVE_FFTW +#ifdef HAVE_FFT EVT_MENU(IFMENU_FILTER_FFT, ImageFileView::OnFFT) EVT_MENU(IFMENU_FILTER_IFFT, ImageFileView::OnIFFT) +EVT_MENU(IFMENU_FILTER_FFT_ROWS, ImageFileView::OnFFTRows) +EVT_MENU(IFMENU_FILTER_IFFT_ROWS, ImageFileView::OnIFFTRows) +EVT_MENU(IFMENU_FILTER_FFT_COLS, ImageFileView::OnFFTCols) +EVT_MENU(IFMENU_FILTER_IFFT_COLS, ImageFileView::OnIFFTCols) #endif EVT_MENU(IFMENU_FILTER_MAGNITUDE, ImageFileView::OnMagnitude) EVT_MENU(IFMENU_FILTER_PHASE, ImageFileView::OnPhase) EVT_MENU(IFMENU_PLOT_ROW, ImageFileView::OnPlotRow) EVT_MENU(IFMENU_PLOT_COL, ImageFileView::OnPlotCol) +#ifdef HAVE_FFT +EVT_MENU(IFMENU_PLOT_FFT_ROW, ImageFileView::OnPlotFFTRow) +EVT_MENU(IFMENU_PLOT_FFT_COL, ImageFileView::OnPlotFFTCol) +#endif EVT_MENU(IFMENU_PLOT_HISTOGRAM, ImageFileView::OnPlotHistogram) END_EVENT_TABLE() @@ -286,6 +295,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 +323,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 +345,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,12 +580,11 @@ ImageFileView::OnDivide (wxCommandEvent& event) } -#ifdef HAVE_FFTW +#ifdef HAVE_FFT void ImageFileView::OnFFT (wxCommandEvent& event) { ImageFile& rIF = GetDocument()->getImageFile(); - wxProgressDialog dlgProgress (wxString("FFT"), wxString("FFT Progress"), 1, m_frame, wxPD_APP_MODAL); rIF.fft (rIF); rIF.labelAdd ("FFT Image"); m_bMinSpecified = false; @@ -580,7 +598,6 @@ void ImageFileView::OnIFFT (wxCommandEvent& event) { ImageFile& rIF = GetDocument()->getImageFile(); - wxProgressDialog dlgProgress (wxString("IFFT"), wxString("IFFT Progress"), 1, m_frame, wxPD_APP_MODAL); rIF.ifft (rIF); rIF.labelAdd ("IFFT Image"); m_bMinSpecified = false; @@ -589,6 +606,58 @@ ImageFileView::OnIFFT (wxCommandEvent& event) GetDocument()->Modify(TRUE); GetDocument()->UpdateAllViews(this); } + +void +ImageFileView::OnFFTRows (wxCommandEvent& event) +{ + ImageFile& rIF = GetDocument()->getImageFile(); + rIF.fftRows (rIF); + rIF.labelAdd ("FFT Rows"); + m_bMinSpecified = false; + m_bMaxSpecified = false; + if (theApp->getSetModifyNewDocs()) + GetDocument()->Modify(TRUE); + GetDocument()->UpdateAllViews(this); +} + +void +ImageFileView::OnIFFTRows (wxCommandEvent& event) +{ + ImageFile& rIF = GetDocument()->getImageFile(); + rIF.ifftRows (rIF); + rIF.labelAdd ("IFFT Rows"); + m_bMinSpecified = false; + m_bMaxSpecified = false; + if (theApp->getSetModifyNewDocs()) + GetDocument()->Modify(TRUE); + GetDocument()->UpdateAllViews(this); +} + +void +ImageFileView::OnFFTCols (wxCommandEvent& event) +{ + ImageFile& rIF = GetDocument()->getImageFile(); + rIF.fftCols (rIF); + rIF.labelAdd ("FFT Columns"); + m_bMinSpecified = false; + m_bMaxSpecified = false; + if (theApp->getSetModifyNewDocs()) + GetDocument()->Modify(TRUE); + GetDocument()->UpdateAllViews(this); +} + +void +ImageFileView::OnIFFTCols (wxCommandEvent& event) +{ + ImageFile& rIF = GetDocument()->getImageFile(); + rIF.ifftCols (rIF); + rIF.labelAdd ("IFFT Columns"); + m_bMinSpecified = false; + m_bMaxSpecified = false; + if (theApp->getSetModifyNewDocs()) + GetDocument()->Modify(TRUE); + GetDocument()->UpdateAllViews(this); +} #endif void @@ -604,6 +673,7 @@ ImageFileView::OnFourier (wxCommandEvent& event) GetDocument()->Modify(TRUE); GetDocument()->UpdateAllViews(this); } + void ImageFileView::OnInverseFourier (wxCommandEvent& event) { @@ -694,7 +764,11 @@ ImageFileView::CreateCanvas (wxView *view, wxFrame *parent) wxFrame* ImageFileView::CreateChildFrame(wxDocument *doc, wxView *view) { +#if CTSIM_MDI + wxMDIChildFrame *subframe = new wxMDIChildFrame(theApp->getMainFrame(), -1, "ImageFile Frame", wxPoint(-1, -1), wxSize(0, 0), wxDEFAULT_FRAME_STYLE); +#else wxDocChildFrame *subframe = new wxDocChildFrame(doc, view, theApp->getMainFrame(), -1, "ImageFile Frame", wxPoint(-1, -1), wxSize(0, 0), wxDEFAULT_FRAME_STYLE); +#endif wxMenu *file_menu = new wxMenu; @@ -717,6 +791,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,9 +800,13 @@ 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 - filter_menu->Append (IFMENU_FILTER_FFT, "&FFT"); - filter_menu->Append (IFMENU_FILTER_IFFT, "&IFFT"); +#ifdef HAVE_FFT + filter_menu->Append (IFMENU_FILTER_FFT, "2D &FFT"); + filter_menu->Append (IFMENU_FILTER_IFFT, "2D &IFFT"); + filter_menu->Append (IFMENU_FILTER_FFT_ROWS, "FFT Rows"); + filter_menu->Append (IFMENU_FILTER_IFFT_ROWS, "IFFT Rows"); + filter_menu->Append (IFMENU_FILTER_FFT_COLS, "FFT Columns"); + filter_menu->Append (IFMENU_FILTER_IFFT_COLS, "IFFT Columns"); filter_menu->Append (IFMENU_FILTER_FOURIER, "F&ourier"); filter_menu->Append (IFMENU_FILTER_INVERSE_FOURIER, "Inverse Fo&urier"); #else @@ -752,6 +831,9 @@ ImageFileView::CreateChildFrame(wxDocument *doc, wxView *view) analyze_menu->Append (IFMENU_PLOT_COL, "Plot &Column"); analyze_menu->Append (IFMENU_PLOT_HISTOGRAM, "Plot &Histogram"); analyze_menu->AppendSeparator(); + analyze_menu->Append (IFMENU_PLOT_FFT_ROW, "Plot FFT Row"); + analyze_menu->Append (IFMENU_PLOT_FFT_COL, "Plot FFT Column"); + analyze_menu->AppendSeparator(); analyze_menu->Append (IFMENU_COMPARE_IMAGES, "Compare &Images..."); analyze_menu->Append (IFMENU_COMPARE_ROW, "Compare &Row"); analyze_menu->Append (IFMENU_COMPARE_COL, "Compare &Column"); @@ -863,7 +945,7 @@ ImageFileView::OnClose (bool deleteWindow) if (!GetDocument()->Close()) return false; - m_canvas->Clear(); + // m_canvas->Clear(); m_canvas->m_pView = NULL; m_canvas = NULL; wxString s(theApp->GetAppName()); @@ -945,6 +1027,7 @@ ImageFileView::OnScaleSize (wxCommandEvent& event) } ImageFile& rScaledIF = pScaledDoc->getImageFile(); rScaledIF.setArraySize (iNewNX, iNewNY); + rScaledIF.labelsCopy (rIF); rScaledIF.labelAdd (os.str().c_str()); rIF.scaleImage (rScaledIF); *theApp->getLog() << os.str().c_str() << "\n"; @@ -1051,6 +1134,142 @@ ImageFileView::OnPlotCol (wxCommandEvent& event) } } +#ifdef HAVE_FFT +void +ImageFileView::OnPlotFFTRow (wxCommandEvent& event) +{ + int xCursor, yCursor; + if (! m_canvas->GetCurrentCursor (xCursor, yCursor)) { + wxMessageBox ("No row selected. Please use left mouse button on image to select column","Error"); + return; + } + + const ImageFile& rIF = dynamic_cast(GetDocument())->getImageFile(); + ImageFileArrayConst v = rIF.getArray(); + ImageFileArrayConst vImag = rIF.getImaginaryArray(); + int nx = rIF.nx(); + int ny = rIF.ny(); + + if (v != NULL && yCursor < ny) { + fftw_complex* pcIn = new fftw_complex [nx]; + + int i; + for (i = 0; i < nx; i++) { + pcIn[i].re = v[i][yCursor]; + if (rIF.isComplex()) + pcIn[i].im = vImag[i][yCursor]; + else + pcIn[i].im = 0; + } + + fftw_plan plan = fftw_create_plan (nx, FFTW_FORWARD, FFTW_IN_PLACE); + fftw_one (plan, pcIn, NULL); + fftw_destroy_plan (plan); + + double* pX = new double [nx]; + double* pYReal = new double [nx]; + double* pYImag = new double [nx]; + double* pYMag = new double [nx]; + for (i = 0; i < nx; i++) { + pX[i] = i; + pYReal[i] = pcIn[i].re; + pYImag[i] = pcIn[i].im; + pYMag[i] = ::sqrt (pcIn[i].re * pcIn[i].re + pcIn[i].im * pcIn[i].im); + } + Fourier::shuffleFourierToNaturalOrder (pYReal, nx); + Fourier::shuffleFourierToNaturalOrder (pYImag, nx); + Fourier::shuffleFourierToNaturalOrder (pYMag, nx); + + PlotFileDocument* pPlotDoc = dynamic_cast(theApp->getDocManager()->CreateDocument("untitled.plt", wxDOC_SILENT)); + if (! pPlotDoc) { + sys_error (ERR_SEVERE, "Internal error: unable to create Plot file"); + } else { + PlotFile& rPlotFile = pPlotDoc->getPlotFile(); + std::ostringstream os; + os << "Row " << yCursor; + std::string title("title "); + title += os.str(); + rPlotFile.addEzsetCommand (title.c_str()); + rPlotFile.addEzsetCommand ("xlabel Column"); + rPlotFile.addEzsetCommand ("ylabel Pixel Value"); + rPlotFile.addEzsetCommand ("lxfrac 0"); + rPlotFile.addEzsetCommand ("curve 1"); + rPlotFile.addEzsetCommand ("color 1"); + rPlotFile.addEzsetCommand ("curve 2"); + rPlotFile.addEzsetCommand ("color 2"); + rPlotFile.addEzsetCommand ("dash 1"); + rPlotFile.addEzsetCommand ("curve 3"); + rPlotFile.addEzsetCommand ("dash 2"); + rPlotFile.addEzsetCommand ("color 3"); + rPlotFile.addEzsetCommand ("box"); + rPlotFile.addEzsetCommand ("grid"); + rPlotFile.setCurveSize (2, nx); + rPlotFile.addColumn (0, pX); + rPlotFile.addColumn (1, pYReal); + rPlotFile.addColumn (2, pYImag); + rPlotFile.addColumn (3, pYMag); + } + delete pX; + delete pYReal; + delete pYImag; + delete pYMag; + delete [] pcIn; + + if (theApp->getSetModifyNewDocs()) + pPlotDoc->Modify(true); + pPlotDoc->UpdateAllViews(); + } +} + +void +ImageFileView::OnPlotFFTCol (wxCommandEvent& event) +{ + int xCursor, yCursor; + if (! m_canvas->GetCurrentCursor (xCursor, yCursor)) { + wxMessageBox ("No column selected. Please use left mouse button on image to select column","Error"); + return; + } + + const ImageFile& rIF = dynamic_cast(GetDocument())->getImageFile(); + ImageFileArrayConst v = rIF.getArray(); + int nx = rIF.nx(); + int ny = rIF.ny(); + + if (v != NULL && xCursor < nx) { + double* pX = new double [ny]; + double* pY = new double [ny]; + for (int i = 0; i < ny; i++) { + pX[i] = i; + pY[i] = v[xCursor][i]; + } + PlotFileDocument* pPlotDoc = dynamic_cast(theApp->getDocManager()->CreateDocument("untitled.plt", wxDOC_SILENT)); + if (! pPlotDoc) { + sys_error (ERR_SEVERE, "Internal error: unable to create Plot file"); + } else { + PlotFile& rPlotFile = pPlotDoc->getPlotFile(); + std::ostringstream os; + os << "Column " << xCursor; + std::string title("title "); + title += os.str(); + rPlotFile.addEzsetCommand (title.c_str()); + rPlotFile.addEzsetCommand ("xlabel Row"); + rPlotFile.addEzsetCommand ("ylabel Pixel Value"); + rPlotFile.addEzsetCommand ("lxfrac 0"); + rPlotFile.addEzsetCommand ("box"); + rPlotFile.addEzsetCommand ("grid"); + rPlotFile.setCurveSize (2, nx); + rPlotFile.addColumn (0, pX); + rPlotFile.addColumn (1, pY); + } + delete pX; + delete pY; + if (theApp->getSetModifyNewDocs()) + pPlotDoc->Modify(true); + pPlotDoc->UpdateAllViews(); + } +} +#endif + void ImageFileView::OnCompareCol (wxCommandEvent& event) { @@ -1283,11 +1502,15 @@ 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; m_iDefaultTrace = Trace::TRACE_NONE; + + m_iDefaultRasterNX = 256; + m_iDefaultRasterNY = 256; + m_iDefaultRasterNSamples = 2; } PhantomView::~PhantomView(void) @@ -1403,15 +1626,15 @@ PhantomView::OnProjections (wxCommandEvent& event) void PhantomView::OnRasterize (wxCommandEvent& event) { - DialogGetRasterParameters dialogRaster (m_frame, 256, 256, 1); + DialogGetRasterParameters dialogRaster (m_frame, m_iDefaultRasterNX, m_iDefaultRasterNY, m_iDefaultRasterNSamples); int retVal = dialogRaster.ShowModal(); if (retVal == wxID_OK) { - int xSize = dialogRaster.getXSize(); - int ySize = dialogRaster.getYSize(); - int nSamples = dialogRaster.getNSamples(); - if (nSamples < 1) - nSamples = 1; - if (xSize > 0 && ySize > 0) { + m_iDefaultRasterNX = dialogRaster.getXSize(); + m_iDefaultRasterNY = dialogRaster.getYSize(); + m_iDefaultRasterNSamples = dialogRaster.getNSamples(); + if (m_iDefaultRasterNSamples < 1) + m_iDefaultRasterNSamples = 1; + if (m_iDefaultRasterNX > 0 && m_iDefaultRasterNY > 0) { const Phantom& rPhantom = GetDocument()->getPhantom(); ImageFileDocument* pRasterDoc = dynamic_cast(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT)); if (! pRasterDoc) { @@ -1420,11 +1643,11 @@ PhantomView::OnRasterize (wxCommandEvent& event) } ImageFile& imageFile = pRasterDoc->getImageFile(); - imageFile.setArraySize (xSize, ySize); + imageFile.setArraySize (m_iDefaultRasterNX, m_iDefaultRasterNX); wxProgressDialog dlgProgress (wxString("Rasterize"), wxString("Rasterization Progress"), imageFile.nx() + 1, m_frame, wxPD_CAN_ABORT); Timer timer; for (unsigned int i = 0; i < imageFile.nx(); i++) { - rPhantom.convertToImagefile (imageFile, nSamples, Trace::TRACE_NONE, i, 1, true); + rPhantom.convertToImagefile (imageFile, m_iDefaultRasterNSamples, Trace::TRACE_NONE, i, 1, true); if (! dlgProgress.Update(i+1)) { pRasterDoc->DeleteAllViews(); return; @@ -1434,7 +1657,8 @@ PhantomView::OnRasterize (wxCommandEvent& event) pRasterDoc->Modify(true); pRasterDoc->UpdateAllViews(this); std::ostringstream os; - os << "Rasterize Phantom " << rPhantom.name() << ": XSize=" << xSize << ", YSize=" << ySize << ", nSamples=" << nSamples; + os << "Rasterize Phantom " << rPhantom.name() << ": XSize=" << m_iDefaultRasterNX << ", YSize=" + << m_iDefaultRasterNY << ", nSamples=" << m_iDefaultRasterNSamples; *theApp->getLog() << os.str().c_str() << "\n"; imageFile.labelAdd (os.str().c_str(), timer.timerEnd()); ImageFileView* rasterView = dynamic_cast(pRasterDoc->GetFirstView()); @@ -1466,8 +1690,12 @@ PhantomView::CreateCanvas (wxView *view, wxFrame *parent) wxFrame* PhantomView::CreateChildFrame(wxDocument *doc, wxView *view) { +#if CTSIM_MDI + wxMDIChildFrame *subframe = new wxMDIChildFrame(theApp->getMainFrame(), -1, "Phantom Frame", wxPoint(10, 10), wxSize(256, 256), wxDEFAULT_FRAME_STYLE); +#else wxDocChildFrame *subframe = new wxDocChildFrame(doc, view, theApp->getMainFrame(), -1, "Phantom Frame", wxPoint(10, 10), wxSize(256, 256), wxDEFAULT_FRAME_STYLE); - +#endif + wxMenu *file_menu = new wxMenu; file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "Cr&eate Phantom..."); @@ -1543,17 +1771,18 @@ PhantomView::OnClose (bool deleteWindow) if (!GetDocument()->Close()) return false; - m_canvas->Clear(); +// m_canvas->Clear(); m_canvas->m_pView = NULL; m_canvas = NULL; - wxString s(wxTheApp->GetAppName()); - if (m_frame) - m_frame->SetTitle(s); +// wxString s(wxTheApp->GetAppName()); +// if (m_frame) +// m_frame->SetTitle(s); SetFrame(NULL); Activate(false); if (deleteWindow) { + delete m_frame; return true; } @@ -1617,6 +1846,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) @@ -1639,23 +1873,67 @@ void 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(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(); - wxMessageBox ("Polar conversion not yet implemented", "Unimplemented function"); -#if 0 - rProj.convertPolar (); - if (theApp->getSetModifyNewDocs()) - GetDocument()->Modify(true); - GetDocument()->UpdateAllViews(); -#ifndef HAVE_FFT - wxMessageBox ("FFT support has not been compiled into this version of CTSim", "Error"); -#endif -#endif -} + 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(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) @@ -1772,8 +2050,12 @@ ProjectionFileView::CreateCanvas (wxView *view, wxFrame *parent) wxFrame* ProjectionFileView::CreateChildFrame(wxDocument *doc, wxView *view) { +#ifdef CTSIM_MDI + wxMDIChildFrame *subframe = new wxMDIChildFrame (theApp->getMainFrame(), -1, "Projection Frame", wxPoint(10, 10), wxSize(0, 0), wxDEFAULT_FRAME_STYLE); +#else wxDocChildFrame *subframe = new wxDocChildFrame(doc, view, theApp->getMainFrame(), -1, "Projection Frame", wxPoint(10, 10), wxSize(0, 0), wxDEFAULT_FRAME_STYLE); - +#endif + wxMenu *file_menu = new wxMenu; file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "Cr&eate Phantom..."); @@ -1905,7 +2187,7 @@ ProjectionFileView::OnClose (bool deleteWindow) if (!GetDocument()->Close()) return false; - m_canvas->Clear(); + // m_canvas->Clear(); m_canvas->m_pView = NULL; m_canvas = NULL; wxString s(wxTheApp->GetAppName()); @@ -1947,6 +2229,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) @@ -2026,6 +2309,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) @@ -2045,8 +2338,12 @@ PlotFileView::CreateCanvas (wxView *view, wxFrame *parent) wxFrame* PlotFileView::CreateChildFrame(wxDocument *doc, wxView *view) { +#ifdef CTSIM_MDI + wxMDIChildFrame *subframe = new wxMDIChildFrame (theApp->getMainFrame(), -1, "Plot Frame", wxPoint(10, 10), wxSize(500, 300), wxDEFAULT_FRAME_STYLE); +#else wxDocChildFrame *subframe = new wxDocChildFrame(doc, view, theApp->getMainFrame(), -1, "Plot Frame", wxPoint(10, 10), wxSize(500, 300), wxDEFAULT_FRAME_STYLE); - +#endif + wxMenu *file_menu = new wxMenu; file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "Cr&eate Phantom..."); @@ -2067,6 +2364,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"); @@ -2185,7 +2483,7 @@ PlotFileView::OnClose (bool deleteWindow) if (!GetDocument()->Close()) return false; - m_canvas->Clear(); + // m_canvas->Clear(); m_canvas->m_pView = NULL; m_canvas = NULL; wxString s(wxTheApp->GetAppName());