48 QByteArray fixed = record.simplified();
49 for (
int i = fixed.size() - 1; i > 0; --i) {
50 const char c = fixed.at(i);
51 const char pc = fixed.at(i - 1);
52 if (c ==
'-' && pc >=
'0' && pc <=
'9') {
57 const QList<QByteArray> tokens = fixed.split(
' ');
58 if (tokens.size() < 4) {
63 const int station = tokens[0].toInt(&ok);
68 auto parseFloat = [&ok](
const QByteArray& t) ->
float {
70 const float v = t.toFloat(&good);
76 const float x = parseFloat(tokens[1]);
77 const float y = parseFloat(tokens[2]);
78 const float z = parseFloat(tokens[3]);
83 const float scale = linearScale(
units);
85 out.
position = QVector3D(x * scale, y * scale, z * scale);
89 if (tokens.size() >= 8) {
92 const float q0 = parseFloat(tokens[4]);
93 const float q1 = parseFloat(tokens[5]);
94 const float q2 = parseFloat(tokens[6]);
95 const float q3 = parseFloat(tokens[7]);
97 out.
orientation = QQuaternion(q0, q1, q2, q3).normalized();
100 }
else if (tokens.size() >= 7) {
103 const float az = parseFloat(tokens[4]);
104 const float el = parseFloat(tokens[5]);
105 const float ro = parseFloat(tokens[6]);
107 const QQuaternion qZ = QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, az);
108 const QQuaternion qY = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, el);
109 const QQuaternion qX = QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, ro);