49 QByteArray fixed = record.simplified();
50 for (
int i = fixed.size() - 1; i > 0; --i) {
51 const char c = fixed.at(i);
52 const char pc = fixed.at(i - 1);
53 if (c ==
'-' && pc >=
'0' && pc <=
'9') {
58 const QList<QByteArray> tokens = fixed.split(
' ');
59 if (tokens.size() < 4) {
64 const int station = tokens[0].toInt(&ok);
69 auto parseFloat = [&ok](
const QByteArray& t) ->
float {
71 const float v = t.toFloat(&good);
77 const float x = parseFloat(tokens[1]);
78 const float y = parseFloat(tokens[2]);
79 const float z = parseFloat(tokens[3]);
84 const float scale = linearScale(
units);
86 out.
position = QVector3D(x * scale, y * scale, z * scale);
90 if (tokens.size() >= 8) {
93 const float q0 = parseFloat(tokens[4]);
94 const float q1 = parseFloat(tokens[5]);
95 const float q2 = parseFloat(tokens[6]);
96 const float q3 = parseFloat(tokens[7]);
98 out.
orientation = QQuaternion(q0, q1, q2, q3).normalized();
101 }
else if (tokens.size() >= 7) {
104 const float az = parseFloat(tokens[4]);
105 const float el = parseFloat(tokens[5]);
106 const float ro = parseFloat(tokens[6]);
108 const QQuaternion qZ = QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, az);
109 const QQuaternion qY = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, el);
110 const QQuaternion qX = QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, ro);