From e9222e8a8190ca48f30a1359badae06bcb200210 Mon Sep 17 00:00:00 2001 From: "Kevin M. Rosenberg" Date: Mon, 18 Dec 2000 05:40:30 +0000 Subject: [PATCH] r295: *** empty log message *** --- ChangeLog | 12 +- configure.in | 2 +- libctgraphics/ezplot.cpp | 8 +- libctgraphics/sgp.cpp | 19 ++- msvc/ctsim/ctsim.plg | 18 +- src/dlgprojections.cpp | 273 +++++++++++++++--------------- src/dlgreconstruct.cpp | 349 +++++++++++++++++++-------------------- src/dlgreconstruct.h | 6 +- 8 files changed, 338 insertions(+), 349 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0f2442d..0e5355b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,15 +1,17 @@ -2.1.0 - 12/18/00 +2.5.0 - 12/18/00 + First Microsoft Windows GUI version + Modifications for Microsoft Visual C++ compilation. Improved pjinfo to output binary headers and view data, useful when manually compiling phantoms that vary during projection process. Thanks to Ian Kay for idea and code submission. - Modifications for Microsoft Visual C++ compilation. - First Microsoft Windows GUI version Improved sorting to find median in ImageFile::statistics Fixed core-dump bug in Array2dFile::labelsCopy() function (Ian Kay) + Changed reconstruction dialog to fix onto smaller screens + Fixed display of plotting in Projection views + Improved animation displays for Projections and Reconstructions Changed code to explicitly use std:: namespace rather than "namespace using std" statements - Changed reconstruction dialog to fix onto smaller screens - Renamed if2img to ifexport + Renamed if2img to ifexport, if-1 to if1, if-2 to if2 2.0.6 - 12/03/00 Fixed minor compilation problem with procsignal.h diff --git a/configure.in b/configure.in index 95cfd99..403e5ef 100644 --- a/configure.in +++ b/configure.in @@ -4,7 +4,7 @@ dnl Must reset CDPATH so that bash's cd does not print to stdout dnl CDPATH= AC_INIT(src/ctsim.cpp) -AM_INIT_AUTOMAKE(ctsim,2.1.0) +AM_INIT_AUTOMAKE(ctsim,2.5.0) AM_CONFIG_HEADER(config.h) dnl Checks for programs. diff --git a/libctgraphics/ezplot.cpp b/libctgraphics/ezplot.cpp index 14c0a5b..3ea5ce1 100644 --- a/libctgraphics/ezplot.cpp +++ b/libctgraphics/ezplot.cpp @@ -6,7 +6,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: ezplot.cpp,v 1.17 2000/12/16 06:12:47 kevin Exp $ +** $Id: ezplot.cpp,v 1.18 2000/12/18 05:40:30 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 @@ -32,8 +32,6 @@ int snprintf (char *, size_t, const char*, ...); // Defaults static const double TICKRATIO = 0.4; // ratio of minor to major tick lengths static const int MAXNUMFMT = 15; // maximum length of a numeric format -static const double DEF_CHARHEIGHT = (1./43.); //size of characters in NDC -static const double DEF_CHARWIDTH = (1./80.); // size of characters in NDC static const int DEF_CURVE_CLR = C_RED; @@ -149,8 +147,8 @@ EZPlot::EZPlot (SGP& sgp) void EZPlot::initPlotSettings () { - charheight = DEF_CHARHEIGHT; - charwidth = DEF_CHARWIDTH; + charheight = rSGP.getCharHeight(); + charwidth = rSGP.getCharWidth(); c_xlabel = ""; c_ylabel = ""; diff --git a/libctgraphics/sgp.cpp b/libctgraphics/sgp.cpp index f22dd37..14cfd63 100644 --- a/libctgraphics/sgp.cpp +++ b/libctgraphics/sgp.cpp @@ -7,7 +7,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: sgp.cpp,v 1.19 2000/12/18 02:23:43 kevin Exp $ +** $Id: sgp.cpp,v 1.20 2000/12/18 05:40:30 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 @@ -99,12 +99,14 @@ SGP::SGP (const SGPDriver& driver) static const double dScreenDPI = 82; static const double dPointsPerInch = 72.; m_dPointsPerPixel = dPointsPerInch / dScreenDPI; - const int iTestPointSize = 72; + const int iTestPointSize = 12; m_font.SetPointSize (iTestPointSize); m_driver.idWX()->SetFont(m_font); double dTestCharHeight = m_driver.idWX()->GetCharHeight(); m_dPointsPerPixel = iTestPointSize / dTestCharHeight; - m_driver.idWX()->SetBrush (*wxWHITE_BRUSH); +// wxWHITE_BRUSH->SetColour (255, 255, 255); +// wxWHITE_BRUSH->SetStyle (wxSOLID); + m_driver.idWX()->SetBackground (*wxWHITE_BRUSH); } #endif @@ -163,8 +165,13 @@ SGP::eraseWindow () g2_clear (m_driver.idG2()); #endif #if HAVE_WXWINDOWS - if (m_driver.isWX()) - m_driver.idWX()->Clear(); + if (m_driver.isWX()) { + wxBrush brushWhite; + brushWhite.SetColour(255,255,255); + m_driver.idWX()->SetBackground(brushWhite); + m_driver.idWX()->Clear(); + m_driver.idWX()->SetBackground(wxNullBrush); + } #endif } @@ -420,7 +427,7 @@ SGP::moveRel (double x, double y) void SGP::setTextSize (double height) { - height /= (xw_max - xw_min); + height /= (yw_max - yw_min); // convert to NDC #if HAVE_G2_H if (m_driver.isG2()) g2_set_font_size(m_driver.idG2(), (height * m_iPhysicalYSize)); diff --git a/msvc/ctsim/ctsim.plg b/msvc/ctsim/ctsim.plg index 2ab3ea8..cf2bd49 100644 --- a/msvc/ctsim/ctsim.plg +++ b/msvc/ctsim/ctsim.plg @@ -6,13 +6,13 @@ --------------------Configuration: ctsim - Win32 Debug--------------------

