r641: no message
[ctsim.git] / src / ctsim.cpp
index 5d192706725348a1ed2f0a8345c3ed5821f3ecbb..9d7e87052cd0b9ab9fc7adb10525ee52f7eaff22 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: ctsim.cpp,v 1.90 2001/03/01 20:02:18 kevin Exp $
+**  $Id: ctsim.cpp,v 1.99 2001/03/21 21:45:31 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
@@ -48,6 +48,7 @@
 
 
 #include "ct.h"
+#include "ctndicom.h"
 #include "ctsim.h"
 #include "docs.h"
 #include "views.h"
@@ -69,7 +70,7 @@
 #endif
 #endif
 
-static const char* rcsindent = "$Id: ctsim.cpp,v 1.90 2001/03/01 20:02:18 kevin Exp $";
+static const char* rcsindent = "$Id: ctsim.cpp,v 1.99 2001/03/21 21:45:31 kevin Exp $";
 
 struct option CTSimApp::ctsimOptions[] = 
 {
@@ -84,7 +85,7 @@ IMPLEMENT_APP(CTSimApp)
 CTSimApp::CTSimApp()
 :  m_bAdvancedOptions(false), m_bSetModifyNewDocs(true), m_bVerboseLogging(false), m_bShowStartupTips(true),
 m_iCurrentTip(0), m_bUseBackgroundTasks(false),
-m_docManager(NULL), m_pFrame(NULL), m_pLog(0), m_pLogDoc(0), m_pConfig(0)
+m_docManager(NULL), m_pFrame(NULL), m_pConfig(0), m_pLog(0), m_pLogDoc(0)
 {
   theApp = this;
 }
@@ -229,7 +230,10 @@ CTSimApp::OnInit()
   if (getStartupTips())
     ShowTips();
   
+#ifdef HAVE_WXTHREADS
   m_pBackgroundMgr = new BackgroundManager;
+#endif
+
   return true;
 }
 
@@ -289,6 +293,12 @@ CTSimApp::openConfig()
   m_pConfig->Read ("StartupTips", &m_bShowStartupTips);
   m_pConfig->Read ("CurrentTip", &m_iCurrentTip);
   m_pConfig->Read ("UseBackgroundTasks", &m_bUseBackgroundTasks);
+#ifdef HAVE_FFTW
+  wxString strFftwWisdom;
+  m_pConfig->Read ("FftwWisdom", strFftwWisdom);
+  if (strFftwWisdom.size() > 0)
+    fftw_import_wisdom_from_string (strFftwWisdom.c_str());
+#endif
 }
 
 void
@@ -300,7 +310,13 @@ CTSimApp::closeConfig()
   m_pConfig->Write ("StartupTips", m_bShowStartupTips);
   m_pConfig->Write ("CurrentTip", m_iCurrentTip);
   m_pConfig->Write ("UseBackgroundTasks", m_bUseBackgroundTasks);
-  
+#ifdef HAVE_FFTW
+  const char* const pszWisdom = fftw_export_wisdom_to_string();
+  wxString strFftwWisdom (pszWisdom);
+  fftw_free ((void*) pszWisdom);
+  m_pConfig->Write ("FftwWisdom", strFftwWisdom);
+#endif
+
   delete m_pConfig;
 }
 
@@ -336,6 +352,8 @@ EVT_MENU(MAINMENU_HELP_TIPS, MainFrame::OnHelpTips)
 EVT_MENU(MAINMENU_IMPORT, MainFrame::OnImport)
 EVT_MENU(IDH_QUICKSTART, MainFrame::OnHelpButton)
 EVT_MENU(MAINMENU_LOG_EVENT, MainFrame::OnLogEvent)
+EVT_MENU(NEW_IMAGEFILE_EVENT, MainFrame::OnNewImageFile)
+EVT_MENU(NEW_PROJECTIONFILE_EVENT, MainFrame::OnNewProjectionFile)
 EVT_BUTTON(IDH_DLG_RASTERIZE, MainFrame::OnHelpButton)
 EVT_BUTTON(IDH_DLG_PROJECTIONS, MainFrame::OnHelpButton)
 EVT_BUTTON(IDH_DLG_RECONSTRUCTION, MainFrame::OnHelpButton)
