r635: no message
[ctsim.git] / src / views.cpp
index 41e4367fe44b675239a522f329577619f8674e76..dfce19050dd228534721978c7f8a1abca95674d3 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: views.cpp,v 1.134 2001/03/11 17:55:29 kevin Exp $
+**  $Id: views.cpp,v 1.136 2001/03/13 04:44:25 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
@@ -653,6 +653,7 @@ ImageFileView::OnFFT (wxCommandEvent& event)
   if (theApp->getAskDeleteNewDocs())
     GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
+  GetDocument()->Activate();
 }
 
 void
@@ -666,6 +667,7 @@ ImageFileView::OnIFFT (wxCommandEvent& event)
   if (theApp->getAskDeleteNewDocs())
     GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
+  GetDocument()->Activate();
 }
 
 void
@@ -679,6 +681,7 @@ ImageFileView::OnFFTRows (wxCommandEvent& event)
   if (theApp->getAskDeleteNewDocs())
     GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
+  GetDocument()->Activate();
 }
 
 void
@@ -692,6 +695,7 @@ ImageFileView::OnIFFTRows (wxCommandEvent& event)
   if (theApp->getAskDeleteNewDocs())
     GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
+  GetDocument()->Activate();
 }
 
 void
@@ -705,6 +709,7 @@ ImageFileView::OnFFTCols (wxCommandEvent& event)
   if (theApp->getAskDeleteNewDocs())
     GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
+  GetDocument()->Activate();
 }
 
 void
@@ -718,6 +723,7 @@ ImageFileView::OnIFFTCols (wxCommandEvent& event)
   if (theApp->getAskDeleteNewDocs())
     GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
+  GetDocument()->Activate();
 }
 #endif
 
@@ -733,6 +739,7 @@ ImageFileView::OnFourier (wxCommandEvent& event)
   if (theApp->getAskDeleteNewDocs())
     GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
+  GetDocument()->Activate();
 }
 
 void
@@ -747,6 +754,7 @@ ImageFileView::OnInverseFourier (wxCommandEvent& event)
   if (theApp->getAskDeleteNewDocs())
     GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
+  GetDocument()->Activate();
 }
 
 void
@@ -760,6 +768,7 @@ ImageFileView::OnShuffleNaturalToFourierOrder (wxCommandEvent& event)
   if (theApp->getAskDeleteNewDocs())
     GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
+  GetDocument()->Activate();
 }
 
 void
@@ -773,6 +782,7 @@ ImageFileView::OnShuffleFourierToNaturalOrder (wxCommandEvent& event)
   if (theApp->getAskDeleteNewDocs())
     GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
+  GetDocument()->Activate();
 }
 
 void
@@ -788,6 +798,7 @@ ImageFileView::OnMagnitude (wxCommandEvent& event)
       GetDocument()->Modify (true);
     GetDocument()->UpdateAllViews (this);
   }
+  GetDocument()->Activate();
 }
 
 void
@@ -803,6 +814,7 @@ ImageFileView::OnPhase (wxCommandEvent& event)
       GetDocument()->Modify (true);
     GetDocument()->UpdateAllViews (this);
   }
+  GetDocument()->Activate();
 }
 
 
@@ -868,7 +880,7 @@ ImageFileView::CreateChildFrame(wxDocument *doc, wxView *view)
   edit_menu->Append(IFMENU_EDIT_COPY, "Copy\tCtrl-C");
   edit_menu->Append(IFMENU_EDIT_CUT, "Cut\tCtrl-X");
   edit_menu->Append(IFMENU_EDIT_PASTE, "Paste\tCtrl-V");
-
+  
   wxMenu *view_menu = new wxMenu;
   view_menu->Append(IFMENU_VIEW_SCALE_MINMAX, "Display Scale S&et...\tCtrl-E");
   view_menu->Append(IFMENU_VIEW_SCALE_AUTO, "Display Scale &Auto...\tCtrl-A");
