** This is part of the CTSim program
** Copyright (c) 1983-2001 Kevin Rosenberg
**
-** $Id: views.cpp,v 1.110 2001/02/20 18:10:45 kevin Exp $
+** $Id: views.cpp,v 1.115 2001/02/23 18:56:56 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
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
******************************************************************************/
-// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
-
-#ifdef __BORLANDC__
-#pragma hdrstop
-#endif
-
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "backprojectors.h"
#include "reconstruct.h"
#include "timer.h"
+#include "threadrecon.h"
#if defined(MSVC) || HAVE_SSTREAM
#include <sstream>
return;
}
pDifferenceDoc->setImageFile (pDifferenceImage);
-
+
wxString s = GetFrame()->GetTitle() + ": ";
pDifferenceImage->labelsCopy (rIF, s.c_str());
s = pCompareDoc->GetFirstView()->GetFrame()->GetTitle() + ": ";
rIF.invertPixelValues (rIF);
rIF.labelAdd ("Invert Pixel Values");
if (theApp->getAskDeleteNewDocs())
- GetDocument()->Modify (true);
+ GetDocument()->Modify (true);
GetDocument()->UpdateAllViews (this);
}
rIF.square (rIF);
rIF.labelAdd ("Square Pixel Values");
if (theApp->getAskDeleteNewDocs())
- GetDocument()->Modify (true);
+ GetDocument()->Modify (true);
GetDocument()->UpdateAllViews (this);
}
rIF.sqrt (rIF);
rIF.labelAdd ("Square-root Pixel Values");
if (theApp->getAskDeleteNewDocs())
- GetDocument()->Modify (true);
+ GetDocument()->Modify (true);
GetDocument()->UpdateAllViews (this);
}
rIF.log (rIF);
rIF.labelAdd ("Logrithm base-e Pixel Values");
if (theApp->getAskDeleteNewDocs())
- GetDocument()->Modify (true);
+ GetDocument()->Modify (true);
GetDocument()->UpdateAllViews (this);
}
rIF.exp (rIF);
rIF.labelAdd ("Exponent base-e Pixel Values");
if (theApp->getAskDeleteNewDocs())
- GetDocument()->Modify (true);
+ GetDocument()->Modify (true);
GetDocument()->UpdateAllViews (this);
}
m_bMinSpecified = false;
m_bMaxSpecified = false;
if (theApp->getAskDeleteNewDocs())
- GetDocument()->Modify (true);
+ GetDocument()->Modify (true);
GetDocument()->UpdateAllViews (this);
}
m_bMinSpecified = false;
m_bMaxSpecified = false;
if (theApp->getAskDeleteNewDocs())
- GetDocument()->Modify (true);
+ GetDocument()->Modify (true);
GetDocument()->UpdateAllViews (this);
}
m_bMinSpecified = false;
m_bMaxSpecified = false;
if (theApp->getAskDeleteNewDocs())
- GetDocument()->Modify (true);
+ GetDocument()->Modify (true);
GetDocument()->UpdateAllViews (this);
}
m_bMinSpecified = false;
m_bMaxSpecified = false;
if (theApp->getAskDeleteNewDocs())
- GetDocument()->Modify (true);
+ GetDocument()->Modify (true);
GetDocument()->UpdateAllViews (this);
}
m_bMinSpecified = false;
m_bMaxSpecified = false;
if (theApp->getAskDeleteNewDocs())
- GetDocument()->Modify (true);
+ GetDocument()->Modify (true);
GetDocument()->UpdateAllViews (this);
}
m_bMinSpecified = false;
m_bMaxSpecified = false;
if (theApp->getAskDeleteNewDocs())
- GetDocument()->Modify (true);
+ GetDocument()->Modify (true);
GetDocument()->UpdateAllViews (this);
}
#endif
m_bMinSpecified = false;
m_bMaxSpecified = false;
if (theApp->getAskDeleteNewDocs())
- GetDocument()->Modify (true);
+ GetDocument()->Modify (true);
GetDocument()->UpdateAllViews (this);
}
m_bMinSpecified = false;
m_bMaxSpecified = false;
if (theApp->getAskDeleteNewDocs())
- GetDocument()->Modify (true);
+ GetDocument()->Modify (true);
GetDocument()->UpdateAllViews (this);
}
m_bMinSpecified = false;
m_bMaxSpecified = false;
if (theApp->getAskDeleteNewDocs())
- GetDocument()->Modify (true);
+ GetDocument()->Modify (true);
GetDocument()->UpdateAllViews (this);
}
m_bMinSpecified = false;
m_bMaxSpecified = false;
if (theApp->getAskDeleteNewDocs())
- GetDocument()->Modify (true);
+ GetDocument()->Modify (true);
GetDocument()->UpdateAllViews (this);
}
m_bMinSpecified = false;
m_bMaxSpecified = false;
if (theApp->getAskDeleteNewDocs())
- GetDocument()->Modify (true);
+ GetDocument()->Modify (true);
GetDocument()->UpdateAllViews (this);
}
}
m_bMinSpecified = false;
m_bMaxSpecified = false;
if (theApp->getAskDeleteNewDocs())
- GetDocument()->Modify (true);
+ GetDocument()->Modify (true);
GetDocument()->UpdateAllViews (this);
}
}
m_pFileMenu->Append(wxID_REVERT, "Re&vert");
m_pFileMenu->AppendSeparator();
- m_pFileMenu->Append(IFMENU_FILE_PROPERTIES, "P&roperties");
+ m_pFileMenu->Append(IFMENU_FILE_PROPERTIES, "P&roperties\tCtrl-I");
m_pFileMenu->Append(IFMENU_FILE_EXPORT, "&Export...");
m_pFileMenu->AppendSeparator();
wxMenu *help_menu = new wxMenu;
help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents\tF1");
+ help_menu->Append (MAINMENU_HELP_TIPS, "&Tips");
help_menu->Append (IDH_QUICKSTART, "&Quick Start");
help_menu->Append(MAINMENU_HELP_ABOUT, "&About");
subframe->Centre(wxBOTH);
- wxAcceleratorEntry accelEntries[4];
+ wxAcceleratorEntry accelEntries[5];
accelEntries[0].Set (wxACCEL_CTRL, static_cast<int>('A'), IFMENU_VIEW_SCALE_AUTO);
accelEntries[1].Set (wxACCEL_CTRL, static_cast<int>('U'), IFMENU_VIEW_SCALE_FULL);
accelEntries[2].Set (wxACCEL_CTRL, static_cast<int>('E'), IFMENU_VIEW_SCALE_MINMAX);
+ accelEntries[3].Set (wxACCEL_CTRL, static_cast<int>('I'), IFMENU_FILE_PROPERTIES);
#if wxUSE_GLCANVAS
- accelEntries[3].Set (wxACCEL_CTRL, static_cast<int>('3'), IFMENU_IMAGE_CONVERT3D);
- wxAcceleratorTable accelTable (4, accelEntries);
+ accelEntries[4].Set (wxACCEL_CTRL, static_cast<int>('3'), IFMENU_IMAGE_CONVERT3D);
+ wxAcceleratorTable accelTable (5, accelEntries);
#else
- wxAcceleratorTable accelTable (3, accelEntries);
+ wxAcceleratorTable accelTable (4, accelEntries);
#endif
-
+
subframe->SetAcceleratorTable (accelTable);
return subframe;
//GetDocumentManager()->ActivateView (this, false, true);
if (! GetDocument() || ! GetDocument()->Close())
return false;
-
+
Activate (false);
if (m_pCanvas) {
m_pCanvas->setView(NULL);
rIF.scaleImage (rScaledIF);
*theApp->getLog() << os.str().c_str() << "\n";
if (theApp->getAskDeleteNewDocs())
- pScaledDoc->Modify (true);
+ pScaledDoc->Modify (true);
pScaledDoc->UpdateAllViews (this);
pScaledDoc->getView()->OnUpdate (this, NULL);
pScaledDoc->getView()->getFrame()->Show(true);
delete pYMag;
}
if (theApp->getAskDeleteNewDocs())
- pPlotDoc->Modify (true);
+ pPlotDoc->Modify (true);
pPlotDoc->UpdateAllViews ();
pPlotDoc->getView()->OnUpdate (this, NULL);
pPlotDoc->getView()->getFrame()->Show(true);
delete pYMag;
}
if (theApp->getAskDeleteNewDocs())
- pPlotDoc->Modify (true);
+ pPlotDoc->Modify (true);
pPlotDoc->UpdateAllViews ();
pPlotDoc->getView()->OnUpdate (this, NULL);
pPlotDoc->getView()->getFrame()->Show(true);
delete [] pcIn;
if (theApp->getAskDeleteNewDocs())
- pPlotDoc->Modify (true);
+ pPlotDoc->Modify (true);
pPlotDoc->UpdateAllViews ();
pPlotDoc->getView()->OnUpdate (this, NULL);
pPlotDoc->getView()->getFrame()->Show(true);
delete [] pcIn;
if (theApp->getAskDeleteNewDocs())
- pPlotDoc->Modify (true);
+ pPlotDoc->Modify (true);
pPlotDoc->UpdateAllViews ();
pPlotDoc->getView()->OnUpdate (this, NULL);
pPlotDoc->getView()->getFrame()->Show(true);
{
if (! m_pView)
return wxSize(0,0);
-
+
int xSize, ySize;
theApp->getMainFrame()->GetClientSize (&xSize, &ySize);
xSize = maxValue<int> (xSize, ySize);
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_dDefaultViewRatio, m_dDefaultScanRatio);
+ m_dDefaultRotation, m_dDefaultFocalLength, m_dDefaultViewRatio, m_dDefaultScanRatio);
if (theScanner.fail()) {
wxString msg = "Failed making scanner\n";
msg += theScanner.failMessage().c_str();
}
}
} else {
- wxProgressDialog dlgProgress (wxString("Projection"), wxString("Projection Progress"), pProj->nView() + 1, getFrameForChild(), wxPD_CAN_ABORT);
+ wxProgressDialog dlgProgress (wxString("Projection"), wxString("Projection Progress"), pProj->nView() + 1, getFrameForChild(), wxPD_CAN_ABORT );
for (int i = 0; i < pProj->nView(); i++) {
theScanner.collectProjections (*pProj, rPhantom, i, 1, true, m_iDefaultTrace);
if (! dlgProgress.Update (i+1)) {
m_dDefaultRasterViewRatio = 0;
if (m_iDefaultRasterNX > 0 && m_iDefaultRasterNY > 0) {
const Phantom& rPhantom = GetDocument()->getPhantom();
-
+
ImageFile* pImageFile = new ImageFile;
pImageFile->setArraySize (m_iDefaultRasterNX, m_iDefaultRasterNY);
wxProgressDialog dlgProgress (wxString("Rasterize"), wxString("Rasterization Progress"),
- pImageFile->nx() + 1, getFrameForChild(), wxPD_CAN_ABORT);
+ pImageFile->nx() + 1, getFrameForChild(), wxPD_CAN_ABORT );
Timer timer;
for (unsigned int i = 0; i < pImageFile->nx(); i++) {
rPhantom.convertToImagefile (*pImageFile, m_dDefaultRasterViewRatio, m_iDefaultRasterNSamples,
return;
}
}
-
+
ImageFileDocument* pRasterDoc = theApp->newImageDoc();
if (! pRasterDoc) {
sys_error (ERR_SEVERE, "Unable to create image file");
return;
}
pRasterDoc->setImageFile (pImageFile);
-
+
if (theApp->getAskDeleteNewDocs())
pRasterDoc->Modify (true);
pRasterDoc->UpdateAllViews (this);
m_pFileMenu->Append(wxID_CLOSE, "&Close");
m_pFileMenu->AppendSeparator();
- m_pFileMenu->Append(PHMMENU_FILE_PROPERTIES, "P&roperties");
+ m_pFileMenu->Append(PHMMENU_FILE_PROPERTIES, "P&roperties\tCtrl-I");
m_pFileMenu->AppendSeparator();
m_pFileMenu->Append(wxID_PRINT, "&Print...");
wxMenu *help_menu = new wxMenu;
help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents\tF1");
+ help_menu->Append (MAINMENU_HELP_TIPS, "&Tips");
help_menu->Append (IDH_QUICKSTART, "&Quick Start");
help_menu->Append(MAINMENU_HELP_ABOUT, "&About");
subframe->SetMenuBar(menu_bar);
subframe->Centre(wxBOTH);
- wxAcceleratorEntry accelEntries[2];
+ wxAcceleratorEntry accelEntries[3];
accelEntries[0].Set (wxACCEL_CTRL, static_cast<int>('J'), PHMMENU_PROCESS_PROJECTIONS);
accelEntries[1].Set (wxACCEL_CTRL, static_cast<int>('R'), PHMMENU_PROCESS_RASTERIZE);
- wxAcceleratorTable accelTable (2, accelEntries);
+ accelEntries[2].Set (wxACCEL_CTRL, static_cast<int>('I'), PHMMENU_FILE_PROPERTIES);
+ wxAcceleratorTable accelTable (3, accelEntries);
subframe->SetAcceleratorTable (accelTable);
return subframe;
BEGIN_EVENT_TABLE(ProjectionFileView, wxView)
EVT_MENU(PJMENU_FILE_PROPERTIES, ProjectionFileView::OnProperties)
EVT_MENU(PJMENU_RECONSTRUCT_FBP, ProjectionFileView::OnReconstructFBP)
+EVT_MENU(PJMENU_RECONSTRUCT_FOURIER, ProjectionFileView::OnReconstructFourier)
EVT_MENU(PJMENU_CONVERT_POLAR, ProjectionFileView::OnConvertPolar)
EVT_MENU(PJMENU_CONVERT_FFT_POLAR, ProjectionFileView::OnConvertFFTPolar)
END_EVENT_TABLE()
m_iDefaultPolarNY = dialogPolar.getYSize();
m_iDefaultPolarZeropad = dialogPolar.getZeropad();
ImageFile* pIF = new ImageFile (m_iDefaultPolarNX, m_iDefaultPolarNY);
-
+
m_iDefaultPolarInterpolation = Projections::convertInterpNameToID (strInterpolation.c_str());
if (! rProj.convertFFTPolar (*pIF, m_iDefaultPolarInterpolation, m_iDefaultPolarZeropad)) {
delete pIF;
wxString optBackprojectName = dialogReconstruction.getBackprojectName();
m_iDefaultBackprojector = Backprojector::convertBackprojectNameToID (optBackprojectName.c_str());
m_iDefaultTrace = dialogReconstruction.getTrace();
-
+
if (m_iDefaultNX > 0 && m_iDefaultNY > 0) {
const Projections& rProj = GetDocument()->getProjections();
- ImageFile* pImageFile = new ImageFile;
- pImageFile->setArraySize (m_iDefaultNX, m_iDefaultNY);
-
- Reconstructor* pReconstructor = new Reconstructor (rProj, *pImageFile, optFilterName.c_str(),
- m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(),
- optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), m_iDefaultTrace);
+ std::ostringstream os;
+ os << "Reconstruct " << rProj.getFilename() << ": xSize=" << m_iDefaultNX << ", ySize=" << m_iDefaultNY << ", Filter=" << optFilterName.c_str() << ", FilterParam=" << m_dDefaultFilterParam << ", FilterMethod=" << optFilterMethodName.c_str() << ", FilterGeneration=" << optFilterGenerationName.c_str() << ", Zeropad=" << m_iDefaultZeropad << ", Interpolation=" << optInterpName.c_str() << ", InterpolationParam=" << m_iDefaultInterpParam << ", Backprojection=" << optBackprojectName.c_str();
Timer timerRecon;
if (m_iDefaultTrace > Trace::TRACE_CONSOLE) {
+ ImageFile* pImageFile = new ImageFile;
+ pImageFile->setArraySize (m_iDefaultNX, m_iDefaultNY);
+ Reconstructor* pReconstructor = new Reconstructor (rProj, *pImageFile, optFilterName.c_str(),
+ m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(),
+ optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), m_iDefaultTrace);
+
ReconstructDialog* pDlgReconstruct = new ReconstructDialog (*pReconstructor, rProj, *pImageFile, m_iDefaultTrace, getFrameForChild());
for (int iView = 0; iView < rProj.nView(); iView++) {
::wxYield();
::wxUsleep(50);
}
}
+ pReconstructor->postProcessing();
delete pDlgReconstruct;
+ delete pReconstructor;
+ ImageFileDocument* pReconDoc = theApp->newImageDoc();
+ if (! pReconDoc) {
+ sys_error (ERR_SEVERE, "Unable to create image file");
+ return;
+ }
+ pReconDoc->setImageFile (pImageFile);
+ if (theApp->getAskDeleteNewDocs())
+ pReconDoc->Modify (true);
+ pReconDoc->UpdateAllViews (this);
+ if (ImageFileView* rasterView = pReconDoc->getView()) {
+ rasterView->OnUpdate (rasterView, NULL);
+ rasterView->getFrame()->SetFocus();
+ rasterView->getFrame()->Show(true);
+ }
+ *theApp->getLog() << os.str().c_str() << "\n";
+ pImageFile->labelAdd (rProj.getLabel());
+ pImageFile->labelAdd (os.str().c_str(), timerRecon.timerEnd());
+
} else {
- wxProgressDialog dlgProgress (wxString("Reconstruction"), wxString("Reconstruction Progress"), rProj.nView() + 1, getFrameForChild(), wxPD_CAN_ABORT);
- for (int iView = 0; iView < rProj.nView(); iView++) {
- pReconstructor->reconstructView (iView, 1);
- if (! dlgProgress.Update (iView + 1)) {
+ if (theApp->getUseBackgroundTasks() || theApp->getNumberCPU() > 1) {
+ ReconstructorSupervisor* pReconstructor = new ReconstructorSupervisor (this,
+ m_iDefaultNX, m_iDefaultNY, optFilterName.c_str(),
+ m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(),
+ optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), os.str().c_str());
+ if (! pReconstructor->start()) {
delete pReconstructor;
- delete pImageFile;
return;
}
+ // delete pReconstructor; // reconstructor is still running
+ } else {
+ ImageFile* pImageFile = new ImageFile;
+ pImageFile->setArraySize (m_iDefaultNX, m_iDefaultNY);
+ Reconstructor* pReconstructor = new Reconstructor (rProj, *pImageFile, optFilterName.c_str(),
+ m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(),
+ optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), m_iDefaultTrace);
+
+ wxProgressDialog dlgProgress (wxString("Reconstruction"), wxString("Reconstruction Progress"), rProj.nView() + 1, getFrameForChild(), wxPD_CAN_ABORT );
+ for (int iView = 0; iView < rProj.nView(); iView++) {
+ pReconstructor->reconstructView (iView, 1);
+ if (! dlgProgress.Update (iView + 1)) {
+ delete pReconstructor;
+ delete pImageFile;
+ return;
+ }
+ }
+ pReconstructor->postProcessing();
+ delete pReconstructor;
+ ImageFileDocument* pReconDoc = theApp->newImageDoc();
+ if (! pReconDoc) {
+ sys_error (ERR_SEVERE, "Unable to create image file");
+ return;
+ }
+ pReconDoc->setImageFile (pImageFile);
+ if (theApp->getAskDeleteNewDocs())
+ pReconDoc->Modify (true);
+ pReconDoc->UpdateAllViews (this);
+ if (ImageFileView* rasterView = pReconDoc->getView()) {
+ rasterView->OnUpdate (rasterView, NULL);
+ rasterView->getFrame()->SetFocus();
+ rasterView->getFrame()->Show(true);
+ }
+ *theApp->getLog() << os.str().c_str() << "\n";
+ pImageFile->labelAdd (rProj.getLabel());
+ pImageFile->labelAdd (os.str().c_str(), timerRecon.timerEnd());
}
}
- delete pReconstructor;
- ImageFileDocument* pReconDoc = theApp->newImageDoc();
- if (! pReconDoc) {
- sys_error (ERR_SEVERE, "Unable to create image file");
- return;
- }
- pReconDoc->setImageFile (pImageFile);
- if (theApp->getAskDeleteNewDocs())
- pReconDoc->Modify (true);
- pReconDoc->UpdateAllViews (this);
- if (ImageFileView* rasterView = pReconDoc->getView()) {
- rasterView->OnUpdate (rasterView, NULL);
- rasterView->getFrame()->SetFocus();
- rasterView->getFrame()->Show(true);
- }
- std::ostringstream os;
- os << "Reconstruct " << rProj.getFilename() << ": xSize=" << m_iDefaultNX << ", ySize=" << m_iDefaultNY << ", Filter=" << optFilterName.c_str() << ", FilterParam=" << m_dDefaultFilterParam << ", FilterMethod=" << optFilterMethodName.c_str() << ", FilterGeneration=" << optFilterGenerationName.c_str() << ", Zeropad=" << m_iDefaultZeropad << ", Interpolation=" << optInterpName.c_str() << ", InterpolationParam=" << m_iDefaultInterpParam << ", Backprojection=" << optBackprojectName.c_str();
- *theApp->getLog() << os.str().c_str() << "\n";
- pImageFile->labelAdd (rProj.getLabel());
- pImageFile->labelAdd (os.str().c_str(), timerRecon.timerEnd());
}
}
}
m_pFileMenu->Append(wxID_CLOSE, "&Close\tCtrl-W");
m_pFileMenu->AppendSeparator();
- m_pFileMenu->Append(PJMENU_FILE_PROPERTIES, "P&roperties");
+ m_pFileMenu->Append(PJMENU_FILE_PROPERTIES, "P&roperties\tCtrl-I");
m_pFileMenu->AppendSeparator();
m_pFileMenu->Append(wxID_PRINT, "&Print...");
wxMenu *convert_menu = new wxMenu;
convert_menu->Append (PJMENU_CONVERT_POLAR, "&Polar Image...\tCtrl-L");
- convert_menu->Append (PJMENU_CONVERT_FFT_POLAR, "&FFT->Polar Image...\tCtrl-I");
+ convert_menu->Append (PJMENU_CONVERT_FFT_POLAR, "&FFT->Polar Image...\tCtrl-M");
wxMenu *reconstruct_menu = new wxMenu;
reconstruct_menu->Append (PJMENU_RECONSTRUCT_FBP, "&Filtered Backprojection...\tCtrl-R", "Reconstruct image using filtered backprojection");
wxMenu *help_menu = new wxMenu;
help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents\tF1");
+ help_menu->Append (MAINMENU_HELP_TIPS, "&Tips");
help_menu->Append (IDH_QUICKSTART, "&Quick Start");
help_menu->Append(MAINMENU_HELP_ABOUT, "&About");
subframe->SetMenuBar(menu_bar);
subframe->Centre(wxBOTH);
- wxAcceleratorEntry accelEntries[4];
+ wxAcceleratorEntry accelEntries[5];
accelEntries[0].Set (wxACCEL_CTRL, static_cast<int>('L'), PJMENU_CONVERT_POLAR);
- accelEntries[1].Set (wxACCEL_CTRL, static_cast<int>('I'), PJMENU_CONVERT_FFT_POLAR);
+ accelEntries[1].Set (wxACCEL_CTRL, static_cast<int>('M'), PJMENU_CONVERT_FFT_POLAR);
accelEntries[2].Set (wxACCEL_CTRL, static_cast<int>('R'), PJMENU_RECONSTRUCT_FBP);
accelEntries[3].Set (wxACCEL_CTRL, static_cast<int>('E'), PJMENU_RECONSTRUCT_FOURIER);
- wxAcceleratorTable accelTable (4, accelEntries);
+ accelEntries[4].Set (wxACCEL_CTRL, static_cast<int>('I'), PJMENU_FILE_PROPERTIES);
+ wxAcceleratorTable accelTable (5, accelEntries);
subframe->SetAcceleratorTable (accelTable);
return subframe;
if (GetDocument() && GetDocument()->getBadFileOpen())
::wxYield(); // wxWindows bug workaround
}
-
+
return true;
}
IMPLEMENT_DYNAMIC_CLASS(PlotFileView, wxView)
BEGIN_EVENT_TABLE(PlotFileView, wxView)
-EVT_MENU(PJMENU_FILE_PROPERTIES, PlotFileView::OnProperties)
+EVT_MENU(PLOTMENU_FILE_PROPERTIES, PlotFileView::OnProperties)
EVT_MENU(PLOTMENU_VIEW_SCALE_MINMAX, PlotFileView::OnScaleMinMax)
EVT_MENU(PLOTMENU_VIEW_SCALE_AUTO, PlotFileView::OnScaleAuto)
EVT_MENU(PLOTMENU_VIEW_SCALE_FULL, PlotFileView::OnScaleFull)
m_pFileMenu->Append(wxID_CLOSE, "&Close\tCtrl-W");
m_pFileMenu->AppendSeparator();
- m_pFileMenu->Append(PJMENU_FILE_PROPERTIES, "P&roperties");
+ m_pFileMenu->Append(PLOTMENU_FILE_PROPERTIES, "P&roperties\tCtrl-I");
m_pFileMenu->AppendSeparator();
m_pFileMenu->Append(wxID_PRINT, "&Print...");
wxMenu *help_menu = new wxMenu;
help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents\tF1");
+ help_menu->Append (MAINMENU_HELP_TIPS, "&Tips");
help_menu->Append (IDH_QUICKSTART, "&Quick Start");
help_menu->Append(MAINMENU_HELP_ABOUT, "&About");
subframe->SetMenuBar(menu_bar);
subframe->Centre(wxBOTH);
- wxAcceleratorEntry accelEntries[3];
+ wxAcceleratorEntry accelEntries[4];
accelEntries[0].Set (wxACCEL_CTRL, static_cast<int>('E'), PLOTMENU_VIEW_SCALE_MINMAX);
accelEntries[1].Set (wxACCEL_CTRL, static_cast<int>('A'), PLOTMENU_VIEW_SCALE_AUTO);
accelEntries[2].Set (wxACCEL_CTRL, static_cast<int>('U'), PLOTMENU_VIEW_SCALE_FULL);
- wxAcceleratorTable accelTable (3, accelEntries);
+ accelEntries[3].Set (wxACCEL_CTRL, static_cast<int>('I'), PLOTMENU_FILE_PROPERTIES);
+ wxAcceleratorTable accelTable (4, accelEntries);
subframe->SetAcceleratorTable (accelTable);
return subframe;
m_pFrame = NULL;
if (GetDocument() && GetDocument()->getBadFileOpen())
::wxYield(); // wxWindows bug workaround
- }
-
+ }
+
return true;
}
if (GetDocument() && GetDocument()->getBadFileOpen())
::wxYield(); // wxWindows bug workaround
}
-
+
return TRUE;
}
#endif
theApp->setIconForFrame (subframe);
- m_pFileMenu = new wxMenu;
+ m_pFileMenu = new wxMenu;
m_pFileMenu->Append(MAINMENU_FILE_CREATE_PHANTOM, "Cr&eate Phantom...\tCtrl-P");
m_pFileMenu->Append(MAINMENU_FILE_CREATE_FILTER, "Create &Filter...\tCtrl-F");
wxMenu *help_menu = new wxMenu;
help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents\tF1");
+ help_menu->Append (MAINMENU_HELP_TIPS, "&Tips");
help_menu->Append (IDH_QUICKSTART, "&Quick Start");
help_menu->Append(MAINMENU_HELP_ABOUT, "&About");
subframe->SetMenuBar(menu_bar);
subframe->Centre(wxBOTH);
-
+
return subframe;
}