+ 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);
+ *theApp->getLog() << os.str().c_str() << "\n";
+ pImageFile->labelAdd (os.str().c_str(), timer.timerEnd());
+
+ pRasterDoc->UpdateAllViews(this);
+ pRasterDoc->getView()->setInitialClientSize();
+ pRasterDoc->Activate();
+ }
+}
+
+
+PhantomCanvas*
+PhantomFileView::CreateCanvas (wxFrame *parent)
+{
+ PhantomCanvas* pCanvas;
+
+ pCanvas = new PhantomCanvas (this, parent, wxPoint(0, 0), wxSize(0,0), 0);
+ pCanvas->SetBackgroundColour(*wxWHITE);
+ pCanvas->Clear();
+
+ return pCanvas;
+}
+
+#if CTSIM_MDI
+wxDocMDIChildFrame*
+#else
+wxDocChildFrame*
+#endif
+PhantomFileView::CreateChildFrame(wxDocument *doc, wxView *view)
+{
+#if CTSIM_MDI
+ 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(0, 0), wxDEFAULT_FRAME_STYLE);
+#endif
+ theApp->setIconForFrame (subframe);
+
+ 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");
+ m_pFileMenu->Append(wxID_OPEN, "&Open...\tCtrl-O");
+ m_pFileMenu->Append(wxID_SAVEAS, "Save &As...");
+ m_pFileMenu->Append(wxID_CLOSE, "&Close");
+
+ m_pFileMenu->AppendSeparator();
+ m_pFileMenu->Append(PHMMENU_FILE_PROPERTIES, "P&roperties\tCtrl-I");
+
+ m_pFileMenu->AppendSeparator();
+ m_pFileMenu->Append(wxID_PRINT, "&Print...");
+ m_pFileMenu->Append(wxID_PRINT_SETUP, "Print &Setup...");
+ m_pFileMenu->Append(wxID_PREVIEW, "Print Pre&view");
+ m_pFileMenu->AppendSeparator();
+ m_pFileMenu->Append(MAINMENU_IMPORT, "&Import...\tCtrl-M");
+#ifdef CTSIM_MDI
+ m_pFileMenu->AppendSeparator();
+ m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Prefere&nces...");
+ m_pFileMenu->Append(MAINMENU_FILE_EXIT, "E&xit");
+#endif
+ GetDocumentManager()->FileHistoryAddFilesToMenu(m_pFileMenu);
+ GetDocumentManager()->FileHistoryUseMenu(m_pFileMenu);
+
+ wxMenu *process_menu = new wxMenu;
+ process_menu->Append(PHMMENU_PROCESS_RASTERIZE, "&Rasterize...\tCtrl-R");
+ process_menu->Append(PHMMENU_PROCESS_PROJECTIONS, "&Projections...\tCtrl-J");
+
+ 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");
+
+ wxMenuBar *menu_bar = new wxMenuBar;
+
+ menu_bar->Append(m_pFileMenu, "&File");
+ menu_bar->Append(process_menu, "&Process");
+ menu_bar->Append(help_menu, "&Help");
+
+ subframe->SetMenuBar(menu_bar);
+ subframe->Centre(wxBOTH);
+
+ 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);
+ accelEntries[2].Set (wxACCEL_CTRL, static_cast<int>('I'), PHMMENU_FILE_PROPERTIES);
+ wxAcceleratorTable accelTable (3, accelEntries);
+ subframe->SetAcceleratorTable (accelTable);
+
+ return subframe;
+}
+
+
+bool
+PhantomFileView::OnCreate(wxDocument *doc, long WXUNUSED(flags) )
+{
+ m_pFrame = CreateChildFrame(doc, this);
+ SetFrame(m_pFrame);
+ m_pCanvas = CreateCanvas (m_pFrame);
+ m_pFrame->SetClientSize (m_pCanvas->GetBestSize());
+ m_pCanvas->SetClientSize (m_pCanvas->GetBestSize());
+ m_pFrame->SetTitle ("PhantomFileView");
+
+ m_pFrame->Show(true);
+ Activate(true);
+
+ return true;
+}
+
+void
+PhantomFileView::OnUpdate (wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint) )
+{
+ if (m_pCanvas)
+ m_pCanvas->Refresh();
+}
+
+bool
+PhantomFileView::OnClose (bool deleteWindow)
+{
+ //GetDocumentManager()->ActivateView (this, false, true);
+ if (! GetDocument() || ! GetDocument()->Close())
+ return false;
+
+ Activate(false);
+ if (m_pCanvas) {
+ m_pCanvas->setView(NULL);
+ m_pCanvas = NULL;
+ }
+ wxString s(wxTheApp->GetAppName());
+ if (m_pFrame)
+ m_pFrame->SetTitle(s);
+
+ SetFrame(NULL);
+
+ if (deleteWindow) {
+ delete m_pFrame;
+ m_pFrame = NULL;
+ if (GetDocument() && GetDocument()->getBadFileOpen())
+ ::wxYield(); // wxWindows bug workaround
+ }
+
+ return true;
+}
+
+void
+PhantomFileView::OnDraw (wxDC* dc)
+{
+ int xsize, ysize;
+ m_pCanvas->GetClientSize (&xsize, &ysize);
+ SGPDriver driver (dc, xsize, ysize);
+ SGP sgp (driver);
+ const Phantom& rPhantom = GetDocument()->getPhantom();
+ sgp.setColor (C_RED);
+ rPhantom.show (sgp);
+}
+
+// ProjectionCanvas
+
+ProjectionFileCanvas::ProjectionFileCanvas (ProjectionFileView* v, wxFrame *frame, const wxPoint& pos, const wxSize& size, const long style)
+: wxScrolledWindow(frame, -1, pos, size, style)
+{
+ m_pView = v;
+}
+
+ProjectionFileCanvas::~ProjectionFileCanvas ()
+{
+ m_pView = NULL;
+}
+
+void
+ProjectionFileCanvas::OnDraw(wxDC& dc)
+{
+ if (m_pView)
+ m_pView->OnDraw(& dc);
+}
+
+wxSize
+ProjectionFileCanvas::GetBestSize () const
+{
+ wxSize best (0, 0);
+ if (! m_pView)
+ return best;
+
+ if (m_pView) {
+ Projections& rProj = m_pView->GetDocument()->getProjections();
+ best.Set (rProj.nDet(), rProj.nView());
+ }
+
+ return best;
+}
+
+
+// ProjectionFileView
+
+IMPLEMENT_DYNAMIC_CLASS(ProjectionFileView, wxView)
+
+BEGIN_EVENT_TABLE(ProjectionFileView, wxView)
+EVT_MENU(PJMENU_FILE_PROPERTIES, ProjectionFileView::OnProperties)
+EVT_MENU(PJMENU_RECONSTRUCT_FBP, ProjectionFileView::OnReconstructFBP)
+EVT_MENU(PJMENU_RECONSTRUCT_FBP_REBIN, ProjectionFileView::OnReconstructFBPRebin)
+EVT_MENU(PJMENU_RECONSTRUCT_FOURIER, ProjectionFileView::OnReconstructFourier)
+EVT_MENU(PJMENU_CONVERT_RECTANGULAR, ProjectionFileView::OnConvertRectangular)
+EVT_MENU(PJMENU_CONVERT_POLAR, ProjectionFileView::OnConvertPolar)
+EVT_MENU(PJMENU_CONVERT_FFT_POLAR, ProjectionFileView::OnConvertFFTPolar)
+EVT_MENU(PJMENU_CONVERT_PARALLEL, ProjectionFileView::OnConvertParallel)
+EVT_MENU(PJMENU_PLOT_TTHETA_SAMPLING, ProjectionFileView::OnPlotTThetaSampling)
+EVT_MENU(PJMENU_PLOT_HISTOGRAM, ProjectionFileView::OnPlotHistogram)
+ // EVT_MENU(PJMENU_ARTIFACT_REDUCTION, ProjectionFileView::OnArtifactReduction)
+END_EVENT_TABLE()
+
+
+ProjectionFileView::ProjectionFileView()
+: wxView(), m_pFrame(0), m_pCanvas(0), m_pFileMenu(0)
+{
+#ifdef DEBUG
+ m_iDefaultNX = 115;
+ m_iDefaultNY = 115;
+#else
+ m_iDefaultNX = 256;
+ m_iDefaultNY = 256;
+#endif
+
+ m_iDefaultFilter = SignalFilter::FILTER_ABS_BANDLIMIT;
+ m_dDefaultFilterParam = 1.;
+#if HAVE_FFTW
+ m_iDefaultFilterMethod = ProcessSignal::FILTER_METHOD_RFFTW;
+ m_iDefaultFilterGeneration = ProcessSignal::FILTER_GENERATION_INVERSE_FOURIER;
+#else
+ m_iDefaultFilterMethod = ProcessSignal::FILTER_METHOD_CONVOLUTION;
+ m_iDefaultFilterGeneration = ProcessSignal::FILTER_GENERATION_DIRECT;
+#endif
+ m_iDefaultZeropad = 1;
+ m_iDefaultBackprojector = Backprojector::BPROJ_IDIFF;
+ m_iDefaultInterpolation = Backprojector::INTERP_LINEAR;
+ m_iDefaultInterpParam = 1;
+ m_iDefaultTrace = Trace::TRACE_NONE;
+
+ m_iDefaultPolarNX = 256;
+ m_iDefaultPolarNY = 256;
+ m_iDefaultPolarInterpolation = Projections::POLAR_INTERP_BILINEAR;
+ m_iDefaultPolarZeropad = 1;
+}
+
+ProjectionFileView::~ProjectionFileView()
+{
+ GetDocumentManager()->FileHistoryRemoveMenu (m_pFileMenu);
+ GetDocumentManager()->ActivateView(this, FALSE, TRUE);;
+}
+
+void
+ProjectionFileView::OnProperties (wxCommandEvent& event)
+{
+ const Projections& rProj = GetDocument()->getProjections();
+ std::ostringstream os;
+ rProj.printScanInfo(os);
+ *theApp->getLog() << ">>>>\n" << os.str().c_str() << "<<<<\n";
+ wxMessageDialog dialogMsg (getFrameForChild(), os.str().c_str(), "Projection File Properties", wxOK | wxICON_INFORMATION);
+ dialogMsg.ShowModal();
+ GetDocument()->Activate();
+}
+
+
+void
+ProjectionFileView::OnConvertRectangular (wxCommandEvent& event)
+{
+ Projections& rProj = GetDocument()->getProjections();
+
+ int nDet = rProj.nDet();
+ int nView = rProj.nView();
+ ImageFile* pIF = new ImageFile (nDet, nView);
+ ImageFileArray v = pIF->getArray();
+ for (int iv = 0; iv < nView; iv++) {
+ DetectorValue* detval = rProj.getDetectorArray(iv).detValues();