From ebb615bb35cf344a765aa65414982904e59f961b Mon Sep 17 00:00:00 2001 From: "Kevin M. Rosenberg" Date: Mon, 18 Dec 2000 09:31:26 +0000 Subject: [PATCH] r301: *** empty log message *** --- ChangeLog | 1 + libctsim/backprojectors.cpp | 10 +- msvc/ctsim/ctsim.dsp | 5 +- msvc/ctsim/ctsim.plg | 159 ++++---- src/views.cpp | 771 ++++++++++++++++++------------------ src/views.h | 8 +- 6 files changed, 489 insertions(+), 465 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0e5355b..c8c93f1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -11,6 +11,7 @@ Improved animation displays for Projections and Reconstructions Changed code to explicitly use std:: namespace rather than "namespace using std" statements + Fixed reconstruction scaling bug introduced in 2.0.6 Renamed if2img to ifexport, if-1 to if1, if-2 to if2 2.0.6 - 12/03/00 diff --git a/libctsim/backprojectors.cpp b/libctsim/backprojectors.cpp index 4e82edd..7926b0d 100644 --- a/libctsim/backprojectors.cpp +++ b/libctsim/backprojectors.cpp @@ -8,7 +8,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: backprojectors.cpp,v 1.19 2000/12/16 06:12:47 kevin Exp $ +** $Id: backprojectors.cpp,v 1.20 2000/12/18 09:31:26 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 @@ -263,7 +263,13 @@ Backproject::Backproject (const Projections& proj, ImageFile& im, int interpType nDet = proj.nDet(); iDetCenter = (nDet - 1) / 2; // index refering to L=0 projection rotScale = proj.rotInc(); - rotScale /= (proj.nView() * proj.rotInc() / PI); // scale by number of PI rotations + + if (proj.geometry() == Scanner::GEOMETRY_PARALLEL) + rotScale /= (proj.nView() * proj.rotInc() / PI); // scale by number of PI rotations + else if (proj.geometry() == Scanner::GEOMETRY_EQUIANGULAR || proj.geometry() == Scanner::GEOMETRY_EQUILINEAR) + rotScale /= (proj.nView() * proj.rotInc() / (2 * PI)); // scale by number of 2PI rotations + else + sys_error (ERR_SEVERE, "Invalid geometry type %d [Backproject::Backproject]", proj.geometry()); v = im.getArray(); nx = im.nx(); diff --git a/msvc/ctsim/ctsim.dsp b/msvc/ctsim/ctsim.dsp index db78b9a..d393449 100644 --- a/msvc/ctsim/ctsim.dsp +++ b/msvc/ctsim/ctsim.dsp @@ -43,7 +43,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /G6 /MT /W3 /GR /GX /O2 /I "." /I "..\..\include" /I "..\..\getopt" /I "..\..\..\lpng108" /I "..\..\..\zlib" /I "..\..\..\fftw-2.1.3\fftw" /I "..\..\..\fftw-2.1.3\rfftw" /I "..\..\..\wx2\include" /D CTSIMVERSION=\"2.1.0\" /D "NDEBUG" /D "__WXWIN__" /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" /D "__WXMSW__" /D "HAVE_SGP" /FR /YX /FD /c +# ADD CPP /nologo /G6 /MT /W3 /GR /GX /O2 /I "." /I "..\..\include" /I "..\..\getopt" /I "..\..\..\lpng108" /I "..\..\..\zlib" /I "..\..\..\fftw-2.1.3\fftw" /I "..\..\..\fftw-2.1.3\rfftw" /I "..\..\..\wx2\include" /D CTSIMVERSION=\"2.5.0\" /D "NDEBUG" /D "__WXWIN__" /D "__WXMSW__" /D "HAVE_SGP" /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 /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" @@ -69,7 +69,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /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 /YX /FD /GZ /c +# ADD CPP /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.5.0\" /D "_DEBUG" /D "__WXMSW__" /D "HAVE_SGP" /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" /D CTSIMVERSION=\"2.5.0\" /FR /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" @@ -158,6 +158,7 @@ SOURCE=..\..\..\wx2\include\wx\msw\wx.rc # ADD BASE RSC /l 0x409 /i "\wx2\include\wx\msw" # SUBTRACT BASE RSC /i "\wx2\include\wx\msw" /i "\wx2\include" # ADD RSC /l 0x409 /i "\wx2\include\wx\msw" +# SUBTRACT RSC /i "\wx2\include\wx\msw" /i "\wx2\include" !ENDIF diff --git a/msvc/ctsim/ctsim.plg b/msvc/ctsim/ctsim.plg index 4e02fe2..b60a0d0 100644 --- a/msvc/ctsim/ctsim.plg +++ b/msvc/ctsim/ctsim.plg @@ -42,57 +42,60 @@ RFFTW2st.lib - 0 error(s), 0 warning(s) --------------------Configuration: ctsim - Win32 Release--------------------

Command Lines

-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPB6.tmp" with contents + + + +

Results

+ctsim.exe - 0 error(s), 0 warning(s) +

+--------------------Configuration: libctsim - Win32 Debug-------------------- +

+

Command Lines

+Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPF2.tmp" with contents [ -/nologo /G6 /MT /W3 /GR /GX /O2 /I "." /I "..\..\include" /I "..\..\getopt" /I "..\..\..\lpng108" /I "..\..\..\zlib" /I "..\..\..\fftw-2.1.3\fftw" /I "..\..\..\fftw-2.1.3\rfftw" /I "..\..\..\wx2\include" /D CTSIMVERSION=\"2.1.0\" /D "NDEBUG" /D "__WXWIN__" /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" /D "__WXMSW__" /D "HAVE_SGP" /FR"Release/" /Fp"Release/ctsim.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c -"C:\ctsim-2.0.6\src\ctsim.cpp" -"C:\ctsim-2.0.6\src\docs.cpp" -"C:\ctsim-2.0.6\src\views.cpp" +/nologo /G6 /MTd /W3 /Gm /GR- /GX /ZI /Od /I "..\..\..\zlib" /I "..\..\INCLUDE" /I "..\..\getopt" /I "..\..\..\lpng108" /I "..\..\..\fftw-2.1.3\fftw" /I "..\..\..\fftw-2.1.3\rfftw" /I "..\..\..\wx2\include" /D "_DEBUG" /D "HAVE_WXWIN" /D "HAVE_STRING_H" /D "HAVE_GETOPT_H" /D "WIN32" /D "_MBCS" /D "_LIB" /D "MSVC" /D "HAVE_FFTW" /D "HAVE_PNG" /D "HAVE_SGP" /D "HAVE_WXWINDOWS" /D "__WXMSW__" /FR"Debug/" /Fp"Debug/libctsim.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c +"C:\ctsim-2.0.6\libctsim\backprojectors.cpp" ] -Creating command line "cl.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPB6.tmp" -Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPB7.tmp" with contents +Creating command line "cl.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPF2.tmp" +Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPF3.tmp" with contents [ -kernel32.lib user32.lib wsock32.lib comctl32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libpng.lib zlib.lib /nologo /subsystem:windows /incremental:no /pdb:"Release/ctsim.pdb" /machine:I386 /out:"Release/ctsim.exe" /libpath:"..\..\..\lpng108\msvc\win32\libpng\lib" /libpath:"..\..\..\lpng108\msvc\win32\zlib\lib" -".\Release\ctsim.obj" -".\Release\dialogs.obj" -".\Release\dlgprojections.obj" -".\Release\dlgreconstruct.obj" -".\Release\docs.obj" -".\Release\views.obj" -".\Release\wx.res" -"\ctsim-2.0.6\msvc\libctsim\Release\libctsim.lib" -"\fftw-2.1.3\Win32\FFTW2st\Release\FFTW2st.lib" -"\fftw-2.1.3\Win32\RFFTW2st\Release\RFFTW2st.lib" -"\wx2\lib\wx.lib" +/nologo /out:"Debug\libctsim.lib" +".\Debug\array2dfile.obj" +".\Debug\backprojectors.obj" +".\Debug\clip.obj" +".\Debug\consoleio.obj" +".\Debug\ezplot.obj" +".\Debug\ezset.obj" +".\Debug\ezsupport.obj" +".\Debug\filter.obj" +".\Debug\fnetorderstream.obj" +".\Debug\getopt.obj" +".\Debug\getopt1.obj" +".\Debug\imagefile.obj" +".\Debug\mathfuncs.obj" +".\Debug\phantom.obj" +".\Debug\pol.obj" +".\Debug\procsignal.obj" +".\Debug\projections.obj" +".\Debug\reconstruct.obj" +".\Debug\scanner.obj" +".\Debug\sgp.obj" +".\Debug\strfuncs.obj" +".\Debug\syserror.obj" +".\Debug\trace.obj" +".\Debug\transformmatrix.obj" +".\Debug\xform.obj" ] -Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPB7.tmp" +Creating command line "link.exe -lib @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPF3.tmp"

Output Window

