** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: views.cpp,v 1.44 2001/01/02 05:34:57 kevin Exp $
+** $Id: views.cpp,v 1.45 2001/01/02 06:29:23 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
EVT_MENU(IFMENU_COMPARE_IMAGES, ImageFileView::OnCompare)\r
EVT_MENU(IFMENU_COMPARE_ROW, ImageFileView::OnCompareRow)\r
EVT_MENU(IFMENU_COMPARE_COL, ImageFileView::OnCompareCol)\r
-EVT_MENU(IFMENU_PROCESS_INVERTVALUES, ImageFileView::OnInvertValues)\r
-EVT_MENU(IFMENU_PROCESS_SQUARE, ImageFileView::OnSquare)\r
-EVT_MENU(IFMENU_PROCESS_SQRT, ImageFileView::OnSquareRoot)\r
-EVT_MENU(IFMENU_PROCESS_LOG, ImageFileView::OnLog)\r
-EVT_MENU(IFMENU_PROCESS_EXP, ImageFileView::OnExp)\r
-EVT_MENU(IFMENU_PROCESS_ADD, ImageFileView::OnAdd)\r
-EVT_MENU(IFMENU_PROCESS_SUBTRACT, ImageFileView::OnSubtract)\r
-EVT_MENU(IFMENU_PROCESS_MULTIPLY, ImageFileView::OnMultiply)\r
-EVT_MENU(IFMENU_PROCESS_DIVIDE, ImageFileView::OnDivide)\r
-EVT_MENU(IFMENU_PROCESS_FOURIER, ImageFileView::OnFourier)\r
-EVT_MENU(IFMENU_PROCESS_SCALESIZE, ImageFileView::OnScaleSize)\r
-EVT_MENU(IFMENU_PROCESS_INVERSE_FOURIER, ImageFileView::OnInverseFourier)\r
-EVT_MENU(IFMENU_PROCESS_SHUFFLEFOURIERTONATURALORDER, ImageFileView::OnShuffleFourierToNaturalOrder)\r
-EVT_MENU(IFMENU_PROCESS_SHUFFLENATURALTOFOURIERORDER, ImageFileView::OnShuffleNaturalToFourierOrder)\r
+EVT_MENU(IFMENU_FILTER_INVERTVALUES, ImageFileView::OnInvertValues)\r
+EVT_MENU(IFMENU_FILTER_SQUARE, ImageFileView::OnSquare)\r
+EVT_MENU(IFMENU_FILTER_SQRT, ImageFileView::OnSquareRoot)\r
+EVT_MENU(IFMENU_FILTER_LOG, ImageFileView::OnLog)\r
+EVT_MENU(IFMENU_FILTER_EXP, ImageFileView::OnExp)\r
+EVT_MENU(IFMENU_FILTER_FOURIER, ImageFileView::OnFourier)\r
+EVT_MENU(IFMENU_FILTER_INVERSE_FOURIER, ImageFileView::OnInverseFourier)\r
+EVT_MENU(IFMENU_FILTER_SHUFFLEFOURIERTONATURALORDER, ImageFileView::OnShuffleFourierToNaturalOrder)\r
+EVT_MENU(IFMENU_FILTER_SHUFFLENATURALTOFOURIERORDER, ImageFileView::OnShuffleNaturalToFourierOrder)\r
+EVT_MENU(IFMENU_IMAGE_ADD, ImageFileView::OnAdd)\r
+EVT_MENU(IFMENU_IMAGE_SUBTRACT, ImageFileView::OnSubtract)\r
+EVT_MENU(IFMENU_IMAGE_MULTIPLY, ImageFileView::OnMultiply)\r
+EVT_MENU(IFMENU_IMAGE_DIVIDE, ImageFileView::OnDivide)\r
+EVT_MENU(IFMENU_IMAGE_SCALESIZE, ImageFileView::OnScaleSize)\r
#ifdef HAVE_FFTW\r
-EVT_MENU(IFMENU_PROCESS_FFT, ImageFileView::OnFFT)\r
-EVT_MENU(IFMENU_PROCESS_IFFT, ImageFileView::OnIFFT)\r
+EVT_MENU(IFMENU_FILTER_FFT, ImageFileView::OnFFT)\r
+EVT_MENU(IFMENU_FILTER_IFFT, ImageFileView::OnIFFT)\r
#endif\r
-EVT_MENU(IFMENU_PROCESS_MAGNITUDE, ImageFileView::OnMagnitude)\r
-EVT_MENU(IFMENU_PROCESS_PHASE, ImageFileView::OnPhase)\r
+EVT_MENU(IFMENU_FILTER_MAGNITUDE, ImageFileView::OnMagnitude)\r
+EVT_MENU(IFMENU_FILTER_PHASE, ImageFileView::OnPhase)\r
EVT_MENU(IFMENU_PLOT_ROW, ImageFileView::OnPlotRow)\r
EVT_MENU(IFMENU_PLOT_COL, ImageFileView::OnPlotCol)\r
END_EVENT_TABLE()
return;\r
}\r
\r
+ wxString s = GetDocument()->GetFirstView()->GetFrame()->GetTitle() + ": ";\r
+ differenceImage.labelsCopy (rIF, s.c_str());\r
+ s = pCompareDoc->GetFirstView()->GetFrame()->GetTitle() + ": ";\r
+ differenceImage.labelsCopy (rCompareIF, s.c_str());\r
+ std::ostringstream osLabel;\r
+ osLabel << "Compare image " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str() \r
+ << " and " << pCompareDoc->GetFirstView()->GetFrame()->GetTitle().c_str() << ": "\r
+ << os.str().c_str();\r
+ differenceImage.labelAdd (os.str().c_str());\r
if (theApp->getSetModifyNewDocs())\r
pDifferenceDoc->Modify(true);\r
pDifferenceDoc->UpdateAllViews(this);\r
ImageFile& rIF = GetDocument()->getImageFile();\r
ImageFileDocument* pRHSDoc = dialogGetCompare.getImageFileDocument();\r
const ImageFile& rRHSIF = pRHSDoc->getImageFile();\r
- rIF.addImages (rRHSIF, rIF);\r
+ ImageFileDocument* pNewDoc = dynamic_cast<ImageFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT));\r
+ if (! pNewDoc) {\r
+ sys_error (ERR_SEVERE, "Unable to create image file");\r
+ return;\r
+ }\r
+ ImageFile& newImage = pNewDoc->getImageFile(); \r
+ newImage.setArraySize (rIF.nx(), rIF.ny());\r
+ rIF.addImages (rRHSIF, newImage);\r
std::ostringstream os;\r
os << "Add image " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str() << " and " \r
<< pRHSDoc->GetFirstView()->GetFrame()->GetTitle().c_str();\r
- rIF.labelAdd (os.str().c_str());\r
+ wxString s = GetDocument()->GetFirstView()->GetFrame()->GetTitle() + ": ";\r
+ newImage.labelsCopy (rIF, s.c_str());\r
+ s = pRHSDoc->GetFirstView()->GetFrame()->GetTitle() + ": ";\r
+ newImage.labelsCopy (rRHSIF, s.c_str());\r
+ newImage.labelAdd (os.str().c_str());\r
*theApp->getLog() << os.str().c_str() << "\n";\r
if (theApp->getSetModifyNewDocs())\r
- GetDocument()->Modify(TRUE);\r
- GetDocument()->UpdateAllViews(this);\r
+ pNewDoc->Modify(TRUE);\r
+ pNewDoc->UpdateAllViews(this);\r
+ pNewDoc->GetFirstView()->OnUpdate (this, NULL);\r
}\r
}\r
}\r
ImageFile& rIF = GetDocument()->getImageFile();\r
ImageFileDocument* pRHSDoc = dialogGetCompare.getImageFileDocument();\r
const ImageFile& rRHSIF = pRHSDoc->getImageFile();\r
- rIF.subtractImages (rRHSIF, rIF);\r
+ ImageFileDocument* pNewDoc = dynamic_cast<ImageFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT));\r
+ if (! pNewDoc) {\r
+ sys_error (ERR_SEVERE, "Unable to create image file");\r
+ return;\r
+ }\r
+ ImageFile& newImage = pNewDoc->getImageFile(); \r
+ newImage.setArraySize (rIF.nx(), rIF.ny());\r
+ rIF.subtractImages (rRHSIF, newImage);\r
std::ostringstream os;\r
- os << "Subtract image " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str() \r
- << " and " << pRHSDoc->GetFirstView()->GetFrame()->GetTitle().c_str();\r
- rIF.labelAdd (os.str().c_str());\r
+ os << "Subtract image " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str() << " and " \r
+ << pRHSDoc->GetFirstView()->GetFrame()->GetTitle().c_str();\r
+ wxString s = GetDocument()->GetFirstView()->GetFrame()->GetTitle() + ": ";\r
+ newImage.labelsCopy (rIF, s.c_str());\r
+ s = pRHSDoc->GetFirstView()->GetFrame()->GetTitle() + ": ";\r
+ newImage.labelsCopy (rRHSIF, s.c_str());\r
+ newImage.labelAdd (os.str().c_str());\r
*theApp->getLog() << os.str().c_str() << "\n";\r
if (theApp->getSetModifyNewDocs())\r
- GetDocument()->Modify(TRUE);\r
- GetDocument()->UpdateAllViews(this);\r
+ pNewDoc->Modify(TRUE);\r
+ pNewDoc->UpdateAllViews(this);\r
+ pNewDoc->GetFirstView()->OnUpdate (this, NULL);\r
}\r
}\r
}\r
ImageFile& rIF = GetDocument()->getImageFile();\r
ImageFileDocument* pRHSDoc = dialogGetCompare.getImageFileDocument();\r
const ImageFile& rRHSIF = pRHSDoc->getImageFile();\r
- rIF.multiplyImages (rRHSIF, rIF);\r
+ ImageFileDocument* pNewDoc = dynamic_cast<ImageFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT));\r
+ if (! pNewDoc) {\r
+ sys_error (ERR_SEVERE, "Unable to create image file");\r
+ return;\r
+ }\r
+ ImageFile& newImage = pNewDoc->getImageFile(); \r
+ newImage.setArraySize (rIF.nx(), rIF.ny());\r
+ rIF.multiplyImages (rRHSIF, newImage);\r
std::ostringstream os;\r
- os << "Multiply image " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str() \r
- << " and " << pRHSDoc->GetFirstView()->GetFrame()->GetTitle().c_str();\r
- rIF.labelAdd (os.str().c_str());\r
+ os << "Multiply image " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str() << " and " \r
+ << pRHSDoc->GetFirstView()->GetFrame()->GetTitle().c_str();\r
+ wxString s = GetDocument()->GetFirstView()->GetFrame()->GetTitle() + ": ";\r
+ newImage.labelsCopy (rIF, s.c_str());\r
+ s = pRHSDoc->GetFirstView()->GetFrame()->GetTitle() + ": ";\r
+ newImage.labelsCopy (rRHSIF, s.c_str());\r
+ newImage.labelAdd (os.str().c_str());\r
*theApp->getLog() << os.str().c_str() << "\n";\r
if (theApp->getSetModifyNewDocs())\r
- GetDocument()->Modify(TRUE);\r
- GetDocument()->UpdateAllViews(this);\r
+ pNewDoc->Modify(TRUE);\r
+ pNewDoc->UpdateAllViews(this);\r
+ pNewDoc->GetFirstView()->OnUpdate (this, NULL);\r
}\r
}\r
}\r
ImageFile& rIF = GetDocument()->getImageFile();\r
ImageFileDocument* pRHSDoc = dialogGetCompare.getImageFileDocument();\r
const ImageFile& rRHSIF = pRHSDoc->getImageFile();\r
- rIF.divideImages (rRHSIF, rIF);\r
+ ImageFileDocument* pNewDoc = dynamic_cast<ImageFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT));\r
+ if (! pNewDoc) {\r
+ sys_error (ERR_SEVERE, "Unable to create image file");\r
+ return;\r
+ }\r
+ ImageFile& newImage = pNewDoc->getImageFile(); \r
+ newImage.setArraySize (rIF.nx(), rIF.ny());\r
+ rIF.divideImages (rRHSIF, newImage);\r
std::ostringstream os;\r
- os << "Divide image " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str() \r
- << " by " << pRHSDoc->GetFirstView()->GetFrame()->GetTitle().c_str();\r
- rIF.labelAdd (os.str().c_str());\r
+ os << "Divide image " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str() << " by " \r
+ << pRHSDoc->GetFirstView()->GetFrame()->GetTitle().c_str();\r
+ wxString s = GetDocument()->GetFirstView()->GetFrame()->GetTitle() + ": ";\r
+ newImage.labelsCopy (rIF, s.c_str());\r
+ s = pRHSDoc->GetFirstView()->GetFrame()->GetTitle() + ": ";\r
+ newImage.labelsCopy (rRHSIF, s.c_str());\r
+ newImage.labelAdd (os.str().c_str());\r
*theApp->getLog() << os.str().c_str() << "\n";\r
if (theApp->getSetModifyNewDocs())\r
- GetDocument()->Modify(TRUE);\r
- GetDocument()->UpdateAllViews(this);\r
+ pNewDoc->Modify(TRUE);\r
+ pNewDoc->UpdateAllViews(this);\r
+ pNewDoc->GetFirstView()->OnUpdate (this, NULL);\r
}\r
}\r
}\r
view_menu->Append(IFMENU_VIEW_SCALE_MINMAX, "Display Scale &Set...");
view_menu->Append(IFMENU_VIEW_SCALE_AUTO, "Display Scale &Auto...");
\r
- wxMenu* process_menu = new wxMenu;\r
- process_menu->Append (IFMENU_PROCESS_INVERTVALUES, "&Invert Values");\r
- process_menu->Append (IFMENU_PROCESS_SQUARE, "&Square");\r
- process_menu->Append (IFMENU_PROCESS_SQRT, "Square &Root");\r
- process_menu->Append (IFMENU_PROCESS_LOG, "&Log");\r
- process_menu->Append (IFMENU_PROCESS_EXP, "&Exp");\r
- process_menu->AppendSeparator();\r
- process_menu->Append (IFMENU_PROCESS_ADD, "&Add");\r
- process_menu->Append (IFMENU_PROCESS_SUBTRACT, "Su&btract");\r
- process_menu->Append (IFMENU_PROCESS_MULTIPLY, "&Multiply");\r
- process_menu->Append (IFMENU_PROCESS_DIVIDE, "&Divide");\r
- process_menu->AppendSeparator();\r
- process_menu->Append (IFMENU_PROCESS_SCALESIZE, "S&cale Size...");\r
- process_menu->AppendSeparator();\r
+ wxMenu* filter_menu = new wxMenu;\r
+ filter_menu->Append (IFMENU_FILTER_INVERTVALUES, "&Invert Values");\r
+ filter_menu->Append (IFMENU_FILTER_SQUARE, "&Square");\r
+ filter_menu->Append (IFMENU_FILTER_SQRT, "Square &Root");\r
+ filter_menu->Append (IFMENU_FILTER_LOG, "&Log");\r
+ filter_menu->Append (IFMENU_FILTER_EXP, "&Exp");\r
+ filter_menu->AppendSeparator();\r
#ifdef HAVE_FFTW\r
- process_menu->Append (IFMENU_PROCESS_FFT, "&FFT");\r
- process_menu->Append (IFMENU_PROCESS_IFFT, "&IFFT");\r
- process_menu->Append (IFMENU_PROCESS_FOURIER, "F&ourier");\r
- process_menu->Append (IFMENU_PROCESS_INVERSE_FOURIER, "Inverse Fo&urier");\r
+ filter_menu->Append (IFMENU_FILTER_FFT, "&FFT");\r
+ filter_menu->Append (IFMENU_FILTER_IFFT, "&IFFT");\r
+ filter_menu->Append (IFMENU_FILTER_FOURIER, "F&ourier");\r
+ filter_menu->Append (IFMENU_FILTER_INVERSE_FOURIER, "Inverse Fo&urier");\r
#else\r
- process_menu->Append (IFMENU_PROCESS_FOURIER, "&Fourier");\r
- process_menu->Append (IFMENU_PROCESS_INVERSE_FOURIER, "&Inverse Fourier");\r
+ filter_menu->Append (IFMENU_FILTER_FOURIER, "&Fourier");\r
+ filter_menu->Append (IFMENU_FILTER_INVERSE_FOURIER, "&Inverse Fourier");\r
#endif\r
- process_menu->Append (IFMENU_PROCESS_SHUFFLEFOURIERTONATURALORDER, "S&huffle Fourier to Natural Order");\r
- process_menu->Append (IFMENU_PROCESS_SHUFFLENATURALTOFOURIERORDER, "Shu&ffle Natural to Fourier Order");\r
- process_menu->Append (IFMENU_PROCESS_MAGNITUDE, "&Magnitude");\r
- process_menu->Append (IFMENU_PROCESS_PHASE, "&Phase");\r
+ filter_menu->Append (IFMENU_FILTER_SHUFFLEFOURIERTONATURALORDER, "S&huffle Fourier to Natural Order");\r
+ filter_menu->Append (IFMENU_FILTER_SHUFFLENATURALTOFOURIERORDER, "Shu&ffle Natural to Fourier Order");\r
+ filter_menu->Append (IFMENU_FILTER_MAGNITUDE, "&Magnitude");\r
+ filter_menu->Append (IFMENU_FILTER_PHASE, "&Phase");\r
+ \r
+ wxMenu* image_menu = new wxMenu;\r
+ filter_menu->AppendSeparator();\r
+ image_menu->Append (IFMENU_IMAGE_ADD, "&Add...");\r
+ image_menu->Append (IFMENU_IMAGE_SUBTRACT, "&Subtract...");\r
+ image_menu->Append (IFMENU_IMAGE_MULTIPLY, "&Multiply...");\r
+ image_menu->Append (IFMENU_IMAGE_DIVIDE, "&Divide...");\r
+ image_menu->AppendSeparator();\r
+ image_menu->Append (IFMENU_IMAGE_SCALESIZE, "S&cale Size...");\r
\r
wxMenu *plot_menu = new wxMenu;\r
plot_menu->Append (IFMENU_PLOT_ROW, "Plot &Row");\r
menu_bar->Append(file_menu, "&File");
menu_bar->Append(view_menu, "&View");\r
- menu_bar->Append(process_menu, "&Process");\r
+ menu_bar->Append(image_menu, "&Image");\r
+ menu_bar->Append(filter_menu, "Fi<er");\r
menu_bar->Append(plot_menu, "P&lot");\r
menu_bar->Append(compare_menu, "&Compare");
menu_bar->Append(help_menu, "&Help");
if (retVal == wxID_OK) {
int xSize = dialogRaster.getXSize();
int ySize = dialogRaster.getYSize();
- int nSamples = dialogRaster.getNSamples();
+ int nSamples = dialogRaster.getNSamples();\r
if (nSamples < 1)
nSamples = 1;
if (xSize > 0 && ySize > 0) {
ImageFile& imageFile = pRasterDoc->getImageFile();
imageFile.setArraySize (xSize, ySize);
- wxProgressDialog dlgProgress (wxString("Rasterize"), wxString("Rasterization Progress"), imageFile.nx() + 1, m_frame, wxPD_CAN_ABORT);
+ wxProgressDialog dlgProgress (wxString("Rasterize"), wxString("Rasterization Progress"), imageFile.nx() + 1, m_frame, wxPD_CAN_ABORT);\r
+ Timer timer;
for (unsigned int i = 0; i < imageFile.nx(); i++) {
rPhantom.convertToImagefile (imageFile, nSamples, Trace::TRACE_NONE, i, 1, true);
if (! dlgProgress.Update(i+1)) {
}
if (theApp->getSetModifyNewDocs())\r
pRasterDoc->Modify(true);
- pRasterDoc->UpdateAllViews(this);
+ pRasterDoc->UpdateAllViews(this);\r
+ std::ostringstream os;\r
+ os << "Rasterize Phantom " << rPhantom.name() << ": XSize=" << xSize << ", YSize=" << ySize << ", nSamples=" << nSamples;\r
+ *theApp->getLog() << os.str().c_str() << "\n";\r
+ imageFile.labelAdd (os.str().c_str(), timer.timerEnd());
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
}
}
wxMessageBox ("Sorry!\nCurrently, frequency-based filtering with direct filter generation is not support for geometries other than parallel.\nAborting command.", "Not Supported", wxOK | wxICON_WARNING, m_frame);
return;
}
-#if 0
- SGPDriver* pSGPDriver = NULL;
- SGP* pSGP = NULL;
- wxMemoryDC* pDCPlot = NULL;
- wxBitmap bitmap;
- if (m_iDefaultTrace >= Trace::TRACE_PLOT) {
- bitmap.Create (500, 500);
- pDCPlot = new wxMemoryDC;
- pDCPlot->SelectObject (bitmap);
- pSGPDriver = new SGPDriver (dynamic_cast<wxDC*>pDCPlot, 500, 500);
- pSGP = new SGP (*pSGPDriver);
- }
- Reconstructor* pReconstruct = new Reconstructor (rProj, imageFile, optFilterName.c_str(), m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(), optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), m_iDefaultTrace, pSGP);
- delete pSGP;
-#else
+\r
Reconstructor* pReconstruct = new Reconstructor (rProj, imageFile, optFilterName.c_str(), m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(), optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), m_iDefaultTrace);
-#endif
- \r
+\r
Timer timerRecon;
if (m_iDefaultTrace > Trace::TRACE_CONSOLE) {
ReconstructDialog* pDlgReconstruct = new ReconstructDialog (*pReconstruct, rProj, imageFile, m_iDefaultTrace, m_frame);
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";
imageFile.labelAdd (rProj.getLabel());
- imageFile.labelAdd (Array2dFileLabel::L_HISTORY, os.str().c_str(), timerRecon.timerEnd());
+ imageFile.labelAdd (os.str().c_str(), timerRecon.timerEnd());
}
}
}