xz_slice_view.cpp

Go to the documentation of this file.
00001 //--------------------------------------------------
00012 //---------------------------------------------------
00013 
00014 #include "xz_slice_view.h"
00015 
00016 namespace imedgine 
00017 {
00018   XZSliceView::XZSliceView()
00019   : SlicePixelView(XZ_SLICE_VIEW)
00020   { 
00021   }
00022   
00023   //---------------------------------------------------
00024   
00025   XZSliceView::XZSliceView(view_type type)
00026   : SlicePixelView(type)
00027   { 
00028   }
00029   
00030   //---------------------------------------------------
00031   
00032   XZSliceView::XZSliceView(XZSliceView const& src)
00033   : SlicePixelView(src)
00034   {
00035   }    
00036   
00037   //---------------------------------------------------
00038   
00039   XZSliceView::~XZSliceView()
00040   {
00041 #ifdef DEBUG
00042     std::cout << "Deleting XZ_SLICE_VIEW id: " << std::endl;
00043 #endif
00044   }
00045   
00046   //---------------------------------------------------
00047   
00048   view_pointer_type XZSliceView::clone() const
00049   {
00050     return view_pointer_type(new XZSliceView(*this));
00051   }
00052   
00053   //---------------------------------------------------
00054     
00055   void XZSliceView::updateView()
00056       throw(NullPointerException)         
00057   {
00058     if ((volume_dataset_.get() == 0) || (volume_dataset_->isDataSet() == false))
00059     {
00060       return;
00061     }    
00062     
00063     external_data_pointer_type requested_slice;
00064     try
00065     {
00066       requested_slice = 
00067           volume_dataset_->getSliceXZ(volume_dataset_->getFocusPoint()[Y_DIMENSION]);
00068     }
00069     catch (IndexOutOfBoundsException const&)
00070     {
00071       requested_slice = 
00072           volume_dataset_->getSliceXZ(volume_dataset_->getSize()[Y_DIMENSION] - 1);  //take the last available slice
00073     }
00074   
00075     current_image_texture_->image.setValue(
00076         SbVec2s(volume_dataset_->getSize()[X_DIMENSION], 
00077                 volume_dataset_->getSize()[Z_DIMENSION]), 1, requested_slice);
00078 
00079     if ((second_volume_dataset_.get() != 0) && (second_volume_dataset_->isDataSet() == true))
00080     {         
00081       external_data_pointer_type second_requested_slice;
00082       try
00083       {
00084         second_requested_slice = 
00085             second_volume_dataset_->getSliceXZ(volume_dataset_->getFocusPoint()[Y_DIMENSION]);
00086       }
00087       catch (IndexOutOfBoundsException const&) 
00088       { 
00089         //take the last available slice
00090         second_requested_slice = 
00091             second_volume_dataset_->getSliceXZ(second_volume_dataset_->getSize()[Y_DIMENSION] - 1);  
00092       } 
00093      
00094       current_second_image_texture_->image.setValue(
00095           SbVec2s(second_volume_dataset_->getSize()[X_DIMENSION], 
00096                   second_volume_dataset_->getSize()[Z_DIMENSION]), 1, second_requested_slice);
00097       
00098       slice_dataset_material_->transparency = 0.5;
00099       slice_second_dataset_material_->transparency = 0.5;  
00100     }
00101     
00102     drawCrosshair();
00103     render_area_->updateSliceStatusInfo(getSliceIndex(), volume_dataset_->getSize()[Y_DIMENSION]);      
00104     
00105     SlicePixelView::updateView();   
00106   }
00107   
00108   //---------------------------------------------------
00109   
00110   void XZSliceView::onDataChangedEvent(dataset_attribute_type changed_attribute)
00111       throw(NullPointerException) 
00112   {
00113     if ((volume_dataset_.get() == 0) || (volume_dataset_->isDataSet() == false))
00114     {
00115       return;
00116     }
00117     
00118     switch (changed_attribute)
00119     {
00120       case DATASET_ATTRIBUTE_FOCUS_POINT :
00121       {
00122         if (current_focus_point_[Y_DIMENSION] != volume_dataset_->getFocusPoint()[Y_DIMENSION])
00123         {
00124          updateView();  
00125         }
00126     
00127         current_focus_point_ = volume_dataset_->getFocusPoint();
00128         break;
00129       }
00130       default :
00131       {
00132         break;
00133       }
00134     }
00135     SlicePixelView::onDataChangedEvent(changed_attribute);  
00136   }
00137   
00138   //---------------------------------------------------
00139   
00140   void XZSliceView::setFocusPoint2D(index_type x, index_type z)
00141       throw(NullPointerException)    
00142   {
00143     if ((volume_dataset_.get() == 0) || (volume_dataset_->isDataSet() == false))
00144     {
00145       return;
00146     } 
00147     
00148     //update focus point of dataset  
00149     try
00150     {
00151       volume_dataset_->setFocusPointAt(X_DIMENSION, x);
00152     }
00153     catch (IndexOutOfBoundsException const&)
00154     {
00155       volume_dataset_->setFocusPointAt(
00156           X_DIMENSION, volume_dataset_->getSize()[X_DIMENSION] - 1);
00157     }
00158     try
00159     {
00160       volume_dataset_->setFocusPointAt(Z_DIMENSION, z);
00161     }
00162     catch (IndexOutOfBoundsException const&)
00163     {
00164       volume_dataset_->setFocusPointAt(
00165           Z_DIMENSION, volume_dataset_->getSize()[Z_DIMENSION] - 1);
00166     }
00167     
00168     notifyDataChangedEvent(DATASET_ATTRIBUTE_FOCUS_POINT);   
00169   } 
00170    
00171   //---------------------------------------------------
00172   
00173   void XZSliceView::setSliceIndex(index_type slice_index)
00174       throw(NullPointerException)    
00175   {
00176     if ((volume_dataset_.get() == 0) || (volume_dataset_->isDataSet() == false))
00177     {
00178       return;
00179     }     
00180     
00181     try
00182     {
00183       volume_dataset_->setFocusPointAt(Y_DIMENSION, slice_index);
00184     }
00185     catch (IndexOutOfBoundsException const&)
00186     {
00187       volume_dataset_->setFocusPointAt(
00188           Y_DIMENSION, volume_dataset_->getSize()[Y_DIMENSION] - 1);
00189     }
00190   
00191     notifyDataChangedEvent(DATASET_ATTRIBUTE_FOCUS_POINT); 
00192   }
00193   
00194   //---------------------------------------------------
00195   
00196   index_type XZSliceView::getSliceIndex() const
00197   {
00198     return(current_focus_point_[Y_DIMENSION]);
00199   }
00200   
00201   //---------------------------------------------------
00202   
00203   index_type XZSliceView::getNumSlices() const
00204   {
00205     return(volume_dataset_->getSize()[Y_DIMENSION]);
00206   }   
00207   
00208   //---------------------------------------------------
00209   
00210   SbVec2s XZSliceView::getSliceResolution() const
00211   {
00212     if ((volume_dataset_.get() == 0) || (volume_dataset_->isDataSet() == false))
00213     {
00214       return(SbVec2s(0, 0)); 
00215     }
00216     return(SbVec2s(volume_dataset_->getSize()[X_DIMENSION], 
00217            volume_dataset_->getSize()[Z_DIMENSION]));
00218   }    
00219   
00220   //---------------------------------------------------
00221   
00222   SbVec2s XZSliceView::getSecondSliceResolution() const
00223   {  
00224     if ((second_volume_dataset_.get() == 0) ||
00225          (second_volume_dataset_->isDataSet() == false))
00226     {
00227       return(SbVec2s(0, 0)); 
00228     }
00229     return(SbVec2s(second_volume_dataset_->getSize()[X_DIMENSION],
00230            second_volume_dataset_->getSize()[Z_DIMENSION]));
00231   }    
00232   
00233   //---------------------------------------------------
00234   
00235   void XZSliceView::drawCrosshair()
00236   {
00237     SbVec2s current_focus_point_2D;  
00238     SbVec2f crosshair_origin;
00239       
00240     //mapping from 3D to relevant 2D points
00241     current_focus_point_2D[X_DIMENSION] = current_focus_point_[X_DIMENSION];
00242     current_focus_point_2D[Y_DIMENSION] = current_focus_point_[Z_DIMENSION];  
00243     
00244     render_area_->convertCoordsFromTextureToWorld(current_focus_point_2D, crosshair_origin);
00245     
00246     crosshair_coords_->point.set1Value(0, SbVec3f(-10, crosshair_origin[Y_DIMENSION], 0.01)); 
00247     crosshair_coords_->point.set1Value(1, SbVec3f(10, crosshair_origin[Y_DIMENSION], 0.01));
00248     crosshair_coords_->point.set1Value(2, SbVec3f(crosshair_origin[X_DIMENSION], -10, 0.01));
00249     crosshair_coords_->point.set1Value(3, SbVec3f(crosshair_origin[X_DIMENSION], 10, 0.01));
00250     
00251     crosshair_lines_->numVertices.setValue(4); 
00252   }   
00253 }

Generated on Sun Aug 13 18:19:41 2006 for iMEDgine by  doxygen 1.4.6