Skip to content

Commit

Permalink
[NewAPI] Display units in the parameters window (#9527)
Browse files Browse the repository at this point in the history
Better reading of modifiers
  • Loading branch information
adeas31 committed Oct 17, 2022
1 parent 5da3b1f commit e33dbba
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 74 deletions.
17 changes: 12 additions & 5 deletions OMEdit/OMEditLIB/Annotations/TextAnnotation.cpp
Expand Up @@ -602,7 +602,14 @@ void TextAnnotation::updateTextStringHelper(QRegExp regExp)
QString displayUnit = mpElement->getRootParentElement()->getParameterModifierValue(variable, "displayUnit");
if (MainWindow::instance()->isNewApi()) {
ModelInstance::Element* pModelElement = Element::getModelElementByName(mpElement->getRootParentElement()->getModel(), variable);
//! @todo Fix this once we actually have SI.Resistance as type of Element instead of Real. See issue #9374.
if (pModelElement) {
if (displayUnit.isEmpty()) {
displayUnit = pModelElement->getModifierValueFromType(QStringList() << "displayUnit");
}
if (unit.isEmpty()) {
unit = pModelElement->getModifierValueFromType(QStringList() << "unit");
}
}
} else {
Element *pElement = mpElement->getRootParentElement()->getElementByName(variable);
if (pElement) {
Expand All @@ -612,12 +619,12 @@ void TextAnnotation::updateTextStringHelper(QRegExp regExp)
if (unit.isEmpty()) {
unit = pElement->getDerivedClassModifierValue("unit");
}
// if display unit is still empty then use unit
if (displayUnit.isEmpty()) {
displayUnit = unit;
}
}
}
// if display unit is still empty then use unit
if (displayUnit.isEmpty()) {
displayUnit = unit;
}
// do not do any conversion if unit or displayUnit is empty of if both are 1!
if (displayUnit.isEmpty() || unit.isEmpty() || (displayUnit.compare("1") == 0 && unit.compare("1") == 0)) {
qs = mTextString.replace(pos, regExp.matchedLength(), textValue);
Expand Down
4 changes: 2 additions & 2 deletions OMEdit/OMEditLIB/Element/Element.cpp
Expand Up @@ -1886,7 +1886,7 @@ QString Element::getParameterDisplayString(QString parameterName)
/* case 1 */
if (displayString.isEmpty()) {
if (mpGraphicsView->getModelWidget()->isNewApi()) {
displayString = mpModelElement->getModifierValue(QStringList() << parameterName);
displayString = mpModelElement->getModifier().getModifierValue(QStringList() << parameterName);
} else {
displayString = mpElementInfo->getModifiersMap(pOMCProxy, className, this).value(parameterName, "");
}
Expand Down Expand Up @@ -1940,7 +1940,7 @@ QString Element::getParameterModifierValue(const QString &parameterName, const Q
QString modifierValue = "";
/* case 1 */
if (mpGraphicsView->getModelWidget()->isNewApi()) {
modifierValue = mpModelElement->getModifierValue(QStringList() << parameterName << modifier);
modifierValue = mpModelElement->getModifierValueFromType(QStringList() << parameterName << modifier);
} else {
OMCProxy *pOMCProxy = MainWindow::instance()->getOMCProxy();
QString className = mpGraphicsView->getModelWidget()->getLibraryTreeItem()->getNameStructure();
Expand Down
14 changes: 7 additions & 7 deletions OMEdit/OMEditLIB/Element/ElementProperties.cpp
Expand Up @@ -186,13 +186,13 @@ Parameter::Parameter(ModelInstance::Element *pElement, bool showStartAttribute,
setSaveSelectorCaption("-");
createValueWidget();
// Get unit value
mUnit = mpModelInstanceElement->getModifierValueFromType("unit");
mUnit = mpModelInstanceElement->getModifierValueFromType(QStringList() << "unit");
// Get displayUnit value
QString displayUnit = mpModelInstanceElement->getModifierValueFromType("displayUnit");
QString displayUnit = mpModelInstanceElement->getModifierValueFromType(QStringList() << "displayUnit");
if (displayUnit.isEmpty()) {
displayUnit = mUnit;
}
mDisplayUnit = StringHandler::removeFirstLastQuotes(displayUnit);
mDisplayUnit = displayUnit;
mPreviousUnit = mDisplayUnit;
QStringList units;
if (!mUnit.isEmpty()) {
Expand Down Expand Up @@ -1318,8 +1318,8 @@ void ElementParameters::createTabsGroupBoxesAndParametersHelper(ModelInstance::M
bool isParameter = (pElement->getVariability().compare(QStringLiteral("parameter")) == 0);
// If not a parameter then check for start and fixed bindings. See Modelica.Electrical.Analog.Basic.Resistor parameter R.
if (!isParameter && !showStartAttribute) {
start = pElement->getModifierValue(QStringList() << "start");
fixed = pElement->getModifierValue(QStringList() << "fixed");
start = pElement->getModifier().getModifierValue(QStringList() << "start");
fixed = pElement->getModifier().getModifierValue(QStringList() << "fixed");
showStartAttribute = (!start.isEmpty() || !fixed.isEmpty()) ? true : false;
}

Expand Down Expand Up @@ -1390,7 +1390,7 @@ void ElementParameters::fetchElementExtendsModifiers()
{
if (MainWindow::instance()->isNewApi()) {
foreach (auto pExtend, mpElement->getModel()->getExtends()) {
foreach (auto modifier, pExtend->getModifier().getModifiers()) {
foreach (auto modifier, pExtend->getExtendsModifier().getModifiers()) {
Parameter *pParameter = findParameter(modifier.getName());
/* Ticket #2531
* Check if parameter is marked final in the extends modifier.
Expand Down Expand Up @@ -1615,7 +1615,7 @@ void ElementParameters::fetchClassExtendsModifiers()
QList<ModelInstance::Extend*> extends = pClassModelInstance->getExtends();
foreach (auto pExtend, extends) {
if (pExtend->getName().compare(mpElement->getModelElement()->getParentModel()->getName()) == 0) {
foreach (auto modifier, pExtend->getModifier().getModifiers()) {
foreach (auto modifier, pExtend->getExtendsModifier().getModifiers()) {
if (modifier.getName().compare(mpElement->getName()) == 0) {
foreach (auto subModifier, modifier.getModifiers()) {
Parameter *pParameter = findParameter(subModifier.getName());
Expand Down
75 changes: 41 additions & 34 deletions OMEdit/OMEditLIB/Modeling/Model.cpp
Expand Up @@ -32,6 +32,7 @@
*/

#include "Model.h"
#include "Util/StringHandler.h"

#include <QRectF>
#include <QtMath>
Expand Down Expand Up @@ -727,6 +728,11 @@ namespace ModelInstance
mRestriction = mModelJson.value("restriction").toString();
}

// short type definitions have modifiers
if (mModelJson.contains("modifiers")) {
mModifier.deserialize(mModelJson.value("modifiers"));
}

if (mModelJson.contains("prefixes")) {
QJsonObject prefixes = mModelJson.value("prefixes").toObject();

Expand Down Expand Up @@ -1175,6 +1181,30 @@ namespace ModelInstance
}
}

QString Modifier::getModifierValue(QStringList qualifiedModifierName)
{
if (qualifiedModifierName.isEmpty()) {
return "";
}

return Modifier::getModifierValue(*this, qualifiedModifierName.takeFirst(), qualifiedModifierName);
}

QString Modifier::getModifierValue(const Modifier &modifier, const QString &modifierName, QStringList qualifiedModifierName)
{
foreach (auto subModifier, modifier.getModifiers()) {
if (subModifier.getName().compare(modifierName) == 0) {
if (qualifiedModifierName.isEmpty()) {
return StringHandler::removeFirstLastQuotes(subModifier.getValue());
} else {
return Modifier::getModifierValue(subModifier, qualifiedModifierName.takeFirst(), qualifiedModifierName);
}
}
}

return "";
}

Choices::Choices()
{
mCheckBox = false;
Expand Down Expand Up @@ -1338,55 +1368,32 @@ namespace ModelInstance
}
}

QString Element::getModifierValue(QStringList &qualifiedModifierName)
{
if (qualifiedModifierName.isEmpty()) {
return "";
}

return Element::getModifierValue(mModifier, qualifiedModifierName.takeFirst(), qualifiedModifierName);
}

QString Element::getModifierValueFromType(const QString &modifierName)
QString Element::getModifierValueFromType(QStringList modifierNames)
{
/* 1. First check if unit is defined with in the component modifier.
* 2. If no unit is found then check it in the derived class modifier value.
* 3. A derived class can be inherited, so look recursively.
*/
QString modifierValue = getModifierValue(QStringList() << modifierName);
// Case 1
QString modifierValue = mModifier.getModifierValue(modifierNames);
if (modifierValue.isEmpty() && mpModel) {
//! @todo modifiers of derived classes are missing.
//! We should here read the modifier value from mpModel. If its still empty look in extends.
// Case 2
modifierValue = mpModel->getModifier().getModifierValue(modifierNames);
// Case 3
if (modifierValue.isEmpty()) {
modifierValue = Element::getModifierValueFromInheritedType(mpModel, modifierName);
modifierValue = Element::getModifierValueFromInheritedType(mpModel, modifierNames);
}
}
return modifierValue;
}

QString Element::getModifierValue(const Modifier &modifier, const QString &modifierName, QStringList &qualifiedModifierName)
{
foreach (auto subModifier, modifier.getModifiers()) {
if (subModifier.getName().compare(modifierName) == 0) {
if (qualifiedModifierName.isEmpty()) {
return subModifier.getValue();
} else {
return Element::getModifierValue(subModifier, qualifiedModifierName.takeFirst(), qualifiedModifierName);
}
}
}

return "";
}

QString Element::getModifierValueFromInheritedType(Model *pModel, const QString &modifierName)
QString Element::getModifierValueFromInheritedType(Model *pModel, QStringList modifierNames)
{
QString modifierValue = "";
foreach (auto pExtend, pModel->getExtends()) {
//! @todo modifiers of derived classes are missing.
//! We should here read the modifier value from pExtend. If its still empty continue.
modifierValue = pExtend->getModifier().getModifierValue(modifierNames);
if (modifierValue.isEmpty()) {
modifierValue = Element::getModifierValueFromInheritedType(pExtend, modifierName);
modifierValue = Element::getModifierValueFromInheritedType(pExtend, modifierNames);
} else {
return modifierValue;
}
Expand Down Expand Up @@ -1624,7 +1631,7 @@ namespace ModelInstance
void Extend::deserialize(const QJsonObject &jsonObject)
{
if (jsonObject.contains("modifiers")) {
mModifier.deserialize(jsonObject.value("modifiers"));
mExtendsModifier.deserialize(jsonObject.value("modifiers"));
}

if (jsonObject.contains("baseClass")) {
Expand Down
55 changes: 29 additions & 26 deletions OMEdit/OMEditLIB/Modeling/Model.h
Expand Up @@ -314,6 +314,29 @@ namespace ModelInstance

};

class Modifier
{
public:
Modifier();
void deserialize(const QJsonValue &jsonValue);

QString getName() const {return mName;}
void setName(const QString &name) {mName = name;}
QString getValue() const {return mValue;}
QList<Modifier> getModifiers() const {return mModifiers;}
bool isFinal() const {return mFinal;}
bool isEach() const {return mEach;}
QString getModifierValue(QStringList qualifiedModifierName);
private:
QString mName;
QString mValue;
bool mFinal;
bool mEach;
QList<Modifier> mModifiers;

static QString getModifierValue(const Modifier &modifier, const QString &modifierName, QStringList qualifiedModifierName);
};

class Extend;
class Element;
class Connection;
Expand All @@ -331,6 +354,7 @@ namespace ModelInstance
QString getName() const {return mName;}
QStringList getDims() const {return mDims;}
QString getRestriction() const {return mRestriction;}
Modifier getModifier() const {return mModifier;}
bool isConnector() const;
bool isExpandableConnector() const;
bool isEnumeration() const;
Expand Down Expand Up @@ -375,6 +399,7 @@ namespace ModelInstance
QString mName;
QStringList mDims;
QString mRestriction;
Modifier mModifier;
bool mPublic;
bool mFinal;
bool mInner;
Expand Down Expand Up @@ -477,26 +502,6 @@ namespace ModelInstance
bool mConnectorSizing;
};

class Modifier
{
public:
Modifier();
void deserialize(const QJsonValue &jsonValue);

QString getName() const {return mName;}
void setName(const QString &name) {mName = name;}
QString getValue() const {return mValue;}
QList<Modifier> getModifiers() const {return mModifiers;}
bool isFinal() const {return mFinal;}
bool isEach() const {return mEach;}
private:
QString mName;
QString mValue;
bool mFinal;
bool mEach;
QList<Modifier> mModifiers;
};

class Choices
{
public:
Expand Down Expand Up @@ -526,8 +531,7 @@ namespace ModelInstance
void setModel(Model *pModel) {mpModel = pModel;}
Model *getModel() const {return mpModel;}
Modifier getModifier() const {return mModifier;}
QString getModifierValue(QStringList &qualifiedModifierName);
QString getModifierValueFromType(const QString &modifierName);
QString getModifierValueFromType(QStringList modifierName);
QStringList getAbsynDimensions() const {return mAbsynDims;}
QString getAbsynDimensionsString() const {return mAbsynDims.join(", ");}
QStringList getTypedDimensions() const {return mTypedDims;}
Expand Down Expand Up @@ -572,8 +576,7 @@ namespace ModelInstance
bool mEvaluate;
Choices mChoices;

static QString getModifierValue(const Modifier &modifier, const QString &modifierName, QStringList &qualifiedModifierName);
static QString getModifierValueFromInheritedType(Model *pModel, const QString &modifierName);
static QString getModifierValueFromInheritedType(Model *pModel, QStringList modifierName);
};

class Part
Expand Down Expand Up @@ -669,9 +672,9 @@ namespace ModelInstance
~Extend();
void deserialize(const QJsonObject &jsonObject);

Modifier getModifier() const {return mModifier;}
Modifier getExtendsModifier() const {return mExtendsModifier;}
private:
Modifier mModifier;
Modifier mExtendsModifier;
};

}
Expand Down

0 comments on commit e33dbba

Please sign in to comment.