00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00024 #ifdef _USE_WXWIDGETS_
00025
00026
00027 #include "bbwxvtkViewer2D.h"
00028 #include "bbwxvtkPackage.h"
00029
00030
00031 #include "vtkInteractorStyleImage.h"
00032 #include "vtkCamera.h"
00033 #include "vtkRenderer.h"
00034 #include <vtkInteractorStyleImage.h>
00035 #include <vtkCommand.h>
00036
00037
00038
00039 namespace bbwxvtk
00040 {
00041
00042 BBTK_ADD_BLACK_BOX_TO_PACKAGE(wxvtk,Viewer2D);
00043
00044
00045 Viewer2DWidget::Viewer2DWidget(Viewer2D* box,
00046 wxWindow *parent)
00047 :
00048 wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL),
00049 mBox(box)
00050 {
00051 wxPanel *panel = this;
00052
00053 wxvtkrenderwindowinteractor = new wxVTKRenderWindowInteractor(panel,-1);
00054 wxvtkrenderwindowinteractor->UseCaptureMouseOn();
00055
00056 imageViewer = vtkImageViewer2::New();
00057 imageViewer->SetSlice( 1 );
00058 imageViewer->SetupInteractor ( wxvtkrenderwindowinteractor );
00059
00060 mDefaultImage = vtkImageData::New();
00061 int dim[3];
00062 dim[0] = dim[1] = 32 ;
00063 dim[2] = 2;
00064 mDefaultImage->SetDimensions ( dim );
00065 mDefaultImage->SetSpacing(1,1,1);
00066 mDefaultImage->SetExtent(0,dim[0]-1,0,dim[1]-1,0,dim[2]-1);
00067 mDefaultImage->SetWholeExtent(0,dim[0]-1,0,dim[1]-1,0,dim[2]-1);
00068
00069 mDefaultImage->SetScalarTypeToUnsignedChar();
00070 mDefaultImage->AllocateScalars();
00071 for (int i=0;i<dim[0];i++)
00072 for (int j=0;j<dim[1];j++)
00073 for (int k=0;k<dim[2];k++)
00074 mDefaultImage->SetScalarComponentFromFloat(i,j,k,0,0);
00075
00076 for (int i=0;i<dim[0];i++)
00077 {
00078 mDefaultImage->SetScalarComponentFromFloat(dim[0]-i-1,i,0,0,255);
00079 mDefaultImage->SetScalarComponentFromFloat(i,i,1,0,255);
00080 }
00081
00082 backImageData = mDefaultImage;
00083 imageViewer->SetInput( backImageData );
00084 mUpdateCamera = true;
00085
00086 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
00087 sizer-> Add( wxvtkrenderwindowinteractor , 1, wxEXPAND, 0);
00088 panel-> SetSizer(sizer);
00089 panel-> SetAutoLayout(true);
00090 panel-> Layout();
00091
00092
00093 wxvtkrenderwindowinteractor->Refresh();
00094 wxvtkrenderwindowinteractor->Render();
00095 imageViewer->GetRenderer()->ResetCameraClippingRange();
00096
00097
00098 }
00099
00100
00101 Viewer2DWidget::~Viewer2DWidget()
00102 {
00103
00104
00105
00106
00107
00108
00109 mDefaultImage->Delete();
00110
00111 if (backImageData)
00112 {
00113
00114 }
00115 if (imageViewer)
00116 {
00117 imageViewer->Delete();
00118 }
00119 delete wxvtkrenderwindowinteractor;
00120
00121 }
00122
00123
00124
00125
00126
00127
00128 void Viewer2DWidget::UpdateView()
00129 {
00130
00131
00132
00133
00134 if ( ( mBox->bbGetInputIn() == NULL ) &&
00135 ( backImageData != mDefaultImage ) )
00136 {
00137 backImageData = mDefaultImage;
00138 mUpdateCamera = true;
00139 }
00140 else if ( ( mBox->bbGetInputIn() != NULL ) &&
00141 (backImageData != mBox->bbGetInputIn()) )
00142 {
00143 backImageData = mBox->bbGetInputIn();
00144 backImageData->Update();
00145 imageViewer->SetInput( backImageData );
00146 mUpdateCamera = true;
00147 }
00148
00149 if (mUpdateCamera)
00150 {
00151 int x1,x2,y1,y2,z1,z2;
00152 double spx,spy,spz;
00153 backImageData->GetSpacing(spx,spy,spz);
00154 backImageData->GetExtent (x1,x2,y1,y2,z1,z2);
00155
00156
00157
00158
00159
00160 vtkCamera *camera = imageViewer->GetRenderer()->GetActiveCamera();
00161
00162 camera->SetViewUp ( spx*0, -spy*1, spz*0 );
00163 camera->SetPosition ( spx*(x1+x2)/2, spy*(y1+y2)/2, -spz*10000000 );
00164 camera->SetFocalPoint( spx*(x1+x2)/2, spy*(y1+y2)/2, spz*0 );
00165
00166 camera->ComputeViewPlaneNormal();
00167 camera->SetParallelScale( spx*(x2-x1)/2.0 );
00168
00169
00170 mUpdateCamera = false;
00171 }
00172
00173
00174
00175
00176
00177 int orientation = mBox->bbGetInputOrientation();
00178 if (orientation<0 || orientation>2)
00179 orientation=2;
00180
00181
00182
00183
00184 if (
00185 (backImageData!=NULL)&&
00186 (mBox->bbIsShown()))
00187 {
00188 int z = mBox->bbGetInputSlice();
00189
00190 int ext[6];
00191 backImageData->GetWholeExtent(ext);
00192
00193
00194
00195 switch(orientation){
00196 case 0:
00197 if (z<ext[0]) { z=ext[0]; }
00198 if (z>ext[1]) { z=ext[1]; }
00199
00200 break;
00201
00202 case 1:
00203 if (z<ext[2]) { z=ext[2]; }
00204 if (z>ext[3]) { z=ext[3]; }
00205 break;
00206
00207 case 2:
00208 if (z<ext[4]) { z=ext[4]; }
00209 if (z>ext[5]) { z=ext[5]; }
00210 break;
00211
00212 default:
00213 z = ext[5];
00214 }
00215
00216 wxvtkrenderwindowinteractor->Update();
00217 wxvtkrenderwindowinteractor->Render();
00218 imageViewer->GetRenderer()->ResetCameraClippingRange();
00219
00220
00221
00222
00223
00224
00225
00226
00227 imageViewer->SetSliceOrientation (orientation);
00228 imageViewer->SetSlice( z );
00229
00230
00231 }
00232
00233
00234 }
00235
00236
00237 vtkRenderer * Viewer2DWidget::GetRenderer()
00238 {
00239 return imageViewer->GetRenderer();
00240 }
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252 BBTK_BLACK_BOX_IMPLEMENTATION(Viewer2D,bbtk::WxBlackBox);
00253
00254
00255 void Viewer2D::Process()
00256 {
00257
00258
00259
00260
00261
00262 ((Viewer2DWidget*)bbGetOutputWidget())->UpdateView();
00263 bbSetOutputOut( bbGetInputSlice() );
00264 bbSetOutputRenderer( ((Viewer2DWidget*)bbGetOutputWidget())->GetRenderer() );
00265
00266 }
00267
00268
00269 void Viewer2D::bbUserConstructor()
00270 {
00271 bbSetInputIn(NULL);
00272 bbSetInputSlice(0);
00273 }
00274
00280 void Viewer2D::CreateWidget()
00281 {
00282 bbtkDebugMessageInc("Core",9,"Viewer2D::CreateWidget()"<<std::endl);
00283
00284 Viewer2DWidget* w = new Viewer2DWidget(this,bbGetWxParent());
00285 bbSetOutputWidget(w);
00286
00287 bbtkDebugDecTab("Core",9);
00288 }
00289
00290
00291
00292
00293 void Viewer2D::bbUserOnShow()
00294 {
00295
00296 #if defined(_WIN32)
00297
00298 ((Viewer2DWidget*)bbGetOutputWidget())->Update();
00299 ((Viewer2DWidget*)bbGetOutputWidget())->UpdateView();
00300 #endif
00301
00302
00303
00304
00305
00306 }
00307
00308
00309 }
00310
00311 #endif
00312