@@ -1089,9 +1101,9 @@ void
 ImageFileView::OnEditCopy (wxCommandEvent& event)
 {
   wxBitmapDataObject *pBitmapObject = new wxBitmapDataObject;
-
+  
   pBitmapObject->SetBitmap (m_bitmap);
-
+  
   if (wxTheClipboard->Open()) {
     wxTheClipboard->SetData (pBitmapObject);
     wxTheClipboard->Close();
@@ -1118,7 +1130,7 @@ void
 ImageFileView::OnEditPaste (wxCommandEvent& event)
 {
   ImageFile& rIF = GetDocument()->getImageFile();
-
+  
   if (wxTheClipboard->Open()) {
     wxBitmap bitmap;
     if (wxTheClipboard->IsSupported (wxDF_BITMAP)) {
@@ -1127,7 +1139,7 @@ ImageFileView::OnEditPaste (wxCommandEvent& event)
       bitmap = bitmapObject.GetBitmap ();
     }
     wxTheClipboard->Close();
-
+    
     int nx = rIF.nx();
     int ny = rIF.ny();
     if (bitmap.Ok() == true && bitmap.GetWidth() == nx && bitmap.GetHeight() == ny) {
@@ -1233,8 +1245,8 @@ ImageFileView::OnScaleSize (wxCommandEvent& event)
     if (theApp->getAskDeleteNewDocs())
       pScaledDoc->Modify (true);
     pScaledDoc->UpdateAllViews (this);
-    pScaledDoc->getView()->OnUpdate (this, NULL);
     pScaledDoc->getView()->getFrame()->Show(true);
+    pScaledDoc->Activate();
   }
 }
 
@@ -1336,9 +1348,9 @@ ImageFileView::OnPlotRow (wxCommandEvent& event)
     }
     if (theApp->getAskDeleteNewDocs())
       pPlotDoc->Modify (true);
-    pPlotDoc->UpdateAllViews ();
-    pPlotDoc->getView()->OnUpdate (this, NULL);
     pPlotDoc->getView()->getFrame()->Show(true);
+    pPlotDoc->UpdateAllViews ();
+    pPlotDoc->Activate();
   }
 }
 
@@ -1422,9 +1434,9 @@ ImageFileView::OnPlotCol (wxCommandEvent& event)
     }
     if (theApp->getAskDeleteNewDocs())
       pPlotDoc->Modify (true);
-    pPlotDoc->UpdateAllViews ();
-    pPlotDoc->getView()->OnUpdate (this, NULL);
     pPlotDoc->getView()->getFrame()->Show(true);
+    pPlotDoc->UpdateAllViews ();
+    pPlotDoc->Activate();
   }
 }
 
@@ -1517,9 +1529,9 @@ ImageFileView::OnPlotFFTRow (wxCommandEvent& event)
     
     if (theApp->getAskDeleteNewDocs())
       pPlotDoc->Modify (true);
-    pPlotDoc->UpdateAllViews ();
-    pPlotDoc->getView()->OnUpdate (this, NULL);
     pPlotDoc->getView()->getFrame()->Show(true);
+    pPlotDoc->UpdateAllViews ();
+    pPlotDoc->Activate();
   }
 }
 
@@ -1618,9 +1630,9 @@ ImageFileView::OnPlotFFTCol (wxCommandEvent& event)
     
     if (theApp->getAskDeleteNewDocs())
       pPlotDoc->Modify (true);
-    pPlotDoc->UpdateAllViews ();
-    pPlotDoc->getView()->OnUpdate (this, NULL);
     pPlotDoc->getView()->getFrame()->Show(true);
+    pPlotDoc->UpdateAllViews ();
+    pPlotDoc->Activate();
   }
 }
 #endif
@@ -1709,9 +1721,9 @@ ImageFileView::OnCompareCol (wxCommandEvent& event)
       delete pY2;
       if (theApp->getAskDeleteNewDocs())
         pPlotDoc->Modify (true);
