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);
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
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
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
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 }