72 const DataObjectPointerArray& inputs =
const_cast<Self*
>(
this)->GetInputs();
73 for (DataObjectPointerArray::const_iterator it = inputs.begin();
74 it != inputs.end(); ++it)
76 if (std::string(messageName) ==
77 (
static_cast<IGTLMessage*
>(it->GetPointer()))->GetName())
142 igtl::TransformMessage* tMsg =
143 (igtl::TransformMessage*)(input->
GetMessage().GetPointer());
148 mitkThrow() <<
"Cast from igtl::MessageBase to igtl::TransformMessage "
149 <<
"failed! Please check the message.";
153 for (
unsigned int i = 0; i < this->GetNumberOfOutputs(); ++i)
160 output->SetDataValid(
false);
165 igtl::Matrix4x4 transformation_;
166 tMsg->GetMatrix(transformation_);
167 mitk::AffineTransform3D::Pointer affineTransformation =
168 mitk::AffineTransform3D::New();
169 mitk::Matrix3D transformation;
170 mitk::Vector3D offset;
171 for (
unsigned int r = 0; r < 3; r++)
173 for (
unsigned int c = 0; c < 3; c++)
175 transformation.GetVnlMatrix().set(r, c, transformation_[r][c]);
177 offset.SetElement(r, transformation_[r][3]);
180 affineTransformation->SetMatrix(transformation);
181 affineTransformation->SetOffset(offset);
187 mitk::NavigationData::Pointer nd =
188 mitk::NavigationData::New(affineTransformation,
true);
190 nd->SetIGTTimeStamp(input->GetTimeStamp());
192 nd->SetName(input->GetName());
204 igtl::TrackingDataMessage* tdMsg =
205 (igtl::TrackingDataMessage*)(input->
GetMessage().GetPointer());
210 mitkThrow() <<
"Cast from igtl::MessageBase to igtl::TrackingDataMessage "
211 <<
"failed! Please check the message.";
215 unsigned int numTrackingDataElements =
216 tdMsg->GetNumberOfTrackingDataElements();
218 if (!numTrackingDataElements)
220 MITK_ERROR(
"IGTLMsgToNavDataFilter") <<
"There are no tracking data "
221 "elements in this message";
225 for (
unsigned int i = 0; i < this->GetNumberOfOutputs(); ++i)
231 output->SetDataValid(
false);
237 output->SetDataValid(
true);
240 igtl::TrackingDataElement::Pointer td;
241 tdMsg->GetTrackingDataElement(i, td);
244 igtl::Matrix4x4 transformation_;
245 td->GetMatrix(transformation_);
246 mitk::AffineTransform3D::Pointer affineTransformation =
247 mitk::AffineTransform3D::New();
248 mitk::Matrix3D transformation;
249 mitk::Vector3D offset;
250 for (
unsigned int r = 0; r < 3; r++)
252 for (
unsigned int c = 0; c < 3; c++)
254 transformation.GetVnlMatrix().set(r, c, transformation_[r][c]);
256 offset.SetElement(r, transformation_[r][3]);
259 affineTransformation->SetMatrix(transformation);
260 affineTransformation->SetOffset(offset);
262 mitk::NavigationData::Pointer nd;
265 vnl_matrix_fixed<ScalarType, 3, 3> rotationMatrix =
266 affineTransformation->GetMatrix().GetVnlMatrix();
267 vnl_matrix_fixed<ScalarType, 3, 3> rotationMatrixTransposed =
268 rotationMatrix.transpose();
271 if (!
Equal(1.0, vnl_det(rotationMatrix), 0.1)
272 || !((rotationMatrix*rotationMatrixTransposed).is_identity(0.1)))
274 MITK_ERROR(
"IGTLMsgToNavDataFilter") <<
"tried to initialize NavData "
275 <<
"with non-rotation matrix :" << rotationMatrix <<
" (Does your "
276 "AffineTransform3D object include spacing? This is not "
277 "supported by NavigationData objects!)";
278 nd = mitk::NavigationData::New();
286 nd = mitk::NavigationData::New(affineTransformation,
true);
289 nd->SetIGTTimeStamp(input->GetIGTTimeStamp());
291 nd->SetName(td->GetName());
303 igtl::QuaternionTrackingDataMessage* tdMsg =
304 (igtl::QuaternionTrackingDataMessage*)(input->
GetMessage().GetPointer());
309 mitkThrow() <<
"Cast from igtl::MessageBase to igtl::TrackingDataMessage "
310 <<
"failed! Please check the message.";
314 unsigned int numTrackingDataElements =
315 tdMsg->GetNumberOfQuaternionTrackingDataElements();
317 if (!numTrackingDataElements)
319 MITK_ERROR(
"IGTLMsgToNavDataFilter") <<
"There are no tracking data "
320 "elements in this message";
324 for (
unsigned int i = 0; i < this->GetNumberOfOutputs(); ++i)
330 output->SetDataValid(
false);
335 if (input->
IsDataValid() ==
false || i >= numTrackingDataElements)
339 output->SetDataValid(
true);
342 igtl::QuaternionTrackingDataElement::Pointer td;
343 tdMsg->GetQuaternionTrackingDataElement(i, td);
346 float quaternion_[4];
347 td->GetQuaternion(quaternion_);
348 mitk::Quaternion quaternion;
349 quaternion.put(0, quaternion_[0]);
350 quaternion.put(1, quaternion_[1]);
351 quaternion.put(2, quaternion_[2]);
352 quaternion.put(3, quaternion_[3]);
353 output->SetOrientation(quaternion);
354 output->SetHasOrientation(
true);
358 td->GetPosition(position_);
360 position.SetElement(0, position_[0]);
361 position.SetElement(1, position_[1]);
362 position.SetElement(2, position_[2]);
363 output->SetPosition(position);
364 output->SetHasPosition(
true);
366 output->SetIGTTimeStamp(input->GetTimeStamp());
368 output->SetName(td->GetName());
MITKIGTBASE_EXPORT bool Equal(const mitk::NavigationData &leftHandSide, const mitk::NavigationData &rightHandSide, ScalarType eps=mitk::eps, bool verbose=false)
Equal A function comparing two navigation data objects for beeing equal in meta- and imagedata.