-      pPlotDoc->UpdateAllViews ();
-      pPlotDoc->getView()->OnUpdate (this, NULL);
       pPlotDoc->getView()->getFrame()->Show(true);
+      pPlotDoc->UpdateAllViews ();
+      pPlotDoc->Activate();
     }
   }
 }
@@ -1801,9 +1813,9 @@ ImageFileView::OnCompareRow (wxCommandEvent& event)
       delete pY2;
       if (theApp->getAskDeleteNewDocs())
         pPlotDoc->Modify (true);
-      pPlotDoc->UpdateAllViews ();
-      pPlotDoc->getView()->OnUpdate (this, NULL);
       pPlotDoc->getView()->getFrame()->Show(true);
+      pPlotDoc->UpdateAllViews ();
+      pPlotDoc->Activate();
     }
   }
 }
@@ -1868,9 +1880,9 @@ ImageFileView::OnPlotHistogram (wxCommandEvent& event)
       delete pY;
       if (theApp->getAskDeleteNewDocs())
         pPlotDoc->Modify (true);
-      pPlotDoc->UpdateAllViews ();
-      pPlotDoc->getView()->OnUpdate (this, NULL);
       pPlotDoc->getView()->getFrame()->Show(true);
+      pPlotDoc->UpdateAllViews ();
+      pPlotDoc->Activate();
   }
 }
 
@@ -1972,6 +1984,7 @@ PhantomFileView::OnProperties (wxCommandEvent& event)
 #endif
   *theApp->getLog() << ">>>>\n" << os.str().c_str() << "<<<<\n";
   wxMessageBox (os.str().c_str(), "Phantom Properties");
+  GetDocument()->Activate();
 }
 
 
@@ -2058,7 +2071,7 @@ PhantomFileView::OnProjections (wxCommandEvent& event)
       return;
     } else     
 #endif // HAVE_WXTHREADS
-       {
+    {
       pProj = new Projections;
       pProj->initFromScanner (theScanner);
       wxProgressDialog dlgProgress (wxString("Projection"), wxString("Projection Progress"), pProj->nView() + 1, getFrameForChild(), wxPD_CAN_ABORT );
@@ -2097,6 +2110,7 @@ PhantomFileView::OnProjections (wxCommandEvent& event)
   if (theApp->getAskDeleteNewDocs())
     pProjectionDoc-> Modify(true);
   pProjectionDoc->UpdateAllViews (this);
+  pProjectionDoc->Activate();
 }
 
 
@@ -2125,7 +2139,7 @@ PhantomFileView::OnRasterize (wxCommandEvent& event)
   os << "Rasterize Phantom " << rPhantom.name() << ": XSize=" << m_iDefaultRasterNX << ", YSize=" 
     << m_iDefaultRasterNY << ", ViewRatio=" << m_dDefaultRasterViewRatio << ", nSamples=" 
     << m_iDefaultRasterNSamples;;
-
+  
 #if HAVE_WXTHREADS
   if (theApp->getUseBackgroundTasks()) {
     RasterizerSupervisorThread* pThread = new RasterizerSupervisorThread (this, m_iDefaultRasterNX, m_iDefaultRasterNY,
@@ -2150,7 +2164,7 @@ PhantomFileView::OnRasterize (wxCommandEvent& event)
         return;
       }
     }
-  
+    
     ImageFileDocument* pRasterDoc = theApp->newImageDoc();
     if (! pRasterDoc) {
       sys_error (ERR_SEVERE, "Unable to create image file");
@@ -2168,6 +2182,7 @@ PhantomFileView::OnRasterize (wxCommandEvent& event)
       rasterView->getFrame()->SetFocus();
       rasterView->OnUpdate (rasterView, NULL);
     }
+    pRasterDoc->Activate();
   }
 }
 
