#include "Data/VectorSeries.h" namespace { /** * Flatten the three components of a vector to a single QVector that can be passed to an ArrayData * * Example: * xValues = {1, 2, 3} * yValues = {4, 5, 6} * zValues = {7, 8, 9} * * result = {1, 4, 7, 2, 5, 8, 3, 6, 9} * * @param xValues the x-component values of the vector * @param yValues the y-component values of the vector * @param zValues the z-component values of the vector * @return the single QVector * @remarks the three components are consumed * @sa ArrayData */ std::vector flatten(std::vector xValues, std::vector yValues, std::vector zValues) { if (xValues.size() != yValues.size() || xValues.size() != zValues.size()) { /// @todo ALX : log return {}; } auto result = std::vector(); result.reserve(xValues.size() * 3); while (!xValues.empty()) { result.insert(result.cend(), {xValues.front(), yValues.front(), zValues.front()}); xValues.erase(xValues.begin()); yValues.erase(yValues.begin()); zValues.erase(zValues.begin()); } return result; } } // namespace VectorSeries::VectorSeries(std::vector xAxisData, std::vector xValuesData, std::vector yValuesData, std::vector zValuesData, const Unit &xAxisUnit, const Unit &valuesUnit) : VectorSeries{std::move(xAxisData), flatten(std::move(xValuesData), std::move(yValuesData), std::move(zValuesData)), xAxisUnit, valuesUnit} { } VectorSeries::VectorSeries(std::vector xAxisData, std::vector valuesData, const Unit &xAxisUnit, const Unit &valuesUnit) : DataSeries{std::make_shared >(std::move(xAxisData)), xAxisUnit, std::make_shared >(std::move(valuesData), 3), valuesUnit} { } std::unique_ptr VectorSeries::clone() const { return std::make_unique(*this); } std::shared_ptr VectorSeries::subDataSeries(const SqpRange &range) { auto subXAxisData = std::vector(); auto subXValuesData = std::vector(); auto subYValuesData = std::vector(); auto subZValuesData = std::vector(); this->lockRead(); { auto bounds = xAxisRange(range.m_TStart, range.m_TEnd); for (auto it = bounds.first; it != bounds.second; ++it) { subXAxisData.push_back(it->x()); subXValuesData.push_back(it->value(0)); subYValuesData.push_back(it->value(1)); subZValuesData.push_back(it->value(2)); } } this->unlock(); return std::make_shared(std::move(subXAxisData), std::move(subXValuesData), std::move(subYValuesData), std::move(subZValuesData), this->xAxisUnit(), this->valuesUnit()); }