@@ -400,7 +418,7 @@ MainFrame::MainFrame(wxDocManager *manager, wxFrame *frame, wxWindowID id, const
   file_menu->Append(wxID_OPEN, "&Open...\tCtrl-O");
   
   file_menu->AppendSeparator();
-  file_menu->Append (MAINMENU_IMPORT, "&Import...\tCtrl-I");
+  file_menu->Append (MAINMENU_IMPORT, "&Import...\tCtrl-M");
   file_menu->Append (MAINMENU_FILE_PREFERENCES, "Prefere&nces...");
   file_menu->Append(MAINMENU_FILE_EXIT, "E&xit");
   
@@ -451,14 +469,14 @@ MainFrame::MainFrame(wxDocManager *manager, wxFrame *frame, wxWindowID id, const
   m_dDefaultFilterBandwidth = 1.;
   m_dDefaultFilterInputScale = 1.;
   m_dDefaultFilterOutputScale = 1.;
-  m_iDefaultImportFormat = ImageFile::IMPORT_FORMAT_PPM;
+  m_iDefaultImportFormat = ImageFile::IMPORT_FORMAT_PNG;
   
-  wxAcceleratorEntry accelEntries[16];
+  wxAcceleratorEntry accelEntries[15];
   accelEntries[0].Set (wxACCEL_CTRL, static_cast<int>('O'), wxID_OPEN);
-  accelEntries[2].Set (wxACCEL_CTRL, static_cast<int>('P'), MAINMENU_FILE_CREATE_PHANTOM);
-  accelEntries[3].Set (wxACCEL_CTRL, static_cast<int>('F'), MAINMENU_FILE_CREATE_FILTER);
-  accelEntries[4].Set (wxACCEL_CTRL, static_cast<int>('I'), MAINMENU_IMPORT);
-  accelEntries[5].Set (wxACCEL_NORMAL, WXK_F1, MAINMENU_HELP_CONTENTS);
+  accelEntries[1].Set (wxACCEL_CTRL, static_cast<int>('P'), MAINMENU_FILE_CREATE_PHANTOM);
+  accelEntries[2].Set (wxACCEL_CTRL, static_cast<int>('F'), MAINMENU_FILE_CREATE_FILTER);
+  accelEntries[3].Set (wxACCEL_CTRL, static_cast<int>('M'), MAINMENU_IMPORT);
+  accelEntries[4].Set (wxACCEL_NORMAL, WXK_F1, MAINMENU_HELP_CONTENTS);
 #ifndef CTSIM_MDI
   for (i = 0; i < 10; i++)
     accelEntries[i+5].Set (wxACCEL_CTRL, static_cast<int>('0'+i), MAINMENU_WINDOW_BASE+i);
@@ -589,6 +607,49 @@ CTSimApp::getCompatibleImages (const ImageFileDocument* pIFDoc, std::vector<Imag
 }
 
 
+void
+MainFrame::OnNewImageFile (wxCommandEvent& event)
+{
+  ImageFile* pImageFile = reinterpret_cast<ImageFile*>(event.GetClientData());
+
+  ImageFileDocument* pImageDoc = theApp->newImageDoc();
+  if (! pImageDoc) {
+    sys_error (ERR_SEVERE, "Unable to create image file");
+    return;
+  }  
+  pImageDoc->setImageFile (pImageFile);
+  pImageDoc->UpdateAllViews (NULL);
+  if (ImageFileView* imageView = pImageDoc->getView()) {
+    imageView->OnUpdate (imageView, NULL);
+    imageView->getFrame()->SetFocus();
+    imageView->getFrame()->Show(true);
+  }
+  if (theApp->getAskDeleteNewDocs())
+    pImageDoc->Modify (true);
+
+}
+
+void
+MainFrame::OnNewProjectionFile (wxCommandEvent& event)
+{
+  Projections* pProjections = reinterpret_cast<Projections*>(event.GetClientData());
+  ProjectionFileDocument* pProjDoc = theApp->newProjectionDoc();
+  if (! pProjDoc) {
+    sys_error (ERR_SEVERE, "Unable to create projection file");
+    return;
+  }  
+  pProjDoc->setProjections (pProjections);
+  pProjDoc->UpdateAllViews (NULL);
+  if (ProjectionFileView* projView = pProjDoc->getView()) {
+    projView->OnUpdate (projView, NULL);
+    projView->getFrame()->SetFocus();
+    projView->getFrame()->Show(true);
+  }
+
+  if (theApp->getAskDeleteNewDocs())
+    pProjDoc->Modify (true);
+}
+
 void
 MainFrame::OnLogEvent (wxCommandEvent& event)
 {
@@ -889,13 +950,19 @@ MainFrame::OnImport (wxCommandEvent& WXUNUSED(event) )
   wxString strWildcard;
   if (m_iDefaultImportFormat == ImageFile::IMPORT_FORMAT_PPM) {
     strExt = ".ppm";
-    strWildcard = "PPM Files (*.ppm)|*.pgm|PGM Files (*.pgm)|*.pgm";
+    strWildcard = "PPM Files (*.ppm)|*.ppm|PGM Files (*.pgm)|*.pgm";
   }
 #ifdef HAVE_PNG
   else if (m_iDefaultImportFormat == ImageFile::IMPORT_FORMAT_PNG) {
     strExt = ".png";
     strWildcard = "PNG Files (*.png)|*.png";
   }
+#endif
+#ifdef HAVE_CTN_DICOM
+  else if (m_iDefaultImportFormat == ImageFile::IMPORT_FORMAT_DICOM) {
+    strExt = "*.*";
+    strWildcard = "Dicom Files (*.*)|*.*";
+  }
 #endif
   else {
     return;
@@ -904,21 +971,60 @@ MainFrame::OnImport (wxCommandEvent& WXUNUSED(event) )
   wxString strFilename = wxFileSelector (wxString("Import Filename"), wxString(""), 
     wxString(""), strExt, strWildcard, wxHIDE_READONLY | wxOPEN);
   if (! strFilename.IsEmpty()) {
-    ImageFile* pIF = new ImageFile;
-    if (pIF->importImage (strFormatName.c_str(), strFilename.c_str())) {
-      ImageFileDocument* pIFDoc = theApp->newImageDoc();
-      pIFDoc->setImageFile(pIF);
-      pIFDoc->getView()->getFrame()->Show(true);
-      std::ostringstream os;
-      os << "Import file " << strFilename.c_str() << " (type " << strFormatName.c_str() << ")";
-      pIF->labelAdd (os.str().c_str());
-      if (theApp->getAskDeleteNewDocs())
-        pIFDoc->Modify (true);
-    pIFDoc->UpdateAllViews();
-    pIFDoc->GetFirstView()->OnUpdate (NULL, NULL);
-    pIFDoc->getView()->getFrame()->Show(true);
-    } else
-      delete pIF;
+    if (m_iDefaultImportFormat == ImageFile::IMPORT_FORMAT_PPM || m_iDefaultImportFormat == ImageFile::IMPORT_FORMAT_PNG) {
+      ImageFile* pIF = new ImageFile;
+      if (pIF->importImage (strFormatName.c_str(), strFilename.c_str())) {
+        ImageFileDocument* pIFDoc = theApp->newImageDoc();
+        pIFDoc->setImageFile(pIF);
+        pIFDoc->getView()->getFrame()->Show(true);
+        std::ostringstream os;
+        os << "Import file " << strFilename.c_str() << " (type " << strFormatName.c_str() << ")";
+        pIF->labelAdd (os.str().c_str());
+        if (theApp->getAskDeleteNewDocs())
+          pIFDoc->Modify (true);
+        pIFDoc->UpdateAllViews();
+        pIFDoc->GetFirstView()->OnUpdate (NULL, NULL);
+        pIFDoc->getView()->getFrame()->Show(true);
+      } else
+        delete pIF;
+    } 
+#ifdef HAVE_CTN_DICOM
+    else if (m_iDefaultImportFormat == ImageFile::IMPORT_FORMAT_DICOM) {
+      DicomImporter dicomImport (strFilename.c_str());
+      if (dicomImport.fail()) {
+        ::wxMessageBox (dicomImport.failMessage().c_str(), "Import Error");
+      } else if (dicomImport.testImage()) {
+        ImageFileDocument* pIFDoc = theApp->newImageDoc();
+        ImageFile* pIF = dicomImport.getImageFile();
+        pIFDoc->setImageFile (pIF);
+        pIFDoc->getView()->getFrame()->Show(true);
+        std::ostringstream os;
+        os << "Import file " << strFilename.c_str() << " (type " << strFormatName.c_str() << ")";
+        pIF->labelAdd (os.str().c_str());
+        if (theApp->getAskDeleteNewDocs())
+          pIFDoc->Modify (true);
+        pIFDoc->UpdateAllViews();
+        pIFDoc->GetFirstView()->OnUpdate (NULL, NULL);
+        pIFDoc->getView()->getFrame()->Show(true);
+      } else if (dicomImport.testProjections()) {
+        ProjectionFileDocument* pProjDoc = theApp->newProjectionDoc();
+        Projections* pProj = dicomImport.getProjections();
+        pProjDoc->setProjections (pProj);
+        pProjDoc->getView()->getFrame()->Show(true);
+        std::ostringstream os;
+        os << "Import projection file " << strFilename.c_str() << " (type " << strFormatName.c_str() << ")";
+        pProj->setRemark (os.str().c_str());
+        if (theApp->getAskDeleteNewDocs())
+          pProjDoc->Modify (true);
+        pProjDoc->UpdateAllViews();
+        pProjDoc->GetFirstView()->OnUpdate (NULL, NULL);
+        pProjDoc->getView()->getFrame()->Show(true);
+      } else
+        ::wxMessageBox ("Unrecognized DICOM file contents", "Import Error");
+    } 
+#endif
+    else
+      sys_error (ERR_WARNING, "Unknown import format type");
   }
 }