Skip to content

Commit

Permalink
Use QHash instead of QList when reading result variables (#7315)
Browse files Browse the repository at this point in the history
Temporarily create a QHash based tree for Variables and then put it in QList based tree structure
  • Loading branch information
adeas31 committed Mar 19, 2021
1 parent ccf632c commit 985c38c
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 26 deletions.
110 changes: 84 additions & 26 deletions OMEdit/OMEditLIB/Plotting/VariablesWidget.cpp
Expand Up @@ -595,8 +595,7 @@ void VariablesTreeModel::insertVariablesItems(QString fileName, QString filePath
parseInitXml(initXmlReader);
initFile.close();
} else {
MessagesWidget::instance()->addGUIMessage(MessageItem(MessageItem::Modelica,
GUIMessages::getMessage(GUIMessages::ERROR_OPENING_FILE).arg(initFile.fileName())
MessagesWidget::instance()->addGUIMessage(MessageItem(MessageItem::Modelica, GUIMessages::getMessage(GUIMessages::ERROR_OPENING_FILE).arg(initFile.fileName())
.arg(initFile.errorString()), Helper::scriptingKind, Helper::errorLevel));
}
}
Expand Down Expand Up @@ -636,9 +635,8 @@ void VariablesTreeModel::insertVariablesItems(QString fileName, QString filePath
MessagesWidget::instance()->addGUIMessage(MessageItem(MessageItem::Modelica, "Parsed json file " + infoFile.fileName(), Helper::scriptingKind, Helper::errorLevel));
}
}
QVariantMap vars = result["variables"].toMap();
QVariantList eqs = result["equations"].toList();

QVariantList eqs = result["equations"].toList();
for (int i=0; i<eqs.size(); i++) {
QVariantMap veq = eqs[i].toMap();
bool isInitial = (veq.find("section") != veq.end() && veq["section"] == QString("initial"));
Expand All @@ -664,20 +662,19 @@ void VariablesTreeModel::insertVariablesItems(QString fileName, QString filePath
}
}
}

