]> Creatis software - bbtk.git/blob - packages/wxvtk/src/bbwxvtkMIPViewer.cxx
*** empty log message ***
[bbtk.git] / packages / wxvtk / src / bbwxvtkMIPViewer.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbwxvtkMIPViewer.cxx,v $
5   Language:  C++
6   Date:      $Date: 2008/03/03 13:14:27 $
7   Version:   $Revision: 1.1 $
8                                                                                 
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10   l'Image). All rights reserved. See Doc/License.txt or
11   http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
12                                                                                 
13      This software is distributed WITHOUT ANY WARRANTY; without even
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15      PURPOSE.  See the above copyright notices for more information.
16                                                                                 
17 =========================================================================*/
18 /**
19  *  \file 
20  *  \brief 
21  */
22
23
24
25 #ifdef _USE_WXWIDGETS_
26
27
28 #include "bbwxvtkMIPViewer.h"
29 #include "bbwxvtkPackage.h"
30 //#include <wx/dialog.h>
31
32 #include "vtkInteractorStyleImage.h"
33 #include "vtkCamera.h"
34 #include "vtkRenderer.h"
35
36
37
38 namespace bbwxvtk
39 {
40
41   BBTK_ADD_BLACK_BOX_TO_PACKAGE(wxvtk,MIPViewer);
42   
43
44   MIPViewerWidget::MIPViewerWidget(MIPViewer* v, wxWindow *parent)
45     :    
46     wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL),
47     mBox(v)
48   {
49     wxPanel *panel      = this;
50     
51     mImageData    = NULL;
52     
53     // Create the pipeline
54     mCast = vtkImageShiftScale::New();
55     mCast->SetOutputScalarTypeToUnsignedChar();
56     mCast->ClampOverflowOn();
57     
58     mMIP = vtkVolumeRayCastMIPFunction::New();
59     mMIP->SetMaximizeMethodToScalarValue();
60     
61     mMapper = vtkVolumeRayCastMapper::New();
62     mMapper->SetVolumeRayCastFunction(mMIP);
63     mMapper->SetInput(mCast->GetOutput()); // (smoother.GetOutput())
64     
65     
66     // Actor
67     mActor = vtkVolume::New();
68     mActor->SetMapper(mMapper);
69     
70     // Pipeline Viewer
71     // Camera
72     mCamera = vtkCamera::New();
73     mCamera->SetViewUp(0, 0, -1);
74     mCamera->SetPosition(0, 1, 0);
75     mCamera->SetFocalPoint(0, 0, 0);
76     mCamera->ComputeViewPlaneNormal();
77     mCamera->Dolly(1.5);
78     // Renderer
79     mRenderer = vtkRenderer::New();
80     mRenderer->AddActor(mActor);
81     mRenderer->SetActiveCamera(mCamera);
82     mRenderer->ResetCamera();
83     mRenderer->SetBackground(1,1,1);
84     mRenderer->ResetCameraClippingRange();
85     // Window
86     mRenderWindow = vtkRenderWindow::New();
87     mRenderWindow->SetSize(640, 480);
88     mRenderWindow->AddRenderer(mRenderer);
89     
90     mRenderWindowInteractor = new wxVTKRenderWindowInteractor(panel,-1);
91     mRenderWindowInteractor->UseCaptureMouseOn();       
92     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
93     sizer       -> Add( mRenderWindowInteractor , 1, wxEXPAND, 0);
94     panel       -> SetSizer(sizer);
95     panel       -> SetAutoLayout(true);
96     panel       -> Layout();
97     mRenderWindowInteractor->SetRenderWindow(mRenderWindow);
98
99     mBox->bbSetOutputInteractor(mRenderWindowInteractor);
100   }
101   //-------------------------------------------------------------------------
102   
103   MIPViewerWidget::~MIPViewerWidget()
104   {
105   }
106   
107   //-------------------------------------------------------------------------
108   void MIPViewerWidget::Update()
109   {
110
111     
112     if ( mImageData != mBox->bbGetInputIn() )
113       {
114         mImageData = mBox->bbGetInputIn();
115         
116         mCast->SetShift(0);
117         mCast->SetScale(1.0);
118         mCast->SetInput(mImageData);
119         
120         int x1,x2,y1,y2,z1,z2;
121         double spx,spy,spz;
122         mImageData->GetSpacing(spx,spy,spz);
123         mImageData->GetExtent (x1,x2,y1,y2,z1,z2);
124         
125         mCamera->SetViewUp ( spx*0, -spy*1, spz*0);
126         mCamera->SetPosition( spx*(x1+x2)/2, spy*(y1+y2)/2, -spz*z2*2 ); 
127         mCamera->SetFocalPoint  ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*(z1+z2)/2); 
128         mCamera->SetClippingRange( 0.01, 1000000 );
129         mCamera->ComputeViewPlaneNormal();
130         mCamera->Zoom( 1 );
131       }
132     mCast->SetScale( mBox->bbGetInputScale() / 100. );
133     mCast->SetShift( - mBox->bbGetInputShift() );
134     
135     mRenderWindowInteractor->Refresh();
136     
137     Refresh();
138   }
139
140
141
142
143   //--------------------------------------------------------------------------
144   //-------------------------------------------------------------------------
145   //--------------------------------------------------------------------------
146   //--------------------------------------------------------------------------
147
148
149   BBTK_USER_BLACK_BOX_IMPLEMENTATION(MIPViewer,bbtk::WxBlackBox);
150
151
152   void MIPViewer::Process() 
153   { 
154     ((MIPViewerWidget*)bbGetOutputWidget())->Update();
155   }
156   
157
158   /**
159    * \brief  Create wxWidget . 
160    *
161    *
162    */ 
163   void MIPViewer::CreateWidget()
164   {
165     bbtkDebugMessageInc("Core",9,"MIPViewer::CreateWidget()"<<std::endl);
166
167     MIPViewerWidget* w = new MIPViewerWidget(this,bbGetWxParent());
168     w->Update();
169     bbSetOutputWidget(w);
170
171     bbtkDebugDecTab("Core",9);
172   }
173
174
175 }//namespace bbtk
176
177 #endif
178