@@ -2419,6 +2434,7 @@ ProjectionFileView::OnProperties (wxCommandEvent& event)
   *theApp->getLog() << ">>>>\n" << os.str().c_str() << "<<<<\n";
   wxMessageDialog dialogMsg (getFrameForChild(), os.str().c_str(), "Projection File Properties", wxOK | wxICON_INFORMATION);
   dialogMsg.ShowModal();
+  GetDocument()->Activate();
 }
 
 
@@ -2442,7 +2458,7 @@ ProjectionFileView::OnConvertPolar (wxCommandEvent& event)
       *theApp->getLog() << "Error converting to Polar\n";
       return;
     }
-
+    
     pPolarDoc = theApp->newImageDoc ();
     if (! pPolarDoc) {
       sys_error (ERR_SEVERE, "Unable to create image file");
@@ -2458,9 +2474,9 @@ ProjectionFileView::OnConvertPolar (wxCommandEvent& event)
     pIF->labelAdd (os.str().c_str());
     if (theApp->getAskDeleteNewDocs())
       pPolarDoc->Modify (true);
-    pPolarDoc->UpdateAllViews ();
-    pPolarDoc->getView()->OnUpdate (this, NULL);
     pPolarDoc->getView()->getFrame()->Show(true);
+    pPolarDoc->UpdateAllViews ();
+    pPolarDoc->Activate();
   }
 }
 
@@ -2499,47 +2515,52 @@ ProjectionFileView::OnConvertFFTPolar (wxCommandEvent& event)
     pIF->labelAdd (os.str().c_str());
     if (theApp->getAskDeleteNewDocs())
       pPolarDoc->Modify (true);
-    pPolarDoc->UpdateAllViews ();
-    pPolarDoc->getView()->OnUpdate (this, NULL);
     pPolarDoc->getView()->getFrame()->Show(true);
+    pPolarDoc->UpdateAllViews ();
+    pPolarDoc->Activate();
   }
 }
 
 void
 ProjectionFileView::OnPlotTThetaSampling (wxCommandEvent& event)
 {
-  Projections& rProj = GetDocument()->getProjections();
-    ParallelRaysums parallel (&rProj);
-    PlotFileDocument* pPlotDoc = theApp->newPlotDoc();
-    PlotFile& rPlot = pPlotDoc->getPlotFile();
-    ParallelRaysums::CoordinateContainer& coordContainer = parallel.getCoordinates();
-    double* pdT = new double [parallel.getNumCoordinates()];
-    double* pdTheta = new double [parallel.getNumCoordinates()];
-
-    for (int i = 0; i < parallel.getNumCoordinates(); i++) {
-      pdT[i] = coordContainer[i]->m_dT;
-      pdTheta[i] = coordContainer[i]->m_dTheta;
-    }
-    rPlot.setCurveSize (2, parallel.getNumCoordinates(), true);
-    rPlot.addEzsetCommand ("title T-Theta Sampling");
-    rPlot.addEzsetCommand ("xlabel T");
-    rPlot.addEzsetCommand ("ylabel Theta");
-    rPlot.addEzsetCommand ("curve 1");
-    if (rProj.nDet() < 50 && rProj.nView() < 50)
-      rPlot.addEzsetCommand ("symbol 1"); // x symbol
-    else
-      rPlot.addEzsetCommand ("symbol 6"); // point symbol
-    rPlot.addEzsetCommand ("noline");
-    rPlot.addColumn (0, pdT);
-    rPlot.addColumn (1, pdTheta);
-    delete pdT;
-    delete pdTheta;
-    if (theApp->getAskDeleteNewDocs())
-      pPlotDoc->Modify (true);
-    pPlotDoc->UpdateAllViews ();
-    pPlotDoc->getView()->OnUpdate (this, NULL);
-    pPlotDoc->getView()->getFrame()->Show(true);
+  DialogGetThetaRange dlgTheta (this->getFrame(), ParallelRaysums::THETA_RANGE_UNCONSTRAINED);
+  if (dlgTheta.ShowModal() != wxID_OK)
     return;
+  
+  int iThetaRange = dlgTheta.getThetaRange();
+  
+  Projections& rProj = GetDocument()->getProjections();
+  ParallelRaysums parallel (&rProj, iThetaRange);
+  PlotFileDocument* pPlotDoc = theApp->newPlotDoc();
+  PlotFile& rPlot = pPlotDoc->getPlotFile();
+  ParallelRaysums::CoordinateContainer& coordContainer = parallel.getCoordinates();
+  double* pdT = new double [parallel.getNumCoordinates()];
+  double* pdTheta = new double [parallel.getNumCoordinates()];
+  
+  for (int i = 0; i < parallel.getNumCoordinates(); i++) {
+    pdT[i] = coordContainer[i]->m_dT;
+    pdTheta[i] = coordContainer[i]->m_dTheta;
+  }
+  rPlot.setCurveSize (2, parallel.getNumCoordinates(), true);
+  rPlot.addEzsetCommand ("title T-Theta Sampling");
+  rPlot.addEzsetCommand ("xlabel T");
+  rPlot.addEzsetCommand ("ylabel Theta");
+  rPlot.addEzsetCommand ("curve 1");
+  if (rProj.nDet() < 50 && rProj.nView() < 50)
+    rPlot.addEzsetCommand ("symbol 1"); // x symbol
+  else
+    rPlot.addEzsetCommand ("symbol 6"); // point symbol
+  rPlot.addEzsetCommand ("noline");
+  rPlot.addColumn (0, pdT);
+  rPlot.addColumn (1, pdTheta);
+  delete pdT;
+  delete pdTheta;
+  if (theApp->getAskDeleteNewDocs())
+    pPlotDoc->Modify (true);
+  pPlotDoc->getView()->getFrame()->Show(true);
+  pPlotDoc->UpdateAllViews ();
+  pPlotDoc->Activate();
 }
 
 void
