mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#2031 Curve Calculator : Sort variable names by the order they first appear
This commit is contained in:
parent
dd01863240
commit
f61c83a659
@ -33,6 +33,8 @@
|
|||||||
|
|
||||||
#include "cafPdmUiTextEditor.h"
|
#include "cafPdmUiTextEditor.h"
|
||||||
|
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
|
||||||
@ -132,7 +134,12 @@ caf::PdmFieldHandle* RimCalculation::userDescriptionField()
|
|||||||
bool RimCalculation::parseExpression()
|
bool RimCalculation::parseExpression()
|
||||||
{
|
{
|
||||||
QString leftHandSideVariableName = RimCalculation::findLeftHandSide(m_expression);
|
QString leftHandSideVariableName = RimCalculation::findLeftHandSide(m_expression);
|
||||||
if (leftHandSideVariableName.isEmpty()) return false;
|
if (leftHandSideVariableName.isEmpty())
|
||||||
|
{
|
||||||
|
QMessageBox::warning(nullptr, "Expression Parser", "Failed to detect left hand side of equation");
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<QString> variableNames = ExpressionParser::detectReferencedVariables(m_expression);
|
std::vector<QString> variableNames = ExpressionParser::detectReferencedVariables(m_expression);
|
||||||
|
|
||||||
|
@ -41,8 +41,8 @@ TEST(RicExpressionParserTest, DetectVariables)
|
|||||||
|
|
||||||
std::vector<QString> variables = ExpressionParser::detectReferencedVariables(expr);
|
std::vector<QString> variables = ExpressionParser::detectReferencedVariables(expr);
|
||||||
|
|
||||||
EXPECT_STREQ(variables[0].toStdString().data(), "a");
|
EXPECT_STREQ(variables[0].toStdString().data(), "c");
|
||||||
EXPECT_STREQ(variables[1].toStdString().data(), "c");
|
EXPECT_STREQ(variables[1].toStdString().data(), "a");
|
||||||
EXPECT_STREQ(variables[2].toStdString().data(), "x");
|
EXPECT_STREQ(variables[2].toStdString().data(), "x");
|
||||||
EXPECT_STREQ(variables[3].toStdString().data(), "y");
|
EXPECT_STREQ(variables[3].toStdString().data(), "y");
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,8 @@ std::vector<QString> ExpressionParserImpl::detectReferencedVariables(const QStri
|
|||||||
std::vector<std::string> variable_list;
|
std::vector<std::string> variable_list;
|
||||||
exprtk::collect_variables(expression.toStdString(), variable_list);
|
exprtk::collect_variables(expression.toStdString(), variable_list);
|
||||||
|
|
||||||
|
std::vector<std::pair<int, QString>> indexAndNamePairs;
|
||||||
|
|
||||||
for (const auto& s : variable_list)
|
for (const auto& s : variable_list)
|
||||||
{
|
{
|
||||||
QString variableNameLowerCase = QString::fromStdString(s);
|
QString variableNameLowerCase = QString::fromStdString(s);
|
||||||
@ -45,9 +47,17 @@ std::vector<QString> ExpressionParserImpl::detectReferencedVariables(const QStri
|
|||||||
int index = expression.indexOf(variableNameLowerCase, 0, Qt::CaseInsensitive);
|
int index = expression.indexOf(variableNameLowerCase, 0, Qt::CaseInsensitive);
|
||||||
if (index > -1)
|
if (index > -1)
|
||||||
{
|
{
|
||||||
referencedVariables.push_back(expression.mid(index, variableNameLowerCase.size()));
|
indexAndNamePairs.push_back(std::make_pair(index, expression.mid(index, variableNameLowerCase.size())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sort the variable names in the order they first appear in the expression
|
||||||
|
std::sort(indexAndNamePairs.begin(), indexAndNamePairs.end());
|
||||||
|
|
||||||
|
for (const auto& indexAndName : indexAndNamePairs)
|
||||||
|
{
|
||||||
|
referencedVariables.push_back(indexAndName.second);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return referencedVariables;
|
return referencedVariables;
|
||||||
|
Loading…
Reference in New Issue
Block a user