** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: views.cpp,v 1.10 2000/07/29 19:50:08 kevin Exp $
+** $Id: views.cpp,v 1.16 2000/08/25 15:59:13 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
BEGIN_EVENT_TABLE(ImageFileView, wxView)
EVT_MENU(IFMENU_FILE_PROPERTIES, ImageFileView::OnProperties)
- EVT_MENU(IFMENU_VIEW_WINDOW_MINMAX, ImageFileView::OnWindowMinMax)
- EVT_MENU(IFMENU_VIEW_WINDOW_AUTO, ImageFileView::OnWindowAuto)
+ EVT_MENU(IFMENU_VIEW_SCALE_MINMAX, ImageFileView::OnScaleMinMax)
+ EVT_MENU(IFMENU_VIEW_SCALE_AUTO, ImageFileView::OnScaleAuto)
END_EVENT_TABLE()
ImageFileView::ImageFileView(void)
}
void
-ImageFileView::OnWindowAuto (wxCommandEvent& event)
+ImageFileView::OnScaleAuto (wxCommandEvent& event)
{
- *theApp->getLog() << "ImageFile: Window Auto\n";
+ const ImageFile& rIF = GetDocument()->getImageFile();
+ DialogAutoScaleParameters dialogAutoScale (m_frame, rIF);
+ int iRetVal = dialogAutoScale.ShowModal();
+ if (iRetVal == wxID_OK) {
+ m_bMinSpecified = true;
+ m_bMaxSpecified = true;
+ double dMin, dMax;
+ dialogAutoScale.getMinMax (&dMin, &dMax);
+ m_dMinPixel = dMin;
+ m_dMaxPixel = dMax;
+ OnUpdate (this, NULL);
+ }
}
void
-ImageFileView::OnWindowMinMax (wxCommandEvent& event)
+ImageFileView::OnScaleMinMax (wxCommandEvent& event)
{
const ImageFile& rIF = GetDocument()->getImageFile();
double min, max;
file_menu->Append(wxID_PREVIEW, "Print Pre&view");
wxMenu *view_menu = new wxMenu;
- view_menu->Append(IFMENU_VIEW_WINDOW_MINMAX, "&Set Window Min/Max");
- view_menu->Append(IFMENU_VIEW_WINDOW_AUTO, "&Auto Window...");
+ view_menu->Append(IFMENU_VIEW_SCALE_MINMAX, "Display Scale &Set...");
+ view_menu->Append(IFMENU_VIEW_SCALE_AUTO, "Display Scale &Auto...");
wxMenu *help_menu = new wxMenu;
help_menu->Append(MAINMENU_HELP_ABOUT, "&About");
void
PhantomView::OnProjections (wxCommandEvent& event)
{
- DialogGetProjectionParameters dialogProjection (m_frame, 367, 320, 1, 1., Scanner::GEOMETRY_PARALLEL);
+ DialogGetProjectionParameters dialogProjection (m_frame, 367, 320, 1, 1., 1., 1., Scanner::GEOMETRY_PARALLEL);
int retVal = dialogProjection.ShowModal();
if (retVal == wxID_OK) {
int nDet = dialogProjection.getNDet();
int nView = dialogProjection.getNView();
int nSamples = dialogProjection.getNSamples();
double dRotAngle = dialogProjection.getRotAngle();
+ double dFocalLengthRatio = dialogProjection.getFocalLengthRatio();
+ double dFieldOfViewRatio = dialogProjection.getFieldOfViewRatio();
+
wxString sGeometry = dialogProjection.getGeometry();
if (nDet > 0 && nView > 0 && sGeometry != "") {
const Phantom& rPhantom = GetDocument()->getPhantom();
ProjectionFileDocument* pProjectionDoc = dynamic_cast<ProjectionFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.pj", wxDOC_SILENT));
Projections& rProj = pProjectionDoc->getProjections();
- Scanner theScanner (rPhantom, sGeometry.c_str(), nDet, nView, nSamples, dRotAngle);
+ Scanner theScanner (rPhantom, sGeometry.c_str(), nDet, nView, nSamples, dRotAngle, dFocalLengthRatio, dFieldOfViewRatio);
+ if (theScanner.fail()) {
+ *theApp->getLog() << "Failed making scanner: " << theScanner.failMessage().c_str() << "\n";
+ return;
+ }
rProj.initFromScanner (theScanner);
- theScanner.collectProjections (rProj, rPhantom, 0, TRACE_NONE);
+
+#if 1
+ wxFrame frame (m_frame, -1, "", wxDefaultPosition, wxSize(500,500));
+ frame.Show();
+ wxClientDC dc (&frame);
+ int x, y;
+ frame.GetClientSize(&x, &y);
+ SGPDriver driver (dynamic_cast<wxDC*>(&dc), x, y);
+ SGP sgp (driver);
+ for (int iView = 0; iView < rProj.nView(); iView++) {
+ theScanner.collectProjections (rProj, rPhantom, iView, 1, true, TRACE_RAYS, &sgp);
+ }
+#else
+ theScanner.collectProjections (rProj, rPhantom);
+#endif
+
pProjectionDoc->Modify(true);
pProjectionDoc->UpdateAllViews(this);
ostringstream os;
- os << "Projections for " << rPhantom.name() << ": nDet=" << nDet << ", nView=" << nView << ", nSamples=" << nSamples << ", RotAngle=" << dRotAngle << ", Geometry=" << sGeometry.c_str() << "\n";
+ os << "Projections for " << rPhantom.name() << ": nDet=" << nDet << ", nView=" << nView << ", nSamples=" << nSamples << ", RotAngle=" << dRotAngle << ", FocalLengthRatio=" << dFocalLengthRatio << ", FieldOfViewRatio=" << dFieldOfViewRatio << ", Geometry=" << sGeometry.c_str() << "\n";
*theApp->getLog() << os.str().c_str();
}
}
{
int xsize, ysize;
m_canvas->GetClientSize (&xsize, &ysize);
- SGPDriver driver (dc, "", xsize, ysize);
+ SGPDriver driver (dc, xsize, ysize);
SGP sgp (driver);
const Phantom& rPhantom = GetDocument()->getPhantom();
sgp.setColor (C_RED);
- rPhantom.draw (sgp);
+ rPhantom.show (sgp);
}
// ProjectionCanvas
void
ProjectionFileView::OnReconstruct (wxCommandEvent& event)
{
- DialogGetReconstructionParameters dialogReconstruction (m_frame, 256, 256, SignalFilter::FILTER_ABS_BANDLIMIT, 1., SignalFilter::FILTER_METHOD_CONVOLUTION, 3, Backprojector::INTERP_LINEAR, 1, Backprojector::BPROJ_IDIFF3);
+#if HAVE_FFTW
+ DialogGetReconstructionParameters dialogReconstruction (m_frame, 256, 256, SignalFilter::FILTER_ABS_BANDLIMIT, 1., ProcessSignal::FILTER_METHOD_RFFTW, ProcessSignal::FILTER_GENERATION_INVERSE_FOURIER, 1, Backprojector::INTERP_LINEAR, 1, Backprojector::BPROJ_IDIFF3);
+#else
+ DialogGetReconstructionParameters dialogReconstruction (m_frame, 256, 256, SignalFilter::FILTER_ABS_BANDLIMIT, 1., ProcessSignal::FILTER_METHOD_CONVOLUTION, ProcessSignal::FILTER_GENERATION_DIRECT, 1, Backprojector::INTERP_LINEAR, 1, Backprojector::BPROJ_IDIFF3);
+#endif
int retVal = dialogReconstruction.ShowModal();
if (retVal == wxID_OK) {
int xSize = dialogReconstruction.getXSize();
double optFilterParam = dialogReconstruction.getFilterParam();
wxString optFilterMethodName = dialogReconstruction.getFilterMethodName();
int optZeropad = dialogReconstruction.getZeropad();
+ wxString optFilterGenerationName = dialogReconstruction.getFilterGenerationName();
wxString optInterpName = dialogReconstruction.getInterpName();
int optInterpParam = dialogReconstruction.getInterpParam();
wxString optBackprojectName = dialogReconstruction.getBackprojectName();
ImageFile& imageFile = pReconDoc->getImageFile();
const Projections& rProj = GetDocument()->getProjections();
imageFile.setArraySize (xSize, ySize);
- rProj.reconstruct (imageFile, optFilterName.c_str(), optFilterParam, optFilterMethodName.c_str(), optZeropad, optInterpName.c_str(), optInterpParam, optBackprojectName.c_str(), TRACE_NONE);
+ rProj.reconstruct (imageFile, optFilterName.c_str(), optFilterParam, optFilterMethodName.c_str(), optZeropad, optFilterGenerationName.c_str(), optInterpName.c_str(), optInterpParam, optBackprojectName.c_str(), TRACE_NONE);
pReconDoc->Modify(true);
pReconDoc->UpdateAllViews(this);
ostringstream os;
- os << "Reconstruct " << rProj.getFilename() << ": xSize=" << xSize << ", ySize=" << ySize << ", Filter=" << optFilterName.c_str() << ", FilterParam=" << optFilterParam << ", FilterMethod=" << optFilterMethodName.c_str() << ", Zeropad=" << optZeropad << ", Interpolation=" << optInterpName.c_str() << ", InterpolationParam=" << optInterpParam << ", Backprojection=" << optBackprojectName.c_str() << "\n";
+ os << "Reconstruct " << rProj.getFilename() << ": xSize=" << xSize << ", ySize=" << ySize << ", Filter=" << optFilterName.c_str() << ", FilterParam=" << optFilterParam << ", FilterMethod=" << optFilterMethodName.c_str() << ", FilterGeneration=" << optFilterGenerationName.c_str() << ", Zeropad=" << optZeropad << ", Interpolation=" << optInterpName.c_str() << ", InterpolationParam=" << optInterpParam << ", Backprojection=" << optBackprojectName.c_str() << "\n";
*theApp->getLog() << os.str().c_str();
}
}