/* open the .mat file */
ModelicaMatReader matReader;
matReader.file = 0;
const char *msg[] = {""};
if (fileName.endsWith(".mat")) {
//Read in mat file
if (0 != (msg[0] = omc_new_matlab4_reader(QString(filePath + "/" + fileName).toUtf8().constData(), &matReader))) {
MessagesWidget::instance()->addGUIMessage(MessageItem(MessageItem::Modelica,
GUIMessages::getMessage(GUIMessages::ERROR_OPENING_FILE).arg(filePath + "/" + fileName)
MessagesWidget::instance()->addGUIMessage(MessageItem(MessageItem::Modelica, GUIMessages::getMessage(GUIMessages::ERROR_OPENING_FILE).arg(filePath + "/" + fileName)
.arg(QString(msg[0])), Helper::scriptingKind, Helper::errorLevel));
}
}

// create hash based VariableNode
VariableNode *pTopVariableNode = new VariableNode(Variabledata);
// remove time from variables list
variablesList.removeOne("time");
QStringList variables;
Expand All @@ -695,10 +692,10 @@ void VariablesTreeModel::insertVariablesItems(QString fileName, QString filePath
variables = StringHandler::makeVariablePartsWithInd(plotVariable);
}
int count = 1;
VariablesTreeItem *pParentVariablesTreeItem = 0;
VariableNode *pParentVariableNode = 0;
foreach (QString variable, variables) {
if (count == 1) { /* first loop iteration */
pParentVariablesTreeItem = pTopVariablesTreeItem;
pParentVariableNode = pTopVariableNode;
}
QString findVariable;
/* if last item of derivative */
Expand All @@ -723,8 +720,8 @@ void VariablesTreeModel::insertVariablesItems(QString fileName, QString filePath
}
// if its the last item then don't try to find the item as we will always fail to find it
if (variables.size() != count) {
pParentVariablesTreeItem = findVariablesTreeItem(findVariable, pParentVariablesTreeItem);
if (pParentVariablesTreeItem) {
pParentVariableNode = VariableNode::findVariableNode(findVariable, pParentVariableNode);
if (pParentVariableNode) {
QString addVar = "";
/* if last item of derivative */
if ((variables.size() == count) && (plotVariable.startsWith("der("))) {
Expand All @@ -746,14 +743,14 @@ void VariablesTreeModel::insertVariablesItems(QString fileName, QString filePath
/* If pParentVariablesTreeItem is 0 and it is first loop iteration then use pTopVariablesTreeItem as parent.
* If loop iteration is not first and pParentVariablesTreeItem is 0 then find the parent item.
*/
if (!pParentVariablesTreeItem && count > 1) {
pParentVariablesTreeItem = findVariablesTreeItem(fileName + "." + parentVariable, pTopVariablesTreeItem);
if (!pParentVariableNode && count > 1) {
pParentVariableNode = VariableNode::findVariableNode(fileName + "." + parentVariable, pTopVariableNode);
}
// Just make sure parent is not NULL
if (!pParentVariablesTreeItem) {
pParentVariablesTreeItem = pTopVariablesTreeItem;
if (!pParentVariableNode) {
pParentVariableNode = pTopVariableNode;
}
QModelIndex index = variablesTreeItemIndex(pParentVariablesTreeItem);
// data
QVector<QVariant> variableData;
/* if last item of derivative */
if ((variables.size() == count) && (plotVariable.startsWith("der("))) {
Expand All @@ -763,7 +760,7 @@ void VariablesTreeModel::insertVariablesItems(QString fileName, QString filePath
} else if (variables.size() == count && QRegExp("\\[\\d+\\]").exactMatch(variable)) { /* if last item of array derivative*/
variableData << filePath << fileName << fileName + "." + plotVariable << variable;
} else {
variableData << filePath << fileName << pParentVariablesTreeItem->getVariableName() + "." + variable << variable;
variableData << filePath << fileName << pParentVariableNode->mVariableNodeData.at(VariableItemData::NAME).toString() + "." + variable << variable;
}

/* find the variable in the xml file */
Expand Down Expand Up @@ -843,14 +840,11 @@ void VariablesTreeModel::insertVariablesItems(QString fileName, QString filePath
variableData << variantDefinedIn;
variableData << infoFileName;

VariablesTreeItem *pVariablesTreeItem = new VariablesTreeItem(variableData, pParentVariablesTreeItem);
pVariablesTreeItem->setEditable(changeAble);
pVariablesTreeItem->setVariability(variability);
int row = rowCount(index);
beginInsertRows(index, row, row);
pParentVariablesTreeItem->insertChild(row, pVariablesTreeItem);
endInsertRows();
pParentVariablesTreeItem = pVariablesTreeItem;
VariableNode *pVariableNode = new VariableNode(variableData);
pVariableNode->setEditable(changeAble);
pVariableNode->setVariability(variability);
pParentVariableNode->mChildren.insert(variableData.at(VariableItemData::NAME).toString(), pVariableNode);
pParentVariableNode = pVariableNode;
QString addVar = "";
/* if last item of derivative */
if ((variables.size() == count) && (plotVariable.startsWith("der("))) {
Expand All @@ -868,6 +862,10 @@ void VariablesTreeModel::insertVariablesItems(QString fileName, QString filePath
count++;
}
}
// insert variables to VariablesTreeModel
insertVariablesItems(pTopVariableNode, pTopVariablesTreeItem);
// Delete VariableNode
delete pTopVariableNode;
/* close the .mat file */
if (fileName.endsWith(".mat") && matReader.file) {
omc_free_matlab4_reader(&matReader);
Expand Down Expand Up @@ -953,6 +951,36 @@ void VariablesTreeModel::plotAllVariables(VariablesTreeItem *pVariablesTreeItem,
}
}

/*!
* \brief VariablesTreeModel::insertVariablesItems
* Creates VariablesTreeItem using VariableNode and adds them to the VariablesTreeView.
* \param pParentVariableNode
* \param pParentVariablesTreeItem
*/
void VariablesTreeModel::insertVariablesItems(VariableNode *pParentVariableNode, VariablesTreeItem *pParentVariablesTreeItem)
{
QModelIndex index = variablesTreeItemIndex(pParentVariablesTreeItem);
int row = rowCount(index);
beginInsertRows(index, row, pParentVariableNode->mChildren.size());
QHash<QString, VariableNode*>::const_iterator iterator = pParentVariableNode->mChildren.constBegin();
while (iterator != pParentVariableNode->mChildren.constEnd()) {
VariableNode *pVariableNode = iterator.value();
VariablesTreeItem *pVariablesTreeItem = new VariablesTreeItem(pVariableNode->mVariableNodeData, pParentVariablesTreeItem);
pVariablesTreeItem->setEditable(pVariableNode->mEditable);
pVariablesTreeItem->setVariability(pVariableNode->mVariability);
pParentVariablesTreeItem->insertChild(row++, pVariablesTreeItem);
++iterator;
}
endInsertRows();

foreach (VariablesTreeItem *pVariablesTreeItem, pParentVariablesTreeItem->getChildren()) {
VariableNode *pVariableNode = pParentVariableNode->mChildren.value(pVariablesTreeItem->getVariableName());
if (pVariableNode && !pVariableNode->mChildren.isEmpty()) {
insertVariablesItems(pVariableNode, pVariablesTreeItem);
}
}
}

/*!
* \brief VariablesTreeModel::parseScalarVariable
* Parses the scalar variable.
Expand Down Expand Up @@ -2574,3 +2602,33 @@ void VariablesWidget::incrementVisualization()
}
}
}

VariableNode::VariableNode(const QVector<QVariant> &variableNodeData)
{
mVariableNodeData = variableNodeData;
mEditable = false;
mVariability = "";
mChildren.clear();
}

VariableNode::~VariableNode()
{
qDeleteAll(mChildren);
}

VariableNode* VariableNode::findVariableNode(const QString &name, VariableNode *pParentVariableNode)
{
VariableNode *pVariableNode = pParentVariableNode->mChildren.value(name, 0);
if (pVariableNode) {
return pVariableNode;
} else {
QHash<QString, VariableNode*>::const_iterator iterator = pParentVariableNode->mChildren.constBegin();
while (iterator != pParentVariableNode->mChildren.constEnd()) {
if (VariableNode *node = VariableNode::findVariableNode(name, iterator.value())) {
return node;
}
++iterator;
}
}
return 0;
}
17 changes: 17 additions & 0 deletions OMEdit/OMEditLIB/Plotting/VariablesWidget.h
Expand Up @@ -44,6 +44,7 @@
class OMCProxy;
class TreeSearchFilters;
class Label;
class VariableNode;

typedef QPair<int,QString> IntStringPair;
Q_DECLARE_METATYPE(IntStringPair)
Expand Down Expand Up @@ -160,6 +161,7 @@ class VariablesTreeModel : public QAbstractItemModel
VariablesTreeItem *mpRootVariablesTreeItem;
VariablesTreeItem *mpActiveVariablesTreeItem;
QHash<QString, QHash<QString,QString> > mScalarVariablesHash;
void insertVariablesItems(VariableNode *pParentVariableNode, VariablesTreeItem *pParentVariablesTreeItem);
QHash<QString, QString> parseScalarVariable(QXmlStreamReader &xmlReader);
void getVariableInformation(ModelicaMatReader *pMatReader, QString variableToFind, QString *value, bool *changeAble, QString *variability,
QString *unit, QString *displayUnit, QString *description);
Expand Down Expand Up @@ -264,4 +266,19 @@ private slots:
void updateDynamicSelect(double time);
};

class VariableNode
{
public:
VariableNode(const QVector<QVariant> &variableNodeData);
~VariableNode();
QVector<QVariant> mVariableNodeData;
bool mEditable;
QString mVariability;
QHash<QString, VariableNode*> mChildren;

static VariableNode* findVariableNode(const QString &name, VariableNode *pParentVariableNode);
void setEditable(bool editable) {mEditable = editable;}
void setVariability(const QString &variability) {mVariability = variability;}
};

#endif // VARIABLESWIDGET_H

0 comments on commit 985c38c

Please sign in to comment.