r520: no message
[ctsim.git] / src / views.cpp
index ba400e708a4cf336038b2d2bc07dcdbe3276b3fd..ce66ec1eac16c8e9bdba27e70a98209e4171b107 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: views.cpp,v 1.94 2001/01/31 01:01:22 kevin Exp $
+**  $Id: views.cpp,v 1.102 2001/02/11 04:56:38 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
@@ -268,7 +268,7 @@ ImageFileView::OnProperties (wxCommandEvent& event)
   if (rIF.nx() == 0 || rIF.ny() == 0)
     *theApp->getLog() << "Properties: empty imagefile\n";
   else {
-    const std::string& rFilename = rIF.getFilename();
+    const std::string rFilename = m_pFrame->GetTitle().c_str();
     std::ostringstream os;
     double min, max, mean, mode, median, stddev;
     rIF.statistics (rIF.getArray(), min, max, mean, mode, median, stddev);
@@ -822,6 +822,7 @@ ImageFileView::CreateChildFrame(wxDocument *doc, wxView *view)
   m_pFileMenu->Append(wxID_PREVIEW, "Print Preview");
 #ifdef CTSIM_MDI
   m_pFileMenu->AppendSeparator();
+  m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Pr&eferences...");
   m_pFileMenu->Append(MAINMENU_FILE_EXIT, "E&xit");
 #endif
   GetDocumentManager()->FileHistoryAddFilesToMenu(m_pFileMenu);
@@ -932,7 +933,6 @@ bool
 ImageFileView::OnCreate (wxDocument *doc, long WXUNUSED(flags) )
 {
   m_pFrame = CreateChildFrame(doc, this);
-  (m_pFrame);
   
   m_bMinSpecified = false;
   m_bMaxSpecified = false;
@@ -1032,7 +1032,7 @@ ImageFileView::OnClose (bool deleteWindow)
   SetFrame(NULL);
   
   if (deleteWindow) {
-    m_pFrame->Destroy();
+    delete m_pFrame;
     m_pFrame = NULL;
     if (GetDocument() && GetDocument()->getBadFileOpen())
       ::wxYield();  // wxWindows bug workaround
@@ -1125,8 +1125,13 @@ ImageFileView::OnConvert3d (wxCommandEvent& event)
   Graph3dFileDocument* pGraph3d = theApp->newGraph3dDoc();
   pGraph3d->setBadFileOpen();
   pGraph3d->createFromImageFile (rIF);
-  pGraph3d->getView()->getFrame()->SetClientSize (200, 200);
+  pGraph3d->getView()->OnUpdate (this, NULL);
+  pGraph3d->UpdateAllViews();
+  pGraph3d->getView()->getFrame()->SetClientSize (400, 400);
   pGraph3d->getView()->getFrame()->Show (true);
+  GetDocumentManager()->ActivateView (pGraph3d->getView(), true, false);
+  ::wxYield();
+  pGraph3d->getView()->getCanvas()->SetFocus();
 }
 #endif
 
@@ -1762,6 +1767,20 @@ PhantomCanvas::OnDraw (wxDC& dc)
     m_pView->OnDraw(& dc);
 }
 
+wxSize
+PhantomCanvas::GetBestSize() const
+{
+  if (! m_pView)
+    return wxSize(0,0);
+
+  int xSize, ySize;
+  theApp->getMainFrame()->GetClientSize (&xSize, &ySize);
+  xSize = maxValue<int> (xSize, ySize);
+  ySize = xSize = (xSize / 3);
+  return wxSize (xSize, ySize);
+}
+
+
 
 // PhantomFileView
 
@@ -1784,9 +1803,10 @@ PhantomFileView::PhantomFileView()
   m_iDefaultNView = 320;
 #endif
   m_iDefaultNSample = 1;
-  m_dDefaultRotation = 1;
+  m_dDefaultRotation = 2;
   m_dDefaultFocalLength = 2;
-  m_dDefaultFieldOfView = 1;
+  m_dDefaultViewRatio = 1;
+  m_dDefaultScanRatio = 1;
   m_iDefaultGeometry = Scanner::GEOMETRY_PARALLEL;
   m_iDefaultTrace = Trace::TRACE_NONE;
   
@@ -1799,6 +1819,7 @@ PhantomFileView::PhantomFileView()
   m_iDefaultRasterNY = 256;
   m_iDefaultRasterNSamples = 2;
 #endif
+  m_dDefaultRasterViewRatio = 1;
 }
 
 PhantomFileView::~PhantomFileView()
