X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=src%2Fviews.cpp;h=6f55604e11f4c69ee725b19455e897d1c148c66a;hb=b361677a2f7d5b443641faec70b057f2a84dc77e;hp=b78442190c44e0f06aeade515d24e9dd9fd30369;hpb=57befab65f4415286ceea4ef631e2d7a1051d70f;p=ctsim.git diff --git a/src/views.cpp b/src/views.cpp index b784421..6f55604 100644 --- a/src/views.cpp +++ b/src/views.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: views.cpp,v 1.124 2001/03/02 20:20:09 kevin Exp $ +** $Id: views.cpp,v 1.130 2001/03/10 23:14:16 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 @@ -841,7 +841,7 @@ ImageFileView::CreateChildFrame(wxDocument *doc, wxView *view) m_pFileMenu->Append(wxID_PRINT_SETUP, "Print &Setup..."); m_pFileMenu->Append(wxID_PREVIEW, "Print Preview"); m_pFileMenu->AppendSeparator(); - m_pFileMenu->Append(MAINMENU_IMPORT, "&Import\tCtrl-I..."); + m_pFileMenu->Append(MAINMENU_IMPORT, "&Import...\tCtrl-M"); #ifdef CTSIM_MDI m_pFileMenu->AppendSeparator(); m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Prefere&nces..."); @@ -1095,6 +1095,12 @@ ImageFileView::OnExport (wxCommandEvent& event) strExt = ".png"; strWildcard = "PNG Files (*.png)|*.png"; } +#endif +#ifdef HAVE_CTN_DICOM + else if (m_iDefaultExportFormatID == ImageFile::EXPORT_FORMAT_DICOM) { + strExt = ""; + strWildcard = "DICOM Files (*.*)|*.*"; + } #endif else { strExt = ""; @@ -1408,7 +1414,7 @@ ImageFileView::OnPlotFFTRow (wxCommandEvent& event) rPlotFile.addColumn (1, pYReal); rPlotFile.addColumn (2, pYImag); rPlotFile.addColumn (3, pYMag); - for (int iL = 0; iL < rIF.nLabels(); iL++) + for (unsigned int iL = 0; iL < rIF.nLabels(); iL++) rPlotFile.addDescription (rIF.labelGet(iL).getLabelString().c_str()); os << " FFT Plot of " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str(); *theApp->getLog() << os.str().c_str() << "\n"; @@ -1508,7 +1514,7 @@ ImageFileView::OnPlotFFTCol (wxCommandEvent& event) rPlotFile.addColumn (1, pYReal); rPlotFile.addColumn (2, pYImag); rPlotFile.addColumn (3, pYMag); - for (int iL = 0; iL < rIF.nLabels(); iL++) + for (unsigned int iL = 0; iL < rIF.nLabels(); iL++) rPlotFile.addDescription (rIF.labelGet(iL).getLabelString().c_str()); os << " FFT Plot of " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str(); *theApp->getLog() << os.str().c_str() << "\n"; @@ -1948,7 +1954,8 @@ PhantomFileView::OnProjections (wxCommandEvent& event) } } } else { - if (theApp->getUseBackgroundTasks() || theApp->getNumberCPU() > 1) { +#if HAVE_WXTHREADS + if (theApp->getUseBackgroundTasks()) { ProjectorSupervisorThread* pProjector = new ProjectorSupervisorThread (this, m_iDefaultNDet, m_iDefaultNView, sGeometry.c_str(), m_iDefaultNSample, dRotationRadians, m_dDefaultFocalLength, m_dDefaultCenterDetectorLength, m_dDefaultViewRatio, m_dDefaultScanRatio, os.str().c_str()); @@ -1960,7 +1967,9 @@ PhantomFileView::OnProjections (wxCommandEvent& event) pProjector->SetPriority(60); pProjector->Run(); return; - } else { + } else +#endif // HAVE_WXTHREADS + { pProj = new Projections; pProj->initFromScanner (theScanner); wxProgressDialog dlgProgress (wxString("Projection"), wxString("Projection Progress"), pProj->nView() + 1, getFrameForChild(), wxPD_CAN_ABORT ); @@ -2028,7 +2037,8 @@ PhantomFileView::OnRasterize (wxCommandEvent& event) << m_iDefaultRasterNY << ", ViewRatio=" << m_dDefaultRasterViewRatio << ", nSamples=" << m_iDefaultRasterNSamples;; - if (theApp->getUseBackgroundTasks() || theApp->getNumberCPU() > 1) { +#if HAVE_WXTHREADS + if (theApp->getUseBackgroundTasks()) { RasterizerSupervisorThread* pThread = new RasterizerSupervisorThread (this, m_iDefaultRasterNX, m_iDefaultRasterNY, m_iDefaultRasterNSamples, m_dDefaultRasterViewRatio, os.str().c_str()); if (pThread->Create() != wxTHREAD_NO_ERROR) { @@ -2037,7 +2047,9 @@ PhantomFileView::OnRasterize (wxCommandEvent& event) } pThread->SetPriority (60); pThread->Run(); - } else { + } else +#endif + { ImageFile* pImageFile = new ImageFile (m_iDefaultRasterNX, m_iDefaultRasterNY); wxProgressDialog dlgProgress (wxString("Rasterize"), wxString("Rasterization Progress"), pImageFile->nx() + 1, getFrameForChild(), wxPD_CAN_ABORT ); @@ -2113,7 +2125,7 @@ PhantomFileView::CreateChildFrame(wxDocument *doc, wxView *view) 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-I..."); + m_pFileMenu->Append(MAINMENU_IMPORT, "&Import...\tCtrl-M"); #ifdef CTSIM_MDI m_pFileMenu->AppendSeparator(); m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Prefere&nces..."); @@ -2265,6 +2277,7 @@ 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) +EVT_MENU(PJMENU_PLOT_TTHETA_SAMPLING, ProjectionFileView::OnPlotTThetaSampling) END_EVENT_TABLE() ProjectionFileView::ProjectionFileView() @@ -2330,11 +2343,14 @@ ProjectionFileView::OnConvertPolar (wxCommandEvent& event) ImageFileDocument* pPolarDoc = theApp->newImageDoc(); ImageFile* pIF = new ImageFile (m_iDefaultPolarNX, m_iDefaultPolarNY); m_iDefaultPolarInterpolation = Projections::convertInterpNameToID (strInterpolation.c_str()); - if (! rProj.convertPolar (*pIF, m_iDefaultPolarInterpolation)) { + + if (! rProj.convertPolar (*pIF, m_iDefaultPolarInterpolation)) { delete pIF; *theApp->getLog() << "Error converting to Polar\n"; return; } + + pPolarDoc = theApp->newImageDoc (); if (! pPolarDoc) { sys_error (ERR_SEVERE, "Unable to create image file"); @@ -2396,6 +2412,43 @@ ProjectionFileView::OnConvertFFTPolar (wxCommandEvent& event) } } +void +ProjectionFileView::OnPlotTThetaSampling (wxCommandEvent& event) +{ + Projections& rProj = GetDocument()->getProjections(); + ParallelRaysums parallel (&rProj); + PlotFileDocument* pPlotDoc = theApp->newPlotDoc(); + PlotFile& rPlot = pPlotDoc->getPlotFile(); + ParallelRaysumCoordinate** ppCoord = parallel.getCoordinates(); + double* pdT = new double [parallel.getNumCoordinates()]; + double* pdTheta = new double [parallel.getNumCoordinates()]; + for (int i = 0; i < parallel.getNumCoordinates(); i++) { + pdT[i] = (*ppCoord)->m_dT; + pdTheta[i] = (*ppCoord)->m_dTheta; + ++ppCoord; + } + rPlot.setCurveSize (2, parallel.getNumCoordinates(), true); + rPlot.addEzsetCommand ("title T-Theta Sampling"); + rPlot.addEzsetCommand ("xlabel T"); + rPlot.addEzsetCommand ("ylabel Theta"); + rPlot.addEzsetCommand ("curve 1"); + if (rProj.nDet() < 50 && rProj.nView() < 50) + rPlot.addEzsetCommand ("symbol 1"); // x symbol + else + rPlot.addEzsetCommand ("symbol 6"); // point symbol + rPlot.addEzsetCommand ("noline"); + rPlot.addColumn (0, pdT); + rPlot.addColumn (1, pdTheta); + delete pdT; + delete pdTheta; + if (theApp->getAskDeleteNewDocs()) + pPlotDoc->Modify (true); + pPlotDoc->UpdateAllViews (); + pPlotDoc->getView()->OnUpdate (this, NULL); + pPlotDoc->getView()->getFrame()->Show(true); + return; +} + void ProjectionFileView::OnReconstructFourier (wxCommandEvent& event) { @@ -2465,7 +2518,8 @@ ProjectionFileView::OnReconstructFBP (wxCommandEvent& event) delete pDlgReconstruct; delete pReconstructor; } else { - if (theApp->getUseBackgroundTasks() || theApp->getNumberCPU() > 1) { +#if HAVE_WXTHREADS + if (theApp->getUseBackgroundTasks()) { ReconstructorSupervisorThread* pReconstructor = new ReconstructorSupervisorThread (this, m_iDefaultNX, m_iDefaultNY, optFilterName.c_str(), m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(), @@ -2478,7 +2532,9 @@ ProjectionFileView::OnReconstructFBP (wxCommandEvent& event) pReconstructor->SetPriority (60); pReconstructor->Run(); return; - } else { + } else +#endif + { pImageFile = new ImageFile (m_iDefaultNX, m_iDefaultNY); Reconstructor* pReconstructor = new Reconstructor (rProj, *pImageFile, optFilterName.c_str(), m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(), @@ -2563,7 +2619,7 @@ ProjectionFileView::CreateChildFrame(wxDocument *doc, wxView *view) 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-I..."); + m_pFileMenu->Append(MAINMENU_IMPORT, "&Import...\tCtrl-M"); #ifdef CTSIM_MDI m_pFileMenu->AppendSeparator(); m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Prefere&nces..."); @@ -2575,7 +2631,10 @@ ProjectionFileView::CreateChildFrame(wxDocument *doc, wxView *view) 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-M"); - + + wxMenu* analyze_menu = new wxMenu; + analyze_menu->Append (PJMENU_PLOT_TTHETA_SAMPLING, "&Plot T-Theta Sampling\tCtrl-T"); + wxMenu *reconstruct_menu = new wxMenu; reconstruct_menu->Append (PJMENU_RECONSTRUCT_FBP, "&Filtered Backprojection...\tCtrl-R", "Reconstruct image using filtered backprojection"); reconstruct_menu->Append (PJMENU_RECONSTRUCT_FOURIER, "&Fourier...\tCtrl-E", "Reconstruct image using inverse Fourier"); @@ -2591,19 +2650,21 @@ ProjectionFileView::CreateChildFrame(wxDocument *doc, wxView *view) menu_bar->Append (m_pFileMenu, "&File"); menu_bar->Append (convert_menu, "&Convert"); + menu_bar->Append (analyze_menu, "&Analyze"); menu_bar->Append (reconstruct_menu, "&Reconstruct"); menu_bar->Append (help_menu, "&Help"); subframe->SetMenuBar(menu_bar); subframe->Centre(wxBOTH); - wxAcceleratorEntry accelEntries[5]; + wxAcceleratorEntry accelEntries[6]; accelEntries[0].Set (wxACCEL_CTRL, static_cast('L'), PJMENU_CONVERT_POLAR); accelEntries[1].Set (wxACCEL_CTRL, static_cast('M'), PJMENU_CONVERT_FFT_POLAR); accelEntries[2].Set (wxACCEL_CTRL, static_cast('R'), PJMENU_RECONSTRUCT_FBP); accelEntries[3].Set (wxACCEL_CTRL, static_cast('E'), PJMENU_RECONSTRUCT_FOURIER); accelEntries[4].Set (wxACCEL_CTRL, static_cast('I'), PJMENU_FILE_PROPERTIES); - wxAcceleratorTable accelTable (5, accelEntries); + accelEntries[5].Set (wxACCEL_CTRL, static_cast('T'), PJMENU_PLOT_TTHETA_SAMPLING); + wxAcceleratorTable accelTable (6, accelEntries); subframe->SetAcceleratorTable (accelTable); return subframe; @@ -2895,7 +2956,7 @@ PlotFileView::CreateChildFrame(wxDocument *doc, wxView *view) 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-I..."); + m_pFileMenu->Append(MAINMENU_IMPORT, "&Import...\tCtrl-M"); #ifdef CTSIM_MDI m_pFileMenu->AppendSeparator(); m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Prefere&nces..."); @@ -2987,7 +3048,8 @@ PlotFileView::OnUpdate (wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint) ) const PlotFile& rPlotFile = GetDocument()->getPlotFile(); const int iNColumns = rPlotFile.getNumColumns(); const int iNRecords = rPlotFile.getNumRecords(); - + const bool bScatterPlot = rPlotFile.getIsScatterPlot(); + if (iNColumns > 0 && iNRecords > 0) { if (m_pEZPlot) delete m_pEZPlot; @@ -3010,17 +3072,22 @@ PlotFileView::OnUpdate (wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint) ) m_pEZPlot->ezset("box"); m_pEZPlot->ezset("grid"); - - double* pdXaxis = new double [iNRecords]; - rPlotFile.getColumn (0, pdXaxis); - + + double* pdX = new double [iNRecords]; double* pdY = new double [iNRecords]; - for (int iCol = 1; iCol < iNColumns; iCol++) { - rPlotFile.getColumn (iCol, pdY); - m_pEZPlot->addCurve (pdXaxis, pdY, iNRecords); - } + if (! bScatterPlot) { + rPlotFile.getColumn (0, pdX); - delete pdXaxis; + for (int iCol = 1; iCol < iNColumns; iCol++) { + rPlotFile.getColumn (iCol, pdY); + m_pEZPlot->addCurve (pdX, pdY, iNRecords); + } + } else { + rPlotFile.getColumn (0, pdX); + rPlotFile.getColumn (1, pdY); + m_pEZPlot->addCurve (pdX, pdY, iNRecords); + } + delete pdX; delete pdY; } @@ -3150,7 +3217,7 @@ TextFileView::CreateChildFrame (wxDocument *doc, wxView *view) 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-I..."); + m_pFileMenu->Append(MAINMENU_IMPORT, "&Import...\tCtrl-M"); #ifdef CTSIM_MDI m_pFileMenu->AppendSeparator(); m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Prefere&nces...");