diff --git a/Modules/IGT/Algorithms/mitkNavigationDataEvaluationFilter.cpp b/Modules/IGT/Algorithms/mitkNavigationDataEvaluationFilter.cpp index 76808d4051..e1307d2823 100644 --- a/Modules/IGT/Algorithms/mitkNavigationDataEvaluationFilter.cpp +++ b/Modules/IGT/Algorithms/mitkNavigationDataEvaluationFilter.cpp @@ -1,345 +1,369 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkNavigationDataEvaluationFilter.h" #include <mitkPointSetStatisticsCalculator.h> #define _USE_MATH_DEFINES #include <math.h> mitk::NavigationDataEvaluationFilter::NavigationDataEvaluationFilter() : mitk::NavigationDataToNavigationDataFilter() {} mitk::NavigationDataEvaluationFilter::~NavigationDataEvaluationFilter() {} void mitk::NavigationDataEvaluationFilter::GenerateData() { this->CreateOutputsForAllInputs(); // make sure that we have the same number of outputs as inputs this->CreateMembersForAllInputs(); /* update outputs with tracking data from tools */ for (unsigned int i = 0; i < this->GetNumberOfOutputs(); ++i) { // first copy outputs to inputs mitk::NavigationData *output = this->GetOutput(i); assert(output); const mitk::NavigationData *input = this->GetInput(i); assert(input); if (input->IsDataValid() == false) { output->SetDataValid(false); } else { output->Graft(input); } // then save statistics if (input->IsDataValid()) { m_LoggedPositions[i].push_back(input->GetPosition()); m_LoggedQuaternions[i].push_back(input->GetOrientation()); } else { m_InvalidSamples[i]++; } } } void mitk::NavigationDataEvaluationFilter::CreateMembersForAllInputs() { while (this->m_LoggedPositions.size() < this->GetNumberOfInputs()) { std::pair<std::size_t, std::vector<mitk::Point3D>> newElement(m_LoggedPositions.size(), std::vector<mitk::Point3D>()); m_LoggedPositions.insert(newElement); } while (this->m_LoggedQuaternions.size() < this->GetNumberOfInputs()) { std::pair<std::size_t, std::vector<mitk::Quaternion>> newElement(m_LoggedQuaternions.size(), std::vector<mitk::Quaternion>()); m_LoggedQuaternions.insert(newElement); } while (this->m_InvalidSamples.size() < this->GetNumberOfInputs()) { std::pair<std::size_t, int> newElement(m_InvalidSamples.size(), 0); m_InvalidSamples.insert(newElement); } } void mitk::NavigationDataEvaluationFilter::ResetStatistic() { for (unsigned int i = 0; i < m_LoggedPositions.size(); i++) m_LoggedPositions[i] = std::vector<mitk::Point3D>(); for (unsigned int i = 0; i < m_LoggedQuaternions.size(); i++) m_LoggedQuaternions[i] = std::vector<mitk::Quaternion>(); for (unsigned int i = 0; i < m_InvalidSamples.size(); i++) m_InvalidSamples[i] = 0; } int mitk::NavigationDataEvaluationFilter::GetNumberOfAnalysedNavigationData(int input) { return this->m_LoggedPositions[input].size(); } mitk::Point3D mitk::NavigationDataEvaluationFilter::GetPositionMean(int input) { mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(m_LoggedPositions[input])); return myCalculator->GetPositionMean(); } mitk::Vector3D mitk::NavigationDataEvaluationFilter::GetPositionStandardDeviation(int input) { mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(m_LoggedPositions[input])); return myCalculator->GetPositionStandardDeviation(); } mitk::Vector3D mitk::NavigationDataEvaluationFilter::GetPositionSampleStandardDeviation(int input) { mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(m_LoggedPositions[input])); return myCalculator->GetPositionSampleStandardDeviation(); } mitk::Quaternion mitk::NavigationDataEvaluationFilter::GetQuaternionMean(int input) { return GetMean(m_LoggedQuaternions[input]); } mitk::Quaternion mitk::NavigationDataEvaluationFilter::GetQuaternionStandardDeviation(int input) { mitk::Quaternion returnValue; std::vector<double> list1 = std::vector<double>(); std::vector<double> list2 = std::vector<double>(); std::vector<double> list3 = std::vector<double>(); std::vector<double> list4 = std::vector<double>(); for (unsigned int i = 0; i < m_LoggedQuaternions[input].size(); i++) { list1.push_back(m_LoggedQuaternions[input].at(i)[0]); list2.push_back(m_LoggedQuaternions[input].at(i)[1]); list3.push_back(m_LoggedQuaternions[input].at(i)[2]); list4.push_back(m_LoggedQuaternions[input].at(i)[3]); } mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(); returnValue[0] = myCalculator->GetStabw(list1); returnValue[1] = myCalculator->GetStabw(list2); returnValue[2] = myCalculator->GetStabw(list3); returnValue[3] = myCalculator->GetStabw(list4); return returnValue; } mitk::Vector3D mitk::NavigationDataEvaluationFilter::GetEulerAnglesMean(int input) { mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(QuaternionsToEulerAngles(m_LoggedQuaternions[input]))); mitk::Vector3D returnValue; returnValue[0] = myCalculator->GetPositionMean()[0]; returnValue[1] = myCalculator->GetPositionMean()[1]; returnValue[2] = myCalculator->GetPositionMean()[2]; return returnValue; } double mitk::NavigationDataEvaluationFilter::GetEulerAnglesRMS(int input) { mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(QuaternionsToEulerAngles(m_LoggedQuaternions[input]))); return myCalculator->GetPositionErrorRMS(); } double mitk::NavigationDataEvaluationFilter::GetEulerAnglesRMSDegree(int input) { mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(QuaternionsToEulerAnglesGrad(m_LoggedQuaternions[input]))); return myCalculator->GetPositionErrorRMS(); } double mitk::NavigationDataEvaluationFilter::GetToolAxisRSME(int input) { double returnValue = -1; - mitk::NavigationData::Pointer evaluationPoint = mitk::NavigationData::New(); - mitk::Point3D point; - mitk::FillVector3D(point, 0, 0, 1); - evaluationPoint->SetPosition(point); + mitk::Point3D evaluationPoint; + mitk::FillVector3D(evaluationPoint, 0, 0, 1); + + //compute mean transformed point + mitk::Point3D meanTransformedPoint; + mitk::FillVector3D(meanTransformedPoint, 0, 0, 0); + std::vector<mitk::Point3D> transformedPoints; for (int i = 0; i < m_LoggedPositions[input].size(); i++) { mitk::NavigationData::Pointer currentTransform = mitk::NavigationData::New(); currentTransform->SetPosition(m_LoggedPositions[input].at(i)); currentTransform->SetOrientation(m_LoggedQuaternions[input].at(i)); + mitk::NavigationData::Pointer transformedPoint = mitk::NavigationData::New(); + transformedPoint->SetPosition(evaluationPoint); + transformedPoint->Compose(currentTransform); + meanTransformedPoint[0] += transformedPoint->GetPosition()[0]; + meanTransformedPoint[1] += transformedPoint->GetPosition()[1]; + meanTransformedPoint[2] += transformedPoint->GetPosition()[2]; + transformedPoints.push_back(transformedPoint->GetPosition()); + } + meanTransformedPoint[0] /= m_LoggedPositions[input].size(); + meanTransformedPoint[1] /= m_LoggedPositions[input].size(); + meanTransformedPoint[2] /= m_LoggedPositions[input].size(); + + + //compute RMS of error values + returnValue = 0; + for (mitk::Point3D transformedPoint : transformedPoints) + { + double currentError = transformedPoint.EuclideanDistanceTo(meanTransformedPoint); + returnValue += pow(currentError,2); } + returnValue /= transformedPoints.size(); + returnValue = sqrt(returnValue); return returnValue; } double mitk::NavigationDataEvaluationFilter::GetPositionErrorMean(int input) { mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(m_LoggedPositions[input])); return myCalculator->GetPositionErrorMean(); } double mitk::NavigationDataEvaluationFilter::GetPositionErrorStandardDeviation(int input) { mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(m_LoggedPositions[input])); return myCalculator->GetPositionErrorStandardDeviation(); } double mitk::NavigationDataEvaluationFilter::GetPositionErrorSampleStandardDeviation(int input) { mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(m_LoggedPositions[input])); return myCalculator->GetPositionErrorSampleStandardDeviation(); } double mitk::NavigationDataEvaluationFilter::GetPositionErrorRMS(int input) { mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(m_LoggedPositions[input])); return myCalculator->GetPositionErrorRMS(); } double mitk::NavigationDataEvaluationFilter::GetPositionErrorMedian(int input) { mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(m_LoggedPositions[input])); return myCalculator->GetPositionErrorMedian(); } double mitk::NavigationDataEvaluationFilter::GetPositionErrorMax(int input) { mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(m_LoggedPositions[input])); return myCalculator->GetPositionErrorMax(); } double mitk::NavigationDataEvaluationFilter::GetPositionErrorMin(int input) { mitk::PointSetStatisticsCalculator::Pointer myCalculator = mitk::PointSetStatisticsCalculator::New(VectorToPointSet(m_LoggedPositions[input])); return myCalculator->GetPositionErrorMin(); } int mitk::NavigationDataEvaluationFilter::GetNumberOfInvalidSamples(int input) { return m_InvalidSamples[input]; } double mitk::NavigationDataEvaluationFilter::GetPercentageOfInvalidSamples(int input) { return (m_InvalidSamples[input] / (m_InvalidSamples[input] + ((double)m_LoggedPositions[input].size()))) * 100.0; } mitk::Quaternion mitk::NavigationDataEvaluationFilter::GetMean(std::vector<mitk::Quaternion> list) { // calculate mean mitk::Quaternion mean; mean[0] = 0; mean[1] = 0; mean[2] = 0; mean[3] = 0; for (unsigned int i = 0; i < list.size(); i++) { mean[0] += list.at(i)[0]; mean[1] += list.at(i)[1]; mean[2] += list.at(i)[2]; mean[3] += list.at(i)[3]; } mean[0] /= list.size(); mean[1] /= list.size(); mean[2] /= list.size(); mean[3] /= list.size(); return mean; } mitk::PointSet::Pointer mitk::NavigationDataEvaluationFilter::VectorToPointSet(std::vector<mitk::Point3D> pSet) { mitk::PointSet::Pointer returnValue = mitk::PointSet::New(); for (unsigned int i = 0; i < pSet.size(); i++) returnValue->InsertPoint(i, pSet.at(i)); return returnValue; } mitk::PointSet::Pointer mitk::NavigationDataEvaluationFilter::VectorToPointSet(std::vector<mitk::Vector3D> pSet) { mitk::PointSet::Pointer returnValue = mitk::PointSet::New(); for (unsigned int i = 0; i < pSet.size(); i++) { mitk::Point3D thisPoint; thisPoint[0] = pSet.at(i)[0]; thisPoint[1] = pSet.at(i)[1]; thisPoint[2] = pSet.at(i)[2]; returnValue->InsertPoint(i, thisPoint); } return returnValue; } std::vector<mitk::Vector3D> mitk::NavigationDataEvaluationFilter::QuaternionsToEulerAngles( std::vector<mitk::Quaternion> quaterions) { std::vector<mitk::Vector3D> returnValue = std::vector<mitk::Vector3D>(); for (unsigned int i = 0; i < quaterions.size(); i++) { mitk::Vector3D eulerAngles; mitk::Quaternion currentQuaternion = quaterions.at(i); currentQuaternion .normalize(); // must be normalized due to the documentation of the vnl method rotation_euler_angles() eulerAngles[0] = currentQuaternion.rotation_euler_angles()[0]; eulerAngles[1] = currentQuaternion.rotation_euler_angles()[1]; eulerAngles[2] = currentQuaternion.rotation_euler_angles()[2]; returnValue.push_back(eulerAngles); } return returnValue; } std::vector<mitk::Vector3D> mitk::NavigationDataEvaluationFilter::QuaternionsToEulerAnglesGrad( std::vector<mitk::Quaternion> quaterions) { double PI = M_PI; std::vector<mitk::Vector3D> returnValue = std::vector<mitk::Vector3D>(); std::vector<mitk::Vector3D> eulerAnglesRadians = QuaternionsToEulerAngles(quaterions); for (unsigned int i = 0; i < eulerAnglesRadians.size(); i++) { mitk::Vector3D currentAngles; currentAngles[0] = (eulerAnglesRadians.at(i)[0] / PI) * 180; currentAngles[1] = (eulerAnglesRadians.at(i)[1] / PI) * 180; currentAngles[2] = (eulerAnglesRadians.at(i)[2] / PI) * 180; returnValue.push_back(currentAngles); } return returnValue; } mitk::Point3D mitk::NavigationDataEvaluationFilter::GetLoggedPosition(unsigned int i, int input) { mitk::Point3D returnValue; if (m_LoggedPositions[input].size() <= i) returnValue.Fill(0); else returnValue = m_LoggedPositions[input].at(i); return returnValue; } mitk::Quaternion mitk::NavigationDataEvaluationFilter::GetLoggedOrientation(unsigned int i, int input) { mitk::Quaternion returnValue; if (m_LoggedQuaternions[input].size() <= i) returnValue.fill(0); else returnValue = m_LoggedQuaternions[input].at(i); return returnValue; } diff --git a/Plugins/org.mitk.gui.qt.igt.app.hummelprotocolmeasurements/src/internal/QmitkIGTTrackingDataEvaluationViewControls.ui b/Plugins/org.mitk.gui.qt.igt.app.hummelprotocolmeasurements/src/internal/QmitkIGTTrackingDataEvaluationViewControls.ui index 37ec958796..b30a9022b0 100644 --- a/Plugins/org.mitk.gui.qt.igt.app.hummelprotocolmeasurements/src/internal/QmitkIGTTrackingDataEvaluationViewControls.ui +++ b/Plugins/org.mitk.gui.qt.igt.app.hummelprotocolmeasurements/src/internal/QmitkIGTTrackingDataEvaluationViewControls.ui @@ -1,1716 +1,1719 @@ <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>QmitkIGTTrackingDataEvaluationViewControls</class> <widget class="QWidget" name="QmitkIGTTrackingDataEvaluationViewControls"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>383</width> <height>711</height> </rect> </property> <property name="minimumSize"> <size> <width>0</width> <height>0</height> </size> </property> <property name="windowTitle"> <string>QmitkTemplate</string> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <widget class="QTabWidget" name="tabWidget"> <property name="currentIndex"> <number>0</number> </property> <widget class="QWidget" name="tab"> <attribute name="title"> <string>Evaluation</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QLabel" name="label"> <property name="text"> <string>Input File List (recorded tracking data / *.csv):</string> </property> </widget> </item> <item> <widget class="QListWidget" name="m_FileList"/> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <spacer name="horizontalSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="m_LoadInputFileList"> <property name="minimumSize"> <size> <width>120</width> <height>0</height> </size> </property> <property name="text"> <string>Load New List</string> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_6"> <item> <spacer name="horizontalSpacer_4"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="m_AddToCurrentList"> <property name="minimumSize"> <size> <width>120</width> <height>0</height> </size> </property> <property name="text"> <string>Add To Current List</string> </property> </widget> </item> </layout> </item> <item> <widget class="Line" name="line_3"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <widget class="QLabel" name="label_17"> <property name="text"> <string>(1) - VISUALIZATION - of all data sets:</string> </property> </widget> </item> <item> <widget class="QPushButton" name="m_GeneratePointSetOfMeanPositions"> <property name="text"> <string>Generate PointSet of Mean Positions</string> </property> </widget> </item> <item> <widget class="QPushButton" name="m_GeneratePointSetsOfSinglePositions"> <property name="text"> <string>Generate PointSets of Single Positions</string> </property> </widget> </item> <item> <widget class="QPushButton" name="m_GenerateRotationLines"> <property name="text"> <string>Generate Lines for Rotation</string> </property> </widget> </item> <item> <widget class="Line" name="line_4"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <widget class="QLabel" name="label_19"> <property name="text"> <string>(2) - JITTER - Evaluation per file / data set:</string> </property> </widget> </item> <item> <widget class="QPushButton" name="m_StartEvaluation"> <property name="minimumSize"> <size> <width>0</width> <height>0</height> </size> </property> <property name="maximumSize"> <size> <width>16777215</width> <height>16777215</height> </size> </property> <property name="text"> <string>COMPUTE RESULTS PER DATA SET</string> </property> </widget> </item> <item> <widget class="Line" name="line_5"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <widget class="QLabel" name="label_20"> <property name="text"> <string>(3) - ACCURACY - Evaluation of all data sets:</string> </property> </widget> </item> <item> <widget class="QPushButton" name="m_StartEvaluationAll"> <property name="minimumSize"> <size> <width>0</width> <height>0</height> </size> </property> <property name="maximumSize"> <size> <width>16777215</width> <height>16777215</height> </size> </property> <property name="text"> <string>COMPUTE RESULTS OF ALL DATA</string> </property> </widget> </item> <item> <widget class="Line" name="line_6"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <widget class="QLabel" name="label_21"> <property name="text"> <string>(4) - GRID MATCHING - Evaluation of all data sets:</string> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_19"> <item> <widget class="QLabel" name="label_22"> <property name="text"> <string>Reference PointSet:</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer_20"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QmitkDataStorageComboBox" name="m_ReferencePointSetComboBox"> <property name="minimumSize"> <size> <width>150</width> <height>0</height> </size> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_20"> <item> <widget class="QLabel" name="label_23"> <property name="text"> <string>Measurement PointSet:</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer_21"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QmitkDataStorageComboBox" name="m_MeasurementPointSetComboBox"> <property name="minimumSize"> <size> <width>150</width> <height>0</height> </size> </property> </widget> </item> </layout> </item> <item> <widget class="QPushButton" name="m_GridMatching"> <property name="minimumSize"> <size> <width>0</width> <height>0</height> </size> </property> <property name="maximumSize"> <size> <width>16777215</width> <height>16777215</height> </size> </property> <property name="text"> <string>PERFOM GRID MATCHING</string> </property> </widget> </item> <item> <widget class="Line" name="line_7"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <widget class="QLabel" name="label_24"> <property name="text"> <string>(5) - ROTATION - Evaluation of all data sets:</string> </property> </widget> </item> <item> <widget class="QPushButton" name="m_ComputeRotation"> <property name="minimumSize"> <size> <width>0</width> <height>0</height> </size> </property> <property name="maximumSize"> <size> <width>16777215</width> <height>16777215</height> </size> </property> <property name="text"> <string>COMPUTE ROTATION ERRORS</string> </property> </widget> </item> <item> <spacer name="spacer1"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>220</height> </size> </property> </spacer> </item> </layout> </widget> <widget class="QWidget" name="tab_2"> <attribute name="title"> <string>Settings</string> </attribute> <layout class="QGridLayout" name="gridLayout_5"> <item row="0" column="0"> <widget class="QToolBox" name="toolBox"> <widget class="QWidget" name="page_5"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>356</width> <height>551</height> </rect> </property> <attribute name="label"> <string>General</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_4"> <item> <widget class="QGroupBox" name="GeneralOptions"> <property name="title"> <string/> </property> <layout class="QVBoxLayout" name="verticalLayout_5"> <item> <layout class="QHBoxLayout" name="horizontalLayout_4"> <item> <widget class="QLabel" name="label_3"> <property name="text"> <string>Number of samples to analyze:</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer_5"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>60</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QSpinBox" name="m_NumberOfSamples"> <property name="maximum"> <number>1000000</number> </property> <property name="value"> - <number>150</number> + <number>100</number> </property> </widget> </item> </layout> </item> <item> <widget class="Line" name="line_8"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <widget class="QLabel" name="label_15"> <property name="text"> <string>Tracking Volume (culumns x rows on Hummel Board):</string> </property> </widget> </item> <item> <widget class="QRadioButton" name="m_standardVolume"> <property name="text"> <string>Standard Volume (10 X 9 Positions)</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> </item> <item> <widget class="QRadioButton" name="m_mediumVolume"> <property name="text"> <string>Medium Volume (5 X 5 Positions)</string> </property> </widget> </item> <item> <widget class="QRadioButton" name="m_medium5x6Volume"> <property name="text"> <string>Medium Volume (6 X 5 Positions)</string> </property> </widget> </item> <item> <widget class="QRadioButton" name="m_smallVolume"> <property name="text"> <string>Small Volume (4 X 3 Positions)</string> </property> </widget> </item> <item> <widget class="Line" name="line_9"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <widget class="QLabel" name="label_40"> <property name="text"> <string>Rotation Evaluation:</string> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_26"> <item> <widget class="QLabel" name="label_41"> <property name="text"> <string>Rotation Vector:</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer_28"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="label_42"> <property name="text"> <string>X</string> </property> </widget> </item> <item> <widget class="QSpinBox" name="m_rotVecX"> <property name="maximum"> <number>99999</number> </property> <property name="value"> <number>1</number> </property> </widget> </item> <item> <spacer name="horizontalSpacer_27"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="label_43"> <property name="text"> <string>Y</string> </property> </widget> </item> <item> <widget class="QSpinBox" name="m_rotVecY"> <property name="maximum"> <number>99999</number> </property> </widget> </item> <item> <spacer name="horizontalSpacer_26"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLabel" name="label_44"> <property name="text"> <string>Z</string> </property> </widget> </item> <item> <widget class="QSpinBox" name="m_rotVecZ"> <property name="maximum"> <number>99999</number> </property> <property name="value"> <number>0</number> </property> </widget> </item> </layout> </item> <item> <widget class="Line" name="line_10"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <widget class="QLabel" name="label_2"> <property name="text"> <string>Result CSV Filename:</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="m_OutputFilename"> <property name="text"> <string>D:/tmp/output.csv</string> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_17"> <item> <widget class="QLabel" name="label_18"> <property name="text"> <string>Prefix for Data Nodes:</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="m_prefix"/> </item> </layout> </item> <item> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> </layout> </widget> </item> </layout> </widget> <widget class="QWidget" name="page"> <property name="geometry"> <rect> <x>0</x> <y>0</y> - <width>324</width> + <width>262</width> <height>765</height> </rect> </property> <attribute name="label"> <string>.csv file input options</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_13"> <item> <widget class="QGroupBox" name="groupBox_9"> <property name="title"> <string>Presets</string> </property> <layout class="QVBoxLayout" name="verticalLayout_20"> <item> <widget class="QPushButton" name="m_loadMITKPresets"> <property name="text"> <string>Load MITK tracking data csv file presets</string> </property> </widget> </item> <item> <widget class="QPushButton" name="m_loadPolhemusPresets"> <property name="text"> <string>Load Polhemus csv file presets</string> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="m_FileOptionsBox"> <property name="title"> <string>File Options:</string> </property> <layout class="QVBoxLayout" name="verticalLayout_12"> <item> <layout class="QHBoxLayout" name="horizontalLayout_5"> <item> <widget class="QLabel" name="label_16"> <property name="text"> <string>Scaling factor to convert to mm :</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer_15"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>38</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QDoubleSpinBox" name="m_ScalingFactor"> <property name="minimum"> <double>1.000000000000000</double> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_23"> <item> <widget class="QLabel" name="label_26"> <property name="text"> <string>Separator in the csv file: </string> </property> </widget> </item> <item> <spacer name="horizontalSpacer_25"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>60</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QLineEdit" name="m_SeparatorSign"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="maximumSize"> <size> <width>40</width> <height>16777215</height> </size> </property> <property name="text"> <string>;</string> </property> <property name="maxLength"> <number>1</number> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_25"> <item> <widget class="QLabel" name="label_25"> <property name="text"> <string>Use every n-th smaple n:</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer_24"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QSpinBox" name="m_SampleCount"> <property name="value"> <number>1</number> </property> </widget> </item> </layout> </item> <item> <widget class="QCheckBox" name="m_HeaderRow"> <property name="text"> <string>The csv file has a header row</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="CoordinateType"> <property name="title"> <string>Type of Coordinate System:</string> </property> <layout class="QVBoxLayout" name="verticalLayout_19"> <item> <layout class="QHBoxLayout" name="horizontalLayout_24"> <item> <widget class="QRadioButton" name="m_LeftHanded"> <property name="text"> <string>Left handed </string> </property> </widget> </item> <item> <widget class="QRadioButton" name="m_RigthHanded"> <property name="text"> <string>Right handed</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> </item> </layout> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="PositionAndOrientationOptions"> <property name="title"> <string>Position and Orientation Options:</string> </property> <layout class="QVBoxLayout" name="verticalLayout_11"> <item> <layout class="QGridLayout" name="gridLayout"> <item row="2" column="0"> <widget class="QLabel" name="label_28"> <property name="text"> <string>Y</string> </property> </widget> </item> <item row="2" column="1"> <widget class="QSpinBox" name="m_YPos"> <property name="value"> <number>3</number> </property> </widget> </item> <item row="3" column="0"> <widget class="QLabel" name="label_29"> <property name="text"> <string>Z</string> </property> </widget> </item> <item row="3" column="1"> <widget class="QSpinBox" name="m_ZPos"> <property name="value"> <number>4</number> </property> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="label_27"> <property name="text"> <string>X</string> </property> </widget> </item> <item row="1" column="1"> <widget class="QSpinBox" name="m_XPos"> <property name="value"> <number>2</number> </property> </widget> </item> <item row="0" column="0"> <widget class="QLabel" name="label_4"> <property name="text"> <string>Coordinate:</string> </property> </widget> </item> <item row="0" column="1"> <widget class="QLabel" name="label_5"> <property name="text"> <string>Colum number:</string> </property> </widget> </item> </layout> </item> <item> <widget class="QRadioButton" name="m_UseQuats"> <property name="text"> <string>Use Quaternions for Orientation</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> </item> <item> <layout class="QGridLayout" name="gridLayout_2"> <item row="4" column="0"> <widget class="QLabel" name="label_35"> <property name="text"> <string>Qr</string> </property> </widget> </item> <item row="3" column="1"> <widget class="QSpinBox" name="m_Qz"> <property name="value"> <number>7</number> </property> </widget> </item> <item row="2" column="0"> <widget class="QLabel" name="label_33"> <property name="text"> <string>Qy</string> </property> </widget> </item> <item row="4" column="1"> <widget class="QSpinBox" name="m_Qr"> <property name="value"> <number>8</number> </property> </widget> </item> <item row="2" column="1"> <widget class="QSpinBox" name="m_Qy"> <property name="value"> <number>6</number> </property> </widget> </item> <item row="1" column="1"> <widget class="QSpinBox" name="m_Qx"> <property name="value"> <number>5</number> </property> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="label_32"> <property name="text"> <string>Qx</string> </property> </widget> </item> <item row="3" column="0"> <widget class="QLabel" name="label_34"> <property name="text"> <string>Qz</string> </property> </widget> </item> <item row="0" column="0"> <widget class="QLabel" name="label_6"> <property name="text"> <string>Quaternion component:</string> </property> </widget> </item> <item row="0" column="1"> <widget class="QLabel" name="label_36"> <property name="text"> <string>Column number:</string> </property> </widget> </item> </layout> </item> <item> <widget class="QRadioButton" name="m_UseEuler"> <property name="text"> <string>Use Euler Angles for Orientation</string> </property> </widget> </item> <item> <layout class="QGridLayout" name="gridLayout_3"> <item row="0" column="1"> <widget class="QLabel" name="label_30"> <property name="text"> <string>Column number:</string> </property> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="label_37"> <property name="text"> <string>Azimuth</string> </property> </widget> </item> <item row="2" column="1"> <widget class="QSpinBox" name="m_Elevation"> <property name="minimum"> <number>-1</number> </property> </widget> </item> <item row="3" column="0"> <widget class="QLabel" name="label_39"> <property name="text"> <string>Roll</string> </property> </widget> </item> <item row="0" column="0"> <widget class="QLabel" name="label_7"> <property name="text"> <string>Angle:</string> </property> </widget> </item> <item row="3" column="1"> <widget class="QSpinBox" name="m_Roll"> <property name="minimum"> <number>-1</number> </property> </widget> </item> <item row="2" column="0"> <widget class="QLabel" name="label_38"> <property name="text"> <string>Elevation</string> </property> </widget> </item> <item row="1" column="1"> <widget class="QSpinBox" name="m_Azimuth"> <property name="minimum"> <number>-1</number> </property> </widget> </item> </layout> </item> <item> <widget class="QWidget" name="EulerUnity" native="true"> <layout class="QVBoxLayout" name="verticalLayout_18"> <item> <widget class="QLabel" name="label_31"> <property name="text"> <string>Unity for Euler Angles:</string> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_22"> <item> <widget class="QRadioButton" name="m_Radiants"> <property name="text"> <string>Radiants</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> </item> <item> <widget class="QRadioButton" name="m_Degrees"> <property name="text"> <string>Degrees</string> </property> <property name="checked"> <bool>false</bool> </property> </widget> </item> </layout> </item> </layout> </widget> </item> </layout> </widget> </item> </layout> </widget> <widget class="QWidget" name="toolBoxPage1"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>341</width> <height>568</height> </rect> </property> <attribute name="label"> <string>Output per data set</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_17"> <item> <widget class="QGroupBox" name="groupBox"> <property name="title"> <string>Position</string> </property> <layout class="QVBoxLayout" name="verticalLayout_14"> <item> <widget class="QCheckBox" name="m_settingPosMean"> <property name="text"> <string>Mean (x,y,z)</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> </item> <item> <widget class="QCheckBox" name="m_settingPosStabw"> <property name="text"> <string>Standard Deviation (x,y,z)</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="m_settingPosSampleStabw"> <property name="text"> <string>Sample Standard Deviation (x,y,z)</string> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="groupBox_6"> <property name="title"> <string>Orientation</string> </property> <layout class="QVBoxLayout" name="verticalLayout_3"> <item> <widget class="QCheckBox" name="m_settingQuaternionMean"> <property name="text"> <string>Quaternion Mean (qx,qy,qz,qr)</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="m_QuaternionMeanSlerp"> <property name="text"> <string>Quaternion Mean (SLERP)</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="m_settionQuaternionStabw"> <property name="text"> <string>Quaternion Standard Deviation (qx,qy,qz,qr)</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="m_settingEulerMean"> <property name="text"> <string>Euler Mean (tx,ty,tz)</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="m_settingDifferenceAngles"> <property name="text"> <string>Difference Angles to all other Positions</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="m_DifferencesSLERP"> <property name="text"> <string>Difference Angles to all other Positions (SLERP)</string> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="groupBox_7"> <property name="title"> <string>Position Error</string> </property> <layout class="QVBoxLayout" name="verticalLayout_15"> <item> <widget class="QCheckBox" name="m_settingPosErrorMean"> <property name="text"> <string>Mean</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="m_settingPosErrorStabw"> <property name="text"> <string>Standard Deviation</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="m_settingPosErrorSampleStabw"> <property name="text"> <string>Sample Standard Deviation</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="m_settingPosErrorRMS"> <property name="text"> <string>RMS</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> </item> <item> <widget class="QCheckBox" name="m_settingPosErrorMedian"> <property name="text"> <string>Median</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="m_settingPosErrorMinMax"> <property name="text"> <string>Min/Max</string> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="groupBox_10"> <property name="title"> <string>Tool Axis Error</string> </property> <layout class="QVBoxLayout" name="verticalLayout_21"> <item> <widget class="QCheckBox" name="m_toolAxisRSME"> <property name="text"> <string>Tool Axis RSME at Z=1.0</string> </property> + <property name="checked"> + <bool>true</bool> + </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="groupBox_8"> <property name="title"> <string>Orientation Error</string> </property> <layout class="QVBoxLayout" name="verticalLayout_16"> <item> <widget class="QCheckBox" name="m_settingEulerRMS"> <property name="text"> <string>Euler RMS</string> </property> </widget> </item> </layout> </widget> </item> </layout> </widget> </widget> </item> </layout> </widget> <widget class="QWidget" name="tab_3"> <attribute name="title"> <string>Tools</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_10"> <item> <widget class="QGroupBox" name="groupBox_2"> <property name="title"> <string>Point Set Ground Truth Generator</string> </property> <layout class="QVBoxLayout" name="verticalLayout_6"> <item> <layout class="QHBoxLayout" name="horizontalLayout_8"> <item> <widget class="QLabel" name="label_8"> <property name="text"> <string>Generate</string> </property> </widget> </item> <item> <widget class="QSpinBox" name="m_PointNumber1"> <property name="minimum"> <number>1</number> </property> <property name="maximum"> <number>999</number> </property> <property name="value"> <number>10</number> </property> </widget> </item> <item> <widget class="QLabel" name="label_9"> <property name="text"> <string>X</string> </property> </widget> </item> <item> <widget class="QSpinBox" name="m_PointNumber2"> <property name="minimum"> <number>1</number> </property> <property name="maximum"> <number>999</number> </property> <property name="value"> <number>9</number> </property> </widget> </item> <item> <widget class="QLabel" name="label_10"> <property name="text"> <string>Point Set</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer_7"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_7"> <item> <widget class="QLabel" name="label_11"> <property name="text"> <string>Inter Point Distance (in mm):</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer_8"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QSpinBox" name="m_PointDistance"> <property name="minimum"> <number>1</number> </property> <property name="maximum"> <number>99999</number> </property> <property name="value"> <number>50</number> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_9"> <item> <spacer name="horizontalSpacer_6"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="m_GeneratePointSet"> <property name="text"> <string>Generate</string> </property> </widget> </item> </layout> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="groupBox_3"> <property name="title"> <string>Result CSV File to NavigationData Converter</string> </property> <layout class="QVBoxLayout" name="verticalLayout_7"> <item> <widget class="QRadioButton" name="m_ConvertSingleFile"> <property name="text"> <string>Convert Single File</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> </item> <item> <widget class="QLabel" name="label_12"> <property name="text"> <string>Input CSV Logging File:</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="m_InputCSV"> <property name="text"> <string>C:/Tools/test.csv</string> </property> </widget> </item> <item> <widget class="QLabel" name="label_13"> <property name="text"> <string>Output Navigation Data File:</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="m_OutputXML"> <property name="text"> <string>C:/Tools/testoutput.xml</string> </property> </widget> </item> <item> <widget class="Line" name="line_2"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <widget class="QRadioButton" name="m_ConvertFileList"> <property name="text"> <string>Convert File List</string> </property> </widget> </item> <item> <widget class="QLabel" name="label_14"> <property name="text"> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-style:italic;">(use text files with a complete filename in every line)</span></p></body></html></string> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_11"> <item> <widget class="QLabel" name="m_labelCSVtoXMLInputList"> <property name="text"> <string>not loaded</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer_10"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="m_loadCSVtoXMLInputList"> <property name="minimumSize"> <size> <width>100</width> <height>0</height> </size> </property> <property name="text"> <string>Load Input List</string> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_12"> <item> <widget class="QLabel" name="m_labelCSVtoXMLOutputList"> <property name="text"> <string>not loaded</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer_11"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="m_loadCSVtoXMLOutputList"> <property name="minimumSize"> <size> <width>100</width> <height>0</height> </size> </property> <property name="text"> <string>Load Output List</string> </property> </widget> </item> </layout> </item> <item> <widget class="Line" name="line"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_14"> <item> <spacer name="horizontalSpacer_12"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QGroupBox" name="groupBox_4"> <property name="title"> <string>Output Format</string> </property> <layout class="QVBoxLayout" name="verticalLayout_9"> <item> <widget class="QRadioButton" name="m_ConvertXML"> <property name="text"> <string>XML</string> </property> <property name="checked"> <bool>true</bool> </property> </widget> </item> <item> <widget class="QRadioButton" name="m_ConvertCSV"> <property name="text"> <string>CSV</string> </property> </widget> </item> </layout> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_10"> <item> <spacer name="horizontalSpacer_9"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="m_Convert"> <property name="text"> <string>Convert</string> </property> </widget> </item> </layout> </item> </layout> </widget> </item> <item> <widget class="QGroupBox" name="groupBox_5"> <property name="title"> <string>Orientation Calculation (out of three positions)</string> </property> <layout class="QVBoxLayout" name="verticalLayout_8"> <item> <layout class="QHBoxLayout" name="horizontalLayout_13"> <item> <spacer name="horizontalSpacer_13"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="m_OrientationCalculationGenerateReference"> <property name="text"> <string>Generate Reference From Current List</string> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_15"> <item> <spacer name="horizontalSpacer_14"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="m_OrientationCalculationWriteOrientationsToFile"> <property name="text"> <string>Write Orientation Quaternions To File</string> </property> </widget> </item> </layout> </item> </layout> </widget> </item> <item> <spacer name="verticalSpacer_3"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>632</height> </size> </property> </spacer> </item> </layout> </widget> </widget> </item> </layout> </widget> <layoutdefault spacing="6" margin="11"/> <customwidgets> <customwidget> <class>QmitkDataStorageComboBox</class> <extends>QComboBox</extends> <header>QmitkDataStorageComboBox.h</header> </customwidget> </customwidgets> <resources/> <connections/> </ui>