@@ -1827,7 +1848,10 @@ PhantomFileView::OnProperties (wxCommandEvent& event)
 void
 PhantomFileView::OnProjections (wxCommandEvent& event)
 {
-  DialogGetProjectionParameters dialogProjection (getFrameForChild(), m_iDefaultNDet, m_iDefaultNView, m_iDefaultNSample, m_dDefaultRotation, m_dDefaultFocalLength, m_dDefaultFieldOfView, m_iDefaultGeometry, m_iDefaultTrace);
+  DialogGetProjectionParameters dialogProjection (getFrameForChild(), 
+    m_iDefaultNDet, m_iDefaultNView, m_iDefaultNSample, m_dDefaultRotation, 
+    m_dDefaultFocalLength, m_dDefaultViewRatio, m_dDefaultScanRatio, m_iDefaultGeometry, 
+    m_iDefaultTrace);
   int retVal = dialogProjection.ShowModal();
   if (retVal == wxID_OK) {
     m_iDefaultNDet = dialogProjection.getNDet();
@@ -1836,7 +1860,8 @@ PhantomFileView::OnProjections (wxCommandEvent& event)
     m_iDefaultTrace = dialogProjection.getTrace();
     m_dDefaultRotation = dialogProjection.getRotAngle();
     m_dDefaultFocalLength = dialogProjection.getFocalLengthRatio();
-    m_dDefaultFieldOfView = dialogProjection.getFieldOfViewRatio();
+    m_dDefaultViewRatio = dialogProjection.getViewRatio();
+    m_dDefaultScanRatio = dialogProjection.getScanRatio();
     wxString sGeometry = dialogProjection.getGeometry();
     m_iDefaultGeometry = Scanner::convertGeometryNameToID (sGeometry.c_str());
     
@@ -1844,9 +1869,12 @@ 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_dDefaultFieldOfView);
+                          m_dDefaultRotation, m_dDefaultFocalLength, m_dDefaultViewRatio, m_dDefaultScanRatio);
       if (theScanner.fail()) {
-        *theApp->getLog() << "Failed making scanner: " << theScanner.failMessage().c_str() << "\n";
+        wxString msg = "Failed making scanner\n";
+        msg += theScanner.failMessage().c_str();
+        *theApp->getLog() << msg << "\n";
+        wxMessageBox (msg, "Error");
         return;
       }
       pProj->initFromScanner (theScanner);
@@ -1879,7 +1907,12 @@ PhantomFileView::OnProjections (wxCommandEvent& event)
       }
       
       std::ostringstream os;
-      os << "Projections for " << rPhantom.name() << ": nDet=" << m_iDefaultNDet << ", nView=" << m_iDefaultNView << ", nSamples=" << m_iDefaultNSample << ", RotAngle=" << m_dDefaultRotation << ", FocalLengthRatio=" << m_dDefaultFocalLength << ", FieldOfViewRatio=" << m_dDefaultFieldOfView << ", Geometry=" << sGeometry.c_str();
+      os << "Projections for " << rPhantom.name() << ": nDet=" << m_iDefaultNDet 
+        << ", nView=" << m_iDefaultNView << ", nSamples=" << m_iDefaultNSample 
+        << ", RotAngle=" << m_dDefaultRotation << ", FocalLengthRatio=" << m_dDefaultFocalLength 
+        << ", ViewRatio=" << m_dDefaultViewRatio << ", ScanRatio=" << m_dDefaultScanRatio 
+        << ", Geometry=" << sGeometry.c_str() << ", FanBeamAngle=" << 
+        convertRadiansToDegrees (theScanner.fanBeamAngle());
       pProj->setCalcTime (timer.timerEnd());
       pProj->setRemark (os.str());
       *theApp->getLog() << os.str().c_str() << "\n";
