X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=src%2Fdocs.cpp;h=2a340d18e758c850a3f7422dd8cef80f0b0b28d2;hb=7e4ade1664a9e49295ee5ec249ed596d40d6db65;hp=b356033164193c8a900a84b1d0ed1678895d974e;hpb=1ef49f39828474ed05fe69aff68d400e3b7d4044;p=ctsim.git diff --git a/src/docs.cpp b/src/docs.cpp index b356033..2a340d1 100644 --- a/src/docs.cpp +++ b/src/docs.cpp @@ -1,7 +1,7 @@ /***************************************************************************** ** FILE IDENTIFICATION ** -** Name: doc.cpp +** Name: docs.cpp ** Purpose: Document routines for CTSim program ** Programmer: Kevin Rosenberg ** Date Started: July 2000 @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: docs.cpp,v 1.26 2001/02/23 18:56:56 kevin Exp $ +** $Id: docs.cpp,v 1.42 2002/06/04 19:24:03 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 @@ -49,6 +49,12 @@ #include "threadrecon.h" +const char szNEW_IMAGE_FILENAME[] = "___CTSIM___INTERNAL___NEW___.if"; +const char szNEW_PROJECTION_FILENAME[] = "___CTSIM___INTERNAL___NEW___.pj"; +const char szNEW_GRAPH3D_FILENAME[] = "___CTSIM___INTERNAL___NEW___.3d"; +const char szNEW_PLOT_FILENAME[] = "___CTSIM___INTERNAL___NEW___.plt"; + + // ImageFileDocument IMPLEMENT_DYNAMIC_CLASS(ImageFileDocument, wxDocument) @@ -65,22 +71,28 @@ bool ImageFileDocument::OnSaveDocument(const wxString& filename) return true; } -bool ImageFileDocument::OnOpenDocument(const wxString& filename) +bool ImageFileDocument::OnOpenDocument(const wxString& constFilename) { if (! OnSaveModified()) return false; - if (! m_pImageFile->fileRead (filename.c_str())) { + wxString filename (constFilename); + + if (filename == szNEW_IMAGE_FILENAME) + filename = ""; + else if (! m_pImageFile->fileRead (filename.c_str())) { *theApp->getLog() << "Unable to read image file " << filename << "\n"; m_bBadFileOpen = true; return false; } - if (theApp->getVerboseLogging()) + + if (theApp->getVerboseLogging() && filename != "") *theApp->getLog() << "Read image file " << filename << "\n"; + SetFilename(filename, true); Modify(false); + getView()->setInitialClientSize(); UpdateAllViews(); - getView()->OnUpdate (getView(), NULL); m_bBadFileOpen = false; return true; @@ -104,7 +116,6 @@ ImageFileDocument::getView() const return dynamic_cast(GetFirstView()); } - bool ImageFileDocument::Revert () { @@ -120,95 +131,120 @@ ImageFileDocument::Revert () OnOpenDocument (GetFilename()); } } - getView()->OnUpdate (getView(), NULL); + //getView()->OnUpdate (getView(), NULL); UpdateAllViews(); return true; } -// ProjectionFileDocument - -IMPLEMENT_DYNAMIC_CLASS(ProjectionFileDocument, wxDocument) -BEGIN_EVENT_TABLE(ProjectionFileDocument, wxDocument) -EVT_MENU(BackgroundSupervisor::MSG_BACKGROUND_SUPERVISOR_ADD, ProjectionFileDocument::OnAddBackground) -EVT_MENU(BackgroundSupervisor::MSG_BACKGROUND_SUPERVISOR_REMOVE, ProjectionFileDocument::OnRemoveBackground) -END_EVENT_TABLE() - -bool -ProjectionFileDocument::OnSaveDocument(const wxString& filename) -{ - if (! m_pProjectionFile->write (filename.c_str())) { - *theApp->getLog() << "Unable to write projection file " << filename << "\n"; - return false; - } - if (theApp->getVerboseLogging()) - *theApp->getLog() << "Wrote projection file " << filename << "\n"; - Modify(false); - return true; -} - -ProjectionFileDocument::~ProjectionFileDocument() -{ - for (BackgroundContainer::iterator i = m_vecpBackgroundSupervisors.begin(); - i != m_vecpBackgroundSupervisors.end(); i++) { - (*i)->cancel(); - } - - m_vecpBackgroundSupervisors.clear(); - delete m_pProjectionFile; -} - void -ProjectionFileDocument::OnAddBackground (wxCommandEvent& event) +ImageFileDocument::Activate() { -} +#if CTSIM_MDI + getView()->getFrame()->Activate(); +#endif +}; -void -ProjectionFileDocument::OnRemoveBackground (wxCommandEvent& event) -{ -} +// BackgroundProcessingDocument - Base Class + +IMPLEMENT_DYNAMIC_CLASS(BackgroundProcessingDocument, wxDocument) +BEGIN_EVENT_TABLE(BackgroundProcessingDocument, wxDocument) +END_EVENT_TABLE() +#ifdef HAVE_WXTHREADS void -ProjectionFileDocument::addReconstructor (BackgroundSupervisor* pRecon) +BackgroundProcessingDocument::addBackgroundSupervisor (BackgroundSupervisor* pSupervisor) { wxCriticalSectionLocker locker (m_criticalSection); - m_vecpBackgroundSupervisors.push_back (pRecon); + if (pSupervisor) + m_vecpBackgroundSupervisors.push_back (pSupervisor); } void -ProjectionFileDocument::removeReconstructor (BackgroundSupervisor* pRecon) +BackgroundProcessingDocument::removeBackgroundSupervisor (BackgroundSupervisor* pSupervisor) { - wxCriticalSectionLocker locker (m_criticalSection); + m_criticalSection.Enter(); bool bFound = false; for (BackgroundContainer::iterator i = m_vecpBackgroundSupervisors.begin(); i != m_vecpBackgroundSupervisors.end(); i++) - if (*i == pRecon) { + if (*i == pSupervisor) { m_vecpBackgroundSupervisors.erase(i); bFound = true; break; } - if (! bFound) - sys_error (ERR_SEVERE, "Could not find background task [ProjectionFileDocument::removeBackgroundTask"); + m_criticalSection.Leave(); + + if (! bFound) + sys_error (ERR_SEVERE, "Could not find background task [OnRemoveBackground]"); +} +#endif + +void +BackgroundProcessingDocument::cancelRunningTasks() +{ +#ifdef HAVE_WXTHREADS + m_criticalSection.Enter(); + for (BackgroundContainer::iterator i = m_vecpBackgroundSupervisors.begin(); + i != m_vecpBackgroundSupervisors.end(); i++) + (*i)->onCancel(); + m_criticalSection.Leave(); + + while (m_vecpBackgroundSupervisors.size() > 0) { + ::wxYield(); + ::wxUsleep(50); + } +#endif +} + + +// ProjectionFileDocument + +IMPLEMENT_DYNAMIC_CLASS(ProjectionFileDocument, BackgroundProcessingTask) + +bool +ProjectionFileDocument::OnSaveDocument(const wxString& filename) +{ + if (! m_pProjectionFile->write (filename.c_str())) { + *theApp->getLog() << "Unable to write projection file " << filename << "\n"; + return false; + } + if (theApp->getVerboseLogging()) + *theApp->getLog() << "Wrote projection file " << filename << "\n"; + Modify(false); + return true; +} + +ProjectionFileDocument::~ProjectionFileDocument() +{ + cancelRunningTasks(); + + delete m_pProjectionFile; } bool -ProjectionFileDocument::OnOpenDocument(const wxString& filename) +ProjectionFileDocument::OnOpenDocument(const wxString& constFilename) { if (! OnSaveModified()) return false; - if (! m_pProjectionFile->read (filename.c_str())) { + wxString filename (constFilename); + + if (filename == szNEW_PROJECTION_FILENAME) + filename = ""; + else if (! m_pProjectionFile->read (filename.c_str())) { *theApp->getLog() << "Unable to read projection file " << filename << "\n"; m_bBadFileOpen = true; return false; } - if (theApp->getVerboseLogging()) + + if (theApp->getVerboseLogging() && filename != "") *theApp->getLog() << "Read projection file " << filename << "\n"; + SetFilename(filename, true); Modify(false); + getView()->setInitialClientSize(); UpdateAllViews(); - GetFirstView()->OnUpdate (GetFirstView(), NULL); m_bBadFileOpen = false; return true; @@ -233,9 +269,22 @@ ProjectionFileDocument::getView() const return dynamic_cast(GetFirstView()); } +void +ProjectionFileDocument::Activate() +{ +#if CTSIM_MDI + getView()->getFrame()->Activate(); +#endif +}; + // PhantomFileDocument -IMPLEMENT_DYNAMIC_CLASS(PhantomFileDocument, wxDocument) +IMPLEMENT_DYNAMIC_CLASS(PhantomFileDocument, BackgroundProcessingTask) + +PhantomFileDocument::~PhantomFileDocument() +{ + cancelRunningTasks(); +} bool PhantomFileDocument::OnOpenDocument(const wxString& filename) @@ -262,7 +311,6 @@ PhantomFileDocument::OnOpenDocument(const wxString& filename) m_idPhantom = m_phantom.id(); Modify(false); UpdateAllViews(); - GetFirstView()->OnUpdate (GetFirstView(), NULL); m_bBadFileOpen = false; return true; @@ -300,6 +348,14 @@ PhantomFileDocument::getView() const return dynamic_cast(GetFirstView()); } +void +PhantomFileDocument::Activate() +{ +#if CTSIM_MDI + getView()->getFrame()->Activate(); +#endif +}; + // PlotFileDocument IMPLEMENT_DYNAMIC_CLASS(PlotFileDocument, wxDocument) @@ -319,23 +375,28 @@ PlotFileDocument::OnSaveDocument(const wxString& filename) } bool -PlotFileDocument::OnOpenDocument(const wxString& filename) +PlotFileDocument::OnOpenDocument(const wxString& constFilename) { if (! OnSaveModified()) return false; - if (! m_plot.fileRead (filename.c_str())) { + wxString filename (constFilename); + + if (filename == szNEW_PLOT_FILENAME) + filename = ""; + else if (! m_plot.fileRead (filename.c_str())) { *theApp->getLog() << "Unable to read plot file " << filename << "\n"; m_bBadFileOpen = true; return false; } - if (theApp->getVerboseLogging()) + + if (theApp->getVerboseLogging() && filename != "") *theApp->getLog() << "Read plot file " << filename << "\n"; + SetFilename (filename, true); m_namePlot = filename.c_str(); Modify (false); UpdateAllViews(); - GetFirstView()->OnUpdate (NULL, NULL); m_bBadFileOpen = false; return true; @@ -360,6 +421,14 @@ PlotFileDocument::getView() const return dynamic_cast(GetFirstView()); } +void +PlotFileDocument::Activate() +{ +#if CTSIM_MDI + getView()->getFrame()->Activate(); +#endif +}; + ////////////////////////////////////////////////////////////////////////// // // TextFileDocument @@ -438,8 +507,6 @@ Graph3dFileDocument::Graph3dFileDocument(void) Graph3dFileDocument::~Graph3dFileDocument() { -// delete [] m_pVertices; -// delete [] m_pNormals; } bool @@ -475,10 +542,6 @@ Graph3dFileDocument::getView() const bool Graph3dFileDocument::createFromImageFile (const ImageFile& rImageFile) { -// delete [] m_pVertices; -// delete [] m_pNormals; - - m_nx = rImageFile.nx(); m_ny = rImageFile.ny(); m_array = rImageFile.getArray(); @@ -486,4 +549,13 @@ Graph3dFileDocument::createFromImageFile (const ImageFile& rImageFile) return true; } +void +Graph3dFileDocument::Activate() +{ +#if CTSIM_MDI + getView()->getFrame()->Activate(); +#endif +}; + + #endif // wxUSE_GLCANVAS