Compiling... -ctsim.cpp -docs.cpp -views.cpp -Linking... -LINK : warning LNK4089: all references to "ADVAPI32.dll" discarded by /OPT:REF -LINK : warning LNK4089: all references to "WSOCK32.dll" discarded by /OPT:REF -Creating command line "bscmake.exe /nologo /o"Release/ctsim.bsc" ".\Release\ctsim.sbr" ".\Release\dialogs.sbr" ".\Release\dlgprojections.sbr" ".\Release\dlgreconstruct.sbr" ".\Release\docs.sbr" ".\Release\views.sbr"" -Creating browse info file... -

Output Window

- - - -

Results

-ctsim.exe - 0 error(s), 2 warning(s) +backprojectors.cpp +Creating library...

--------------------Configuration: ctsim - Win32 Debug--------------------

Command Lines

-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPB9.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\views.cpp" -] -Creating command line "cl.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPB9.tmp" -Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPBA.tmp" with contents +Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPF4.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" @@ -107,31 +110,25 @@ 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\RSPBA.tmp" +Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPF4.tmp"

Output Window

-Compiling... -views.cpp Linking... -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... -BSCMAKE: warning BK4503 : minor error in .SBR file '.\Debug\views.sbr' ignored -

Output Window

Results

-ctsim.exe - 0 error(s), 1 warning(s) +ctsim.exe - 0 error(s), 0 warning(s)

--------------------Configuration: if1 - Win32 Release--------------------

Command Lines

-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPBB.tmp" with contents +Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPF6.tmp" with contents [ wx.lib libctsim.lib zlib.lib comctl32.lib wsock32.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 libpng.lib /nologo /subsystem:console /incremental:no /pdb:"Release/if1.pdb" /machine:I386 /out:"Release/if1.exe" /libpath:"..\libctsim\Release" /libpath:"..\..\..\lpng108\msvc\win32\libpng\lib" /libpath:"..\..\..\wx2\lib" /libpath:"..\..\..\lpng108\msvc\win32\zlib\lib" ".\Release\if1.obj" "\ctsim-2.0.6\msvc\libctsim\Release\libctsim.lib" ] -Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPBB.tmp" +Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPF6.tmp"

Output Window

Linking... @@ -143,13 +140,13 @@ if1.exe - 0 error(s), 0 warning(s) --------------------Configuration: if1 - Win32 Debug--------------------

Command Lines

-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPBD.tmp" with contents +Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPF8.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:console /incremental:yes /pdb:"Debug/if1.pdb" /debug /machine:I386 /nodefaultlib:"libcd.lib" /nodefaultlib:"libcid.lib" /nodefaultlib:"msvcrtd.lib" /out:"Debug/if1.exe" /pdbtype:sept /libpath:"..\..\..\lpng108\msvc\win32\libpng\lib" /libpath:"..\..\..\lpng108\msvc\win32\zlib\lib" ".\Debug\if1.obj" "\ctsim-2.0.6\msvc\libctsim\Debug\libctsim.lib" ] -Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPBD.tmp" +Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPF8.tmp"

Output Window

Linking... @@ -161,13 +158,13 @@ if1.exe - 0 error(s), 0 warning(s) --------------------Configuration: if2 - Win32 Release--------------------

Command Lines

-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPBE.tmp" with contents +Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPF9.tmp" with contents [ wx.lib libctsim.lib zlib.lib comctl32.lib wsock32.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 libpng.lib /nologo /subsystem:console /incremental:no /pdb:"Release/if2.pdb" /machine:I386 /out:"Release/if2.exe" /libpath:"..\libctsim\Release" /libpath:"..\..\..\lpng108\msvc\win32\libpng\lib" /libpath:"..\..\..\wx2\lib" /libpath:"..\..\..\lpng108\msvc\win32\zlib\lib" ".\Release\if2.obj" "\ctsim-2.0.6\msvc\libctsim\Release\libctsim.lib" ] -Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPBE.tmp" +Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPF9.tmp"

Output Window

Linking... @@ -179,13 +176,13 @@ if2.exe - 0 error(s), 0 warning(s) --------------------Configuration: if2 - Win32 Debug--------------------

Command Lines

-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPC0.tmp" with contents +Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPFB.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:console /incremental:yes /pdb:"Debug/if2.pdb" /debug /machine:I386 /nodefaultlib:"libcd.lib" /nodefaultlib:"libcid.lib" /nodefaultlib:"msvcrtd.lib" /out:"Debug/if2.exe" /pdbtype:sept /libpath:"..\..\..\lpng108\msvc\win32\libpng\lib" /libpath:"..\..\..\lpng108\msvc\win32\zlib\lib" ".\Debug\if2.obj" "\ctsim-2.0.6\msvc\libctsim\Debug\libctsim.lib" ] -Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPC0.tmp" +Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPFB.tmp"

Output Window

Linking... @@ -215,13 +212,13 @@ ifexport.exe - 0 error(s), 0 warning(s) --------------------Configuration: ifinfo - Win32 Release--------------------

Command Lines

-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPC1.tmp" with contents +Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPFC.tmp" with contents [ wx.lib libctsim.lib zlib.lib comctl32.lib wsock32.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 libpng.lib /nologo /subsystem:console /incremental:no /pdb:"Release/ifinfo.pdb" /machine:I386 /out:"Release/ifinfo.exe" /libpath:"..\libctsim\Release" /libpath:"..\..\..\lpng108\msvc\win32\libpng\lib" /libpath:"..\..\..\wx2\lib" /libpath:"..\..\..\lpng108\msvc\win32\zlib\lib" ".\Release\ifinfo.obj" "\ctsim-2.0.6\msvc\libctsim\Release\libctsim.lib" ] -Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPC1.tmp" +Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPFC.tmp"

Output Window

Linking... @@ -233,13 +230,13 @@ ifinfo.exe - 0 error(s), 0 warning(s) --------------------Configuration: ifinfo - Win32 Debug--------------------

Command Lines

-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPC3.tmp" with contents +Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPFE.tmp" with contents [ rpcrt4.lib comctl32.lib wsock32.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 libcpd.lib libcd.lib ..\..\..\fftw-2.1.3\Win32\FFTW2st\Debug\FFTW2st.lib ..\..\..\fftw-2.1.3\Win32\RFFTW2st\Debug\RFFTW2st.lib /nologo /subsystem:console /incremental:yes /pdb:"Debug/ifinfo.pdb" /debug /machine:I386 /nodefaultlib:"libcd.lib" /nodefaultlib:"libcid.lib" /nodefaultlib:"msvcrt.lib" /nodefaultlib /out:"Debug/ifinfo.exe" /pdbtype:sept ".\Debug\ifinfo.obj" "\ctsim-2.0.6\msvc\libctsim\Debug\libctsim.lib" ] -Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPC3.tmp" +Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPFE.tmp"

Output Window

Linking... @@ -269,13 +266,13 @@ libpng.lib - 0 error(s), 0 warning(s) --------------------Configuration: phm2if - Win32 Release--------------------

Command Lines

-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPC4.tmp" with contents +Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPFF.tmp" with contents [ wx.lib libctsim.lib zlib.lib comctl32.lib wsock32.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 libpng.lib /nologo /subsystem:console /incremental:no /pdb:"Release/phm2if.pdb" /machine:I386 /out:"Release/phm2if.exe" /libpath:"..\libctsim\Release" /libpath:"..\..\..\lpng108\msvc\win32\libpng\lib" /libpath:"..\..\..\wx2\lib" /libpath:"..\..\..\lpng108\msvc\win32\zlib\lib" ".\Release\phm2if.obj" "\ctsim-2.0.6\msvc\libctsim\Release\libctsim.lib" ] -Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPC4.tmp" +Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPFF.tmp"

Output Window

Linking... LINK : warning LNK4089: all references to "ADVAPI32.dll" discarded by /OPT:REF @@ -289,13 +286,13 @@ phm2if.exe - 0 error(s), 2 warning(s) --------------------Configuration: phm2if - Win32 Debug--------------------

Command Lines

-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPC6.tmp" with contents +Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP101.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:console /incremental:yes /pdb:"Debug/phm2if.pdb" /debug /machine:I386 /nodefaultlib:"libcd.lib" /nodefaultlib:"libcid.lib" /nodefaultlib:"msvcrtd.lib" /out:"Debug/phm2if.exe" /pdbtype:sept /libpath:"..\..\..\lpng108\msvc\win32\libpng\lib" /libpath:"..\..\..\lpng108\msvc\win32\zlib\lib" ".\Debug\phm2if.obj" "\ctsim-2.0.6\msvc\libctsim\Debug\libctsim.lib" ] -Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPC6.tmp" +Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP101.tmp"

Output Window

Linking... @@ -307,13 +304,13 @@ phm2if.exe - 0 error(s), 0 warning(s) --------------------Configuration: phm2pj - Win32 Release--------------------

Command Lines