@@ -1914,14 +1947,18 @@ PhantomFileView::OnProjections (wxCommandEvent& event)
 void
 PhantomFileView::OnRasterize (wxCommandEvent& event)
 {
-  DialogGetRasterParameters dialogRaster (getFrameForChild(), m_iDefaultRasterNX, m_iDefaultRasterNY, m_iDefaultRasterNSamples);
+  DialogGetRasterParameters dialogRaster (getFrameForChild(), m_iDefaultRasterNX, m_iDefaultRasterNY, 
+    m_iDefaultRasterNSamples, m_dDefaultRasterViewRatio);
   int retVal = dialogRaster.ShowModal();
   if (retVal == wxID_OK) {
     m_iDefaultRasterNX = dialogRaster.getXSize();
     m_iDefaultRasterNY  = dialogRaster.getYSize();
     m_iDefaultRasterNSamples = dialogRaster.getNSamples();
+    m_dDefaultRasterViewRatio = dialogRaster.getViewRatio();
     if (m_iDefaultRasterNSamples < 1)
       m_iDefaultRasterNSamples = 1;
+    if (m_dDefaultRasterViewRatio < 0)
+      m_dDefaultRasterViewRatio = 0;
     if (m_iDefaultRasterNX > 0 && m_iDefaultRasterNY > 0) {
       const Phantom& rPhantom = GetDocument()->getPhantom();
 
@@ -1932,7 +1969,8 @@ PhantomFileView::OnRasterize (wxCommandEvent& event)
                                     pImageFile->nx() + 1, getFrameForChild(), wxPD_CAN_ABORT);
       Timer timer;
       for (unsigned int i = 0; i < pImageFile->nx(); i++) {
-        rPhantom.convertToImagefile (*pImageFile, m_iDefaultRasterNSamples, Trace::TRACE_NONE, i, 1, true);
+        rPhantom.convertToImagefile (*pImageFile, m_dDefaultRasterViewRatio, m_iDefaultRasterNSamples, 
+          Trace::TRACE_NONE, i, 1, true);
         if (! dlgProgress.Update (i+1)) {
           delete pImageFile;
           return;
@@ -1951,7 +1989,8 @@ PhantomFileView::OnRasterize (wxCommandEvent& event)
       pRasterDoc->getView()->getFrame()->Show(true);
       std::ostringstream os;
       os << "Rasterize Phantom " << rPhantom.name() << ": XSize=" << m_iDefaultRasterNX << ", YSize=" 
-        << m_iDefaultRasterNY << ", nSamples=" << m_iDefaultRasterNSamples;
+        << m_iDefaultRasterNY << ", ViewRatio=" << m_dDefaultRasterViewRatio << ", nSamples=" 
+        << m_iDefaultRasterNSamples;;
       *theApp->getLog() << os.str().c_str() << "\n";
       pImageFile->labelAdd (os.str().c_str(), timer.timerEnd());
       ImageFileView* rasterView = pRasterDoc->getView();
@@ -1969,11 +2008,8 @@ PhantomCanvas*
 PhantomFileView::CreateCanvas (wxFrame *parent)
 {
   PhantomCanvas* pCanvas;
-  int width, height;
-  parent->GetClientSize(&width, &height);
-  
-  pCanvas = new PhantomCanvas (this, parent, wxPoint(0, 0), wxSize(width, height), 0);
   
+  pCanvas = new PhantomCanvas (this, parent, wxPoint(0, 0), wxSize(0,0), 0);
   pCanvas->SetBackgroundColour(*wxWHITE);
   pCanvas->Clear();
   
@@ -1988,9 +2024,9 @@ wxDocChildFrame*
 PhantomFileView::CreateChildFrame(wxDocument *doc, wxView *view)
 {
 #if CTSIM_MDI
-  wxDocMDIChildFrame *subframe = new wxDocMDIChildFrame (doc, view, theApp->getMainFrame(), -1, "Phantom Frame", wxPoint(10, 10), wxSize(256, 256), wxDEFAULT_FRAME_STYLE);
+  wxDocMDIChildFrame *subframe = new wxDocMDIChildFrame (doc, view, theApp->getMainFrame(), -1, "Phantom Frame", wxPoint(10, 10), wxSize(0, 0), wxDEFAULT_FRAME_STYLE);
 #else
-  wxDocChildFrame *subframe = new wxDocChildFrame (doc, view, theApp->getMainFrame(), -1, "Phantom Frame", wxPoint(10, 10), wxSize(256, 256), wxDEFAULT_FRAME_STYLE);
+  wxDocChildFrame *subframe = new wxDocChildFrame (doc, view, theApp->getMainFrame(), -1, "Phantom Frame", wxPoint(10, 10), wxSize(0, 0), wxDEFAULT_FRAME_STYLE);
 #endif
   theApp->setIconForFrame (subframe);
   
@@ -2011,6 +2047,7 @@ PhantomFileView::CreateChildFrame(wxDocument *doc, wxView *view)
   m_pFileMenu->Append(wxID_PREVIEW, "Print Pre&view");
 #ifdef CTSIM_MDI
   m_pFileMenu->AppendSeparator();
+  m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Pr&eferences...");
   m_pFileMenu->Append(MAINMENU_FILE_EXIT, "E&xit");
 #endif
   GetDocumentManager()->FileHistoryAddFilesToMenu(m_pFileMenu);
@@ -2055,11 +2092,11 @@ PhantomFileView::OnCreate(wxDocument *doc, long WXUNUSED(flags) )
 {
   m_pFrame = CreateChildFrame(doc, this);
   SetFrame(m_pFrame);
-  
-  int width, height;
-  m_pFrame->GetClientSize(&width, &height);
-  m_pFrame->SetTitle("PhantomFileView");
   m_pCanvas = CreateCanvas (m_pFrame);
+  m_pFrame->SetClientSize (m_pCanvas->GetBestSize());
+  m_pCanvas->SetClientSize (m_pCanvas->GetBestSize());
+  
+  m_pFrame->SetTitle ("PhantomFileView");
   
 #ifdef __X__
   int x, y;  // X requires a forced resize
@@ -2165,7 +2202,7 @@ EVT_MENU(PJMENU_CONVERT_FFT_POLAR, ProjectionFileView::OnConvertFFTPolar)
 END_EVENT_TABLE()
 
 ProjectionFileView::ProjectionFileView() 
-: wxView(), m_pCanvas(NULL), m_pFrame(NULL), m_pFileMenu(0)
+: wxView(), m_pFrame(0), m_pCanvas(0), m_pFileMenu(0)
 {
 #ifdef DEBUG
   m_iDefaultNX = 115;
@@ -2185,7 +2222,7 @@ ProjectionFileView::ProjectionFileView()
   m_iDefaultFilterGeneration = ProcessSignal::FILTER_GENERATION_DIRECT;
 #endif
   m_iDefaultZeropad = 1;
-  m_iDefaultBackprojector = Backprojector::BPROJ_IDIFF3;
+  m_iDefaultBackprojector = Backprojector::BPROJ_IDIFF;
   m_iDefaultInterpolation = Backprojector::INTERP_LINEAR;
   m_iDefaultInterpParam = 1;
   m_iDefaultTrace = Trace::TRACE_NONE;
@@ -2290,7 +2327,10 @@ ProjectionFileView::OnReconstructFourier (wxCommandEvent& event)
 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);
+  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) {
@@ -2419,6 +2459,7 @@ ProjectionFileView::CreateChildFrame(wxDocument *doc, wxView *view)
   m_pFileMenu->Append(wxID_PREVIEW, "Print Pre&view");
 #ifdef CTSIM_MDI
   m_pFileMenu->AppendSeparator();
+  m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Pr&eferences...");
   m_pFileMenu->Append(MAINMENU_FILE_EXIT, "E&xit");
 #endif
   GetDocumentManager()->FileHistoryAddFilesToMenu(m_pFileMenu);
@@ -2749,6 +2790,7 @@ PlotFileView::CreateChildFrame(wxDocument *doc, wxView *view)
   m_pFileMenu->Append(wxID_PREVIEW, "Print Pre&view");
 #ifdef CTSIM_MDI
   m_pFileMenu->AppendSeparator();
+  m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Pr&eferences...");
   m_pFileMenu->Append(MAINMENU_FILE_EXIT, "E&xit");
 #endif
   GetDocumentManager()->FileHistoryAddFilesToMenu(m_pFileMenu);
@@ -3006,6 +3048,7 @@ TextFileView::CreateChildFrame (wxDocument *doc, wxView *view)
   m_pFileMenu->Append(wxID_PREVIEW, "Print Pre&view");
 #ifdef CTSIM_MDI
   m_pFileMenu->AppendSeparator();
+  m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Pr&eferences...");
   m_pFileMenu->Append(MAINMENU_FILE_EXIT, "E&xit");
 #endif
   GetDocumentManager()->FileHistoryAddFilesToMenu(m_pFileMenu);