+
+void
+PhantomView::OnProjections (wxCommandEvent& event)
+{
+ DialogGetProjectionParameters dialogProjection (m_frame, m_iDefaultNDet, m_iDefaultNView, m_iDefaultNSample, m_dDefaultRotation, m_dDefaultFocalLength, m_dDefaultFieldOfView, m_iDefaultGeometry, m_iDefaultTrace);
+ int retVal = dialogProjection.ShowModal();
+ if (retVal == wxID_OK) {
+ m_iDefaultNDet = dialogProjection.getNDet();
+ m_iDefaultNView = dialogProjection.getNView();
+ m_iDefaultNSample = dialogProjection.getNSamples();
+ m_iDefaultTrace = dialogProjection.getTrace();
+ m_dDefaultRotation = dialogProjection.getRotAngle();
+ m_dDefaultFocalLength = dialogProjection.getFocalLengthRatio();
+ m_dDefaultFieldOfView = dialogProjection.getFieldOfViewRatio();
+ wxString sGeometry = dialogProjection.getGeometry();
+ m_iDefaultGeometry = Scanner::convertGeometryNameToID (sGeometry.c_str());
+
+ if (m_iDefaultNDet > 0 && m_iDefaultNView > 0 && sGeometry != "") {
+ const Phantom& rPhantom = GetDocument()->getPhantom();
+ ProjectionFileDocument* pProjectionDoc = dynamic_cast<ProjectionFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.pj", wxDOC_SILENT));\r
+ if (! pProjectionDoc) {\r
+ sys_error (ERR_SEVERE, "Unable to create projection document");\r
+ return;\r
+ }
+ Projections& rProj = pProjectionDoc->getProjections();
+ Scanner theScanner (rPhantom, sGeometry.c_str(), m_iDefaultNDet, m_iDefaultNView, m_iDefaultNSample, m_dDefaultRotation, m_dDefaultFocalLength, m_dDefaultFieldOfView);
+ if (theScanner.fail()) {
+ *theApp->getLog() << "Failed making scanner: " << theScanner.failMessage().c_str() << "\n";
+ return;
+ }
+ rProj.initFromScanner (theScanner);
+ m_dDefaultRotation /= PI; // convert back to PI units
+
+ if (m_iDefaultTrace > Trace::TRACE_CONSOLE) {
+ ProjectionsDialog dialogProjections (theScanner, rProj, rPhantom, m_iDefaultTrace, dynamic_cast<wxWindow*>(m_frame));
+ for (int iView = 0; iView < rProj.nView(); iView++) {
+ ::wxYield();
+ ::wxYield();
+ if (dialogProjections.isCancelled() || ! dialogProjections.projectView (iView)) {
+ pProjectionDoc->DeleteAllViews();
+ return;
+ }
+ ::wxYield();
+ ::wxYield();
+ while (dialogProjections.isPaused()) {
+ ::wxYield();
+ ::wxUsleep(50);
+ }
+ }
+ } else {
+ wxProgressDialog dlgProgress (wxString("Projection"), wxString("Projection Progress"), rProj.nView() + 1, m_frame, wxPD_CAN_ABORT);
+ for (int i = 0; i < rProj.nView(); i++) {
+ theScanner.collectProjections (rProj, rPhantom, i, 1, true, m_iDefaultTrace);
+ if (! dlgProgress.Update (i+1)) {
+ pProjectionDoc->DeleteAllViews();
+ return;
+ }
+ }
+ }
+
+ std::ostringstream os;
+ os << "Projections for " << rPhantom.name() << ": nDet=" << m_iDefaultNDet << ", nView=" << m_iDefaultNView << ", nSamples=" << m_iDefaultNSample << ", RotAngle=" << m_dDefaultRotation << ", FocalLengthRatio=" << m_dDefaultFocalLength << ", FieldOfViewRatio=" << m_dDefaultFieldOfView << ", Geometry=" << sGeometry.c_str();
+ rProj.setRemark (os.str());
+ *theApp->getLog() << os.str().c_str() << "\n";
+
+ m_frame->Lower();
+ ::wxYield();
+ ProjectionFileView* projView = dynamic_cast<ProjectionFileView*>(pProjectionDoc->GetFirstView());\r
+ if (projView) {\r
+ projView->getFrame()->SetFocus();\r
+ projView->OnUpdate (projView, NULL);\r
+ }\r
+ if (wxView* pView = pProjectionDoc->GetFirstView()) {
+ if (wxFrame* pFrame = pView->GetFrame()) {
+ pFrame->SetFocus();
+ pFrame->Raise();
+ }
+ theApp->getDocManager()->ActivateView (pView, true, false);
+ }
+ ::wxYield();
+ pProjectionDoc->Modify(true);
+ pProjectionDoc->UpdateAllViews(this);
+ }
+ }
+}
+
+
+void
+PhantomView::OnRasterize (wxCommandEvent& event)
+{
+ DialogGetRasterParameters dialogRaster (m_frame, 256, 256, 1);
+ int retVal = dialogRaster.ShowModal();
+ if (retVal == wxID_OK) {
+ int xSize = dialogRaster.getXSize();
+ int ySize = dialogRaster.getYSize();
+ int nSamples = dialogRaster.getNSamples();
+ if (nSamples < 1)
+ nSamples = 1;
+ if (xSize > 0 && ySize > 0) {
+ const Phantom& rPhantom = GetDocument()->getPhantom();
+ ImageFileDocument* pRasterDoc = dynamic_cast<ImageFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT));\r
+ if (! pRasterDoc) {\r
+ sys_error (ERR_SEVERE, "Unable to create image file");\r
+ return;\r
+ }
+ ImageFile& imageFile = pRasterDoc->getImageFile();
+
+ imageFile.setArraySize (xSize, ySize);
+ wxProgressDialog dlgProgress (wxString("Rasterize"), wxString("Rasterization Progress"), imageFile.nx() + 1, m_frame, wxPD_CAN_ABORT);
+ for (unsigned int i = 0; i < imageFile.nx(); i++) {
+ rPhantom.convertToImagefile (imageFile, nSamples, Trace::TRACE_NONE, i, 1, true);
+ if (! dlgProgress.Update(i+1)) {
+ pRasterDoc->DeleteAllViews();
+ return;
+ }
+ }
+ pRasterDoc->Modify(true);
+ pRasterDoc->UpdateAllViews(this);
+ ImageFileView* rasterView = dynamic_cast<ImageFileView*>(pRasterDoc->GetFirstView());\r
+ if (rasterView) {\r
+ rasterView->getFrame()->SetFocus();\r
+ rasterView->OnUpdate (rasterView, NULL);\r
+ }\r
+
+ std::ostringstream os;
+ os << "Rasterize Phantom " << rPhantom.name() << ": XSize=" << xSize << ", YSize=" << ySize << ", nSamples=" << nSamples << "\n";
+ *theApp->getLog() << os.str().c_str();
+ }\r
+ }
+}
+
+
+PhantomCanvas*
+PhantomView::CreateCanvas (wxView *view, wxFrame *parent)
+{
+ PhantomCanvas* pCanvas;
+ int width, height;
+ parent->GetClientSize(&width, &height);
+
+ pCanvas = new PhantomCanvas (dynamic_cast<PhantomView*>(view), parent, wxPoint(0, 0), wxSize(width, height), 0);
+
+ pCanvas->SetBackgroundColour(*wxWHITE);
+ pCanvas->Clear();
+
+ return pCanvas;
+}
+
+wxFrame*
+PhantomView::CreateChildFrame(wxDocument *doc, wxView *view)
+{
+ wxDocChildFrame *subframe = new wxDocChildFrame(doc, view, theApp->getMainFrame(), -1, "Phantom Frame", wxPoint(10, 10), wxSize(256, 256), wxDEFAULT_FRAME_STYLE);
+
+ wxMenu *file_menu = new wxMenu;
+
+ file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "Cr&eate Phantom...");
+ file_menu->Append(wxID_OPEN, "&Open...");
+ file_menu->Append(wxID_CLOSE, "&Close");
+
+ file_menu->AppendSeparator();
+ file_menu->Append(PHMMENU_FILE_PROPERTIES, "P&roperties");
+
+ file_menu->AppendSeparator();
+ file_menu->Append(wxID_PRINT, "&Print...");
+ file_menu->Append(wxID_PRINT_SETUP, "Print &Setup...");
+ file_menu->Append(wxID_PREVIEW, "Print Pre&view");
+
+ wxMenu *process_menu = new wxMenu;
+ process_menu->Append(PHMMENU_PROCESS_RASTERIZE, "&Rasterize...");
+ process_menu->Append(PHMMENU_PROCESS_PROJECTIONS, "&Projections...");
+
+ wxMenu *help_menu = new wxMenu;
+ help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents");
+ help_menu->Append(MAINMENU_HELP_ABOUT, "&About");
+
+ wxMenuBar *menu_bar = new wxMenuBar;
+
+ menu_bar->Append(file_menu, "&File");
+ menu_bar->Append(process_menu, "&Process");
+ menu_bar->Append(help_menu, "&Help");
+
+ subframe->SetMenuBar(menu_bar);
+
+ subframe->Centre(wxBOTH);
+
+ return subframe;
+}
+
+