Command Lines

-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP219.tmp" with contents +Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP20.tmp" with contents [ /nologo /G6 /MTd /W3 /Gm /GR /GX /ZI /Od /I "\wx2\include" /I "." /I "..\..\include" /I "..\..\getopt" /I "..\..\..\lpng108" /I "..\..\..\zlib" /I "..\..\..\fftw-2.1.3\fftw" /I "..\..\..\fftw-2.1.3\rfftw" /D VERSION=\"2.1.0\" /D "_DEBUG" /D "__WXMSW__" /D "HAVE_SGP" /D VERSION="2.1.0" /D "HAVE_PNG" /D "HAVE_WXWINDOWS" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "HAVE_STRING_H" /D "HAVE_FFTW" /D "HAVE_RFFTW" /D "HAVE_GETOPT_H" /D "MSVC" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /D "STRICT" /FR"Debug/" /Fp"Debug/ctsim.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c -"C:\ctsim-2.0.6\src\dlgprojections.cpp" +"C:\ctsim-2.0.6\src\dlgreconstruct.cpp" ] -Creating command line "cl.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP219.tmp" -Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP21A.tmp" with contents +Creating command line "cl.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP20.tmp" +Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP21.tmp" with contents [ comctl32.lib winmm.lib rpcrt4.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../libctsim/Debug/libctsim.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\..\lpng108\msvc\win32\libpng\lib_dbg\libpng.lib ..\..\..\lpng108\msvc\win32\zlib\lib_dbg\zlib.lib libcmtd.lib ..\..\..\fftw-2.1.3\Win32\FFTW2st\Debug\FFTW2st.lib ..\..\..\fftw-2.1.3\Win32\RFFTW2st\Debug\RFFTW2st.lib ../../../wx2/lib/wxd.lib /nologo /subsystem:windows /incremental:yes /pdb:"Debug/ctsim.pdb" /debug /machine:I386 /nodefaultlib:"libcd.lib" /nodefaultlib:"libcid.lib" /nodefaultlib:"msvcrtd.lib" /out:"Debug/ctsim.exe" /pdbtype:sept /libpath:"..\..\..\lpng108\msvc\win32\libpng\lib" /libpath:"..\..\..\lpng108\msvc\win32\zlib\lib" ".\Debug\ctsim.obj" @@ -27,11 +27,13 @@ comctl32.lib winmm.lib rpcrt4.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib w "\fftw-2.1.3\Win32\RFFTW2st\Debug\RFFTW2st.lib" "\wx2\lib\wxd.lib" ] -Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP21A.tmp" +Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP21.tmp"

Output Window

Compiling... -dlgprojections.cpp -Linking... +dlgreconstruct.cpp +C:\ctsim-2.0.6\src\dlgreconstruct.cpp(147) : error C2039: 'setDC' : is not a member of 'wxDC' + c:\wx2\include\wx\msw\dc.h(74) : see declaration of 'wxDC' +Error executing cl.exe. Creating command line "bscmake.exe /nologo /o"Debug/ctsim.bsc" ".\Debug\ctsim.sbr" ".\Debug\dialogs.sbr" ".\Debug\dlgprojections.sbr" ".\Debug\dlgreconstruct.sbr" ".\Debug\docs.sbr" ".\Debug\views.sbr"" Creating browse info file...

Output Window

@@ -39,7 +41,7 @@ Creating browse info file...

Results