-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPC8.tmp" with contents +Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP102.tmp" with contents [ wx.lib libctsim.lib zlib.lib comctl32.lib wsock32.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 libpng.lib /nologo /subsystem:console /incremental:no /pdb:"Release/phm2pj.pdb" /machine:I386 /out:"Release/phm2pj.exe" /libpath:"..\libctsim\Release" /libpath:"..\..\..\lpng108\msvc\win32\libpng\lib" /libpath:"..\..\..\wx2\lib" /libpath:"..\..\..\lpng108\msvc\win32\zlib\lib" ".\Release\phm2pj.obj" "\ctsim-2.0.6\msvc\libctsim\Release\libctsim.lib" ] -Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPC8.tmp" +Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP102.tmp"

Output Window

Linking... LINK : warning LNK4089: all references to "ADVAPI32.dll" discarded by /OPT:REF @@ -327,13 +324,13 @@ phm2pj.exe - 0 error(s), 2 warning(s) --------------------Configuration: phm2pj - Win32 Debug--------------------

Command Lines

-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPCA.tmp" with contents +Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP104.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:console /incremental:yes /pdb:"Debug/phm2pj.pdb" /debug /machine:I386 /nodefaultlib:"libcd.lib" /nodefaultlib:"libcid.lib" /nodefaultlib:"msvcrtd.lib" /out:"Debug/phm2pj.exe" /pdbtype:sept /libpath:"..\..\..\lpng108\msvc\win32\libpng\lib" /libpath:"..\..\..\lpng108\msvc\win32\zlib\lib" ".\Debug\phm2pj.obj" "\ctsim-2.0.6\msvc\libctsim\Debug\libctsim.lib" ] -Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPCA.tmp" +Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP104.tmp"

Output Window

Linking... @@ -345,14 +342,14 @@ phm2pj.exe - 0 error(s), 0 warning(s) --------------------Configuration: pj2if - Win32 Release--------------------

Command Lines

-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPCC.tmp" with contents +Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP105.tmp" with contents [ wx.lib libctsim.lib zlib.lib comctl32.lib wsock32.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 libpng.lib /nologo /subsystem:console /incremental:no /pdb:"Release/pj2if.pdb" /machine:I386 /out:"Release/pj2if.exe" /libpath:"..\libctsim\Release" /libpath:"..\..\..\lpng108\msvc\win32\libpng\lib" /libpath:"..\..\..\wx2\lib" /libpath:"..\..\..\lpng108\msvc\win32\zlib\lib" ".\Release\pj2if.obj" "\ctsim-2.0.6\msvc\libctsim\Release\libctsim.lib" "\wx2\lib\wx.lib" ] -Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPCC.tmp" +Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP105.tmp"

Output Window

Linking... LINK : warning LNK4089: all references to "ADVAPI32.dll" discarded by /OPT:REF @@ -366,14 +363,14 @@ pj2if.exe - 0 error(s), 2 warning(s) --------------------Configuration: pj2if - Win32 Debug--------------------

Command Lines

-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPCE.tmp" with contents +Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP107.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:console /incremental:yes /pdb:"Debug/pj2if.pdb" /debug /machine:I386 /nodefaultlib:"libcd.lib" /nodefaultlib:"libcid.lib" /nodefaultlib:"msvcrtd.lib" /out:"Debug/pj2if.exe" /pdbtype:sept /libpath:"..\..\..\lpng108\msvc\win32\libpng\lib" /libpath:"..\..\..\lpng108\msvc\win32\zlib\lib" ".\Debug\pj2if.obj" "\ctsim-2.0.6\msvc\libctsim\Debug\libctsim.lib" "\wx2\lib\wxd.lib" ] -Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPCE.tmp" +Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP107.tmp"

Output Window

Linking... @@ -385,7 +382,7 @@ pj2if.exe - 0 error(s), 0 warning(s) --------------------Configuration: pjinfo - Win32 Release--------------------

Command Lines

-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPD0.tmp" with contents +Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP108.tmp" with contents [ wx.lib libctsim.lib zlib.lib comctl32.lib wsock32.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 libpng.lib /nologo /subsystem:console /incremental:no /pdb:"Release/pjinfo.pdb" /machine:I386 /out:"Release/pjinfo.exe" /libpath:"..\libctsim\Release" /libpath:"..\..\..\lpng108\msvc\win32\libpng\lib" /libpath:"..\..\..\wx2\lib" /libpath:"..\..\..\lpng108\msvc\win32\zlib\lib" ".\Release\pjinfo.obj" @@ -394,7 +391,7 @@ wx.lib libctsim.lib zlib.lib comctl32.lib wsock32.lib kernel32.lib user32.lib gd "\fftw-2.1.3\Win32\RFFTW2st\Release\RFFTW2st.lib" "\wx2\lib\wx.lib" ] -Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPD0.tmp" +Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP108.tmp"

Output Window

Linking... LINK : warning LNK4089: all references to "ADVAPI32.dll" discarded by /OPT:REF @@ -408,7 +405,7 @@ pjinfo.exe - 0 error(s), 2 warning(s) --------------------Configuration: pjinfo - Win32 Debug--------------------

Command Lines

-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPD2.tmp" with contents +Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP10A.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:console /incremental:yes /pdb:"Debug/pjinfo.pdb" /debug /machine:I386 /nodefaultlib:"libcd.lib" /nodefaultlib:"libcid.lib" /nodefaultlib:"msvcrtd.lib" /out:"Debug/pjinfo.exe" /pdbtype:sept /libpath:"..\..\..\lpng108\msvc\win32\libpng\lib" /libpath:"..\..\..\lpng108\msvc\win32\zlib\lib" ".\Debug\pjinfo.obj" @@ -417,7 +414,7 @@ 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\RSPD2.tmp" +Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP10A.tmp"

Output Window

Linking... @@ -429,7 +426,7 @@ pjinfo.exe - 0 error(s), 0 warning(s) --------------------Configuration: pjrec - Win32 Release--------------------

Command Lines

-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPD4.tmp" with contents +Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP10B.tmp" with contents [ wx.lib libctsim.lib zlib.lib comctl32.lib wsock32.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 libpng.lib /nologo /subsystem:console /incremental:no /pdb:"Release/pjrec.pdb" /machine:I386 /out:"Release/pjrec.exe" /libpath:"..\libctsim\Release" /libpath:"..\..\..\lpng108\msvc\win32\libpng\lib" /libpath:"..\..\..\wx2\lib" /libpath:"..\..\..\lpng108\msvc\win32\zlib\lib" ".\Release\pjrec.obj" @@ -438,7 +435,7 @@ wx.lib libctsim.lib zlib.lib comctl32.lib wsock32.lib kernel32.lib user32.lib gd "\wx2\lib\wx.lib" "\ctsim-2.0.6\msvc\libctsim\Release\libctsim.lib" ] -Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPD4.tmp" +Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP10B.tmp"

Output Window

Linking... LINK : warning LNK4089: all references to "ADVAPI32.dll" discarded by /OPT:REF @@ -452,7 +449,7 @@ pjrec.exe - 0 error(s), 2 warning(s) --------------------Configuration: pjrec - Win32 Debug--------------------

Command Lines

-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPD6.tmp" with contents +Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP10D.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:console /incremental:yes /pdb:"Debug/pjrec.pdb" /debug /machine:I386 /nodefaultlib:"libcd.lib" /nodefaultlib:"libcid.lib" /nodefaultlib:"msvcrtd.lib" /out:"Debug/pjrec.exe" /pdbtype:sept /libpath:"..\..\..\lpng108\msvc\win32\libpng\lib" /libpath:"..\..\..\lpng108\msvc\win32\zlib\lib" ".\Debug\pjrec.obj" @@ -461,7 +458,7 @@ comctl32.lib winmm.lib rpcrt4.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib w "\wx2\lib\wxd.lib" "\ctsim-2.0.6\msvc\libctsim\Debug\libctsim.lib" ] -Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSPD6.tmp" +Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP10D.tmp"

Output Window

