From ec8424c3340f4e47ea14316032701b9d37d4789c Mon Sep 17 00:00:00 2001 From: farbrorberg Date: Mon, 21 May 2018 11:39:56 -0400 Subject: [PATCH] Add fix for converting fieldlines from json into binary --- .../util/fieldlinesstate.cpp | 70 +++++++++++++------ 1 file changed, 50 insertions(+), 20 deletions(-) diff --git a/modules/fieldlinessequence/util/fieldlinesstate.cpp b/modules/fieldlinessequence/util/fieldlinesstate.cpp index f67f51f21e..d2492787ff 100644 --- a/modules/fieldlinessequence/util/fieldlinesstate.cpp +++ b/modules/fieldlinessequence/util/fieldlinesstate.cpp @@ -29,6 +29,7 @@ #include #include #include +#include namespace { constexpr const char* _loggerCat = "FieldlinesState"; @@ -155,14 +156,14 @@ bool FieldlinesState::loadStateFromJson(const std::string& pathToJsonFile, const char* sData = "data"; const char* sTrace = "trace"; + const char* sIndex = "index"; // ----- EXTRACT THE EXTRA QUANTITY NAMES & TRIGGER TIME (same for all lines) ----- // { const char* sTime = "time"; const json& jTmp = *(jFile.begin()); // First field line in the file - //_triggerTime = Time::convertTime(jTmp[sTime]); - _triggerTime = Time::convertTime("2012 JUL 01 00:01:00"); // Temporary for MAS-fieldlines + _triggerTime = Time::convertTime(jTmp[sTime]); const char* sColumns = "columns"; auto variableNameVec = jTmp[sTrace][sColumns]; @@ -190,33 +191,62 @@ bool FieldlinesState::loadStateFromJson(const std::string& pathToJsonFile, for (json::iterator lineIter = jFile.begin(); lineIter != jFile.end(); ++lineIter) { // The 'data' field in the 'trace' variable contains all vertex positions and the // extra quantities. Each element is an array related to one vertex point. - const std::vector>& jData = (*lineIter)[sTrace][sData]; - const size_t nPoints = jData.size(); - for (size_t j = 0; j < nPoints; ++j) { - const std::vector& variables = jData[j]; - // Expects the x, y and z variables to be stored first! - const size_t xIdx = 0; - const size_t yIdx = 1; - const size_t zIdx = 2; + // This if-else statement is a very crude, temporary fix for MAS-fieldlines + // their data-value sometimes contain floats instead of arrays. + if ((*lineIter)[sTrace][sData][0] == 0.0 || (*lineIter)[sTrace][sData][3] == 0.0) + { + auto jData = (*lineIter)[sTrace][sData]; + // In this case, jData only contains (what should be) 4 ints instead + // of n nr. of arrays. This means that the nPoints is a constant, 1 (one) + // const size_t nPoints = jData.size(); + _vertexPositions.push_back( coordToMeters * glm::vec3( - variables[xIdx], - variables[yIdx], - variables[zIdx] + jData[0], + jData[1], + jData[2] ) ); - // Add the extra quantites. Stored in the same array as the x,y,z variables. - // Hence index of the first extra quantity = 3 - for (size_t xtraIdx = 3, k = 0 ; k < nExtras; ++k, ++xtraIdx) { - _extraQuantities[k].push_back(variables[xtraIdx]); + for (size_t xtraIdx = 3, k = 0; k < nExtras; ++k, ++xtraIdx) { + _extraQuantities[k].push_back(jData[xtraIdx]); } + _lineCount.push_back(static_cast(1)); + _lineStart.push_back(static_cast(lineStartIdx)); + lineStartIdx += 1; + } + else { + const std::vector>& jData = (*lineIter)[sTrace][sData]; + + const size_t nPoints = jData.size(); + + for (size_t j = 0; j < nPoints; ++j) { + const std::vector& variables = jData[j]; + + // Expects the x, y and z variables to be stored first! + const size_t xIdx = 0; + const size_t yIdx = 1; + const size_t zIdx = 2; + _vertexPositions.push_back( + coordToMeters * glm::vec3( + variables[xIdx], + variables[yIdx], + variables[zIdx] + ) + ); + + // Add the extra quantites. Stored in the same array as the x,y,z variables. + // Hence index of the first extra quantity = 3 + for (size_t xtraIdx = 3, k = 0; k < nExtras; ++k, ++xtraIdx) { + _extraQuantities[k].push_back(variables[xtraIdx]); + } + } + _lineCount.push_back(static_cast(nPoints)); + _lineStart.push_back(static_cast(lineStartIdx)); + lineStartIdx += nPoints; } - _lineCount.push_back(static_cast(nPoints)); - _lineStart.push_back(static_cast(lineStartIdx)); - lineStartIdx += nPoints; } return true; }