X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=src%2Fviews.cpp;h=b8404bda75be20c0dfea8b9e5b9badc333e750d9;hp=60eda6ab2633d86c0a31d26d655185bc1a3e4958;hb=e081109a4a541c8780aaa253b874acada5957200;hpb=0730f9f3adbf326b9d4bac754634399ad688efd1 diff --git a/src/views.cpp b/src/views.cpp index 60eda6a..b8404bd 100644 --- a/src/views.cpp +++ b/src/views.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: views.cpp,v 1.112 2001/02/22 11:05:38 kevin Exp $ +** $Id: views.cpp,v 1.113 2001/02/22 15:00:20 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 @@ -49,8 +49,6 @@ #include "timer.h" #include "threadrecon.h" -#define CTSIM_THREADS 1 - #if defined(MSVC) || HAVE_SSTREAM #include #else @@ -385,7 +383,7 @@ ImageFileView::OnCompare (wxCommandEvent& event) return; } pDifferenceDoc->setImageFile (pDifferenceImage); - + wxString s = GetFrame()->GetTitle() + ": "; pDifferenceImage->labelsCopy (rIF, s.c_str()); s = pCompareDoc->GetFirstView()->GetFrame()->GetTitle() + ": "; @@ -413,7 +411,7 @@ ImageFileView::OnInvertValues (wxCommandEvent& event) rIF.invertPixelValues (rIF); rIF.labelAdd ("Invert Pixel Values"); if (theApp->getAskDeleteNewDocs()) - GetDocument()->Modify (true); + GetDocument()->Modify (true); GetDocument()->UpdateAllViews (this); } @@ -424,7 +422,7 @@ ImageFileView::OnSquare (wxCommandEvent& event) rIF.square (rIF); rIF.labelAdd ("Square Pixel Values"); if (theApp->getAskDeleteNewDocs()) - GetDocument()->Modify (true); + GetDocument()->Modify (true); GetDocument()->UpdateAllViews (this); } @@ -435,7 +433,7 @@ ImageFileView::OnSquareRoot (wxCommandEvent& event) rIF.sqrt (rIF); rIF.labelAdd ("Square-root Pixel Values"); if (theApp->getAskDeleteNewDocs()) - GetDocument()->Modify (true); + GetDocument()->Modify (true); GetDocument()->UpdateAllViews (this); } @@ -446,7 +444,7 @@ ImageFileView::OnLog (wxCommandEvent& event) rIF.log (rIF); rIF.labelAdd ("Logrithm base-e Pixel Values"); if (theApp->getAskDeleteNewDocs()) - GetDocument()->Modify (true); + GetDocument()->Modify (true); GetDocument()->UpdateAllViews (this); } @@ -457,7 +455,7 @@ ImageFileView::OnExp (wxCommandEvent& event) rIF.exp (rIF); rIF.labelAdd ("Exponent base-e Pixel Values"); if (theApp->getAskDeleteNewDocs()) - GetDocument()->Modify (true); + GetDocument()->Modify (true); GetDocument()->UpdateAllViews (this); } @@ -636,7 +634,7 @@ ImageFileView::OnFFT (wxCommandEvent& event) m_bMinSpecified = false; m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) - GetDocument()->Modify (true); + GetDocument()->Modify (true); GetDocument()->UpdateAllViews (this); } @@ -649,7 +647,7 @@ ImageFileView::OnIFFT (wxCommandEvent& event) m_bMinSpecified = false; m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) - GetDocument()->Modify (true); + GetDocument()->Modify (true); GetDocument()->UpdateAllViews (this); } @@ -662,7 +660,7 @@ ImageFileView::OnFFTRows (wxCommandEvent& event) m_bMinSpecified = false; m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) - GetDocument()->Modify (true); + GetDocument()->Modify (true); GetDocument()->UpdateAllViews (this); } @@ -675,7 +673,7 @@ ImageFileView::OnIFFTRows (wxCommandEvent& event) m_bMinSpecified = false; m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) - GetDocument()->Modify (true); + GetDocument()->Modify (true); GetDocument()->UpdateAllViews (this); } @@ -688,7 +686,7 @@ ImageFileView::OnFFTCols (wxCommandEvent& event) m_bMinSpecified = false; m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) - GetDocument()->Modify (true); + GetDocument()->Modify (true); GetDocument()->UpdateAllViews (this); } @@ -701,7 +699,7 @@ ImageFileView::OnIFFTCols (wxCommandEvent& event) m_bMinSpecified = false; m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) - GetDocument()->Modify (true); + GetDocument()->Modify (true); GetDocument()->UpdateAllViews (this); } #endif @@ -716,7 +714,7 @@ ImageFileView::OnFourier (wxCommandEvent& event) m_bMinSpecified = false; m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) - GetDocument()->Modify (true); + GetDocument()->Modify (true); GetDocument()->UpdateAllViews (this); } @@ -730,7 +728,7 @@ ImageFileView::OnInverseFourier (wxCommandEvent& event) m_bMinSpecified = false; m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) - GetDocument()->Modify (true); + GetDocument()->Modify (true); GetDocument()->UpdateAllViews (this); } @@ -743,7 +741,7 @@ ImageFileView::OnShuffleNaturalToFourierOrder (wxCommandEvent& event) m_bMinSpecified = false; m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) - GetDocument()->Modify (true); + GetDocument()->Modify (true); GetDocument()->UpdateAllViews (this); } @@ -756,7 +754,7 @@ ImageFileView::OnShuffleFourierToNaturalOrder (wxCommandEvent& event) m_bMinSpecified = false; m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) - GetDocument()->Modify (true); + GetDocument()->Modify (true); GetDocument()->UpdateAllViews (this); } @@ -770,7 +768,7 @@ ImageFileView::OnMagnitude (wxCommandEvent& event) m_bMinSpecified = false; m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) - GetDocument()->Modify (true); + GetDocument()->Modify (true); GetDocument()->UpdateAllViews (this); } } @@ -785,7 +783,7 @@ ImageFileView::OnPhase (wxCommandEvent& event) m_bMinSpecified = false; m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) - GetDocument()->Modify (true); + GetDocument()->Modify (true); GetDocument()->UpdateAllViews (this); } } @@ -936,7 +934,7 @@ ImageFileView::CreateChildFrame(wxDocument *doc, wxView *view) #else wxAcceleratorTable accelTable (4, accelEntries); #endif - + subframe->SetAcceleratorTable (accelTable); return subframe; @@ -1033,7 +1031,7 @@ ImageFileView::OnClose (bool deleteWindow) //GetDocumentManager()->ActivateView (this, false, true); if (! GetDocument() || ! GetDocument()->Close()) return false; - + Activate (false); if (m_pCanvas) { m_pCanvas->setView(NULL); @@ -1125,7 +1123,7 @@ ImageFileView::OnScaleSize (wxCommandEvent& event) rIF.scaleImage (rScaledIF); *theApp->getLog() << os.str().c_str() << "\n"; if (theApp->getAskDeleteNewDocs()) - pScaledDoc->Modify (true); + pScaledDoc->Modify (true); pScaledDoc->UpdateAllViews (this); pScaledDoc->getView()->OnUpdate (this, NULL); pScaledDoc->getView()->getFrame()->Show(true); @@ -1229,7 +1227,7 @@ ImageFileView::OnPlotRow (wxCommandEvent& event) delete pYMag; } if (theApp->getAskDeleteNewDocs()) - pPlotDoc->Modify (true); + pPlotDoc->Modify (true); pPlotDoc->UpdateAllViews (); pPlotDoc->getView()->OnUpdate (this, NULL); pPlotDoc->getView()->getFrame()->Show(true); @@ -1315,7 +1313,7 @@ ImageFileView::OnPlotCol (wxCommandEvent& event) delete pYMag; } if (theApp->getAskDeleteNewDocs()) - pPlotDoc->Modify (true); + pPlotDoc->Modify (true); pPlotDoc->UpdateAllViews (); pPlotDoc->getView()->OnUpdate (this, NULL); pPlotDoc->getView()->getFrame()->Show(true); @@ -1410,7 +1408,7 @@ ImageFileView::OnPlotFFTRow (wxCommandEvent& event) delete [] pcIn; if (theApp->getAskDeleteNewDocs()) - pPlotDoc->Modify (true); + pPlotDoc->Modify (true); pPlotDoc->UpdateAllViews (); pPlotDoc->getView()->OnUpdate (this, NULL); pPlotDoc->getView()->getFrame()->Show(true); @@ -1511,7 +1509,7 @@ ImageFileView::OnPlotFFTCol (wxCommandEvent& event) delete [] pcIn; if (theApp->getAskDeleteNewDocs()) - pPlotDoc->Modify (true); + pPlotDoc->Modify (true); pPlotDoc->UpdateAllViews (); pPlotDoc->getView()->OnUpdate (this, NULL); pPlotDoc->getView()->getFrame()->Show(true); @@ -1794,7 +1792,7 @@ PhantomCanvas::GetBestSize() const { if (! m_pView) return wxSize(0,0); - + int xSize, ySize; theApp->getMainFrame()->GetClientSize (&xSize, &ySize); xSize = maxValue (xSize, ySize); @@ -1891,7 +1889,7 @@ PhantomFileView::OnProjections (wxCommandEvent& event) const Phantom& rPhantom = GetDocument()->getPhantom(); Projections* pProj = new Projections; Scanner theScanner (rPhantom, sGeometry.c_str(), m_iDefaultNDet, m_iDefaultNView, m_iDefaultNSample, - m_dDefaultRotation, m_dDefaultFocalLength, m_dDefaultViewRatio, m_dDefaultScanRatio); + m_dDefaultRotation, m_dDefaultFocalLength, m_dDefaultViewRatio, m_dDefaultScanRatio); if (theScanner.fail()) { wxString msg = "Failed making scanner\n"; msg += theScanner.failMessage().c_str(); @@ -1984,12 +1982,12 @@ PhantomFileView::OnRasterize (wxCommandEvent& event) m_dDefaultRasterViewRatio = 0; if (m_iDefaultRasterNX > 0 && m_iDefaultRasterNY > 0) { const Phantom& rPhantom = GetDocument()->getPhantom(); - + ImageFile* pImageFile = new ImageFile; pImageFile->setArraySize (m_iDefaultRasterNX, m_iDefaultRasterNY); wxProgressDialog dlgProgress (wxString("Rasterize"), wxString("Rasterization Progress"), - pImageFile->nx() + 1, getFrameForChild(), wxPD_CAN_ABORT ); + pImageFile->nx() + 1, getFrameForChild(), wxPD_CAN_ABORT ); Timer timer; for (unsigned int i = 0; i < pImageFile->nx(); i++) { rPhantom.convertToImagefile (*pImageFile, m_dDefaultRasterViewRatio, m_iDefaultRasterNSamples, @@ -1999,14 +1997,14 @@ PhantomFileView::OnRasterize (wxCommandEvent& event) return; } } - + ImageFileDocument* pRasterDoc = theApp->newImageDoc(); if (! pRasterDoc) { sys_error (ERR_SEVERE, "Unable to create image file"); return; } pRasterDoc->setImageFile (pImageFile); - + if (theApp->getAskDeleteNewDocs()) pRasterDoc->Modify (true); pRasterDoc->UpdateAllViews (this); @@ -2323,7 +2321,7 @@ ProjectionFileView::OnConvertFFTPolar (wxCommandEvent& event) m_iDefaultPolarNY = dialogPolar.getYSize(); m_iDefaultPolarZeropad = dialogPolar.getZeropad(); ImageFile* pIF = new ImageFile (m_iDefaultPolarNX, m_iDefaultPolarNY); - + m_iDefaultPolarInterpolation = Projections::convertInterpNameToID (strInterpolation.c_str()); if (! rProj.convertFFTPolar (*pIF, m_iDefaultPolarInterpolation, m_iDefaultPolarZeropad)) { delete pIF; @@ -2354,7 +2352,12 @@ ProjectionFileView::OnConvertFFTPolar (wxCommandEvent& event) void ProjectionFileView::OnReconstructFourier (wxCommandEvent& event) { -#if CTSIM_THREADS + wxMessageBox ("Fourier Reconstruction is not yet supported", "Unimplemented function"); +} + +void +ProjectionFileView::OnReconstructFBP (wxCommandEvent& event) +{ DialogGetReconstructionParameters dialogReconstruction (getFrameForChild(), m_iDefaultNX, m_iDefaultNY, m_iDefaultFilter, m_dDefaultFilterParam, m_iDefaultFilterMethod, m_iDefaultFilterGeneration, m_iDefaultZeropad, m_iDefaultInterpolation, m_iDefaultInterpParam, m_iDefaultBackprojector, @@ -2378,20 +2381,20 @@ ProjectionFileView::OnReconstructFourier (wxCommandEvent& event) wxString optBackprojectName = dialogReconstruction.getBackprojectName(); m_iDefaultBackprojector = Backprojector::convertBackprojectNameToID (optBackprojectName.c_str()); m_iDefaultTrace = dialogReconstruction.getTrace(); - + if (m_iDefaultNX > 0 && m_iDefaultNY > 0) { const Projections& rProj = GetDocument()->getProjections(); - ImageFile* pImageFile = new ImageFile; - pImageFile->setArraySize (m_iDefaultNX, m_iDefaultNY); 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(); Timer timerRecon; if (m_iDefaultTrace > Trace::TRACE_CONSOLE) { + ImageFile* pImageFile = new ImageFile; + pImageFile->setArraySize (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); - + m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(), + optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), m_iDefaultTrace); + ReconstructDialog* pDlgReconstruct = new ReconstructDialog (*pReconstructor, rProj, *pImageFile, m_iDefaultTrace, getFrameForChild()); for (int iView = 0; iView < rProj.nView(); iView++) { ::wxYield(); @@ -2410,164 +2413,71 @@ ProjectionFileView::OnReconstructFourier (wxCommandEvent& event) } delete pDlgReconstruct; delete pReconstructor; - ImageFileDocument* pReconDoc = theApp->newImageDoc(); - if (! pReconDoc) { - sys_error (ERR_SEVERE, "Unable to create image file"); - return; - } - pReconDoc->setImageFile (pImageFile); - if (theApp->getAskDeleteNewDocs()) - pReconDoc->Modify (true); - pReconDoc->UpdateAllViews (this); - if (ImageFileView* rasterView = pReconDoc->getView()) { - rasterView->OnUpdate (rasterView, NULL); - rasterView->getFrame()->SetFocus(); - rasterView->getFrame()->Show(true); - } - *theApp->getLog() << os.str().c_str() << "\n"; - pImageFile->labelAdd (rProj.getLabel()); - pImageFile->labelAdd (os.str().c_str(), timerRecon.timerEnd()); - - } else { -#if CTSIM_THREADS - ThreadedReconstructor* pReconstructor = new ThreadedReconstructor (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()); - if (! pReconstructor->start()) { - delete pImageFile; - delete pReconstructor; + ImageFileDocument* pReconDoc = theApp->newImageDoc(); + if (! pReconDoc) { + sys_error (ERR_SEVERE, "Unable to create image file"); return; } - delete pImageFile; - // delete pReconstructor; -#else - 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); - - wxProgressDialog dlgProgress (wxString("Reconstruction"), wxString("Reconstruction Progress"), rProj.nView() + 1, getFrameForChild(), wxPD_CAN_ABORT ); - for (int iView = 0; iView < rProj.nView(); iView++) { - pReconstructor->reconstructView (iView, 1); - if (! dlgProgress.Update (iView + 1)) { - delete pReconstructor; - delete pImageFile; - return; - } + pReconDoc->setImageFile (pImageFile); + if (theApp->getAskDeleteNewDocs()) + pReconDoc->Modify (true); + pReconDoc->UpdateAllViews (this); + if (ImageFileView* rasterView = pReconDoc->getView()) { + rasterView->OnUpdate (rasterView, NULL); + rasterView->getFrame()->SetFocus(); + rasterView->getFrame()->Show(true); } - delete pReconstructor; - ImageFileDocument* pReconDoc = theApp->newImageDoc(); - if (! pReconDoc) { - sys_error (ERR_SEVERE, "Unable to create image file"); - return; - } - pReconDoc->setImageFile (pImageFile); - if (theApp->getAskDeleteNewDocs()) - pReconDoc->Modify (true); - pReconDoc->UpdateAllViews (this); - if (ImageFileView* rasterView = pReconDoc->getView()) { - rasterView->OnUpdate (rasterView, NULL); - rasterView->getFrame()->SetFocus(); - rasterView->getFrame()->Show(true); - } - *theApp->getLog() << os.str().c_str() << "\n"; - pImageFile->labelAdd (rProj.getLabel()); - pImageFile->labelAdd (os.str().c_str(), timerRecon.timerEnd()); -#endif - } - } - } -#else - wxMessageBox ("Fourier Reconstruction is not yet supported", "Unimplemented function"); -#endif -} - -void -ProjectionFileView::OnReconstructFBP (wxCommandEvent& event) -{ - 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); - - int retVal = dialogReconstruction.ShowModal(); - if (retVal == wxID_OK) { - m_iDefaultNX = dialogReconstruction.getXSize(); - m_iDefaultNY = dialogReconstruction.getYSize(); - wxString optFilterName = dialogReconstruction.getFilterName(); - m_iDefaultFilter = SignalFilter::convertFilterNameToID (optFilterName.c_str()); - m_dDefaultFilterParam = dialogReconstruction.getFilterParam(); - wxString optFilterMethodName = dialogReconstruction.getFilterMethodName(); - m_iDefaultFilterMethod = ProcessSignal::convertFilterMethodNameToID(optFilterMethodName.c_str()); - m_iDefaultZeropad = dialogReconstruction.getZeropad(); - wxString optFilterGenerationName = dialogReconstruction.getFilterGenerationName(); - m_iDefaultFilterGeneration = ProcessSignal::convertFilterGenerationNameToID (optFilterGenerationName.c_str()); - wxString optInterpName = dialogReconstruction.getInterpName(); - m_iDefaultInterpolation = Backprojector::convertInterpNameToID (optInterpName.c_str()); - m_iDefaultInterpParam = dialogReconstruction.getInterpParam(); - wxString optBackprojectName = dialogReconstruction.getBackprojectName(); - m_iDefaultBackprojector = Backprojector::convertBackprojectNameToID (optBackprojectName.c_str()); - m_iDefaultTrace = dialogReconstruction.getTrace(); - - if (m_iDefaultNX > 0 && m_iDefaultNY > 0) { - const Projections& rProj = GetDocument()->getProjections(); - ImageFile* pImageFile = new ImageFile; - pImageFile->setArraySize (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); - - Timer timerRecon; - if (m_iDefaultTrace > Trace::TRACE_CONSOLE) { - ReconstructDialog* pDlgReconstruct = new ReconstructDialog (*pReconstructor, rProj, *pImageFile, m_iDefaultTrace, getFrameForChild()); - for (int iView = 0; iView < rProj.nView(); iView++) { - ::wxYield(); - if (pDlgReconstruct->isCancelled() || ! pDlgReconstruct->reconstructView (iView, true)) { - delete pDlgReconstruct; + *theApp->getLog() << os.str().c_str() << "\n"; + pImageFile->labelAdd (rProj.getLabel()); + pImageFile->labelAdd (os.str().c_str(), timerRecon.timerEnd()); + + } else { + if (theApp->getUseBackgroundTasks() || theApp->getNumberCPU() > 1) { + ThreadedReconstructor* pReconstructor = new ThreadedReconstructor (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()); + if (! pReconstructor->start()) { delete pReconstructor; - delete pImageFile; return; } - ::wxYield(); - ::wxYield(); - while (pDlgReconstruct->isPaused()) { - ::wxYield(); - ::wxUsleep(50); + // delete pReconstructor; // reconstructor is still running + } else { + ImageFile* pImageFile = new ImageFile; + pImageFile->setArraySize (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); + + wxProgressDialog dlgProgress (wxString("Reconstruction"), wxString("Reconstruction Progress"), rProj.nView() + 1, getFrameForChild(), wxPD_CAN_ABORT ); + for (int iView = 0; iView < rProj.nView(); iView++) { + pReconstructor->reconstructView (iView, 1); + if (! dlgProgress.Update (iView + 1)) { + delete pReconstructor; + delete pImageFile; + return; + } } - } - delete pDlgReconstruct; - } else { - wxProgressDialog dlgProgress (wxString("Reconstruction"), wxString("Reconstruction Progress"), rProj.nView() + 1, getFrameForChild(), wxPD_CAN_ABORT ); - for (int iView = 0; iView < rProj.nView(); iView++) { - pReconstructor->reconstructView (iView, 1); - if (! dlgProgress.Update (iView + 1)) { - delete pReconstructor; - delete pImageFile; + delete pReconstructor; + ImageFileDocument* pReconDoc = theApp->newImageDoc(); + if (! pReconDoc) { + sys_error (ERR_SEVERE, "Unable to create image file"); return; } + pReconDoc->setImageFile (pImageFile); + if (theApp->getAskDeleteNewDocs()) + pReconDoc->Modify (true); + pReconDoc->UpdateAllViews (this); + if (ImageFileView* rasterView = pReconDoc->getView()) { + rasterView->OnUpdate (rasterView, NULL); + rasterView->getFrame()->SetFocus(); + rasterView->getFrame()->Show(true); + } + *theApp->getLog() << os.str().c_str() << "\n"; + pImageFile->labelAdd (rProj.getLabel()); + pImageFile->labelAdd (os.str().c_str(), timerRecon.timerEnd()); } } - delete pReconstructor; - ImageFileDocument* pReconDoc = theApp->newImageDoc(); - if (! pReconDoc) { - sys_error (ERR_SEVERE, "Unable to create image file"); - return; - } - pReconDoc->setImageFile (pImageFile); - if (theApp->getAskDeleteNewDocs()) - pReconDoc->Modify (true); - pReconDoc->UpdateAllViews (this); - if (ImageFileView* rasterView = pReconDoc->getView()) { - rasterView->OnUpdate (rasterView, NULL); - rasterView->getFrame()->SetFocus(); - rasterView->getFrame()->Show(true); - } - 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(); - *theApp->getLog() << os.str().c_str() << "\n"; - pImageFile->labelAdd (rProj.getLabel()); - pImageFile->labelAdd (os.str().c_str(), timerRecon.timerEnd()); } } } @@ -2634,10 +2544,8 @@ ProjectionFileView::CreateChildFrame(wxDocument *doc, wxView *view) wxMenu *reconstruct_menu = new wxMenu; reconstruct_menu->Append (PJMENU_RECONSTRUCT_FBP, "&Filtered Backprojection...\tCtrl-R", "Reconstruct image using filtered backprojection"); reconstruct_menu->Append (PJMENU_RECONSTRUCT_FOURIER, "&Fourier...\tCtrl-E", "Reconstruct image using inverse Fourier"); -#ifndef CTSIM_THREADS reconstruct_menu->Enable (PJMENU_RECONSTRUCT_FOURIER, false); -#endif - + wxMenu *help_menu = new wxMenu; help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents\tF1"); help_menu->Append (MAINMENU_HELP_TIPS, "&Tips"); @@ -2777,7 +2685,7 @@ ProjectionFileView::OnClose (bool deleteWindow) if (GetDocument() && GetDocument()->getBadFileOpen()) ::wxYield(); // wxWindows bug workaround } - + return true; } @@ -3101,8 +3009,8 @@ PlotFileView::OnClose (bool deleteWindow) m_pFrame = NULL; if (GetDocument() && GetDocument()->getBadFileOpen()) ::wxYield(); // wxWindows bug workaround - } - + } + return true; } @@ -3169,7 +3077,7 @@ TextFileView::OnClose (bool deleteWindow) if (GetDocument() && GetDocument()->getBadFileOpen()) ::wxYield(); // wxWindows bug workaround } - + return TRUE; } @@ -3187,7 +3095,7 @@ TextFileView::CreateChildFrame (wxDocument *doc, wxView *view) #endif theApp->setIconForFrame (subframe); - m_pFileMenu = new wxMenu; + m_pFileMenu = new wxMenu; m_pFileMenu->Append(MAINMENU_FILE_CREATE_PHANTOM, "Cr&eate Phantom...\tCtrl-P"); m_pFileMenu->Append(MAINMENU_FILE_CREATE_FILTER, "Create &Filter...\tCtrl-F"); @@ -3221,7 +3129,7 @@ TextFileView::CreateChildFrame (wxDocument *doc, wxView *view) subframe->SetMenuBar(menu_bar); subframe->Centre(wxBOTH); - + return subframe; }