X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=src%2Fviews.cpp;h=87e9e932135af1083e1f0cd4792ea9d63caf1011;hp=9939b1f07873030923f0441fee3709d590d09190;hb=08a5cd04c3994d5ea24713b9b000791bd2e406fe;hpb=861c2186ce387ce809882315a8f26d640f1844fc diff --git a/src/views.cpp b/src/views.cpp index 9939b1f..87e9e93 100644 --- a/src/views.cpp +++ b/src/views.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: views.cpp,v 1.5 2000/07/18 16:20:53 kevin Exp $ +** $Id: views.cpp,v 1.10 2000/07/29 19:50:08 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 @@ -52,6 +52,7 @@ #include "views.h" #include "dialogs.h" #include +#include "backprojectors.h" // ImageFileCanvas @@ -92,7 +93,7 @@ ImageFileCanvas::OnMouseEvent(wxMouseEvent& event) if (pt.x >= 0 && pt.x < nx && pt.y >= 0 & pt.y < ny) { ostringstream os; - os << "Image value (" << pt.x << "," << pt.y << ") = " << v[pt.x][pt.y] << "\n"; + os << "Image value (" << pt.x << "," << pt.y << ") = " << v[pt.x][ny - 1 - pt.y] << "\n"; *theApp->getLog() << os.str().c_str(); } else *theApp->getLog() << "Mouse out of image range (" << pt.x << "," << pt.y << ")\n"; @@ -200,7 +201,7 @@ ImageFileView::CreateChildFrame(wxDocument *doc, wxView *view) wxMenu *file_menu = new wxMenu; - file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "&Create Phantom..."); + file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "Cr&eate Phantom..."); file_menu->Append(wxID_OPEN, "&Open..."); file_menu->Append(wxID_CLOSE, "&Close"); file_menu->Append(wxID_SAVE, "&Save"); @@ -296,7 +297,7 @@ ImageFileView::OnUpdate(wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint) ) imageData[baseAddr] = imageData[baseAddr+1] = imageData[baseAddr+2] = intensity; } } - wxImage image (ny, nx, imageData, true); + wxImage image (nx, ny, imageData, true); m_bitmap = image.ConvertToBitmap(); delete imageData; int xSize = nx; @@ -340,7 +341,7 @@ ImageFileView::OnClose (bool deleteWindow) // PhantomCanvas PhantomCanvas::PhantomCanvas (PhantomView* v, wxFrame *frame, const wxPoint& pos, const wxSize& size, const long style) - : wxPanel(frame, -1, pos, size, style) + : wxScrolledWindow(frame, -1, pos, size, style) { m_pView = v; } @@ -352,6 +353,7 @@ PhantomCanvas::OnDraw(wxDC& dc) m_pView->OnDraw(& dc); } + // PhantomView IMPLEMENT_DYNAMIC_CLASS(PhantomView, wxView) @@ -374,10 +376,10 @@ PhantomView::~PhantomView(void) void PhantomView::OnProperties (wxCommandEvent& event) { - const Phantom::PhantomID idPhantom = GetDocument()->getPhantomID(); + const int idPhantom = GetDocument()->getPhantomID(); const string& namePhantom = GetDocument()->getPhantomName(); ostringstream os; - os << "Phantom " << namePhantom << " (" << static_cast(idPhantom) << ")\n"; + os << "Phantom " << namePhantom << " (" << idPhantom << ")\n"; *theApp->getLog() << os.str().c_str(); #if DEBUG const Phantom& rPhantom = GetDocument()->getPhantom(); @@ -389,14 +391,14 @@ PhantomView::OnProperties (wxCommandEvent& event) void PhantomView::OnProjections (wxCommandEvent& event) { - DialogGetProjectionParameters dialogProjection (m_frame, 367, 320, 1, 1., Scanner::GEOMETRY_PARALLEL_STR); + DialogGetProjectionParameters dialogProjection (m_frame, 367, 320, 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(); - string sGeometry = dialogProjection.getGeometry(); + wxString sGeometry = dialogProjection.getGeometry(); if (nDet > 0 && nView > 0 && sGeometry != "") { const Phantom& rPhantom = GetDocument()->getPhantom(); ProjectionFileDocument* pProjectionDoc = dynamic_cast(theApp->getDocManager()->CreateDocument("untitled.pj", wxDOC_SILENT)); @@ -407,7 +409,7 @@ PhantomView::OnProjections (wxCommandEvent& event) pProjectionDoc->Modify(true); pProjectionDoc->UpdateAllViews(this); ostringstream os; - os << "Projections for " << rPhantom.name() << ": nDet=" << nDet << ", nView=" << nView << ", nSamples=" << nSamples << ", RotAngle=" << dRotAngle << ", Geometry=" << sGeometry << "\n"; + os << "Projections for " << rPhantom.name() << ": nDet=" << nDet << ", nView=" << nView << ", nSamples=" << nSamples << ", RotAngle=" << dRotAngle << ", Geometry=" << sGeometry.c_str() << "\n"; *theApp->getLog() << os.str().c_str(); } } @@ -465,7 +467,7 @@ PhantomView::CreateChildFrame(wxDocument *doc, wxView *view) wxMenu *file_menu = new wxMenu; - file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "&Create Phantom..."); + file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "Cr&eate Phantom..."); file_menu->Append(wxID_OPEN, "&Open..."); file_menu->Append(wxID_CLOSE, "&Close"); @@ -517,15 +519,8 @@ PhantomView::OnCreate(wxDocument *doc, long WXUNUSED(flags) ) m_frame->Show(true); Activate(true); - - return true; -} -void -PhantomView::OnDraw (wxDC* dc) -{ - // if (m_bitmap.Ok()) - // dc->DrawBitmap (m_bitmap, 0, 0, false); + return true; } @@ -559,6 +554,17 @@ PhantomView::OnClose (bool deleteWindow) return true; } +void +PhantomView::OnDraw (wxDC* dc) +{ + int xsize, ysize; + m_canvas->GetClientSize (&xsize, &ysize); + SGPDriver driver (dc, "", xsize, ysize); + SGP sgp (driver); + const Phantom& rPhantom = GetDocument()->getPhantom(); + sgp.setColor (C_RED); + rPhantom.draw (sgp); +} // ProjectionCanvas @@ -606,27 +612,30 @@ ProjectionFileView::OnProperties (wxCommandEvent& event) void ProjectionFileView::OnReconstruct (wxCommandEvent& event) { - int xSize, ySize; - xSize = 256; - ySize = 256; - const char* optFilterName = "abs_bandlimit"; - double optFilterParam = 1.; - const char*optFilterMethodName = "convolution"; - int optZeropad = 3; - const char* optInterpName = "linear"; - int optInterpParam = 1; - const char* optBackprojectName = "idiff3"; - if (xSize > 0 && ySize > 0) { - ImageFileDocument* pReconDoc = dynamic_cast(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT)); - ImageFile& imageFile = pReconDoc->getImageFile(); - const Projections& rProj = GetDocument()->getProjections(); - imageFile.setArraySize (xSize, ySize); - rProj.reconstruct (imageFile, optFilterName, optFilterParam, optFilterMethodName, optZeropad, optInterpName, optInterpParam, optBackprojectName, TRACE_NONE); - pReconDoc->Modify(true); - pReconDoc->UpdateAllViews(this); - ostringstream os; - os << "Reconstruct " << rProj.getFilename() << ": xSize=" << xSize << ", ySize=" << ySize << ", Filter=" << optFilterName << ", FilterParam=" << optFilterParam << ", FilterMethod=" << optFilterMethodName << ", Zeropad=" << optZeropad << ", Interpolation=" << optInterpName << ", InterpolationParam=" << optInterpParam << ", Backprojection=" << optBackprojectName << "\n"; - *theApp->getLog() << os.str().c_str(); + DialogGetReconstructionParameters dialogReconstruction (m_frame, 256, 256, SignalFilter::FILTER_ABS_BANDLIMIT, 1., SignalFilter::FILTER_METHOD_CONVOLUTION, 3, Backprojector::INTERP_LINEAR, 1, Backprojector::BPROJ_IDIFF3); + int retVal = dialogReconstruction.ShowModal(); + if (retVal == wxID_OK) { + int xSize = dialogReconstruction.getXSize(); + int ySize = dialogReconstruction.getYSize(); + wxString optFilterName = dialogReconstruction.getFilterName(); + double optFilterParam = dialogReconstruction.getFilterParam(); + wxString optFilterMethodName = dialogReconstruction.getFilterMethodName(); + int optZeropad = dialogReconstruction.getZeropad(); + wxString optInterpName = dialogReconstruction.getInterpName(); + int optInterpParam = dialogReconstruction.getInterpParam(); + wxString optBackprojectName = dialogReconstruction.getBackprojectName(); + if (xSize > 0 && ySize > 0) { + ImageFileDocument* pReconDoc = dynamic_cast(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT)); + 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); + 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"; + *theApp->getLog() << os.str().c_str(); + } } } @@ -654,7 +663,7 @@ ProjectionFileView::CreateChildFrame(wxDocument *doc, wxView *view) wxMenu *file_menu = new wxMenu; - file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "&Create Phantom..."); + file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "Cr&eate Phantom..."); file_menu->Append(wxID_OPEN, "&Open..."); file_menu->Append(wxID_CLOSE, "&Close");