X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=src%2Fviews.cpp;h=1fe4bbfbbc2c71facb551f464b64bc7dec8a4b36;hp=72b79738d44dc361ee7ee25d92a70651793b6b08;hb=d42d3d062dd1aca92b5a2552a1f474aab0bee610;hpb=87ab55294bcd767d86786ad1caae8b1b36b49de0 diff --git a/src/views.cpp b/src/views.cpp index 72b7973..1fe4bbf 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.164 2003/01/24 05:24:19 kevin Exp $ +** $Id$ ** ** 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 @@ -329,6 +329,7 @@ ImageFileView::OnScaleAuto (wxCommandEvent& event) m_dMinPixel = dMin; m_dMaxPixel = dMax; m_dAutoScaleFactor = dialogAutoScale.getAutoScaleFactor(); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); } } @@ -355,6 +356,7 @@ ImageFileView::OnScaleMinMax (wxCommandEvent& event) m_bMaxSpecified = true; m_dMinPixel = dialogMinMax.getMinimum(); m_dMaxPixel = dialogMinMax.getMaximum(); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); } GetDocument()->Activate(); @@ -366,6 +368,7 @@ ImageFileView::OnScaleFull (wxCommandEvent& event) if (m_bMinSpecified || m_bMaxSpecified) { m_bMinSpecified = false; m_bMaxSpecified = false; + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); } GetDocument()->Activate(); @@ -423,6 +426,7 @@ ImageFileView::OnCompare (wxCommandEvent& event) pDifferenceImage->labelAdd (os.str().c_str()); if (theApp->getAskDeleteNewDocs()) pDifferenceDoc->Modify (true); + OnUpdate(this, NULL); pDifferenceDoc->UpdateAllViews(this); pDifferenceDoc->getView()->setInitialClientSize(); pDifferenceDoc->Activate(); @@ -440,6 +444,7 @@ ImageFileView::OnInvertValues (wxCommandEvent& event) rIF.labelAdd ("Invert Pixel Values"); if (theApp->getAskDeleteNewDocs()) GetDocument()->Modify (true); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); GetDocument()->Activate(); } @@ -452,6 +457,7 @@ ImageFileView::OnSquare (wxCommandEvent& event) rIF.labelAdd ("Square Pixel Values"); if (theApp->getAskDeleteNewDocs()) GetDocument()->Modify (true); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); GetDocument()->Activate(); } @@ -464,6 +470,7 @@ ImageFileView::OnSquareRoot (wxCommandEvent& event) rIF.labelAdd ("Square-root Pixel Values"); if (theApp->getAskDeleteNewDocs()) GetDocument()->Modify (true); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); GetDocument()->Activate(); } @@ -476,6 +483,7 @@ ImageFileView::OnLog (wxCommandEvent& event) rIF.labelAdd ("Logrithm base-e Pixel Values"); if (theApp->getAskDeleteNewDocs()) GetDocument()->Modify (true); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); GetDocument()->Activate(); } @@ -488,6 +496,7 @@ ImageFileView::OnExp (wxCommandEvent& event) rIF.labelAdd ("Exponent base-e Pixel Values"); if (theApp->getAskDeleteNewDocs()) GetDocument()->Modify (true); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); GetDocument()->Activate(); } @@ -526,6 +535,7 @@ ImageFileView::OnAdd (wxCommandEvent& event) *theApp->getLog() << os.str().c_str() << "\n"; if (theApp->getAskDeleteNewDocs()) pNewDoc->Modify (true); + OnUpdate(this, NULL); pNewDoc->UpdateAllViews (this); pNewDoc->getView()->setInitialClientSize(); pNewDoc->Activate(); @@ -567,6 +577,7 @@ ImageFileView::OnSubtract (wxCommandEvent& event) *theApp->getLog() << os.str().c_str() << "\n"; if (theApp->getAskDeleteNewDocs()) pNewDoc->Modify (true); + OnUpdate(this, NULL); pNewDoc->UpdateAllViews (this); pNewDoc->getView()->setInitialClientSize(); pNewDoc->Activate(); @@ -608,6 +619,7 @@ ImageFileView::OnMultiply (wxCommandEvent& event) *theApp->getLog() << os.str().c_str() << "\n"; if (theApp->getAskDeleteNewDocs()) pNewDoc->Modify (true); + OnUpdate(this, NULL); pNewDoc->UpdateAllViews (this); pNewDoc->getView()->setInitialClientSize(); pNewDoc->Activate(); @@ -649,6 +661,7 @@ ImageFileView::OnDivide (wxCommandEvent& event) *theApp->getLog() << os.str().c_str() << "\n"; if (theApp->getAskDeleteNewDocs()) pNewDoc->Modify (true); + OnUpdate(this, NULL); pNewDoc->UpdateAllViews (this); pNewDoc->getView()->setInitialClientSize(); pNewDoc->Activate(); @@ -668,6 +681,7 @@ ImageFileView::OnFFT (wxCommandEvent& event) m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) GetDocument()->Modify (true); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); GetDocument()->Activate(); } @@ -682,6 +696,7 @@ ImageFileView::OnIFFT (wxCommandEvent& event) m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) GetDocument()->Modify (true); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); GetDocument()->Activate(); } @@ -696,6 +711,7 @@ ImageFileView::OnFFTRows (wxCommandEvent& event) m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) GetDocument()->Modify (true); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); GetDocument()->Activate(); } @@ -710,6 +726,7 @@ ImageFileView::OnIFFTRows (wxCommandEvent& event) m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) GetDocument()->Modify (true); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); GetDocument()->Activate(); } @@ -724,6 +741,7 @@ ImageFileView::OnFFTCols (wxCommandEvent& event) m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) GetDocument()->Modify (true); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); GetDocument()->Activate(); } @@ -738,6 +756,7 @@ ImageFileView::OnIFFTCols (wxCommandEvent& event) m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) GetDocument()->Modify (true); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); GetDocument()->Activate(); } @@ -754,6 +773,7 @@ ImageFileView::OnFourier (wxCommandEvent& event) m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) GetDocument()->Modify (true); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); GetDocument()->Activate(); } @@ -769,6 +789,7 @@ ImageFileView::OnInverseFourier (wxCommandEvent& event) m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) GetDocument()->Modify (true); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); GetDocument()->Activate(); } @@ -783,6 +804,7 @@ ImageFileView::OnShuffleNaturalToFourierOrder (wxCommandEvent& event) m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) GetDocument()->Modify (true); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); GetDocument()->Activate(); } @@ -797,6 +819,7 @@ ImageFileView::OnShuffleFourierToNaturalOrder (wxCommandEvent& event) m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) GetDocument()->Modify (true); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); GetDocument()->Activate(); } @@ -811,6 +834,7 @@ ImageFileView::OnMagnitude (wxCommandEvent& event) m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) GetDocument()->Modify (true); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); GetDocument()->Activate(); } @@ -826,6 +850,7 @@ ImageFileView::OnPhase (wxCommandEvent& event) m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) GetDocument()->Modify (true); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); } GetDocument()->Activate(); @@ -842,6 +867,7 @@ ImageFileView::OnReal (wxCommandEvent& event) m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) GetDocument()->Modify (true); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); } GetDocument()->Activate(); @@ -858,6 +884,7 @@ ImageFileView::OnImaginary (wxCommandEvent& event) m_bMaxSpecified = false; if (theApp->getAskDeleteNewDocs()) GetDocument()->Modify (true); + OnUpdate(this, NULL); GetDocument()->UpdateAllViews (this); } GetDocument()->Activate(); @@ -1060,8 +1087,12 @@ ImageFileView::setInitialClientSize () void ImageFileView::OnDraw (wxDC* dc) { - if (m_pBitmap && m_pBitmap->Ok()) + if (m_pBitmap && m_pBitmap->Ok()) { +#ifdef DEBUG + *theApp->getLog() << "Drawing bitmap\n"; +#endif dc->DrawBitmap(*m_pBitmap, 0, 0, false); + } int xCursor, yCursor; if (m_pCanvas->GetCurrentCursor (xCursor, yCursor)) @@ -1111,8 +1142,13 @@ ImageFileView::OnUpdate (wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint) ) } } wxImage image (nx, ny, imageData, true); - if (m_pBitmap) + if (m_pBitmap) { delete m_pBitmap; + m_pBitmap = NULL; + } +#ifdef DEBUG + *theApp->getLog() << "Making new bitmap\n"; +#endif m_pBitmap = new wxBitmap (image); delete imageData; m_pCanvas->SetScrollbars(20, 20, nx/20, ny/20); @@ -1311,6 +1347,7 @@ ImageFileView::OnScaleSize (wxCommandEvent& event) *theApp->getLog() << os.str().c_str() << "\n"; if (theApp->getAskDeleteNewDocs()) pScaledDoc->Modify (true); + OnUpdate(this, NULL); pScaledDoc->UpdateAllViews (this); pScaledDoc->getView()->setInitialClientSize(); pScaledDoc->Activate(); @@ -1523,19 +1560,19 @@ ImageFileView::OnPlotFFTRow (wxCommandEvent& event) int ny = rIF.ny(); if (v != NULL && yCursor < ny) { - fftw_complex* pcIn = new fftw_complex [nx]; + fftw_complex* pcIn = static_cast(fftw_malloc (sizeof(fftw_complex) * nx)); int i; for (i = 0; i < nx; i++) { - pcIn[i].re = v[i][yCursor]; + pcIn[i][0] = v[i][yCursor]; if (rIF.isComplex()) - pcIn[i].im = vImag[i][yCursor]; + pcIn[i][1] = vImag[i][yCursor]; else - pcIn[i].im = 0; + pcIn[i][1] = 0; } - fftw_plan plan = fftw_create_plan (nx, FFTW_FORWARD, FFTW_IN_PLACE | FFTW_ESTIMATE | FFTW_USE_WISDOM); - fftw_one (plan, pcIn, NULL); + fftw_plan plan = fftw_plan_dft_1d (nx, pcIn, pcIn, FFTW_FORWARD, FFTW_ESTIMATE); + fftw_execute (plan); fftw_destroy_plan (plan); double* pX = new double [nx]; @@ -1544,9 +1581,9 @@ ImageFileView::OnPlotFFTRow (wxCommandEvent& event) double* pYMag = new double [nx]; for (i = 0; i < nx; i++) { pX[i] = i; - pYReal[i] = pcIn[i].re / nx; - pYImag[i] = pcIn[i].im / nx; - pYMag[i] = ::sqrt (pcIn[i].re * pcIn[i].re + pcIn[i].im * pcIn[i].im); + pYReal[i] = pcIn[i][0] / nx; + pYImag[i] = pcIn[i][1] / nx; + pYMag[i] = ::sqrt (pcIn[i][0] * pcIn[i][0] + pcIn[i][1] * pcIn[i][1]); } Fourier::shuffleFourierToNaturalOrder (pYReal, nx); Fourier::shuffleFourierToNaturalOrder (pYImag, nx); @@ -1591,7 +1628,7 @@ ImageFileView::OnPlotFFTRow (wxCommandEvent& event) delete pYReal; delete pYImag; delete pYMag; - delete [] pcIn; + fftw_free(pcIn); if (theApp->getAskDeleteNewDocs()) pPlotDoc->Modify (true); @@ -1625,7 +1662,7 @@ ImageFileView::OnPlotFFTCol (wxCommandEvent& event) pdTemp[i] = v[xCursor][i]; Fourier::shuffleNaturalToFourierOrder (pdTemp, ny); for (i = 0; i < ny; i++) - pcIn[i].re = pdTemp[i]; + pcIn[i][0] = pdTemp[i]; for (i = 0; i < ny; i++) { if (rIF.isComplex()) @@ -1635,10 +1672,10 @@ ImageFileView::OnPlotFFTCol (wxCommandEvent& event) } Fourier::shuffleNaturalToFourierOrder (pdTemp, ny); for (i = 0; i < ny; i++) - pcIn[i].im = pdTemp[i]; + pcIn[i][1] = pdTemp[i]; - fftw_plan plan = fftw_create_plan (ny, FFTW_BACKWARD, FFTW_IN_PLACE | FFTW_ESTIMATE | FFTW_USE_WISDOM); - fftw_one (plan, pcIn, NULL); + fftw_plan plan = fftw_plan_dft_1d (ny, pcIn, pcIn, FFTW_BACKWARD, FFTW_ESTIMATE); + fftw_execute (plan); fftw_destroy_plan (plan); double* pX = new double [ny]; @@ -1647,9 +1684,9 @@ ImageFileView::OnPlotFFTCol (wxCommandEvent& event) double* pYMag = new double [ny]; for (i = 0; i < ny; i++) { pX[i] = i; - pYReal[i] = pcIn[i].re / ny; - pYImag[i] = pcIn[i].im / ny; - pYMag[i] = ::sqrt (pcIn[i].re * pcIn[i].re + pcIn[i].im * pcIn[i].im); + pYReal[i] = pcIn[i][0] / ny; + pYImag[i] = pcIn[i][1] / ny; + pYMag[i] = ::sqrt (pcIn[i][0] * pcIn[i][0] + pcIn[i][1] * pcIn[i][1]); } PlotFileDocument* pPlotDoc = theApp->newPlotDoc(); @@ -2176,6 +2213,7 @@ PhantomFileView::OnProjections (wxCommandEvent& event) pProjectionDoc->setProjections (pProj); if (theApp->getAskDeleteNewDocs()) pProjectionDoc-> Modify(true); + OnUpdate(this, NULL); pProjectionDoc->UpdateAllViews (this); pProjectionDoc->getView()->setInitialClientSize(); pProjectionDoc->Activate(); @@ -2483,7 +2521,7 @@ ProjectionFileView::ProjectionFileView() m_iDefaultFilterMethod = ProcessSignal::FILTER_METHOD_CONVOLUTION; m_iDefaultFilterGeneration = ProcessSignal::FILTER_GENERATION_DIRECT; #endif - m_iDefaultZeropad = 1; + m_iDefaultZeropad = 2; m_iDefaultBackprojector = Backprojector::BPROJ_IDIFF; m_iDefaultInterpolation = Backprojector::INTERP_LINEAR; m_iDefaultInterpParam = 1; @@ -2492,7 +2530,7 @@ ProjectionFileView::ProjectionFileView() m_iDefaultPolarNX = 256; m_iDefaultPolarNY = 256; m_iDefaultPolarInterpolation = Projections::POLAR_INTERP_BILINEAR; - m_iDefaultPolarZeropad = 1; + m_iDefaultPolarZeropad = 2; } ProjectionFileView::~ProjectionFileView() @@ -2559,7 +2597,6 @@ ProjectionFileView::OnConvertPolar (wxCommandEvent& event) wxString strInterpolation (dialogPolar.getInterpolationName()); m_iDefaultPolarNX = dialogPolar.getXSize(); m_iDefaultPolarNY = dialogPolar.getYSize(); - ImageFileDocument* pPolarDoc = theApp->newImageDoc(); ImageFile* pIF = new ImageFile (m_iDefaultPolarNX, m_iDefaultPolarNY); m_iDefaultPolarInterpolation = Projections::convertInterpNameToID (strInterpolation.c_str()); @@ -2569,7 +2606,7 @@ ProjectionFileView::OnConvertPolar (wxCommandEvent& event) return; } - pPolarDoc = theApp->newImageDoc (); + ImageFileDocument* pPolarDoc = theApp->newImageDoc(); if (! pPolarDoc) { sys_error (ERR_SEVERE, "Unable to create image file"); return; @@ -3025,12 +3062,12 @@ ProjectionFileView::CreateChildFrame(wxDocument *doc, wxView *view) GetDocumentManager()->FileHistoryAddFilesToMenu(m_pFileMenu); GetDocumentManager()->FileHistoryUseMenu(m_pFileMenu); - wxMenu *convert_menu = new wxMenu; - convert_menu->Append (PJMENU_CONVERT_RECTANGULAR, "&Rectangular Image"); - convert_menu->Append (PJMENU_CONVERT_POLAR, "&Polar Image...\tCtrl-L"); - convert_menu->Append (PJMENU_CONVERT_FFT_POLAR, "FF&T->Polar Image...\tCtrl-T"); - convert_menu->AppendSeparator(); - convert_menu->Append (PJMENU_CONVERT_PARALLEL, "&Interpolate to Parallel"); + m_pConvertMenu = new wxMenu; + m_pConvertMenu->Append (PJMENU_CONVERT_RECTANGULAR, "&Rectangular Image"); + m_pConvertMenu->Append (PJMENU_CONVERT_POLAR, "&Polar Image...\tCtrl-L"); + m_pConvertMenu->Append (PJMENU_CONVERT_FFT_POLAR, "FF&T->Polar Image...\tCtrl-T"); + m_pConvertMenu->AppendSeparator(); + m_pConvertMenu->Append (PJMENU_CONVERT_PARALLEL, "&Interpolate to Parallel"); // wxMenu* filter_menu = new wxMenu; // filter_menu->Append (PJMENU_ARTIFACT_REDUCTION, "&Artifact Reduction"); @@ -3039,11 +3076,10 @@ ProjectionFileView::CreateChildFrame(wxDocument *doc, wxView *view) analyze_menu->Append (PJMENU_PLOT_HISTOGRAM, "&Plot Histogram"); analyze_menu->Append (PJMENU_PLOT_TTHETA_SAMPLING, "Plot T-T&heta Sampling...\tCtrl-H"); - 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_FBP_REBIN, "Filtered &Backprojection (Rebin to Parallel)...\tCtrl-B", "Reconstruct image using filtered backprojection"); - // still buggy - // reconstruct_menu->Append (PJMENU_RECONSTRUCT_FOURIER, "&Fourier...\tCtrl-E", "Reconstruct image using inverse Fourier"); + m_pReconstructMenu = new wxMenu; + m_pReconstructMenu->Append (PJMENU_RECONSTRUCT_FBP, "&Filtered Backprojection...\tCtrl-R", "Reconstruct image using filtered backprojection"); + m_pReconstructMenu->Append (PJMENU_RECONSTRUCT_FBP_REBIN, "Filtered &Backprojection (Rebin to Parallel)...\tCtrl-B", "Reconstruct image using filtered backprojection"); + m_pReconstructMenu->Append (PJMENU_RECONSTRUCT_FOURIER, "&Inverse Fourier...\tCtrl-E", "Direct inverse Fourier"); wxMenu *help_menu = new wxMenu; help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents\tF1"); @@ -3054,10 +3090,10 @@ ProjectionFileView::CreateChildFrame(wxDocument *doc, wxView *view) wxMenuBar *menu_bar = new wxMenuBar; menu_bar->Append (m_pFileMenu, "&File"); - menu_bar->Append (convert_menu, "&Convert"); + menu_bar->Append (m_pConvertMenu, "&Convert"); // menu_bar->Append (filter_menu, "Fi<er"); menu_bar->Append (analyze_menu, "&Analyze"); - menu_bar->Append (reconstruct_menu, "&Reconstruct"); + menu_bar->Append (m_pReconstructMenu, "&Reconstruct"); menu_bar->Append (help_menu, "&Help"); subframe->SetMenuBar(menu_bar); @@ -3120,6 +3156,14 @@ ProjectionFileView::OnUpdate (wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint) const Projections& rProj = GetDocument()->getProjections(); const int nDet = rProj.nDet(); const int nView = rProj.nView(); + if (rProj.geometry() == Scanner::GEOMETRY_PARALLEL) { + m_pReconstructMenu->Enable (PJMENU_RECONSTRUCT_FBP_REBIN, false); + m_pConvertMenu->Enable (PJMENU_CONVERT_PARALLEL, false); + } else { + m_pReconstructMenu->Enable (PJMENU_RECONSTRUCT_FBP_REBIN, true); + m_pConvertMenu->Enable (PJMENU_CONVERT_PARALLEL, true); + } + if (nDet != 0 && nView != 0) { const DetectorArray& detarray = rProj.getDetectorArray(0); const DetectorValue* detval = detarray.detValues(); @@ -3153,8 +3197,10 @@ ProjectionFileView::OnUpdate (wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint) } } wxImage image (nDet, nView, imageData, true); - if (m_pBitmap) + if (m_pBitmap) { delete m_pBitmap; + m_pBitmap = NULL; + } m_pBitmap = new wxBitmap (image); delete imageData; }