Skip to content

Commit

Permalink
Fetch the extends modifiers recursively (#9824)
Browse files Browse the repository at this point in the history
Read the annotation error from instance JSON
Always use icon annotation when connector is used as port
  • Loading branch information
adeas31 committed Dec 1, 2022
1 parent f7e88c8 commit 91e0355
Show file tree
Hide file tree
Showing 5 changed files with 153 additions and 117 deletions.
22 changes: 20 additions & 2 deletions OMEdit/OMEditLIB/Element/Element.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2677,7 +2677,7 @@ void Element::createClassShapes()
*
* Always use the icon annotation when element type is port.
*/
if (mpModel->isConnector() && mpGraphicsView->getViewType() == StringHandler::Diagram && mElementType != Element::Port) {
if (mpModel->isConnector() && mpGraphicsView->getViewType() == StringHandler::Diagram && canUseDiagramAnnotation()) {
shapes = mpModel->getDiagramAnnotation()->getGraphics();
} else {
shapes = mpModel->getIconAnnotation()->getGraphics();
Expand Down Expand Up @@ -2712,7 +2712,7 @@ void Element::createClassShapes()
*
* Always use the icon annotation when element type is port.
*/
if (mpLibraryTreeItem->isConnector() && mpGraphicsView->getViewType() == StringHandler::Diagram && mElementType != Element::Port) {
if (mpLibraryTreeItem->isConnector() && mpGraphicsView->getViewType() == StringHandler::Diagram && canUseDiagramAnnotation()) {
mpLibraryTreeItem->getModelWidget()->loadDiagramView();
pGraphicsView = mpLibraryTreeItem->getModelWidget()->getDiagramGraphicsView();
}
Expand Down Expand Up @@ -3115,6 +3115,24 @@ void Element::updateToolTip()
}
}

/*!
* \brief Element::canUseDiagramAnnotation
* If the component is a port component or has a port component as parent in the hirerchy
* then we should not use the diagram annotation.
* \return
*/
bool Element::canUseDiagramAnnotation()
{
Element *pElement = this;
while (pElement->getParentElement()) {
if (pElement->getElementType() == Element::Port) {
return false;
}
pElement = pElement->getParentElement();
}
return true;
}

void Element::updatePlacementAnnotation()
{
// Add component annotation.
Expand Down
1 change: 1 addition & 0 deletions OMEdit/OMEditLIB/Element/Element.h
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,7 @@ class Element : public QObject, public QGraphicsItem
static QString getParameterDisplayStringFromExtendsParameters(ModelInstance::Model *pModel, QString parameterName, QString modifierString);
static bool checkEnumerationDisplayString(QString &displayString, const QString &typeName);
void updateToolTip();
bool canUseDiagramAnnotation();
signals:
void added();
void transformChange(bool positionChanged);
Expand Down
179 changes: 93 additions & 86 deletions OMEdit/OMEditLIB/Element/ElementProperties.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -961,7 +961,7 @@ void ElementParameters::setUpDialog()
* Modelica.Electrical.Analog.Basic.Resistor order is wrong if we don't use insert.
*/
createTabsGroupBoxesAndParametersHelper(mpElement->getModel(), true);
fetchElementExtendsModifiers();
fetchElementExtendsModifiers(mpElement->getModel());
fetchElementModifiers();
fetchClassExtendsModifiers();
} else {
Expand Down Expand Up @@ -1405,13 +1405,14 @@ void ElementParameters::createTabsGroupBoxesAndParametersHelper(ModelInstance::M
/*!
* \brief ElementParameters::fetchElementExtendsModifiers
* Fetches the Element's extends modifiers and apply modifier values on the appropriate Parameters.
* \param pModelInstance
*/
void ElementParameters::fetchElementExtendsModifiers()
void ElementParameters::fetchElementExtendsModifiers(ModelInstance::Model *pModelInstance)
{
if (MainWindow::instance()->isNewApi()) {
foreach (auto pExtend, mpElement->getModel()->getExtends()) {
foreach (auto modifier, pExtend->getExtendsModifier().getModifiers()) {
Parameter *pParameter = findParameter(modifier.getName());
foreach (auto pExtend, pModelInstance->getExtends()) {
foreach (auto modifier, pExtend->getExtendsModifier().getModifiers()) {
Parameter *pParameter = findParameter(modifier.getName());
if (pParameter) {
/* Ticket #2531
* Check if parameter is marked final in the extends modifier.
*/
Expand All @@ -1420,100 +1421,106 @@ void ElementParameters::fetchElementExtendsModifiers()
delete pParameter;
continue;
}
if (pParameter) {
pParameter->setValueWidget(modifier.getValue(), true, pParameter->getUnit());
foreach (auto subModifier, modifier.getModifiers()) {
if (subModifier.getName().compare(QStringLiteral("start")) == 0 || subModifier.getName().compare(QStringLiteral("fixed")) == 0) {
QString startOrFixed = subModifier.getValue();
if (!startOrFixed.isEmpty()) {
if (!pParameter->isGroupBoxDefined()) {
pParameter->setGroupBox("Initialization");
}
pParameter->setShowStartAttribute(true);
if (subModifier.getName().compare(QStringLiteral("start")) == 0) {
pParameter->setValueWidget(startOrFixed, true, pParameter->getUnit());
} else { // fixed modifier
pParameter->setFixedState(startOrFixed, true);
}
pParameter->setValueWidget(modifier.getValue(), true, pParameter->getUnit());
foreach (auto subModifier, modifier.getModifiers()) {
if (subModifier.getName().compare(QStringLiteral("start")) == 0 || subModifier.getName().compare(QStringLiteral("fixed")) == 0) {
QString startOrFixed = subModifier.getValue();
if (!startOrFixed.isEmpty()) {
if (!pParameter->isGroupBoxDefined()) {
pParameter->setGroupBox("Initialization");
}
} else if (subModifier.getName().compare(QStringLiteral("displayUnit")) == 0) {
QString displayUnit = subModifier.getValue();
int index = pParameter->getUnitComboBox()->findData(displayUnit);
if (index < 0) {
// add extends modifier as additional display unit if compatible
index = pParameter->getUnitComboBox()->count() - 1;
OMCProxy *pOMCProxy = MainWindow::instance()->getOMCProxy();
if (index > -1 &&
(pOMCProxy->convertUnits(pParameter->getUnitComboBox()->itemData(0).toString(), displayUnit)).unitsCompatible) {
pParameter->getUnitComboBox()->addItem(Utilities::convertUnitToSymbol(displayUnit), displayUnit);
index ++;
}
pParameter->setShowStartAttribute(true);
if (subModifier.getName().compare(QStringLiteral("start")) == 0) {
pParameter->setValueWidget(startOrFixed, true, pParameter->getUnit());
} else { // fixed modifier
pParameter->setFixedState(startOrFixed, true);
}
if (index > -1) {
pParameter->getUnitComboBox()->setCurrentIndex(index);
pParameter->setDisplayUnit(displayUnit);
}
} else if (subModifier.getName().compare(QStringLiteral("displayUnit")) == 0) {
QString displayUnit = subModifier.getValue();
int index = pParameter->getUnitComboBox()->findData(displayUnit);
if (index < 0) {
// add extends modifier as additional display unit if compatible
index = pParameter->getUnitComboBox()->count() - 1;
OMCProxy *pOMCProxy = MainWindow::instance()->getOMCProxy();
if (index > -1 &&
(pOMCProxy->convertUnits(pParameter->getUnitComboBox()->itemData(0).toString(), displayUnit)).unitsCompatible) {
pParameter->getUnitComboBox()->addItem(Utilities::convertUnitToSymbol(displayUnit), displayUnit);
index ++;
}
}
if (index > -1) {
pParameter->getUnitComboBox()->setCurrentIndex(index);
pParameter->setDisplayUnit(displayUnit);
}
}
}
}
}
} else {
if (mpElement->getReferenceElement()) {
OMCProxy *pOMCProxy = MainWindow::instance()->getOMCProxy();
QString inheritedClassName;
inheritedClassName = mpElement->getReferenceElement()->getGraphicsView()->getModelWidget()->getLibraryTreeItem()->getNameStructure();
QMap<QString, QString> extendsModifiersMap = mpElement->getGraphicsView()->getModelWidget()->getExtendsModifiersMap(inheritedClassName);
QMap<QString, QString>::iterator extendsModifiersIterator;
for (extendsModifiersIterator = extendsModifiersMap.begin(); extendsModifiersIterator != extendsModifiersMap.end(); ++extendsModifiersIterator) {
QString elementName = StringHandler::getFirstWordBeforeDot(extendsModifiersIterator.key());
if (mpElement->getName().compare(elementName) == 0) {
/* Ticket #4095
* Handle parameters display of inherited elements.
*/
QString parameterName = extendsModifiersIterator.key();
Parameter *pParameter = findParameter(StringHandler::removeFirstWordAfterDot(parameterName));
if (pParameter) {
if (pParameter->isShowStartAttribute()) {
if (extendsModifiersIterator.key().compare(parameterName + ".start") == 0) {
QString start = extendsModifiersIterator.value();
if (!start.isEmpty()) {
if (pParameter->getGroupBox().isEmpty()) {
pParameter->setGroupBox("Initialization");
}
pParameter->setShowStartAttribute(true);
pParameter->setValueWidget(start, false, pParameter->getUnit());
}
} else if (extendsModifiersIterator.key().compare(parameterName + ".fixed") == 0) {
QString fixed = extendsModifiersIterator.value();
if (!fixed.isEmpty()) {
if (pParameter->getGroupBox().isEmpty()) {
pParameter->setGroupBox("Initialization");
}
pParameter->setShowStartAttribute(true);
pParameter->setFixedState(fixed, false);
fetchElementExtendsModifiers(pExtend);
}
}

/*!
* \brief ElementParameters::fetchElementExtendsModifiers
* Fetches the Element's extends modifiers and apply modifier values on the appropriate Parameters.
*/
void ElementParameters::fetchElementExtendsModifiers()
{
if (mpElement->getReferenceElement()) {
OMCProxy *pOMCProxy = MainWindow::instance()->getOMCProxy();
QString inheritedClassName;
inheritedClassName = mpElement->getReferenceElement()->getGraphicsView()->getModelWidget()->getLibraryTreeItem()->getNameStructure();
QMap<QString, QString> extendsModifiersMap = mpElement->getGraphicsView()->getModelWidget()->getExtendsModifiersMap(inheritedClassName);
QMap<QString, QString>::iterator extendsModifiersIterator;
for (extendsModifiersIterator = extendsModifiersMap.begin(); extendsModifiersIterator != extendsModifiersMap.end(); ++extendsModifiersIterator) {
QString elementName = StringHandler::getFirstWordBeforeDot(extendsModifiersIterator.key());
if (mpElement->getName().compare(elementName) == 0) {
/* Ticket #4095
* Handle parameters display of inherited elements.
*/
QString parameterName = extendsModifiersIterator.key();
Parameter *pParameter = findParameter(StringHandler::removeFirstWordAfterDot(parameterName));
if (pParameter) {
if (pParameter->isShowStartAttribute()) {
if (extendsModifiersIterator.key().compare(parameterName + ".start") == 0) {
QString start = extendsModifiersIterator.value();
if (!start.isEmpty()) {
if (pParameter->getGroupBox().isEmpty()) {
pParameter->setGroupBox("Initialization");
}
pParameter->setShowStartAttribute(true);
pParameter->setValueWidget(start, false, pParameter->getUnit());
}
} else if (extendsModifiersIterator.key().compare(parameterName) == 0) {
pParameter->setValueWidget(extendsModifiersIterator.value(), false, pParameter->getUnit());
}
if (extendsModifiersIterator.key().compare(parameterName + ".displayUnit") == 0) {
QString displayUnit = StringHandler::removeFirstLastQuotes(extendsModifiersIterator.value());
int index = pParameter->getUnitComboBox()->findData(displayUnit);
if (index < 0) {
// add extends modifier as additional display unit if compatible
index = pParameter->getUnitComboBox()->count() - 1;
if (index > -1 &&
(pOMCProxy->convertUnits(pParameter->getUnitComboBox()->itemData(0).toString(), displayUnit)).unitsCompatible) {
pParameter->getUnitComboBox()->addItem(Utilities::convertUnitToSymbol(displayUnit), displayUnit);
index ++;
} else if (extendsModifiersIterator.key().compare(parameterName + ".fixed") == 0) {
QString fixed = extendsModifiersIterator.value();
if (!fixed.isEmpty()) {
if (pParameter->getGroupBox().isEmpty()) {
pParameter->setGroupBox("Initialization");
}
pParameter->setShowStartAttribute(true);
pParameter->setFixedState(fixed, false);
}
if (index > -1) {
pParameter->getUnitComboBox()->setCurrentIndex(index);
pParameter->setDisplayUnit(displayUnit);
}
} else if (extendsModifiersIterator.key().compare(parameterName) == 0) {
pParameter->setValueWidget(extendsModifiersIterator.value(), false, pParameter->getUnit());
}
if (extendsModifiersIterator.key().compare(parameterName + ".displayUnit") == 0) {
QString displayUnit = StringHandler::removeFirstLastQuotes(extendsModifiersIterator.value());
int index = pParameter->getUnitComboBox()->findData(displayUnit);
if (index < 0) {
// add extends modifier as additional display unit if compatible
index = pParameter->getUnitComboBox()->count() - 1;
if (index > -1 &&
(pOMCProxy->convertUnits(pParameter->getUnitComboBox()->itemData(0).toString(), displayUnit)).unitsCompatible) {
pParameter->getUnitComboBox()->addItem(Utilities::convertUnitToSymbol(displayUnit), displayUnit);
index ++;
}
}
if (index > -1) {
pParameter->getUnitComboBox()->setCurrentIndex(index);
pParameter->setDisplayUnit(displayUnit);
}
}
}
}
Expand Down
1 change: 1 addition & 0 deletions OMEdit/OMEditLIB/Element/ElementProperties.h
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@ class ElementParameters : public QDialog
void createTabsGroupBoxesAndParametersHelper(LibraryTreeItem *pLibraryTreeItem, bool useInsert = false);
void createTabsGroupBoxesAndParameters(ModelInstance::Model *pModelInstance);
void createTabsGroupBoxesAndParametersHelper(ModelInstance::Model *pModelInstance, bool useInsert = false);
void fetchElementExtendsModifiers(ModelInstance::Model *pModelInstance);
void fetchElementExtendsModifiers();
void fetchElementModifiers();
void fetchClassExtendsModifiers();
Expand Down
67 changes: 38 additions & 29 deletions OMEdit/OMEditLIB/Modeling/Model.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@

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

#include <QRectF>
#include <QtMath>
Expand Down Expand Up @@ -460,35 +462,42 @@ namespace ModelInstance
}

if (jsonObject.contains("graphics")) {
QJsonArray graphicsArray = jsonObject.value("graphics").toArray();
for (int i = 0; i < graphicsArray.size(); ++i) {
QJsonObject graphicObject = graphicsArray.at(i).toObject();
if (graphicObject.contains("name") && graphicObject.contains("elements")) {
const QString name = graphicObject.value("name").toString();
if (name.compare(QStringLiteral("Line")) == 0) {
Line *pLine = new Line(mpParentModel);
pLine->deserialize(graphicObject.value("elements").toArray());
mGraphics.append(pLine);
} else if (name.compare(QStringLiteral("Polygon")) == 0) {
Polygon *pPolygon = new Polygon(mpParentModel);
pPolygon->deserialize(graphicObject.value("elements").toArray());
mGraphics.append(pPolygon);
} else if (name.compare(QStringLiteral("Rectangle")) == 0) {
Rectangle *pRectangle = new Rectangle(mpParentModel);
pRectangle->deserialize(graphicObject.value("elements").toArray());
mGraphics.append(pRectangle);
} else if (name.compare(QStringLiteral("Ellipse")) == 0) {
Ellipse *pEllipse = new Ellipse(mpParentModel);
pEllipse->deserialize(graphicObject.value("elements").toArray());
mGraphics.append(pEllipse);
} else if (name.compare(QStringLiteral("Text")) == 0) {
Text *pText = new Text(mpParentModel);
pText->deserialize(graphicObject.value("elements").toArray());
mGraphics.append(pText);
} else if (name.compare(QStringLiteral("Bitmap")) == 0) {
Bitmap *pBitmap = new Bitmap(mpParentModel);
pBitmap->deserialize(graphicObject.value("elements").toArray());
mGraphics.append(pBitmap);
if (jsonObject.value("graphics").isObject()) {
QJsonObject graphicsObject = jsonObject.value("graphics").toObject();
if (graphicsObject.contains("$error")) {
MessagesWidget::instance()->addGUIMessage(MessageItem(MessageItem::Modelica, graphicsObject.value("$error").toString(), Helper::scriptingKind, Helper::errorLevel));
}
} else if (jsonObject.value("graphics").isArray()) {
QJsonArray graphicsArray = jsonObject.value("graphics").toArray();
for (int i = 0; i < graphicsArray.size(); ++i) {
QJsonObject graphicObject = graphicsArray.at(i).toObject();
if (graphicObject.contains("name") && graphicObject.contains("elements")) {
const QString name = graphicObject.value("name").toString();
if (name.compare(QStringLiteral("Line")) == 0) {
Line *pLine = new Line(mpParentModel);
pLine->deserialize(graphicObject.value("elements").toArray());
mGraphics.append(pLine);
} else if (name.compare(QStringLiteral("Polygon")) == 0) {
Polygon *pPolygon = new Polygon(mpParentModel);
pPolygon->deserialize(graphicObject.value("elements").toArray());
mGraphics.append(pPolygon);
} else if (name.compare(QStringLiteral("Rectangle")) == 0) {
Rectangle *pRectangle = new Rectangle(mpParentModel);
pRectangle->deserialize(graphicObject.value("elements").toArray());
mGraphics.append(pRectangle);
} else if (name.compare(QStringLiteral("Ellipse")) == 0) {
Ellipse *pEllipse = new Ellipse(mpParentModel);
pEllipse->deserialize(graphicObject.value("elements").toArray());
mGraphics.append(pEllipse);
} else if (name.compare(QStringLiteral("Text")) == 0) {
Text *pText = new Text(mpParentModel);
pText->deserialize(graphicObject.value("elements").toArray());
mGraphics.append(pText);
} else if (name.compare(QStringLiteral("Bitmap")) == 0) {
Bitmap *pBitmap = new Bitmap(mpParentModel);
pBitmap->deserialize(graphicObject.value("elements").toArray());
mGraphics.append(pBitmap);
}
}
}
}
Expand Down

0 comments on commit 91e0355

Please sign in to comment.