Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "mitkNavigationDataRecorder.h"
00020 #include <fstream>
00021
00022 #include <mitkTimeStamp.h>
00023 #include <tinyxml.h>
00024
00025 #include <itksys/SystemTools.hxx>
00026 mitk::NavigationDataRecorder::NavigationDataRecorder()
00027 {
00028 m_NumberOfInputs = 0;
00029 m_RecordingMode = NormalFile;
00030 m_Recording = false;
00031 m_NumberOfRecordedFiles = 0;
00032 m_Stream = NULL;
00033 m_FileName = "";
00034
00035
00036 mitk::TimeStamp::GetInstance()->Start(this);
00037
00038 }
00039
00040 mitk::NavigationDataRecorder::~NavigationDataRecorder()
00041 {
00042 }
00043
00044
00045 void mitk::NavigationDataRecorder::GenerateData()
00046 {
00047
00048 }
00049
00050 void mitk::NavigationDataRecorder::AddNavigationData( const NavigationData* nd )
00051 {
00052
00053 this->SetNthInput(m_NumberOfInputs,
00054 const_cast< mitk::NavigationData * >( nd ) );
00055
00056 m_NumberOfInputs++;
00057
00058 this->Modified();
00059 }
00060
00061 void mitk::NavigationDataRecorder::SetRecordingMode( RecordingMode mode )
00062 {
00063 m_RecordingMode = mode;
00064 this->Modified();
00065 }
00066
00067 void mitk::NavigationDataRecorder::Update()
00068 {
00069 if (m_Recording)
00070 {
00071 DataObjectPointerArray inputs = this->GetInputs();
00072 mitk::NavigationData::TimeStampType timestamp=0.0;
00073 timestamp = mitk::TimeStamp::GetInstance()->GetElapsed();
00074
00075 for (unsigned int index = 0; index < inputs.size(); index++)
00076 {
00077 mitk::NavigationData* nd = dynamic_cast<mitk::NavigationData*>(inputs[index].GetPointer());
00078 nd->Update();
00079
00080 mitk::NavigationData::PositionType position;
00081 mitk::NavigationData::OrientationType orientation(0.0, 0.0, 0.0, 0.0);
00082 mitk::NavigationData::CovarianceMatrixType matrix;
00083
00084 bool hasPosition = true;
00085 bool hasOrientation = true;
00086 bool dataValid = false;
00087
00088 position.Fill(0.0);
00089 matrix.SetIdentity();
00090
00091 position = nd->GetPosition();
00092 orientation = nd->GetOrientation();
00093 matrix = nd->GetCovErrorMatrix();
00094
00095 hasPosition = nd->GetHasPosition();
00096 hasOrientation = nd->GetHasOrientation();
00097 dataValid = nd->IsDataValid();
00098
00099
00100
00101
00102
00103 if (timestamp >= 0)
00104 {
00105 TiXmlElement* elem = new TiXmlElement("ND");
00106
00107 elem->SetDoubleAttribute("Time", timestamp);
00108 elem->SetDoubleAttribute("Tool", index);
00109 elem->SetDoubleAttribute("X", position[0]);
00110 elem->SetDoubleAttribute("Y", position[1]);
00111 elem->SetDoubleAttribute("Z", position[2]);
00112
00113 elem->SetDoubleAttribute("QX", orientation[0]);
00114 elem->SetDoubleAttribute("QY", orientation[1]);
00115 elem->SetDoubleAttribute("QZ", orientation[2]);
00116 elem->SetDoubleAttribute("QR", orientation[3]);
00117
00118 elem->SetDoubleAttribute("C00", matrix[0][0]);
00119 elem->SetDoubleAttribute("C01", matrix[0][1]);
00120 elem->SetDoubleAttribute("C02", matrix[0][2]);
00121 elem->SetDoubleAttribute("C03", matrix[0][3]);
00122 elem->SetDoubleAttribute("C04", matrix[0][4]);
00123 elem->SetDoubleAttribute("C05", matrix[0][5]);
00124 elem->SetDoubleAttribute("C10", matrix[1][0]);
00125 elem->SetDoubleAttribute("C11", matrix[1][1]);
00126 elem->SetDoubleAttribute("C12", matrix[1][2]);
00127 elem->SetDoubleAttribute("C13", matrix[1][3]);
00128 elem->SetDoubleAttribute("C14", matrix[1][4]);
00129 elem->SetDoubleAttribute("C15", matrix[1][5]);
00130
00131 if (dataValid)
00132 elem->SetAttribute("Valid",1);
00133 else
00134 elem->SetAttribute("Valid",0);
00135
00136 if (hasOrientation)
00137 elem->SetAttribute("hO",1);
00138 else
00139 elem->SetAttribute("hO",0);
00140
00141 if (hasPosition)
00142 elem->SetAttribute("hP",1);
00143 else
00144 elem->SetAttribute("hP",0);
00145
00146 *m_Stream << " " << *elem << std::endl;
00147
00148 delete elem;
00149 }
00150 }
00151 }
00152 }
00153
00154 void mitk::NavigationDataRecorder::StartRecording()
00155 {
00156 if (m_Recording)
00157 {
00158 std::cout << "Already recording please stop before start new recording session" << std::endl;
00159 return;
00160 }
00161 if (m_Stream == NULL)
00162 {
00163 std::stringstream ss;
00164 std::ostream* stream;
00165
00166
00167 std::string tmpPath = itksys::SystemTools::GetFilenamePath(m_FileName);
00168 m_FileName = itksys::SystemTools::GetFilenameWithoutExtension(m_FileName);
00169 ss << tmpPath << "/" << m_FileName << "-" << m_NumberOfRecordedFiles << ".xml";
00170 switch(m_RecordingMode)
00171 {
00172 case Console:
00173 stream = &std::cout;
00174 break;
00175 case NormalFile:
00176
00177
00178 if (m_FileName == "")
00179 {
00180 stream = &std::cout;
00181 std::cout << "No file name or file path set the output is redirected to the console";
00182 }
00183 else
00184 {
00185 stream = new std::ofstream(ss.str().c_str());
00186 }
00187
00188 break;
00189 case ZipFile:
00190 stream = &std::cout;
00191 std::cout << "Sorry no ZipFile support yet";
00192 break;
00193 default:
00194 stream = &std::cout;
00195 break;
00196 }
00197 StartRecording(stream);
00198 }
00199
00200
00201
00202
00203 }
00204 void mitk::NavigationDataRecorder::StartRecording(std::ostream* stream)
00205 {
00206 if (m_Recording)
00207 {
00208 std::cout << "Already recording please stop before start new recording session" << std::endl;
00209 return;
00210 }
00211
00212 m_Stream = stream;
00213 m_Stream->precision(10);
00214
00215
00216 if (m_Stream)
00217 {
00218 *m_Stream << "<?xml version=\"1.0\" ?>" << std::endl;
00220
00221 *m_Stream << " " << "<Data ToolCount=\"" << (m_NumberOfInputs) << "\" version=\"1.0\">" << std::endl;
00222
00223 m_Recording = true;
00224 }
00225 }
00226 void mitk::NavigationDataRecorder::StopRecording()
00227 {
00228 if (!m_Recording)
00229 {
00230 std::cout << "You have to start a recording first" << std::endl;
00231 return;
00232 }
00233 if (m_Stream)
00234 {
00235 *m_Stream << "</Data>" << std::endl;
00236 }
00237
00238 m_NumberOfRecordedFiles++;
00239 m_Stream = NULL;
00240 m_Recording = false;
00241 }