@@ -2554,7 +2575,7 @@ ProjectionFileView::OnConvertParallel (wxCommandEvent& event)
   Projections* pProjNew = rProj.interpolateToParallel();
   ProjectionFileDocument* pProjDocNew = theApp->newProjectionDoc();
   pProjDocNew->setProjections (pProjNew);  
-
+  
   if (ProjectionFileView* projView = pProjDocNew->getView()) {
     projView->OnUpdate (projView, NULL);
     if (projView->getCanvas())
@@ -2569,6 +2590,7 @@ ProjectionFileView::OnConvertParallel (wxCommandEvent& event)
   if (theApp->getAskDeleteNewDocs())
     pProjDocNew-> Modify(true);
   pProjDocNew->UpdateAllViews (this);
+  pProjDocNew->Activate();
 }
 
 void
@@ -2586,7 +2608,7 @@ ProjectionFileView::OnReconstructFBP (wxCommandEvent& event)
   defaultROI.m_dXMax = defaultROI.m_dXMin + rProj.phmLen();
   defaultROI.m_dYMin = -rProj.phmLen() / 2;
   defaultROI.m_dYMax = defaultROI.m_dYMin + rProj.phmLen();
-
+  
   DialogGetReconstructionParameters dialogReconstruction (getFrameForChild(), m_iDefaultNX, m_iDefaultNY, 
     m_iDefaultFilter, m_dDefaultFilterParam, m_iDefaultFilterMethod, m_iDefaultFilterGeneration, 
     m_iDefaultZeropad, m_iDefaultInterpolation, m_iDefaultInterpParam, m_iDefaultBackprojector, 
@@ -2613,7 +2635,7 @@ ProjectionFileView::OnReconstructFBP (wxCommandEvent& event)
   m_iDefaultBackprojector = Backprojector::convertBackprojectNameToID (optBackprojectName.c_str());
   m_iDefaultTrace = dialogReconstruction.getTrace();
   dialogReconstruction.getROI (&defaultROI);
-
+  
   if (m_iDefaultNX <= 0 && m_iDefaultNY <= 0) 
     return;
   
@@ -2663,7 +2685,7 @@ ProjectionFileView::OnReconstructFBP (wxCommandEvent& event)
       return;
     } else 
 #endif