Linking... diff --git a/src/views.cpp b/src/views.cpp index 613d26d..f150237 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.29 2000/12/18 01:00:05 kevin Exp $ +** $Id: views.cpp,v 1.30 2000/12/18 09:31:26 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 @@ -64,12 +64,12 @@ // ImageFileCanvas BEGIN_EVENT_TABLE(ImageFileCanvas, wxScrolledWindow) - EVT_MOUSE_EVENTS(ImageFileCanvas::OnMouseEvent) +EVT_MOUSE_EVENTS(ImageFileCanvas::OnMouseEvent) END_EVENT_TABLE() ImageFileCanvas::ImageFileCanvas (ImageFileView* v, wxFrame *frame, const wxPoint& pos, const wxSize& size, const long style) - : wxScrolledWindow(frame, -1, pos, size, style) +: wxScrolledWindow(frame, -1, pos, size, style) { m_pView = v; } @@ -91,20 +91,20 @@ ImageFileCanvas::OnMouseEvent(wxMouseEvent& event) PrepareDC(dc); wxPoint pt(event.GetLogicalPosition(dc)); - + if (event.LeftIsDown()) { - const ImageFile& rIF = m_pView->GetDocument()->getImageFile(); - ImageFileArrayConst v = rIF.getArray(); - int nx = rIF.nx(); - int ny = rIF.ny(); - - if (pt.x >= 0 && pt.x < nx && pt.y >= 0 && pt.y < ny) { - std::ostringstream os; - 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"; - + const ImageFile& rIF = m_pView->GetDocument()->getImageFile(); + ImageFileArrayConst v = rIF.getArray(); + int nx = rIF.nx(); + int ny = rIF.ny(); + + if (pt.x >= 0 && pt.x < nx && pt.y >= 0 && pt.y < ny) { + std::ostringstream os; + 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"; + } } @@ -114,13 +114,13 @@ ImageFileCanvas::OnMouseEvent(wxMouseEvent& event) IMPLEMENT_DYNAMIC_CLASS(ImageFileView, wxView) BEGIN_EVENT_TABLE(ImageFileView, wxView) - EVT_MENU(IFMENU_FILE_PROPERTIES, ImageFileView::OnProperties) - EVT_MENU(IFMENU_VIEW_SCALE_MINMAX, ImageFileView::OnScaleMinMax) - EVT_MENU(IFMENU_VIEW_SCALE_AUTO, ImageFileView::OnScaleAuto) +EVT_MENU(IFMENU_FILE_PROPERTIES, ImageFileView::OnProperties) +EVT_MENU(IFMENU_VIEW_SCALE_MINMAX, ImageFileView::OnScaleMinMax) +EVT_MENU(IFMENU_VIEW_SCALE_AUTO, ImageFileView::OnScaleAuto) END_EVENT_TABLE() ImageFileView::ImageFileView(void) - : wxView(), m_canvas(NULL), m_frame(NULL), m_bMinSpecified(false), m_bMaxSpecified(false) +: wxView(), m_canvas(NULL), m_frame(NULL), m_bMinSpecified(false), m_bMaxSpecified(false) { } @@ -131,19 +131,19 @@ ImageFileView::~ImageFileView(void) void ImageFileView::OnProperties (wxCommandEvent& event) { - double min, max, mean, mode, median, stddev; - const ImageFile& rIF = GetDocument()->getImageFile(); - if (rIF.nx() == 0 || rIF.ny() == 0) - *theApp->getLog() << "Properties: empty imagefile\n"; - else { - const std::string& rFilename = rIF.getFilename(); - rIF.statistics (min, max, mean, mode, median, stddev); - std::ostringstream os; - os << "file: " << rFilename << "\nmin: "<getLog() << os.str().c_str(); - wxMessageDialog dialogMsg (m_frame, os.str().c_str(), "Imagefile Properties", wxOK | wxICON_INFORMATION); - dialogMsg.ShowModal(); - } + double min, max, mean, mode, median, stddev; + const ImageFile& rIF = GetDocument()->getImageFile(); + if (rIF.nx() == 0 || rIF.ny() == 0) + *theApp->getLog() << "Properties: empty imagefile\n"; + else { + const std::string& rFilename = rIF.getFilename(); + rIF.statistics (min, max, mean, mode, median, stddev); + std::ostringstream os; + os << "file: " << rFilename << "\nmin: "<getLog() << os.str().c_str(); + wxMessageDialog dialogMsg (m_frame, os.str().c_str(), "Imagefile Properties", wxOK | wxICON_INFORMATION); + dialogMsg.ShowModal(); + } } void @@ -153,14 +153,14 @@ ImageFileView::OnScaleAuto (wxCommandEvent& event) DialogAutoScaleParameters dialogAutoScale (m_frame, rIF, m_dAutoScaleFactor); 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; - m_dAutoScaleFactor = dialogAutoScale.getAutoScaleFactor(); - OnUpdate (this, NULL); + m_bMinSpecified = true; + m_bMaxSpecified = true; + double dMin, dMax; + dialogAutoScale.getMinMax (&dMin, &dMax); + m_dMinPixel = dMin; + m_dMaxPixel = dMax; + m_dAutoScaleFactor = dialogAutoScale.getAutoScaleFactor(); + OnUpdate (this, NULL); } } @@ -170,21 +170,21 @@ ImageFileView::OnScaleMinMax (wxCommandEvent& event) const ImageFile& rIF = GetDocument()->getImageFile(); double min, max; if (! m_bMinSpecified && ! m_bMaxSpecified) - rIF.getMinMax (min, max); - + rIF.getMinMax (min, max); + if (m_bMinSpecified) - min = m_dMinPixel; + min = m_dMinPixel; if (m_bMaxSpecified) - max = m_dMaxPixel; - + max = m_dMaxPixel; + DialogGetImageMinMax dialogMinMax (m_frame, rIF, min, max); int retVal = dialogMinMax.ShowModal(); if (retVal == wxID_OK) { - m_bMinSpecified = true; - m_bMaxSpecified = true; - m_dMinPixel = dialogMinMax.getMinimum(); - m_dMaxPixel = dialogMinMax.getMaximum(); - OnUpdate (this, NULL); + m_bMinSpecified = true; + m_bMaxSpecified = true; + m_dMinPixel = dialogMinMax.getMinimum(); + m_dMaxPixel = dialogMinMax.getMaximum(); + OnUpdate (this, NULL); } } @@ -220,7 +220,7 @@ ImageFileView::CreateChildFrame(wxDocument *doc, wxView *view) file_menu->AppendSeparator(); file_menu->Append(IFMENU_FILE_PROPERTIES, "P&roperties"); - + file_menu->AppendSeparator(); file_menu->Append(wxID_PRINT, "&Print..."); file_menu->Append(wxID_PRINT_SETUP, "Print &Setup..."); @@ -251,24 +251,22 @@ bool ImageFileView::OnCreate(wxDocument *doc, long WXUNUSED(flags) ) { m_frame = CreateChildFrame(doc, this); - SetFrame(m_frame); + SetFrame (m_frame); m_bMinSpecified = false; m_bMaxSpecified = false; m_dAutoScaleFactor = 1.; - + int width, height; - m_frame->GetClientSize(&width, &height); + m_frame->GetClientSize (&width, &height); m_frame->SetTitle("ImageFileView"); - m_canvas = CreateCanvas(this, m_frame); - -#ifdef __X__ + m_canvas = CreateCanvas (this, m_frame); + int x, y; // X requires a forced resize m_frame->GetSize(&x, &y); m_frame->SetSize(-1, -1, x, y); -#endif - - m_frame->Show(true); + m_frame->SetFocus(); + m_frame->Show(true); Activate(true); return true; @@ -277,53 +275,53 @@ ImageFileView::OnCreate(wxDocument *doc, long WXUNUSED(flags) ) void ImageFileView::OnDraw (wxDC* dc) { - if (m_bitmap.Ok()) - dc->DrawBitmap(m_bitmap, 0, 0, false); + if (m_bitmap.Ok()) + dc->DrawBitmap(m_bitmap, 0, 0, false); } void -ImageFileView::OnUpdate(wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint) ) +ImageFileView::OnUpdate (wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint) ) { const ImageFile& rIF = dynamic_cast(GetDocument())->getImageFile(); ImageFileArrayConst v = rIF.getArray(); int nx = rIF.nx(); int ny = rIF.ny(); if (v != NULL && nx != 0 && ny != 0) { - if (! m_bMinSpecified || ! m_bMaxSpecified) { - double min, max; - rIF.getMinMax (min, max); - if (! m_bMinSpecified) - m_dMinPixel = min; - if (! m_bMaxSpecified) - m_dMaxPixel = max; - } - double scaleWidth = m_dMaxPixel - m_dMinPixel; - - unsigned char* imageData = new unsigned char [nx * ny * 3]; - for (int ix = 0; ix < nx; ix++) { - for (int iy = 0; iy < ny; iy++) { - double scaleValue = ((v[ix][iy] - m_dMinPixel) / scaleWidth) * 255; - int intensity = static_cast(scaleValue + 0.5); - intensity = clamp (intensity, 0, 255); - int baseAddr = ((ny - 1 - iy) * nx + ix) * 3; - imageData[baseAddr] = imageData[baseAddr+1] = imageData[baseAddr+2] = intensity; - } - } - wxImage image (nx, ny, imageData, true); - m_bitmap = image.ConvertToBitmap(); - delete imageData; - int xSize = nx; - int ySize = ny; - xSize = clamp (xSize, 0, 800); - ySize = clamp (ySize, 0, 800); - m_frame->SetClientSize (xSize, ySize); - m_canvas->SetScrollbars(20, 20, nx/20, ny/20); - m_canvas->SetBackgroundColour(*wxWHITE); + if (! m_bMinSpecified || ! m_bMaxSpecified) { + double min, max; + rIF.getMinMax (min, max); + if (! m_bMinSpecified) + m_dMinPixel = min; + if (! m_bMaxSpecified) + m_dMaxPixel = max; + } + double scaleWidth = m_dMaxPixel - m_dMinPixel; + + unsigned char* imageData = new unsigned char [nx * ny * 3]; + for (int ix = 0; ix < nx; ix++) { + for (int iy = 0; iy < ny; iy++) { + double scaleValue = ((v[ix][iy] - m_dMinPixel) / scaleWidth) * 255; + int intensity = static_cast(scaleValue + 0.5); + intensity = clamp (intensity, 0, 255); + int baseAddr = ((ny - 1 - iy) * nx + ix) * 3; + imageData[baseAddr] = imageData[baseAddr+1] = imageData[baseAddr+2] = intensity; + } + } + wxImage image (nx, ny, imageData, true); + m_bitmap = image.ConvertToBitmap(); + delete imageData; + int xSize = nx; + int ySize = ny; + xSize = clamp (xSize, 0, 800); + ySize = clamp (ySize, 0, 800); + m_frame->SetClientSize (xSize, ySize); + m_canvas->SetScrollbars(20, 20, nx/20, ny/20); + m_canvas->SetBackgroundColour(*wxWHITE); } - + if (m_canvas) - m_canvas->Refresh(); + m_canvas->Refresh(); } bool @@ -331,15 +329,15 @@ ImageFileView::OnClose (bool deleteWindow) { if (!GetDocument()->Close()) return false; - + m_canvas->Clear(); m_canvas->m_pView = NULL; m_canvas = NULL; wxString s(theApp->GetAppName()); if (m_frame) - m_frame->SetTitle(s); + m_frame->SetTitle(s); SetFrame(NULL); - + Activate(false); if (deleteWindow) { @@ -354,7 +352,7 @@ ImageFileView::OnClose (bool deleteWindow) // PhantomCanvas PhantomCanvas::PhantomCanvas (PhantomView* v, wxFrame *frame, const wxPoint& pos, const wxSize& size, const long style) - : wxScrolledWindow(frame, -1, pos, size, style) +: wxScrolledWindow(frame, -1, pos, size, style) { m_pView = v; } @@ -372,13 +370,13 @@ PhantomCanvas::OnDraw(wxDC& dc) IMPLEMENT_DYNAMIC_CLASS(PhantomView, wxView) BEGIN_EVENT_TABLE(PhantomView, wxView) - EVT_MENU(PHMMENU_FILE_PROPERTIES, PhantomView::OnProperties) - EVT_MENU(PHMMENU_PROCESS_RASTERIZE, PhantomView::OnRasterize) - EVT_MENU(PHMMENU_PROCESS_PROJECTIONS, PhantomView::OnProjections) +EVT_MENU(PHMMENU_FILE_PROPERTIES, PhantomView::OnProperties) +EVT_MENU(PHMMENU_PROCESS_RASTERIZE, PhantomView::OnRasterize) +EVT_MENU(PHMMENU_PROCESS_PROJECTIONS, PhantomView::OnProjections) END_EVENT_TABLE() PhantomView::PhantomView(void) - : wxView(), m_canvas(NULL), m_frame(NULL) +: wxView(), m_canvas(NULL), m_frame(NULL) { m_iDefaultNDet = 367; m_iDefaultNView = 320; @@ -397,14 +395,14 @@ PhantomView::~PhantomView(void) void PhantomView::OnProperties (wxCommandEvent& event) { - const int idPhantom = GetDocument()->getPhantomID(); - const wxString& namePhantom = GetDocument()->getPhantomName(); - std::ostringstream os; - os << "Phantom " << namePhantom.c_str() << " (" << idPhantom << ")\n"; - *theApp->getLog() << os.str().c_str(); + const int idPhantom = GetDocument()->getPhantomID(); + const wxString& namePhantom = GetDocument()->getPhantomName(); + std::ostringstream os; + os << "Phantom " << namePhantom.c_str() << " (" << idPhantom << ")\n"; + *theApp->getLog() << os.str().c_str(); #if DEBUG - const Phantom& rPhantom = GetDocument()->getPhantom(); - rPhantom.print(); + const Phantom& rPhantom = GetDocument()->getPhantom(); + rPhantom.print(); #endif } @@ -412,113 +410,123 @@ PhantomView::OnProperties (wxCommandEvent& event) void PhantomView::OnProjections (wxCommandEvent& event) { - DialogGetProjectionParameters dialogProjection (m_frame, m_iDefaultNDet, m_iDefaultNView, m_iDefaultNSample, m_dDefaultRotation, m_dDefaultFocalLength, m_dDefaultFieldOfView, m_iDefaultGeometry, m_iDefaultTrace); - int retVal = dialogProjection.ShowModal(); - if (retVal == wxID_OK) { - m_iDefaultNDet = dialogProjection.getNDet(); - m_iDefaultNView = dialogProjection.getNView(); - m_iDefaultNSample = dialogProjection.getNSamples(); - m_iDefaultTrace = dialogProjection.getTrace(); - m_dDefaultRotation = dialogProjection.getRotAngle(); - m_dDefaultFocalLength = dialogProjection.getFocalLengthRatio(); - m_dDefaultFieldOfView = dialogProjection.getFieldOfViewRatio(); - wxString sGeometry = dialogProjection.getGeometry(); - m_iDefaultGeometry = Scanner::convertGeometryNameToID (sGeometry.c_str()); - - if (m_iDefaultNDet > 0 && m_iDefaultNView > 0 && sGeometry != "") { - const Phantom& rPhantom = GetDocument()->getPhantom(); - ProjectionFileDocument* pProjectionDoc = dynamic_cast(theApp->getDocManager()->CreateDocument("untitled.pj", wxDOC_SILENT)); - Projections& rProj = pProjectionDoc->getProjections(); - Scanner theScanner (rPhantom, sGeometry.c_str(), m_iDefaultNDet, m_iDefaultNView, m_iDefaultNSample, m_dDefaultRotation, m_dDefaultFocalLength, m_dDefaultFieldOfView); - if (theScanner.fail()) { - *theApp->getLog() << "Failed making scanner: " << theScanner.failMessage().c_str() << "\n"; - return; - } - rProj.initFromScanner (theScanner); - m_dDefaultRotation /= PI; // convert back to PI units - - if (m_iDefaultTrace > Trace::TRACE_CONSOLE) { - ProjectionsDialog dialogProjections (theScanner, rProj, rPhantom, m_iDefaultTrace, dynamic_cast(m_frame)); - for (int iView = 0; iView < rProj.nView(); iView++) { - ::wxYield(); - ::wxYield(); - if (dialogProjections.isCancelled() || ! dialogProjections.projectView (iView)) { - pProjectionDoc->DeleteAllViews(); - return; - } - ::wxYield(); - ::wxYield(); - while (dialogProjections.isPaused()) { - ::wxYield(); - ::wxUsleep(50); - } - } - } else { - wxProgressDialog dlgProgress (wxString("Projection"), wxString("Projection Progress"), rProj.nView() + 1, m_frame, wxPD_CAN_ABORT); - for (int i = 0; i < rProj.nView(); i++) { - theScanner.collectProjections (rProj, rPhantom, i, 1, true, m_iDefaultTrace); - if (! dlgProgress.Update (i+1)) { - pProjectionDoc->DeleteAllViews(); - return; - } - } - } - - std::ostringstream os; - os << "Projections for " << rPhantom.name() << ": nDet=" << m_iDefaultNDet << ", nView=" << m_iDefaultNView << ", nSamples=" << m_iDefaultNSample << ", RotAngle=" << m_dDefaultRotation << ", FocalLengthRatio=" << m_dDefaultFocalLength << ", FieldOfViewRatio=" << m_dDefaultFieldOfView << ", Geometry=" << sGeometry.c_str(); - rProj.setRemark (os.str()); - *theApp->getLog() << os.str().c_str() << "\n"; - - m_frame->Lower(); - ::wxYield(); - if (wxView* pView = pProjectionDoc->GetFirstView()) { - if (wxFrame* pFrame = pView->GetFrame()) { - pFrame->SetFocus(); - pFrame->Raise(); + DialogGetProjectionParameters dialogProjection (m_frame, m_iDefaultNDet, m_iDefaultNView, m_iDefaultNSample, m_dDefaultRotation, m_dDefaultFocalLength, m_dDefaultFieldOfView, m_iDefaultGeometry, m_iDefaultTrace); + int retVal = dialogProjection.ShowModal(); + if (retVal == wxID_OK) { + m_iDefaultNDet = dialogProjection.getNDet(); + m_iDefaultNView = dialogProjection.getNView(); + m_iDefaultNSample = dialogProjection.getNSamples(); + m_iDefaultTrace = dialogProjection.getTrace(); + m_dDefaultRotation = dialogProjection.getRotAngle(); + m_dDefaultFocalLength = dialogProjection.getFocalLengthRatio(); + m_dDefaultFieldOfView = dialogProjection.getFieldOfViewRatio(); + wxString sGeometry = dialogProjection.getGeometry(); + m_iDefaultGeometry = Scanner::convertGeometryNameToID (sGeometry.c_str()); + + if (m_iDefaultNDet > 0 && m_iDefaultNView > 0 && sGeometry != "") { + const Phantom& rPhantom = GetDocument()->getPhantom(); + ProjectionFileDocument* pProjectionDoc = dynamic_cast(theApp->getDocManager()->CreateDocument("untitled.pj", wxDOC_SILENT)); + Projections& rProj = pProjectionDoc->getProjections(); + Scanner theScanner (rPhantom, sGeometry.c_str(), m_iDefaultNDet, m_iDefaultNView, m_iDefaultNSample, m_dDefaultRotation, m_dDefaultFocalLength, m_dDefaultFieldOfView); + if (theScanner.fail()) { + *theApp->getLog() << "Failed making scanner: " << theScanner.failMessage().c_str() << "\n"; + return; + } + rProj.initFromScanner (theScanner); + m_dDefaultRotation /= PI; // convert back to PI units + + if (m_iDefaultTrace > Trace::TRACE_CONSOLE) { + ProjectionsDialog dialogProjections (theScanner, rProj, rPhantom, m_iDefaultTrace, dynamic_cast(m_frame)); + for (int iView = 0; iView < rProj.nView(); iView++) { + ::wxYield(); + ::wxYield(); + if (dialogProjections.isCancelled() || ! dialogProjections.projectView (iView)) { + pProjectionDoc->DeleteAllViews(); + return; + } + ::wxYield(); + ::wxYield(); + while (dialogProjections.isPaused()) { + ::wxYield(); + ::wxUsleep(50); + } + } + } else { + wxProgressDialog dlgProgress (wxString("Projection"), wxString("Projection Progress"), rProj.nView() + 1, m_frame, wxPD_CAN_ABORT); + for (int i = 0; i < rProj.nView(); i++) { + theScanner.collectProjections (rProj, rPhantom, i, 1, true, m_iDefaultTrace); + if (! dlgProgress.Update (i+1)) { + pProjectionDoc->DeleteAllViews(); + return; + } + } + } + + std::ostringstream os; + os << "Projections for " << rPhantom.name() << ": nDet=" << m_iDefaultNDet << ", nView=" << m_iDefaultNView << ", nSamples=" << m_iDefaultNSample << ", RotAngle=" << m_dDefaultRotation << ", FocalLengthRatio=" << m_dDefaultFocalLength << ", FieldOfViewRatio=" << m_dDefaultFieldOfView << ", Geometry=" << sGeometry.c_str(); + rProj.setRemark (os.str()); + *theApp->getLog() << os.str().c_str() << "\n"; + + m_frame->Lower(); + ::wxYield(); + ProjectionFileView* projView = dynamic_cast(pProjectionDoc->GetFirstView()); + if (projView) { + projView->getFrame()->SetFocus(); + projView->OnUpdate (projView, NULL); + } + if (wxView* pView = pProjectionDoc->GetFirstView()) { + if (wxFrame* pFrame = pView->GetFrame()) { + pFrame->SetFocus(); + pFrame->Raise(); + } + theApp->getDocManager()->ActivateView (pView, true, false); + } + ::wxYield(); + pProjectionDoc->Modify(true); + pProjectionDoc->UpdateAllViews(this); + } } - theApp->getDocManager()->ActivateView (pView, true, false); - } - ::wxYield(); - pProjectionDoc->Modify(true); - pProjectionDoc->UpdateAllViews(this); - } - } } void PhantomView::OnRasterize (wxCommandEvent& event) { - DialogGetRasterParameters dialogRaster (m_frame, 256, 256, 1); - int retVal = dialogRaster.ShowModal(); - if (retVal == wxID_OK) { - int xSize = dialogRaster.getXSize(); - int ySize = dialogRaster.getYSize(); - int nSamples = dialogRaster.getNSamples(); - if (nSamples < 1) - nSamples = 1; - if (xSize > 0 && ySize > 0) { - const Phantom& rPhantom = GetDocument()->getPhantom(); - ImageFileDocument* pRasterDoc = dynamic_cast(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT)); - ImageFile& imageFile = pRasterDoc->getImageFile(); - - imageFile.setArraySize (xSize, ySize); - wxProgressDialog dlgProgress (wxString("Rasterize"), wxString("Rasterization Progress"), imageFile.nx() + 1, m_frame, wxPD_CAN_ABORT); - for (unsigned int i = 0; i < imageFile.nx(); i++) { - rPhantom.convertToImagefile (imageFile, nSamples, Trace::TRACE_NONE, i, 1, true); - if (! dlgProgress.Update(i+1)) { - pRasterDoc->DeleteAllViews(); - return; + DialogGetRasterParameters dialogRaster (m_frame, 256, 256, 1); + int retVal = dialogRaster.ShowModal(); + if (retVal == wxID_OK) { + int xSize = dialogRaster.getXSize(); + int ySize = dialogRaster.getYSize(); + int nSamples = dialogRaster.getNSamples(); + if (nSamples < 1) + nSamples = 1; + if (xSize > 0 && ySize > 0) { + const Phantom& rPhantom = GetDocument()->getPhantom(); + ImageFileDocument* pRasterDoc = dynamic_cast(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT)); + ImageFile& imageFile = pRasterDoc->getImageFile(); + + imageFile.setArraySize (xSize, ySize); + wxProgressDialog dlgProgress (wxString("Rasterize"), wxString("Rasterization Progress"), imageFile.nx() + 1, m_frame, wxPD_CAN_ABORT); + for (unsigned int i = 0; i < imageFile.nx(); i++) { + rPhantom.convertToImagefile (imageFile, nSamples, Trace::TRACE_NONE, i, 1, true); + if (! dlgProgress.Update(i+1)) { + pRasterDoc->DeleteAllViews(); + return; + } + } + pRasterDoc->Modify(true); + pRasterDoc->UpdateAllViews(this); + ImageFileView* rasterView = dynamic_cast(pRasterDoc->GetFirstView()); + if (rasterView) { + rasterView->getFrame()->SetFocus(); + rasterView->OnUpdate (rasterView, NULL); + } + + std::ostringstream os; + os << "Rasterize Phantom " << rPhantom.name() << ": XSize=" << xSize << ", YSize=" << ySize << ", nSamples=" << nSamples << "\n"; + *theApp->getLog() << os.str().c_str(); + } } - } - pRasterDoc->Modify(true); - pRasterDoc->UpdateAllViews(this); - - std::ostringstream os; - os << "Rasterize Phantom " << rPhantom.name() << ": XSize=" << xSize << ", YSize=" << ySize << ", nSamples=" << nSamples << "\n"; - *theApp->getLog() << os.str().c_str(); - } - } } @@ -550,7 +558,7 @@ PhantomView::CreateChildFrame(wxDocument *doc, wxView *view) file_menu->AppendSeparator(); file_menu->Append(PHMMENU_FILE_PROPERTIES, "P&roperties"); - + file_menu->AppendSeparator(); file_menu->Append(wxID_PRINT, "&Print..."); file_menu->Append(wxID_PRINT_SETUP, "Print &Setup..."); @@ -559,7 +567,7 @@ PhantomView::CreateChildFrame(wxDocument *doc, wxView *view) wxMenu *process_menu = new wxMenu; process_menu->Append(PHMMENU_PROCESS_RASTERIZE, "&Rasterize..."); process_menu->Append(PHMMENU_PROCESS_PROJECTIONS, "&Projections..."); - + wxMenu *help_menu = new wxMenu; help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents"); help_menu->Append(MAINMENU_HELP_ABOUT, "&About"); @@ -583,21 +591,21 @@ PhantomView::OnCreate(wxDocument *doc, long WXUNUSED(flags) ) { m_frame = CreateChildFrame(doc, this); SetFrame(m_frame); - + int width, height; m_frame->GetClientSize(&width, &height); m_frame->SetTitle("PhantomView"); m_canvas = CreateCanvas(this, m_frame); - + #ifdef __X__ int x, y; // X requires a forced resize m_frame->GetSize(&x, &y); m_frame->SetSize(-1, -1, x, y); #endif - + m_frame->Show(true); Activate(true); - + return true; } @@ -606,7 +614,7 @@ void PhantomView::OnUpdate(wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint) ) { if (m_canvas) - m_canvas->Refresh(); + m_canvas->Refresh(); } bool @@ -614,15 +622,15 @@ PhantomView::OnClose (bool deleteWindow) { if (!GetDocument()->Close()) return false; - + m_canvas->Clear(); m_canvas->m_pView = NULL; m_canvas = NULL; wxString s(wxTheApp->GetAppName()); if (m_frame) - m_frame->SetTitle(s); + m_frame->SetTitle(s); SetFrame(NULL); - + Activate(false); if (deleteWindow) { @@ -635,19 +643,19 @@ PhantomView::OnClose (bool deleteWindow) 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.show (sgp); + 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.show (sgp); } // ProjectionCanvas ProjectionFileCanvas::ProjectionFileCanvas (ProjectionFileView* v, wxFrame *frame, const wxPoint& pos, const wxSize& size, const long style) - : wxScrolledWindow(frame, -1, pos, size, style) +: wxScrolledWindow(frame, -1, pos, size, style) { m_pView = v; } @@ -664,29 +672,29 @@ ProjectionFileCanvas::OnDraw(wxDC& dc) IMPLEMENT_DYNAMIC_CLASS(ProjectionFileView, wxView) BEGIN_EVENT_TABLE(ProjectionFileView, wxView) - EVT_MENU(PJMENU_FILE_PROPERTIES, ProjectionFileView::OnProperties) - EVT_MENU(PJMENU_PROCESS_RECONSTRUCT, ProjectionFileView::OnReconstruct) +EVT_MENU(PJMENU_FILE_PROPERTIES, ProjectionFileView::OnProperties) +EVT_MENU(PJMENU_PROCESS_RECONSTRUCT, ProjectionFileView::OnReconstruct) END_EVENT_TABLE() ProjectionFileView::ProjectionFileView(void) - : wxView(), m_canvas(NULL), m_frame(NULL) +: wxView(), m_canvas(NULL), m_frame(NULL) { m_iDefaultNX = 256; m_iDefaultNY = 256; - m_iDefaultFilter = SignalFilter::FILTER_ABS_BANDLIMIT; - m_dDefaultFilterParam = 1.; + m_iDefaultFilter = SignalFilter::FILTER_ABS_BANDLIMIT; + m_dDefaultFilterParam = 1.; #if HAVE_FFTW - m_iDefaultFilterMethod = ProcessSignal::FILTER_METHOD_RFFTW; - m_iDefaultFilterGeneration = ProcessSignal::FILTER_GENERATION_INVERSE_FOURIER; + m_iDefaultFilterMethod = ProcessSignal::FILTER_METHOD_RFFTW; + m_iDefaultFilterGeneration = ProcessSignal::FILTER_GENERATION_INVERSE_FOURIER; #else - m_iDefaultFilterMethod = ProcessSignal::FILTER_METHOD_CONVOLUTION; - m_iDefaultFilterGeneration = ProcessSignal::FILTER_GENERATION_DIRECT; + m_iDefaultFilterMethod = ProcessSignal::FILTER_METHOD_CONVOLUTION; + m_iDefaultFilterGeneration = ProcessSignal::FILTER_GENERATION_DIRECT; #endif - m_iDefaultZeropad = 1; - m_iDefaultBackprojector = Backprojector::BPROJ_IDIFF3; - m_iDefaultInterpolation = Backprojector::INTERP_LINEAR; - m_iDefaultInterpParam = 1; - m_iDefaultTrace = Trace::TRACE_NONE; + m_iDefaultZeropad = 1; + m_iDefaultBackprojector = Backprojector::BPROJ_IDIFF3; + m_iDefaultInterpolation = Backprojector::INTERP_LINEAR; + m_iDefaultInterpParam = 1; + m_iDefaultTrace = Trace::TRACE_NONE; } ProjectionFileView::~ProjectionFileView(void) @@ -696,107 +704,112 @@ ProjectionFileView::~ProjectionFileView(void) void ProjectionFileView::OnProperties (wxCommandEvent& event) { - const Projections& rProj = GetDocument()->getProjections(); - std::ostringstream os; - rProj.printScanInfo(os); - *theApp->getLog() << os.str().c_str(); - wxMessageDialog dialogMsg (m_frame, os.str().c_str(), "Projection File Properties", wxOK | wxICON_INFORMATION); - dialogMsg.ShowModal(); + const Projections& rProj = GetDocument()->getProjections(); + std::ostringstream os; + rProj.printScanInfo(os); + *theApp->getLog() << os.str().c_str(); + wxMessageDialog dialogMsg (m_frame, os.str().c_str(), "Projection File Properties", wxOK | wxICON_INFORMATION); + dialogMsg.ShowModal(); } void ProjectionFileView::OnReconstruct (wxCommandEvent& event) { - DialogGetReconstructionParameters dialogReconstruction (m_frame, m_iDefaultNX, m_iDefaultNY, m_iDefaultFilter, m_dDefaultFilterParam, m_iDefaultFilterMethod, m_iDefaultFilterGeneration, m_iDefaultZeropad, m_iDefaultInterpolation, m_iDefaultInterpParam, m_iDefaultBackprojector, m_iDefaultTrace); - - int retVal = dialogReconstruction.ShowModal(); - if (retVal == wxID_OK) { - m_iDefaultNX = dialogReconstruction.getXSize(); - m_iDefaultNY = dialogReconstruction.getYSize(); - wxString optFilterName = dialogReconstruction.getFilterName(); - m_iDefaultFilter = SignalFilter::convertFilterNameToID (optFilterName.c_str()); - m_dDefaultFilterParam = dialogReconstruction.getFilterParam(); - wxString optFilterMethodName = dialogReconstruction.getFilterMethodName(); - m_iDefaultFilterMethod = ProcessSignal::convertFilterMethodNameToID(optFilterMethodName.c_str()); - m_iDefaultZeropad = dialogReconstruction.getZeropad(); - wxString optFilterGenerationName = dialogReconstruction.getFilterGenerationName(); - m_iDefaultFilterGeneration = ProcessSignal::convertFilterGenerationNameToID (optFilterGenerationName.c_str()); - wxString optInterpName = dialogReconstruction.getInterpName(); - m_iDefaultInterpolation = Backprojector::convertInterpNameToID (optInterpName.c_str()); - m_iDefaultInterpParam = dialogReconstruction.getInterpParam(); - wxString optBackprojectName = dialogReconstruction.getBackprojectName(); - m_iDefaultBackprojector = Backprojector::convertBackprojectNameToID (optBackprojectName.c_str()); - m_iDefaultTrace = dialogReconstruction.getTrace(); - if (m_iDefaultNX > 0 && m_iDefaultNY > 0) { - ImageFileDocument* pReconDoc = dynamic_cast(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT)); - ImageFile& imageFile = pReconDoc->getImageFile(); - const Projections& rProj = GetDocument()->getProjections(); - imageFile.setArraySize (m_iDefaultNX, m_iDefaultNY); - - if (m_iDefaultFilterMethod != ProcessSignal::FILTER_METHOD_CONVOLUTION && m_iDefaultFilterGeneration == ProcessSignal::FILTER_GENERATION_DIRECT && rProj.geometry() != Scanner::GEOMETRY_PARALLEL) { - 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; - } + DialogGetReconstructionParameters dialogReconstruction (m_frame, m_iDefaultNX, m_iDefaultNY, m_iDefaultFilter, m_dDefaultFilterParam, m_iDefaultFilterMethod, m_iDefaultFilterGeneration, m_iDefaultZeropad, m_iDefaultInterpolation, m_iDefaultInterpParam, m_iDefaultBackprojector, m_iDefaultTrace); + + int retVal = dialogReconstruction.ShowModal(); + if (retVal == wxID_OK) { + m_iDefaultNX = dialogReconstruction.getXSize(); + m_iDefaultNY = dialogReconstruction.getYSize(); + wxString optFilterName = dialogReconstruction.getFilterName(); + m_iDefaultFilter = SignalFilter::convertFilterNameToID (optFilterName.c_str()); + m_dDefaultFilterParam = dialogReconstruction.getFilterParam(); + wxString optFilterMethodName = dialogReconstruction.getFilterMethodName(); + m_iDefaultFilterMethod = ProcessSignal::convertFilterMethodNameToID(optFilterMethodName.c_str()); + m_iDefaultZeropad = dialogReconstruction.getZeropad(); + wxString optFilterGenerationName = dialogReconstruction.getFilterGenerationName(); + m_iDefaultFilterGeneration = ProcessSignal::convertFilterGenerationNameToID (optFilterGenerationName.c_str()); + wxString optInterpName = dialogReconstruction.getInterpName(); + m_iDefaultInterpolation = Backprojector::convertInterpNameToID (optInterpName.c_str()); + m_iDefaultInterpParam = dialogReconstruction.getInterpParam(); + wxString optBackprojectName = dialogReconstruction.getBackprojectName(); + m_iDefaultBackprojector = Backprojector::convertBackprojectNameToID (optBackprojectName.c_str()); + m_iDefaultTrace = dialogReconstruction.getTrace(); + if (m_iDefaultNX > 0 && m_iDefaultNY > 0) { + ImageFileDocument* pReconDoc = dynamic_cast(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT)); + ImageFile& imageFile = pReconDoc->getImageFile(); + const Projections& rProj = GetDocument()->getProjections(); + imageFile.setArraySize (m_iDefaultNX, m_iDefaultNY); + + if (m_iDefaultFilterMethod != ProcessSignal::FILTER_METHOD_CONVOLUTION && m_iDefaultFilterGeneration == ProcessSignal::FILTER_GENERATION_DIRECT && rProj.geometry() != Scanner::GEOMETRY_PARALLEL) { + 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_castpDCPlot, 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; + 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_castpDCPlot, 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 - 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); + 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 - - Timer timerRecon; - if (m_iDefaultTrace > Trace::TRACE_CONSOLE) { - ReconstructDialog* pDlgReconstruct = new ReconstructDialog (*pReconstruct, rProj, imageFile, m_iDefaultTrace, m_frame); - for (int iView = 0; iView < rProj.nView(); iView++) { - ::wxYield(); - ::wxYield(); - if (pDlgReconstruct->isCancelled() || ! pDlgReconstruct->reconstructView (iView)) { - delete pDlgReconstruct; - delete pReconstruct; - pReconDoc->DeleteAllViews(); - return; - } - ::wxYield(); - ::wxYield(); - while (pDlgReconstruct->isPaused()) { - ::wxYield(); - ::wxUsleep(50); - } - } - delete pDlgReconstruct; - } else { - wxProgressDialog dlgProgress (wxString("Reconstruction"), wxString("Reconstruction Progress"), rProj.nView() + 1, m_frame, wxPD_CAN_ABORT); - for (int i = 0; i < rProj.nView(); i++) { - pReconstruct->reconstructView (i, 1); - if (! dlgProgress.Update(i + 1)) { - delete pReconstruct; - pReconDoc->DeleteAllViews(); - return; - } + + Timer timerRecon; + if (m_iDefaultTrace > Trace::TRACE_CONSOLE) { + ReconstructDialog* pDlgReconstruct = new ReconstructDialog (*pReconstruct, rProj, imageFile, m_iDefaultTrace, m_frame); + for (int iView = 0; iView < rProj.nView(); iView++) { + ::wxYield(); + ::wxYield(); + if (pDlgReconstruct->isCancelled() || ! pDlgReconstruct->reconstructView (iView)) { + delete pDlgReconstruct; + delete pReconstruct; + pReconDoc->DeleteAllViews(); + return; + } + ::wxYield(); + ::wxYield(); + while (pDlgReconstruct->isPaused()) { + ::wxYield(); + ::wxUsleep(50); + } + } + delete pDlgReconstruct; + } else { + wxProgressDialog dlgProgress (wxString("Reconstruction"), wxString("Reconstruction Progress"), rProj.nView() + 1, m_frame, wxPD_CAN_ABORT); + for (int i = 0; i < rProj.nView(); i++) { + pReconstruct->reconstructView (i, 1); + if (! dlgProgress.Update(i + 1)) { + delete pReconstruct; + pReconDoc->DeleteAllViews(); + return; + } + } + } + delete pReconstruct; + pReconDoc->Modify(true); + pReconDoc->UpdateAllViews(this); + ImageFileView* rasterView = dynamic_cast(pReconDoc->GetFirstView()); + if (rasterView) { + rasterView->getFrame()->SetFocus(); + rasterView->OnUpdate (rasterView, NULL); + } + std::ostringstream os; + 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()); + } } - } - delete pReconstruct; - pReconDoc->Modify(true); - pReconDoc->UpdateAllViews(this); - std::ostringstream os; - 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()); - } - } } @@ -831,7 +844,7 @@ ProjectionFileView::CreateChildFrame(wxDocument *doc, wxView *view) file_menu->AppendSeparator(); file_menu->Append(PJMENU_FILE_PROPERTIES, "P&roperties"); - + file_menu->AppendSeparator(); file_menu->Append(wxID_PRINT, "&Print..."); file_menu->Append(wxID_PRINT_SETUP, "Print &Setup..."); @@ -839,7 +852,7 @@ ProjectionFileView::CreateChildFrame(wxDocument *doc, wxView *view) wxMenu *process_menu = new wxMenu; process_menu->Append(PJMENU_PROCESS_RECONSTRUCT, "R&econstruct..."); - + wxMenu *help_menu = new wxMenu; help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents"); help_menu->AppendSeparator(); @@ -869,13 +882,13 @@ ProjectionFileView::OnCreate(wxDocument *doc, long WXUNUSED(flags) ) m_frame->GetClientSize(&width, &height); m_frame->SetTitle("ProjectionFileView"); m_canvas = CreateCanvas(this, m_frame); - + #ifdef __X__ int x, y; // X requires a forced resize m_frame->GetSize(&x, &y); m_frame->SetSize(-1, -1, x, y); #endif - + m_frame->Show(true); Activate(true); @@ -886,7 +899,7 @@ void ProjectionFileView::OnDraw (wxDC* dc) { if (m_bitmap.Ok()) - dc->DrawBitmap (m_bitmap, 0, 0, false); + dc->DrawBitmap (m_bitmap, 0, 0, false); } @@ -897,46 +910,46 @@ ProjectionFileView::OnUpdate(wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint) const int nDet = rProj.nDet(); const int nView = rProj.nView(); if (nDet != 0 && nView != 0) { - const DetectorArray& detarray = rProj.getDetectorArray(0); - const DetectorValue* detval = detarray.detValues(); - double min = detval[0]; - double max = detval[0]; - for (int iy = 0; iy < nView; iy++) { - const DetectorArray& detarray = rProj.getDetectorArray(iy); - const DetectorValue* detval = detarray.detValues(); - for (int ix = 0; ix < nDet; ix++) { - if (min > detval[ix]) - min = detval[ix]; - else if (max < detval[ix]) - max = detval[ix]; - } - } - - unsigned char* imageData = new unsigned char [nDet * nView * 3]; - double scale = (max - min) / 255; - for (int iy2 = 0; iy2 < nView; iy2++) { - const DetectorArray& detarray = rProj.getDetectorArray (iy2); - const DetectorValue* detval = detarray.detValues(); - for (int ix = 0; ix < nDet; ix++) { - int intensity = static_cast(((detval[ix] - min) / scale) + 0.5); - intensity = clamp(intensity, 0, 255); - int baseAddr = (iy2 * nDet + ix) * 3; - imageData[baseAddr] = imageData[baseAddr+1] = imageData[baseAddr+2] = intensity; - } - } - wxImage image (nDet, nView, imageData, true); - m_bitmap = image.ConvertToBitmap(); - delete imageData; - int xSize = nDet; - int ySize = nView; - xSize = clamp (xSize, 0, 800); - ySize = clamp (ySize, 0, 800); - m_frame->SetClientSize (xSize, ySize); - m_canvas->SetScrollbars (20, 20, nDet/20, nView/20); + const DetectorArray& detarray = rProj.getDetectorArray(0); + const DetectorValue* detval = detarray.detValues(); + double min = detval[0]; + double max = detval[0]; + for (int iy = 0; iy < nView; iy++) { + const DetectorArray& detarray = rProj.getDetectorArray(iy); + const DetectorValue* detval = detarray.detValues(); + for (int ix = 0; ix < nDet; ix++) { + if (min > detval[ix]) + min = detval[ix]; + else if (max < detval[ix]) + max = detval[ix]; + } + } + + unsigned char* imageData = new unsigned char [nDet * nView * 3]; + double scale = (max - min) / 255; + for (int iy2 = 0; iy2 < nView; iy2++) { + const DetectorArray& detarray = rProj.getDetectorArray (iy2); + const DetectorValue* detval = detarray.detValues(); + for (int ix = 0; ix < nDet; ix++) { + int intensity = static_cast(((detval[ix] - min) / scale) + 0.5); + intensity = clamp(intensity, 0, 255); + int baseAddr = (iy2 * nDet + ix) * 3; + imageData[baseAddr] = imageData[baseAddr+1] = imageData[baseAddr+2] = intensity; + } + } + wxImage image (nDet, nView, imageData, true); + m_bitmap = image.ConvertToBitmap(); + delete imageData; + int xSize = nDet; + int ySize = nView; + xSize = clamp (xSize, 0, 800); + ySize = clamp (ySize, 0, 800); + m_frame->SetClientSize (xSize, ySize); + m_canvas->SetScrollbars (20, 20, nDet/20, nView/20); } - + if (m_canvas) - m_canvas->Refresh(); + m_canvas->Refresh(); } bool @@ -944,15 +957,15 @@ ProjectionFileView::OnClose (bool deleteWindow) { if (!GetDocument()->Close()) return false; - + m_canvas->Clear(); m_canvas->m_pView = NULL; m_canvas = NULL; wxString s(wxTheApp->GetAppName()); if (m_frame) - m_frame->SetTitle(s); + m_frame->SetTitle(s); SetFrame(NULL); - + Activate(false); if (deleteWindow) { diff --git a/src/views.h b/src/views.h index 08fd7a8..9fb14a1 100644 --- a/src/views.h +++ b/src/views.h @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: views.h,v 1.10 2000/09/04 09:06:46 kevin Exp $ +** $Id: views.h,v 1.11 2000/12/18 09:31:26 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 @@ -67,6 +67,9 @@ public: void OnProperties (wxCommandEvent& event); void OnScaleAuto (wxCommandEvent& event); void OnScaleMinMax (wxCommandEvent& event); + + wxFrame* getFrame() + { return m_frame; } ImageFileDocument* GetDocument(void) { return dynamic_cast(wxView::GetDocument()); } @@ -124,6 +127,9 @@ public: bool OnClose (bool deleteWindow = true); void OnProperties (wxCommandEvent& event); void OnReconstruct (wxCommandEvent& event); + + wxFrame* getFrame () + { return m_frame; } ProjectionFileDocument* GetDocument(void) { return dynamic_cast(wxView::GetDocument()); } -- 2.34.1