** 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.104 2001/09/24 15:16:41 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
#include "ct.h"
+#include "ctndicom.h"
#include "ctsim.h"
#include "docs.h"
#include "views.h"
#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.104 2001/09/24 15:16:41 kevin Exp $";
struct option CTSimApp::ctsimOptions[] =
{
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;
}
// Create the main frame window
int xDisplay, yDisplay;
::wxDisplaySize (&xDisplay, &yDisplay);
+
m_pFrame = new MainFrame(m_docManager, (wxFrame *) NULL, -1, "CTSim", wxPoint(0, 0),
- wxSize(nearest<int>(xDisplay * .75), nearest<int>(yDisplay * .755)), wxDEFAULT_FRAME_STYLE);
+#ifdef CTSIM_MDI
+ wxSize(nearest<int>(xDisplay * .75), nearest<int>(yDisplay * .75)),
+#else
+ wxSize(nearest<int>(xDisplay * .25), nearest<int>(yDisplay * .25)),
+#endif
+ wxDEFAULT_FRAME_STYLE);
setIconForFrame (m_pFrame);
m_pFrame->Centre(wxBOTH);
if (getStartupTips())
ShowTips();
+#ifdef HAVE_WXTHREADS
m_pBackgroundMgr = new BackgroundManager;
+#endif
+
return true;
}
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
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;
}
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)
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");
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);
}
+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)
{
#endif
}
-#ifdef CTSIM_CUSTOM_MRU
-void
-MainFrame::OnMRUFile (wxCommandEvent& event)
-{
- wxString fileName (theApp->getDocManager()->GetHistoryFile(event.GetId() - wxID_FILE1));
- if (fileName != "")
- theApp->getDocManager()->CreateDocument(fileName, wxDOC_SILENT);
-}
-#endif
void
MainFrame::DoWindowMenu (int iMenuPosition, wxCommandEvent& 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;
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");
}
}
{
long lFreeMem = ::wxGetFreeMemory() / (1024L * 1024L);
wxString strOSDesc = ::wxGetOsDescription();
- *theApp->getLog() << "Operation System: " << strOSDesc;
+ *theApp->getLog() << "Operating System: " << strOSDesc;
if (lFreeMem > 0)
*theApp->getLog() << ", Free Memory: " << lFreeMem << " MB";
+ *theApp->getLog() << ", wxWindows: " << wxVERSION_STRING;
+#ifdef __TIMESTAMP__
+ *theApp->getLog() << ", Build Date: " << __TIMESTAMP__;
+#endif
+#if defined(DEBUG)
+ *theApp->getLog() << ", CTSim Debug version";
+#else
+ *theApp->getLog() << ", CTSim Release version";
+#endif
+
*theApp->getLog() << "\n";
wxBitmap bmp (splash);
msg += "Author: Kevin Rosenberg <kevin@rosenberg.net>\nUsage: ctsim [files-to-open..] [--help]";
wxMessageBox(msg, "About CTSim", wxOK | wxICON_INFORMATION, this);
+ *theApp->getLog() << msg << "\n";
}
}