-       {
+    {
       pImageFile = new ImageFile (m_iDefaultNX, m_iDefaultNY);
       Reconstructor* pReconstructor = new Reconstructor (rProj, *pImageFile, optFilterName.c_str(), 
         m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(), 
@@ -2690,6 +2712,7 @@ ProjectionFileView::OnReconstructFBP (wxCommandEvent& event)
   if (theApp->getAskDeleteNewDocs())
     pReconDoc->Modify (true);
   pReconDoc->UpdateAllViews (this);
+  pReconDoc->Activate();
   if (ImageFileView* rasterView = pReconDoc->getView()) {
     rasterView->OnUpdate (rasterView, NULL);
     rasterView->getFrame()->SetFocus();
@@ -2768,13 +2791,13 @@ ProjectionFileView::CreateChildFrame(wxDocument *doc, wxView *view)
   convert_menu->Append (PJMENU_CONVERT_FFT_POLAR, "&FFT->Polar Image...\tCtrl-M");
   convert_menu->AppendSeparator();
   convert_menu->Append (PJMENU_CONVERT_PARALLEL, "&Interpolate to Parallel");
-
+  
   wxMenu* filter_menu = new wxMenu;
   filter_menu->Append (PJMENU_ARTIFACT_REDUCTION, "&Artifact Reduction");
-
+  
   wxMenu* analyze_menu = new wxMenu;
   analyze_menu->Append (PJMENU_PLOT_TTHETA_SAMPLING, "&Plot T-Theta Sampling\tCtrl-T");
-
+  
   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");
@@ -2986,6 +3009,7 @@ PlotFileView::OnProperties (wxCommandEvent& event)
   *theApp->getLog() << ">>>>\n" << os.str().c_str() << "<<<<<\n";
   wxMessageDialog dialogMsg (getFrameForChild(), os.str().c_str(), "Plot File Properties", wxOK | wxICON_INFORMATION);
   dialogMsg.ShowModal();
+  GetDocument()->Activate();
 }
 
 
@@ -3008,6 +3032,7 @@ PlotFileView::OnScaleAuto (wxCommandEvent& event)
       OnUpdate (this, NULL);
     }
   }
+  GetDocument()->Activate();
 }
 
 void 
@@ -3038,6 +3063,7 @@ PlotFileView::OnScaleMinMax (wxCommandEvent& event)
     m_dMaxPixel = dialogMinMax.getMaximum();
     OnUpdate (this, NULL);
   }
+  GetDocument()->Activate();
 }
 
 void 
@@ -3048,6 +3074,7 @@ PlotFileView::OnScaleFull (wxCommandEvent& event)
     m_bMaxSpecified = false;
     OnUpdate (this, NULL);
   }
+  GetDocument()->Activate();
 }
 
 
@@ -3190,7 +3217,7 @@ PlotFileView::OnUpdate (wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint) )
   const int iNColumns = rPlotFile.getNumColumns();
   const int iNRecords = rPlotFile.getNumRecords();
   const bool bScatterPlot = rPlotFile.getIsScatterPlot();
-
+  
   if (iNColumns > 0 && iNRecords > 0) {
     if (m_pEZPlot)
       delete m_pEZPlot;
@@ -3213,12 +3240,12 @@ PlotFileView::OnUpdate (wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint) )
     
     m_pEZPlot->ezset("box");
     m_pEZPlot->ezset("grid");
-  
+    
     double* pdX = new double [iNRecords];
     double* pdY = new double [iNRecords];
     if (! bScatterPlot) {
       rPlotFile.getColumn (0, pdX);
-    
+      
       for (int iCol = 1; iCol < iNColumns; iCol++) {
         rPlotFile.getColumn (iCol, pdY);
         m_pEZPlot->addCurve (pdX, pdY, iNRecords);