r7061: initial property settings
[ctsim.git] / src / views.cpp
index 72b79738d44dc361ee7ee25d92a70651793b6b08..0bf911a79fe7d52582b4385260fc3fa5b66aac2e 100644 (file)
@@ -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();
@@ -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&lter");
   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;
   }