-ctsim.exe - 0 error(s), 0 warning(s) +ctsim.exe - 1 error(s), 0 warning(s) diff --git a/src/dlgprojections.cpp b/src/dlgprojections.cpp index 6ac73fd..cc5b246 100644 --- a/src/dlgprojections.cpp +++ b/src/dlgprojections.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: dlgprojections.cpp,v 1.9 2000/12/18 02:23:43 kevin Exp $ +** $Id: dlgprojections.cpp,v 1.10 2000/12/18 05:40:30 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 @@ -26,27 +26,27 @@ ******************************************************************************/ #ifdef __GNUG__ - #pragma implementation "dlgprojections.h" +#pragma implementation "dlgprojections.h" #endif // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ - #pragma hdrstop +#pragma hdrstop #endif #ifndef WX_PRECOMP - #include "wx/utils.h" - #include "wx/frame.h" - #include "wx/button.h" - #include "wx/stattext.h" - #include "wx/layout.h" - #include "wx/event.h" - #include "wx/intl.h" - #include "wx/settings.h" - #include "wx/dcclient.h" - #include "wx/timer.h" +#include "wx/utils.h" +#include "wx/frame.h" +#include "wx/button.h" +#include "wx/stattext.h" +#include "wx/layout.h" +#include "wx/event.h" +#include "wx/intl.h" +#include "wx/settings.h" +#include "wx/dcclient.h" +#include "wx/timer.h" #endif #include "dlgprojections.h" @@ -57,18 +57,18 @@ static const int LAYOUT_X_MARGIN = 4; static const int LAYOUT_Y_MARGIN = 4; BEGIN_EVENT_TABLE(ProjectionsDialog, wxDialog) - EVT_BUTTON(wxID_CANCEL, ProjectionsDialog::OnCancel) - EVT_BUTTON(ProjectionsDialog::ID_BTN_PAUSE, ProjectionsDialog::OnPause) - EVT_BUTTON(ProjectionsDialog::ID_BTN_STEP, ProjectionsDialog::OnStep) - EVT_CLOSE(ProjectionsDialog::OnClose) - EVT_PAINT(ProjectionsDialog::OnPaint) +EVT_BUTTON(wxID_CANCEL, ProjectionsDialog::OnCancel) +EVT_BUTTON(ProjectionsDialog::ID_BTN_PAUSE, ProjectionsDialog::OnPause) +EVT_BUTTON(ProjectionsDialog::ID_BTN_STEP, ProjectionsDialog::OnStep) +EVT_CLOSE(ProjectionsDialog::OnClose) +EVT_PAINT(ProjectionsDialog::OnPaint) END_EVENT_TABLE() IMPLEMENT_CLASS(ProjectionsDialog, wxDialog) ProjectionsDialog::ProjectionsDialog (Scanner& rScanner, Projections& rProj, const Phantom& rPhantom, const int iTrace, wxWindow *parent) - : wxDialog(parent, -1, "Collect Projections", wxDefaultPosition), m_rScanner(rScanner), m_rProjections(rProj), m_rPhantom(rPhantom), m_pSGPDriver(NULL), m_pSGP(NULL), m_iTrace(iTrace), m_pDC(NULL), m_btnAbort(0), m_btnPause(0), m_btnStep(0) +: wxDialog(parent, -1, "Collect Projections", wxDefaultPosition), m_rScanner(rScanner), m_rProjections(rProj), m_rPhantom(rPhantom), m_pSGPDriver(NULL), m_pSGP(NULL), m_iTrace(iTrace), m_pDC(NULL), m_btnAbort(0), m_btnPause(0), m_btnStep(0) { m_state = Continue; m_iLastView = -1; @@ -80,13 +80,13 @@ ProjectionsDialog::ProjectionsDialog (Scanner& rScanner, Projections& rProj, con wxLayoutConstraints* c = new wxLayoutConstraints; c->right.SameAs(this, wxRight, 2*LAYOUT_X_MARGIN); c->bottom.SameAs(this, wxBottom, 2*LAYOUT_Y_MARGIN); - + wxSize sizeBtn = wxButton::GetDefaultSize(); c->width.Absolute(sizeBtn.x); c->height.Absolute(sizeBtn.y); - + m_btnAbort->SetConstraints(c); - + m_btnPause = new wxButton (this, ID_BTN_PAUSE, wxString("Pause")); wxLayoutConstraints* cPause = new wxLayoutConstraints; cPause->right.SameAs(this, wxRight, 3*LAYOUT_X_MARGIN + sizeBtn.x); @@ -94,7 +94,7 @@ ProjectionsDialog::ProjectionsDialog (Scanner& rScanner, Projections& rProj, con cPause->width.Absolute(sizeBtn.x); cPause->height.Absolute(sizeBtn.y); m_btnPause->SetConstraints(cPause); - + m_btnStep = new wxButton (this, ID_BTN_STEP, wxString("Step")); wxLayoutConstraints* cStep = new wxLayoutConstraints; cStep->right.SameAs(this, wxRight, 5*LAYOUT_X_MARGIN + sizeBtn.x * 2); @@ -102,39 +102,39 @@ ProjectionsDialog::ProjectionsDialog (Scanner& rScanner, Projections& rProj, con cStep->width.Absolute(sizeBtn.x); cStep->height.Absolute(sizeBtn.y); m_btnStep->SetConstraints(cStep); - + SetAutoLayout(TRUE); Layout(); - + wxSize sizeDlg (500,500); if (sizeDlg.x != sizeDlg.y) { - sizeDlg.x = max(sizeDlg.x,sizeDlg.y); - sizeDlg.y = max(sizeDlg.x,sizeDlg.y); + sizeDlg.x = max(sizeDlg.x,sizeDlg.y); + sizeDlg.y = max(sizeDlg.x,sizeDlg.y); } if (m_iTrace >= Trace::TRACE_PLOT) - sizeDlg.x += 250; - + sizeDlg.x += 250; + m_iClientX = sizeDlg.x; m_iClientY = sizeDlg.y; SetClientSize(sizeDlg); - + Centre(wxCENTER_FRAME | wxBOTH); - + if ( m_parentTop ) - m_parentTop->Enable(FALSE); - + m_parentTop->Enable(FALSE); + Show(TRUE); Enable(TRUE); // enable this window - + m_bitmap.Create (m_iClientX, m_iClientY); // save a copy of screen m_pDC = dynamic_cast (new wxClientDC (this)); int x, y; this->GetClientSize(&x, &y); m_pSGPDriver = new SGPDriver (m_pDC, x, y); m_pSGP = new SGP (*m_pSGPDriver); - + wxYield(); // Update the display - + m_pSGPDriver->idWX()->SetFont(*wxSWISS_FONT); #ifdef __WXMAC__ MacUpdateImmediately(); @@ -145,56 +145,55 @@ void ProjectionsDialog::showView (int iViewNumber) { if ( iViewNumber < m_rProjections.nView() ) { - ::wxYield(); // update the display - m_iLastView = iViewNumber; - if (m_iTrace >= Trace::TRACE_PLOT) - m_pSGP->setViewport (0, 0, 0.66, 1); - ::wxYield(); // update the display - // m_pSGP->setTextSize (1/100.); - m_rScanner.collectProjections (m_rProjections, m_rPhantom, iViewNumber, 1, true, m_iTrace, m_pSGP); - ::wxYield(); // update the display - if (m_iTrace >= Trace::TRACE_PLOT) { - const DetectorArray& detArray = m_rProjections.getDetectorArray (iViewNumber); - const DetectorValue* detValues = detArray.detValues(); - double* detPos = new double [detArray.nDet()]; - for (int i = 0; i < detArray.nDet(); i++) - detPos[i] = i; - EZPlot ezplot (*m_pSGP); - ezplot.ezset("xporigin 0.66"); - ezplot.ezset("yporigin 0.10"); - ezplot.ezset("xlength 0.34"); - ezplot.ezset("ylength 0.90"); - ezplot.ezset("grid"); - ezplot.ezset("box"); - ezplot.addCurve (detValues, detPos, detArray.nDet()); - ezplot.plot(); - delete detPos; - } + m_iLastView = iViewNumber; + ::wxYield(); // update the display + m_pSGP->eraseWindow(); + Refresh(); + + if (m_iTrace >= Trace::TRACE_PLOT) + m_pSGP->setViewport (0, 0, 0.66, 1); + ::wxYield(); // update the display + m_rScanner.collectProjections (m_rProjections, m_rPhantom, iViewNumber, 1, true, m_iTrace, m_pSGP); + ::wxYield(); // update the display + if (m_iTrace >= Trace::TRACE_PLOT) { + const DetectorArray& detArray = m_rProjections.getDetectorArray (iViewNumber); + const DetectorValue* detValues = detArray.detValues(); + double* detPos = new double [detArray.nDet()]; + for (int i = 0; i < detArray.nDet(); i++) + detPos[i] = i; + EZPlot ezplot (*m_pSGP); + ezplot.ezset("grid"); + ezplot.ezset("box"); + ezplot.addCurve (detValues, detPos, detArray.nDet()); + m_pSGP->setViewport (0.67, 0.1, 1., 1.); + ezplot.plot(); + delete detPos; + } } } bool ProjectionsDialog::projectView (int iViewNumber) { - if (iViewNumber <= m_iLastView) // already done this view - return true; - - if (iViewNumber < m_rProjections.nView()) { - showView (iViewNumber); - wxYield(); // update the display - if (m_iTrace >= Trace::TRACE_PLOT) { - ::wxUsleep(500); - } - } else { - m_state = Finished; // so that we return TRUE below and - // that [Cancel] handler knew what to do - } + if (iViewNumber <= m_iLastView) // already done this view + return true; + + if (iViewNumber < m_rProjections.nView()) { + showView (iViewNumber); + wxYield(); // update the display + if (m_iTrace >= Trace::TRACE_PLOT) { + ::wxUsleep(500); + } + } else { + m_state = Finished; // so that we return TRUE below and + // that [Cancel] handler knew what to do + } #ifdef __WXMAC__ - MacUpdateImmediately(); + MacUpdateImmediately(); #endif - return m_state != Cancelled; + return m_state != Cancelled; } @@ -202,86 +201,82 @@ ProjectionsDialog::projectView (int iViewNumber) void ProjectionsDialog::OnCancel (wxCommandEvent& event) { - if ( m_state == Finished ) { - // this means that the count down is already finished and we're being - // shown as a modal dialog - so just let the default handler do the job - event.Skip(); - } else { - // request to cancel was received, the next time Update() is called we - // will handle it - m_state = Cancelled; - - // update the button state immediately so that the user knows that the - // request has been noticed - m_btnAbort->Disable(); - } + if ( m_state == Finished ) { + // this means that the count down is already finished and we're being + // shown as a modal dialog - so just let the default handler do the job + event.Skip(); + } else { + // request to cancel was received, the next time Update() is called we + // will handle it + m_state = Cancelled; + + // update the button state immediately so that the user knows that the + // request has been noticed + m_btnAbort->Disable(); + } } void ProjectionsDialog::OnPause (wxCommandEvent& event) { - if ( m_state == Finished ) { - // this means that the count down is already finished and we're being - // shown as a modal dialog - so just let the default handler do the job - event.Skip(); - } else { - if (m_state == Continue) { - m_memoryDC.SelectObject (m_bitmap); // in memoryDC - m_pSGP->setDC (&m_memoryDC); - m_memoryDC.SetFont (*wxSWISS_FONT); - showView (m_iLastView); - m_pSGP->setDC (m_pDC); - m_memoryDC.SelectObject(wxNullBitmap); - m_state = Paused; - m_btnPause->SetLabel (wxString("Resume")); - } else if (m_state == Paused) { - m_state = Continue; - m_btnPause->SetLabel (wxString("Pause")); - } - } + if ( m_state == Finished ) { + // this means that the count down is already finished and we're being + // shown as a modal dialog - so just let the default handler do the job + event.Skip(); + } else if (m_state == Continue) { + m_memoryDC.SelectObject (m_bitmap); // in memoryDC + m_pSGP->setDC (&m_memoryDC); + m_memoryDC.SetFont (*wxSWISS_FONT); + showView (m_iLastView); + m_state = Paused; + m_btnPause->SetLabel (wxString("Resume")); + } else if (m_state == Paused) { + m_pSGP->setDC (m_pDC); + m_memoryDC.SelectObject(wxNullBitmap); + m_state = Continue; + m_btnPause->SetLabel (wxString("Pause")); + } } void ProjectionsDialog::OnStep (wxCommandEvent& event) { - if ( m_state == Finished ) { - // this means that the count down is already finished and we're being - // shown as a modal dialog - so just let the default handler do the job - event.Skip(); - } else { - if (m_state == Continue) { - m_memoryDC.SelectObject (m_bitmap); // in memoryDC - m_pSGP->setDC (&m_memoryDC); - m_memoryDC.SetFont (*wxSWISS_FONT); - m_rScanner.collectProjections (m_rProjections, m_rPhantom, m_iLastView, 1, true, m_iTrace, m_pSGP); - m_pSGP->setDC (m_pDC); - m_memoryDC.SelectObject(wxNullBitmap); - m_state = Paused; - m_btnPause->SetLabel (wxString("Resume")); - } else if (m_state == Paused) { - projectView (m_iLastView + 1); - } - } + if ( m_state == Finished ) { + // this means that the count down is already finished and we're being + // shown as a modal dialog - so just let the default handler do the job + event.Skip(); + } else if (m_state == Continue) { + m_memoryDC.SelectObject (m_bitmap); // in memoryDC + m_pSGP->setDC (&m_memoryDC); + m_memoryDC.SetFont (*wxSWISS_FONT); + m_rScanner.collectProjections (m_rProjections, m_rPhantom, m_iLastView, 1, true, m_iTrace, m_pSGP); + m_state = Paused; + m_btnPause->SetLabel (wxString("Resume")); + } else if (m_state == Paused) { + m_pSGP->setDC (m_pDC); + m_memoryDC.SelectObject(wxNullBitmap); + projectView (m_iLastView + 1); + } } void ProjectionsDialog::OnClose(wxCloseEvent& event) { if ( m_state == Uncancellable ) - event.Veto(TRUE); // can't close this dialog + event.Veto(TRUE); // can't close this dialog else if ( m_state == Finished ) - event.Skip(); // let the default handler close the window as we already terminated + event.Skip(); // let the default handler close the window as we already terminated else - m_state = Cancelled; // next Update() will notice it + m_state = Cancelled; // next Update() will notice it } void ProjectionsDialog::OnPaint (wxPaintEvent& event) { - wxPaintDC paintDC (this); - if (m_state == Paused) { - paintDC.DrawBitmap(m_bitmap, 0, 0, false); - } + wxPaintDC paintDC (this); + if (m_state == Paused) { + paintDC.DrawBitmap(m_bitmap, 0, 0, false); + } } @@ -290,11 +285,11 @@ ProjectionsDialog::OnPaint (wxPaintEvent& event) ProjectionsDialog::~ProjectionsDialog() { - if ( m_parentTop ) - m_parentTop->Enable(TRUE); - - delete m_pSGP; - delete m_pSGPDriver; - delete m_pDC; + if ( m_parentTop ) + m_parentTop->Enable(TRUE); + + delete m_pSGP; + delete m_pSGPDriver; + delete m_pDC; } diff --git a/src/dlgreconstruct.cpp b/src/dlgreconstruct.cpp index 35184eb..640337a 100644 --- a/src/dlgreconstruct.cpp +++ b/src/dlgreconstruct.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: dlgreconstruct.cpp,v 1.9 2000/12/18 02:23:43 kevin Exp $ +** $Id: dlgreconstruct.cpp,v 1.10 2000/12/18 05:40:30 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 @@ -26,27 +26,27 @@ ******************************************************************************/ #ifdef __GNUG__ - #pragma implementation "dlgreconstruct.h" +#pragma implementation "dlgreconstruct.h" #endif // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ - #pragma hdrstop +#pragma hdrstop #endif - #include "wx/utils.h" - #include "wx/frame.h" - #include "wx/button.h" - #include "wx/stattext.h" - #include "wx/layout.h" - #include "wx/event.h" - #include "wx/intl.h" - #include "wx/settings.h" - #include "wx/dcclient.h" - #include "wx/timer.h" - #include "wx/image.h" +#include "wx/utils.h" +#include "wx/frame.h" +#include "wx/button.h" +#include "wx/stattext.h" +#include "wx/layout.h" +#include "wx/event.h" +#include "wx/intl.h" +#include "wx/settings.h" +#include "wx/dcclient.h" +#include "wx/timer.h" +#include "wx/image.h" #include "dlgreconstruct.h" #include @@ -64,18 +64,18 @@ const int ReconstructDialog::MAX_IMAGE_Y = 400; BEGIN_EVENT_TABLE(ReconstructDialog, wxDialog) - EVT_BUTTON(wxID_CANCEL, ReconstructDialog::OnCancel) - EVT_BUTTON(ID_BTN_PAUSE, ReconstructDialog::OnPause) - EVT_BUTTON(ID_BTN_STEP, ReconstructDialog::OnStep) - EVT_CLOSE(ReconstructDialog::OnClose) - EVT_PAINT(ReconstructDialog::OnPaint) +EVT_BUTTON(wxID_CANCEL, ReconstructDialog::OnCancel) +EVT_BUTTON(ID_BTN_PAUSE, ReconstructDialog::OnPause) +EVT_BUTTON(ID_BTN_STEP, ReconstructDialog::OnStep) +EVT_CLOSE(ReconstructDialog::OnClose) +EVT_PAINT(ReconstructDialog::OnPaint) END_EVENT_TABLE() IMPLEMENT_CLASS(ReconstructDialog, wxDialog) ReconstructDialog::ReconstructDialog (Reconstructor& rReconstruct, const Projections& rProj, ImageFile& rIF, const int iTrace, wxWindow *parent) - : wxDialog(parent, -1, "Reconstruction", wxDefaultPosition), m_rReconstructor(rReconstruct), m_rProjections(rProj), m_rImageFile(rIF), m_pSGPDriver(NULL), m_pSGP(NULL), m_iTrace(iTrace), m_pDC(NULL), m_btnAbort(0), m_btnPause(0), m_btnStep(0) +: wxDialog(parent, -1, "Reconstruction", wxDefaultPosition), m_rReconstructor(rReconstruct), m_rProjections(rProj), m_rImageFile(rIF), m_pSGPDriver(NULL), m_pSGP(NULL), m_iTrace(iTrace), m_pDC(NULL), m_btnAbort(0), m_btnPause(0), m_btnStep(0) { m_state = Continue; m_iLastView = -1; @@ -87,13 +87,13 @@ ReconstructDialog::ReconstructDialog (Reconstructor& rReconstruct, const Project wxLayoutConstraints* c = new wxLayoutConstraints; c->right.SameAs(this, wxRight, 2*LAYOUT_X_MARGIN); c->bottom.SameAs(this, wxBottom, 2*LAYOUT_Y_MARGIN); - + wxSize sizeBtn = wxButton::GetDefaultSize(); c->width.Absolute(sizeBtn.x); c->height.Absolute(sizeBtn.y); - + m_btnAbort->SetConstraints(c); - + m_btnPause = new wxButton (this, ID_BTN_PAUSE, wxString("Pause")); wxLayoutConstraints* cPause = new wxLayoutConstraints; cPause->right.SameAs(this, wxRight, 3*LAYOUT_X_MARGIN + sizeBtn.x); @@ -101,7 +101,7 @@ ReconstructDialog::ReconstructDialog (Reconstructor& rReconstruct, const Project cPause->width.Absolute(sizeBtn.x); cPause->height.Absolute(sizeBtn.y); m_btnPause->SetConstraints(cPause); - + m_btnStep = new wxButton (this, ID_BTN_STEP, wxString("Step")); wxLayoutConstraints* cStep = new wxLayoutConstraints; cStep->right.SameAs(this, wxRight, 5*LAYOUT_X_MARGIN + sizeBtn.x * 2); @@ -109,50 +109,45 @@ ReconstructDialog::ReconstructDialog (Reconstructor& rReconstruct, const Project cStep->width.Absolute(sizeBtn.x); cStep->height.Absolute(sizeBtn.y); m_btnStep->SetConstraints(cStep); - + SetAutoLayout(TRUE); Layout(); - + m_nxGraph = 500; m_nyGraph = 500; wxSize sizeDlg (m_nxGraph, m_nyGraph); m_nxImage = m_rImageFile.nx(); if (m_nxImage > MAX_IMAGE_X) - m_nxImage = MAX_IMAGE_X; + m_nxImage = MAX_IMAGE_X; m_nyImage = m_rImageFile.ny(); if (m_nyImage > MAX_IMAGE_Y) - m_nyImage = MAX_IMAGE_Y; - + m_nyImage = MAX_IMAGE_Y; + sizeDlg.x += m_nxImage; sizeDlg.y = max (sizeDlg.y, m_nyImage); - + m_iClientX = sizeDlg.x; m_iClientY = sizeDlg.y; SetClientSize (sizeDlg); - + Centre(wxCENTER_FRAME | wxBOTH); - + if ( m_parentTop ) - m_parentTop->Enable(FALSE); - + m_parentTop->Enable(FALSE); + Show(TRUE); Enable(TRUE); // enable this window - + m_bitmap.Create (m_iClientX, m_iClientY); // save a copy of screen + m_pDC = dynamic_cast (new wxClientDC (this)); int x, y; this->GetClientSize(&x, &y); -#if OLD - m_pDC = new wxMemoryDC; - m_pDC->SelectObject (m_bitmap); // in memoryDC - m_pSGPDriver = new SGPDriver (dynamic_cast(m_pDC), x, y); -#else - m_pDC = dynamic_cast (new wxClientDC (this)); m_pSGPDriver = new SGPDriver (m_pDC, x, y); -#endif m_pSGP = new SGP (*m_pSGPDriver); - + m_pSGP->getDriver().idWX()->setDC (&m_pDC); + wxYield(); // Update the display - + m_pSGPDriver->idWX()->SetFont(*wxSWISS_FONT); #ifdef __WXMAC__ MacUpdateImmediately(); @@ -161,85 +156,86 @@ ReconstructDialog::ReconstructDialog (Reconstructor& rReconstruct, const Project void ReconstructDialog::showView (int iViewNumber, bool bBackprojectView) -{ - if ( iViewNumber < m_rProjections.nView() ) { - m_iLastView = iViewNumber; - m_pSGP->eraseWindow(); - - char szProgress [256]; - snprintf (szProgress, sizeof(szProgress), "Reconstructing View %d (%.1f%%)", iViewNumber, 100 * iViewNumber / static_cast(m_rProjections.nView())); - m_pSGP->setViewport (0, 0, 1, 1); - m_pSGP->setWindow (0, 0, 1, 1); - m_pSGP->setTextColor (C_LTRED, -1); - double dCharHeight = m_pSGP->getCharHeight(); - m_pSGP->setTextSize (dCharHeight * 2); - m_pSGP->moveAbs(0., m_pSGP->getCharHeight()); - m_pSGP->drawText (szProgress); - m_pSGP->setTextSize (dCharHeight); - - m_pSGP->setViewport (0.0, 0.1, 0.66, 1.); - m_rReconstructor.reconstructView (iViewNumber, 1, m_pSGP, bBackprojectView); - - ImageFileArrayConst v = m_rImageFile.getArray(); - int xBase = m_nxGraph; - int yBase = 0; - if (m_nyGraph > m_nyImage) - yBase = (m_nyGraph - m_nyImage) / 2; - double minValue = v[0][0]; - double maxValue = v[0][0]; - for (int ix = 0; ix < m_nxImage; ix++) { - for (int iy = 0; iy < m_nyImage; iy++) { - double dPixel = v[ix][iy]; - if (dPixel < minValue) - minValue = dPixel; - else if (dPixel > maxValue) - maxValue = dPixel; - } - } - unsigned char* imageData = new unsigned char [m_nxImage * m_nyImage * 3]; - double dScale = 255 / (maxValue - minValue); - for (int ix2 = 0; ix2 < m_nxImage; ix2++) { - for (int iy = 0; iy < m_nyImage; iy++) { - double dPixel = v[ix2][iy]; - dPixel = (dPixel - minValue) * dScale; - int intensity = nearest(dPixel); - intensity = clamp (intensity, 0, 255); - int baseAddr = ((m_nyImage - 1 - iy) * m_nxImage + ix2) * 3; - imageData[baseAddr] = imageData[baseAddr+1] = imageData[baseAddr+2] = intensity; +{ + // m_pSGP->setTextSize(0.01); + if ( iViewNumber < m_rProjections.nView() ) { + m_iLastView = iViewNumber; + ::wxYield(); // update the display + m_pSGP->eraseWindow(); + Refresh(); + + char szProgress [256]; + snprintf (szProgress, sizeof(szProgress), "Reconstructing View %d (%.1f%%)", iViewNumber, 100 * iViewNumber / static_cast(m_rProjections.nView())); + m_pSGP->setViewport (0, 0, 1, 1); + m_pSGP->setWindow (0, 0, 1, 1); + m_pSGP->setTextColor (C_LTRED, -1); + double dCharHeight = m_pSGP->getCharHeight(); + m_pSGP->setTextSize (dCharHeight * 2); + m_pSGP->moveAbs(0., m_pSGP->getCharHeight()); + m_pSGP->drawText (szProgress); + m_pSGP->setTextSize (dCharHeight); + + m_pSGP->setViewport (0.0, 0.1, 0.66, 1.); + m_rReconstructor.reconstructView (iViewNumber, 1, m_pSGP, bBackprojectView); + + ImageFileArrayConst v = m_rImageFile.getArray(); + int xBase = m_nxGraph; + int yBase = 0; + if (m_nyGraph > m_nyImage) + yBase = (m_nyGraph - m_nyImage) / 2; + double minValue = v[0][0]; + double maxValue = v[0][0]; + for (int ix = 0; ix < m_nxImage; ix++) { + for (int iy = 0; iy < m_nyImage; iy++) { + double dPixel = v[ix][iy]; + if (dPixel < minValue) + minValue = dPixel; + else if (dPixel > maxValue) + maxValue = dPixel; + } + } + unsigned char* imageData = new unsigned char [m_nxImage * m_nyImage * 3]; + double dScale = 255 / (maxValue - minValue); + for (int ix2 = 0; ix2 < m_nxImage; ix2++) { + for (int iy = 0; iy < m_nyImage; iy++) { + double dPixel = v[ix2][iy]; + dPixel = (dPixel - minValue) * dScale; + int intensity = nearest(dPixel); + intensity = clamp (intensity, 0, 255); + int baseAddr = ((m_nyImage - 1 - iy) * m_nxImage + ix2) * 3; + imageData[baseAddr] = imageData[baseAddr+1] = imageData[baseAddr+2] = intensity; + } + } + wxImage image (m_nxImage, m_nyImage, imageData, true); + wxBitmap bitmap = image.ConvertToBitmap(); + m_pSGP->getDriver().idWX()->DrawBitmap(bitmap, xBase, yBase, false); + delete imageData; } - } - wxImage image (m_nxImage, m_nyImage, imageData, true); - wxBitmap bitmap = image.ConvertToBitmap(); - m_pSGP->getDriver().idWX()->DrawBitmap(bitmap, xBase, yBase, false); - delete imageData; - - Refresh(); - } } bool ReconstructDialog::reconstructView (int iViewNumber) { - if (iViewNumber <= m_iLastView) // have already done this view - return true; - - if (iViewNumber < m_rProjections.nView()) { - ::wxYield(); // update the display - showView (iViewNumber, true); - ::wxYield(); // update the display - if (m_iTrace >= Trace::TRACE_PLOT) { - ::wxUsleep(250); - } - } else { - m_state = Finished; // so that we return TRUE below and - } // that [Cancel] handler knew what to do - + if (iViewNumber <= m_iLastView) // have already done this view + return true; + + if (iViewNumber < m_rProjections.nView()) { + ::wxYield(); // update the display + showView (iViewNumber, true); + ::wxYield(); // update the display + if (m_iTrace >= Trace::TRACE_PLOT) { + ::wxUsleep(250); + } + } else { + m_state = Finished; // so that we return TRUE below and + } // that [Cancel] handler knew what to do + #ifdef __WXMAC__ - MacUpdateImmediately(); + MacUpdateImmediately(); #endif - - ::wxYield(); // update the display - return m_state != Cancelled; + + ::wxYield(); // update the display + return m_state != Cancelled; } @@ -247,88 +243,81 @@ ReconstructDialog::reconstructView (int iViewNumber) void ReconstructDialog::OnCancel (wxCommandEvent& event) { - if ( m_state == Finished ) { - // this means that the count down is already finished and we're being - // shown as a modal dialog - so just let the default handler do the job - event.Skip(); - } else { - // request to cancel was received, the next time Update() is called we - // will handle it - m_state = Cancelled; - - // update the button state immediately so that the user knows that the - // request has been noticed - m_btnAbort->Disable(); - } + if ( m_state == Finished ) { + // this means that the count down is already finished and we're being + // shown as a modal dialog - so just let the default handler do the job + event.Skip(); + } else { + // request to cancel was received, the next time Update() is called we + // will handle it + m_state = Cancelled; + + // update the button state immediately so that the user knows that the + // request has been noticed + m_btnAbort->Disable(); + } } void ReconstructDialog::OnPause (wxCommandEvent& event) { - if ( m_state == Finished ) { - // this means that the count down is already finished and we're being - // shown as a modal dialog - so just let the default handler do the job - event.Skip(); - } else { - if (m_state == Continue) { -#ifndef OLD - m_memoryDC.SelectObject (m_bitmap); // in memoryDC - m_pSGP->setDC (&m_memoryDC); - m_memoryDC.SetFont (*wxSWISS_FONT); - showView (m_iLastView, false); - m_pSGP->setDC (m_pDC); - m_memoryDC.SelectObject(wxNullBitmap); -#endif - m_state = Paused; - m_btnPause->SetLabel (wxString("Resume")); - } else if (m_state == Paused) { - m_state = Continue; - m_btnPause->SetLabel (wxString("Pause")); - } - } + if ( m_state == Finished ) { + // this means that the count down is already finished and we're being + // shown as a modal dialog - so just let the default handler do the job + event.Skip(); + } else if (m_state == Continue) { +// m_memoryDC.SelectObject (m_bitmap); // in memoryDC +// m_pSGP->setDC (&m_memoryDC); +// m_memoryDC.SetFont (*wxSWISS_FONT); + showView (m_iLastView, false); + m_state = Paused; + m_btnPause->SetLabel (wxString("Resume")); + } else if (m_state == Paused) { +// m_pSGP->setDC (m_pDC); +// m_memoryDC.SelectObject(wxNullBitmap); + m_state = Continue; + m_btnPause->SetLabel (wxString("Pause")); + } } + void ReconstructDialog::OnStep (wxCommandEvent& event) { - if ( m_state == Finished ) { - event.Skip(); - } else { - if (m_state == Continue) { -#ifndef OLD - m_memoryDC.SelectObject (m_bitmap); // in memoryDC - m_pSGP->setDC (&m_memoryDC); - m_memoryDC.SetFont (*wxSWISS_FONT); - m_rReconstructor.reconstructView (m_iLastView, 1, m_pSGP, false); - m_pSGP->setDC (m_pDC); - m_memoryDC.SelectObject(wxNullBitmap); -#endif - m_state = Paused; - m_btnPause->SetLabel (wxString("Resume")); - } else if (m_state == Paused) { - reconstructView (m_iLastView + 1); - } - } + if ( m_state == Finished ) { + event.Skip(); + } else if (m_state == Continue) { +// m_memoryDC.SelectObject (m_bitmap); // in memoryDC +// m_pSGP->setDC (&m_memoryDC); +// m_memoryDC.SetFont (*wxSWISS_FONT); + showView (m_iLastView, false); + m_state = Paused; + m_btnPause->SetLabel (wxString("Resume")); + } else if (m_state == Paused) { +// m_pSGP->setDC (m_pDC); +// m_memoryDC.SelectObject(wxNullBitmap); + reconstructView (m_iLastView + 1); + } } void ReconstructDialog::OnClose(wxCloseEvent& event) { if ( m_state == Uncancellable ) - event.Veto(TRUE); // can't close this dialog + event.Veto(TRUE); // can't close this dialog else if ( m_state == Finished ) - event.Skip(); // let the default handler close the window as we already terminated + event.Skip(); // let the default handler close the window as we already terminated else - m_state = Cancelled; // next Update() will notice it + m_state = Cancelled; // next Update() will notice it } void ReconstructDialog::OnPaint (wxPaintEvent& event) { - wxPaintDC paintDC (this); - if (m_state == Paused) { - paintDC.DrawBitmap(m_bitmap, 0, 0, false); - } + wxPaintDC paintDC (this); + if (m_state == Paused) { + paintDC.DrawBitmap(m_bitmap, 0, 0, false); + } } @@ -337,11 +326,11 @@ ReconstructDialog::OnPaint (wxPaintEvent& event) ReconstructDialog::~ReconstructDialog() { - if ( m_parentTop ) - m_parentTop->Enable(TRUE); - - delete m_pSGP; - delete m_pSGPDriver; - delete m_pDC; + if ( m_parentTop ) + m_parentTop->Enable(TRUE); + + delete m_pSGP; + delete m_pSGPDriver; + delete m_pDC; } diff --git a/src/dlgreconstruct.h b/src/dlgreconstruct.h index 9e08e4a..a7abe8c 100644 --- a/src/dlgreconstruct.h +++ b/src/dlgreconstruct.h @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: dlgreconstruct.h,v 1.4 2000/12/17 22:30:34 kevin Exp $ +** $Id: dlgreconstruct.h,v 1.5 2000/12/18 05:40:30 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 @@ -91,11 +91,7 @@ private: SGPDriver* m_pSGPDriver; SGP* m_pSGP; const int m_iTrace; -#if OLD - wxMemoryDC* m_pDC; -#else wxDC* m_pDC; -#endif wxButton *m_btnAbort; // the abort button (or NULL if none) wxButton *m_btnPause; -- 2.34.1