From 28b394ea69720fa493165d2f287f095e4a273ecc Mon Sep 17 00:00:00 2001 From: Adeel Asghar Date: Mon, 13 Nov 2023 16:45:44 +0100 Subject: [PATCH] Adapt to the new dump format of redeclares (#11567) Improve the handling of final and each Removed the flag structuredRedeclare --- OMCompiler/Compiler/Script/NFApi.mo | 17 +- OMCompiler/Compiler/Util/Flags.mo | 2 - OMCompiler/Compiler/Util/FlagsUtil.mo | 3 +- OMEdit/OMEditLIB/Element/Element.cpp | 13 +- .../OMEditLIB/Element/ElementProperties.cpp | 165 +++++----- OMEdit/OMEditLIB/Element/ElementProperties.h | 14 +- OMEdit/OMEditLIB/Modeling/Model.cpp | 284 +++++++++++++----- OMEdit/OMEditLIB/Modeling/Model.h | 76 ++--- .../Modeling/ModelWidgetContainer.cpp | 6 +- .../OMEditLIB/Modeling/ModelWidgetContainer.h | 6 +- .../instance-API/GetModelInstanceChoices2.mos | 2 +- .../GetModelInstanceReplaceable3.mos | 2 +- .../GetModelInstanceReplaceable5.mos | 2 +- .../GetModelInstanceReplaceable6.mos | 2 +- .../instance-API/ModifierToJSON1.mos | 2 +- 15 files changed, 369 insertions(+), 227 deletions(-) diff --git a/OMCompiler/Compiler/Script/NFApi.mo b/OMCompiler/Compiler/Script/NFApi.mo index bbbb2a8475c..c512e9f5c00 100644 --- a/OMCompiler/Compiler/Script/NFApi.mo +++ b/OMCompiler/Compiler/Script/NFApi.mo @@ -2098,22 +2098,7 @@ algorithm json := JSON.addPair("each", JSON.makeBoolean(true), json); end if; - if Flags.isSet(Flags.STRUCTURED_REDECLARE) then - json := JSON.addPair("$value", dumpJSONSCodeElement(mod.element, scope), json); - else - json := JSON.addPair("redeclare", JSON.makeBoolean(true), json); - - if SCodeUtil.isElementReplaceable(mod.element) then - json := JSON.addPair("replaceable", JSON.makeBoolean(true), json); - end if; - - binding_json := JSON.makeString(SCodeDump.unparseElementStr(mod.element)); - json := JSON.addPair("$value", binding_json, json); - - if isChoices then - json := dumpJSONRedeclareType(mod.element, scope, json); - end if; - end if; + json := JSON.addPair("$value", dumpJSONSCodeElement(mod.element, scope), json); then (); diff --git a/OMCompiler/Compiler/Util/Flags.mo b/OMCompiler/Compiler/Util/Flags.mo index 9128f975375..c63a8418273 100644 --- a/OMCompiler/Compiler/Util/Flags.mo +++ b/OMCompiler/Compiler/Util/Flags.mo @@ -559,8 +559,6 @@ constant DebugFlag DUMP_EVENTS = DEBUG_FLAG(193, "dumpEvents", false, Gettext.gettext("Dumps information about the detected event functions.")); constant DebugFlag DUMP_BINDINGS = DEBUG_FLAG(194, "dumpBindings", false, Gettext.gettext("Dumps information about the equations created from bindings.")); -constant DebugFlag STRUCTURED_REDECLARE = DEBUG_FLAG(195, "structuredRedeclare", false, - Gettext.gettext("Dumps redeclares as structures in getModelInstance.")); public // CONFIGURATION FLAGS diff --git a/OMCompiler/Compiler/Util/FlagsUtil.mo b/OMCompiler/Compiler/Util/FlagsUtil.mo index 6438e030a16..d467e2fa1a6 100644 --- a/OMCompiler/Compiler/Util/FlagsUtil.mo +++ b/OMCompiler/Compiler/Util/FlagsUtil.mo @@ -250,8 +250,7 @@ constant list allDebugFlags = { Flags.DUMP_SLICE, Flags.VECTORIZE_BINDINGS, Flags.DUMP_EVENTS, - Flags.DUMP_BINDINGS, - Flags.STRUCTURED_REDECLARE + Flags.DUMP_BINDINGS }; protected diff --git a/OMEdit/OMEditLIB/Element/Element.cpp b/OMEdit/OMEditLIB/Element/Element.cpp index 44c835dfbe7..b629c4fbce0 100644 --- a/OMEdit/OMEditLIB/Element/Element.cpp +++ b/OMEdit/OMEditLIB/Element/Element.cpp @@ -1844,7 +1844,9 @@ QString Element::getParameterDisplayString(QString parameterName) /* case 1 */ if (displayString.isEmpty()) { if (mpGraphicsView->getModelWidget()->isNewApi()) { - displayString = mpModelComponent->getModifier().getModifierValue(QStringList() << parameterName); + if (mpModelComponent->getModifier()) { + displayString = mpModelComponent->getModifier()->getModifierValue(QStringList() << parameterName); + } } else { displayString = mpElementInfo->getModifiersMap(pOMCProxy, className, this).value(parameterName, ""); } @@ -3568,8 +3570,10 @@ void Element::duplicate() ModelInstance::Component *pModelInstanceComponent = GraphicsView::createModelInstanceComponent(mpGraphicsView->getModelWidget()->getModelInstance(), name, getClassName()); mpGraphicsView->addElementToView(pModelInstanceComponent, false, true, false, QPointF(0, 0), getOMCPlacementAnnotation(gridStep), false); // set modifiers - MainWindow::instance()->getOMCProxy()->setElementModifierValue(mpGraphicsView->getModelWidget()->getLibraryTreeItem()->getNameStructure(), name, - mpModelComponent->getModifier().toString()); + if (mpModelComponent->getModifier()) { + MainWindow::instance()->getOMCProxy()->setElementModifierValue(mpGraphicsView->getModelWidget()->getLibraryTreeItem()->getNameStructure(), name, + mpModelComponent->getModifier()->toString()); + } } else { mpElementInfo->getModifiersMap(MainWindow::instance()->getOMCProxy(), mpGraphicsView->getModelWidget()->getLibraryTreeItem()->getNameStructure(), this); ElementInfo *pElementInfo = new ElementInfo(mpElementInfo); @@ -3835,8 +3839,7 @@ void Element::showParameters() if (MainWindow::instance()->isNewApi()) { pMainWindow->getProgressBar()->setRange(0, 0); pMainWindow->showProgressBar(); - ElementParameters *pElementParameters = new ElementParameters(mpModelComponent, mpGraphicsView, isInheritedElement(), false, ModelInstance::Modifier(), - ModelInstance::Modifier(), ModelInstance::Modifier(), pMainWindow); + ElementParameters *pElementParameters = new ElementParameters(mpModelComponent, mpGraphicsView, isInheritedElement(), false, 0, 0, 0, pMainWindow); pMainWindow->hideProgressBar(); pMainWindow->getStatusBar()->clearMessage(); pElementParameters->exec(); diff --git a/OMEdit/OMEditLIB/Element/ElementProperties.cpp b/OMEdit/OMEditLIB/Element/ElementProperties.cpp index 61715ad01a4..095a097bffd 100644 --- a/OMEdit/OMEditLIB/Element/ElementProperties.cpp +++ b/OMEdit/OMEditLIB/Element/ElementProperties.cpp @@ -235,8 +235,8 @@ Parameter::Parameter(ModelInstance::Element *pElement, ElementParameters *pEleme mConnectorSizing = dialogAnnotation.isConnectorSizing(); // If mShowStartAttribute is not set then check for start modifier - if (!mShowStartAndFixed && !isParameter()) { - mShowStartAndFixed = mpModelInstanceElement->getModifier().hasModifier("start"); + if (!mShowStartAndFixed && !isParameter() && mpModelInstanceElement->getModifier()) { + mShowStartAndFixed = mpModelInstanceElement->getModifier()->hasModifier("start"); } /* if mShowStartAndFixed and group name is empty then set group name to Initialization. * else set group name to Parameters for actual parameters or elements that have dialog annotation or replaceable elements. @@ -254,7 +254,8 @@ Parameter::Parameter(ModelInstance::Element *pElement, ElementParameters *pEleme mpFixedFinalEachMenuButton = new FinalEachToolButton(mpModelInstanceElement->getDimensions().isArray()); // set the value type based on element type. if (mpModelInstanceElement->getRootType().compare(QStringLiteral("Boolean")) == 0) { - if (mpModelInstanceElement->getAnnotation()->getChoices().isCheckBox() || mpModelInstanceElement->getAnnotation()-> getChoices().isDymolaCheckBox()) { + if (mpModelInstanceElement->getAnnotation()->getChoices() + && (mpModelInstanceElement->getAnnotation()->getChoices()->isCheckBox() || mpModelInstanceElement->getAnnotation()-> getChoices()->isDymolaCheckBox())) { mValueType = Parameter::CheckBox; } else { mValueType = Parameter::Boolean; @@ -275,7 +276,7 @@ Parameter::Parameter(ModelInstance::Element *pElement, ElementParameters *pEleme mpEditRedeclareClassButton->setAutoRaise(true); connect(mpEditRedeclareClassButton, SIGNAL(clicked()), SLOT(editRedeclareClassButtonClicked())); } - } else if (!mpModelInstanceElement->getAnnotation()->getChoices().getChoices().isEmpty()) { + } else if (mpModelInstanceElement->getAnnotation()->getChoices() && !mpModelInstanceElement->getAnnotation()->getChoices()->getChoices().isEmpty()) { mValueType = Parameter::Choices; } else if (mpModelInstanceElement->getAnnotation()->isChoicesAllMatching()) { mValueType = Parameter::ChoicesAllMatching; @@ -339,7 +340,10 @@ Parameter::Parameter(ModelInstance::Element *pElement, ElementParameters *pEleme } else if (mValueType == Parameter::ReplaceableComponent) { QString value = "redeclare " % mpModelInstanceElement->getType() % " " % mpModelInstanceElement->getName(); - QString modifiers = mpModelInstanceElement->getModifier().toString(); + QString modifiers; + if (mpModelInstanceElement->getModifier()) { + modifiers = mpModelInstanceElement->getModifier()->toString(true); + } if (!modifiers.isEmpty()) { if (modifiers.startsWith("(")) { value = value % modifiers; @@ -680,7 +684,9 @@ void Parameter::createValueWidget() } } } - choices = mpModelInstanceElement->getAnnotation()->getChoices().getChoices(); + if (mpModelInstanceElement->getAnnotation()->getChoices()) { + choices = mpModelInstanceElement->getAnnotation()->getChoices()->getChoicesStringList(); + } parentClassName = mpElementParameters->getElementParentClassName(); if (mpModelInstanceElement->getModel()) { restriction = mpModelInstanceElement->getModel()->getRestriction(); @@ -842,15 +848,15 @@ void Parameter::editRedeclareClassButtonClicked() QString modifier = value; const QString defaultValue = mpValueComboBox->lineEdit()->placeholderText(); QString defaultModifier = defaultValue; - ModelInstance::Modifier replaceableConstrainedByModifier; + ModelInstance::Modifier *pReplaceableConstrainedByModifier = 0; QString comment; if (mValueType == Parameter::ReplaceableComponent) { type = mpModelInstanceElement->getType(); - replaceableConstrainedByModifier = mpModelInstanceElement->getReplaceable()->getModifier(); + pReplaceableConstrainedByModifier = mpModelInstanceElement->getReplaceable()->getModifier(); } else if (mValueType == Parameter::ReplaceableClass) { auto pReplaceableClass = dynamic_cast(mpModelInstanceElement); type = pReplaceableClass->getBaseClass(); - replaceableConstrainedByModifier = pReplaceableClass->getReplaceable()->getModifier(); + pReplaceableConstrainedByModifier = pReplaceableClass->getReplaceable()->getModifier(); } // parse the Modelica code of element redeclaration to get the type and modifiers if (value.startsWith("redeclare")) { @@ -871,17 +877,17 @@ void Parameter::editRedeclareClassButtonClicked() const QJsonObject newModelJSON = MainWindow::instance()->getOMCProxy()->getModelInstance(qualifiedType, modifier); if (!newModelJSON.isEmpty()) { const QJsonObject modifierJSON = MainWindow::instance()->getOMCProxy()->modifierToJSON(modifier); - ModelInstance::Modifier elementModifier; - elementModifier.deserialize(QJsonValue(modifierJSON)); + ModelInstance::Modifier *pElementModifier = new ModelInstance::Modifier("", QJsonValue(), mpModelInstanceElement->getParentModel()); + pElementModifier->deserialize(QJsonValue(modifierJSON)); const QJsonObject defaultModifierJSON = MainWindow::instance()->getOMCProxy()->modifierToJSON(defaultModifier); - ModelInstance::Modifier defaultElementModifier; - defaultElementModifier.deserialize(QJsonValue(defaultModifierJSON)); + ModelInstance::Modifier *pDefaultElementModifier = new ModelInstance::Modifier("", QJsonValue(), mpModelInstanceElement->getParentModel()); + pDefaultElementModifier->deserialize(QJsonValue(defaultModifierJSON)); ModelInstance::Model *pNewModel = new ModelInstance::Model(newModelJSON); mpModelInstanceElement->setModel(pNewModel); MainWindow::instance()->getProgressBar()->setRange(0, 0); MainWindow::instance()->showProgressBar(); ElementParameters *pElementParameters = new ElementParameters(mpModelInstanceElement, mpElementParameters->getGraphicsView(), mpElementParameters->isInherited(), - true, defaultElementModifier, replaceableConstrainedByModifier, elementModifier, mpElementParameters); + true, pDefaultElementModifier, pReplaceableConstrainedByModifier, pElementModifier, mpElementParameters); MainWindow::instance()->hideProgressBar(); MainWindow::instance()->getStatusBar()->clearMessage(); if (pElementParameters->exec() == QDialog::Accepted) { @@ -915,6 +921,8 @@ void Parameter::editRedeclareClassButtonClicked() } } pElementParameters->deleteLater(); + delete pElementModifier; + delete pDefaultElementModifier; // reset the actual model of the element mpModelInstanceElement->setModel(pCurrentModel); delete pNewModel; @@ -1205,14 +1213,16 @@ QVBoxLayout *ParametersScrollArea::getLayout() * \brief ElementParameters::ElementParameters * \param pElement - pointer to ModelInstance::Element * \param pGraphicsView - * \param className * \param inherited - * \param elementModifier + * \param nested + * \param pDefaultElementModifier + * \param pReplaceableConstrainedByModifier + * \param pElementModifier * \param pParent */ ElementParameters::ElementParameters(ModelInstance::Element *pElement, GraphicsView *pGraphicsView, bool inherited, bool nested, - const ModelInstance::Modifier defaultElementModifier, - const ModelInstance::Modifier replaceableConstrainedByModifier, const ModelInstance::Modifier elementModifier, QWidget *pParent) + ModelInstance::Modifier *pDefaultElementModifier, + ModelInstance::Modifier *pReplaceableConstrainedByModifier, ModelInstance::Modifier *pElementModifier, QWidget *pParent) : QDialog(pParent) { const QString className = pGraphicsView->getModelWidget()->getLibraryTreeItem()->getNameStructure(); @@ -1221,9 +1231,9 @@ ElementParameters::ElementParameters(ModelInstance::Element *pElement, GraphicsV mpGraphicsView = pGraphicsView; mInherited = inherited; mNested = nested; - mDefaultElementModifier = defaultElementModifier; - mReplaceableConstrainedByModifier = replaceableConstrainedByModifier; - mElementModifier = elementModifier; + mpDefaultElementModifier = pDefaultElementModifier; + mpReplaceableConstrainedByModifier = pReplaceableConstrainedByModifier; + mpElementModifier = pElementModifier; mModification.clear(); setUpDialog(); } @@ -1251,28 +1261,28 @@ QString ElementParameters::getElementParentClassName() const /*! * \brief ElementParameters::applyFinalStartFixedAndDisplayUnitModifiers * \param pParameter - * \param modifier + * \param pModifier * \param defaultValue * \param isElementModification * \param checkFinal */ -void ElementParameters::applyFinalStartFixedAndDisplayUnitModifiers(Parameter *pParameter, const ModelInstance::Modifier &modifier, bool defaultValue, bool isElementModification, bool checkFinal) +void ElementParameters::applyFinalStartFixedAndDisplayUnitModifiers(Parameter *pParameter, ModelInstance::Modifier *pModifier, bool defaultValue, bool isElementModification, bool checkFinal) { - if (pParameter) { + if (pParameter && pModifier) { /* Ticket #2531 * Check if parameter is marked final. */ - if ((checkFinal && modifier.isFinal()) || (!isElementModification && modifier.isRedeclare() && !modifier.isReplaceable())) { + if ((checkFinal && pModifier->isFinal()) || (!isElementModification && pModifier->isRedeclare() && !pModifier->isReplaceable())) { mParametersList.removeOne(pParameter); delete pParameter; } else { // if builtin type if (MainWindow::instance()->getOMCProxy()->isBuiltinType(pParameter->getModelInstanceElement()->getRootType())) { - const QString value = modifier.getValue(); + const QString value = pModifier->getValue(); // if value is not empty then use it otherwise try to read start and fixed modifiers if (pParameter->isShowStartAttribute() || (value.isEmpty() && !pParameter->isParameter())) { - bool hasStart = modifier.hasModifier("start"); - bool hasFixed = modifier.hasModifier("fixed"); + bool hasStart = pModifier->hasModifier("start"); + bool hasFixed = pModifier->hasModifier("fixed"); if (hasStart || hasFixed) { if (!pParameter->isGroupDefined() && !pParameter->isParameter()) { pParameter->setGroup("Initialization"); @@ -1280,30 +1290,37 @@ void ElementParameters::applyFinalStartFixedAndDisplayUnitModifiers(Parameter *p pParameter->setShowStartAndFixed(true); } if (hasStart) { - ModelInstance::Modifier startModifier = modifier.getModifier("start"); - pParameter->setValueWidget(StringHandler::removeFirstLastQuotes(startModifier.getValue()), defaultValue, pParameter->getUnit(), mNested); - pParameter->getFinalEachMenu()->setFinal(startModifier.isFinal()); - pParameter->getFinalEachMenu()->setEach(startModifier.isEach()); + ModelInstance::Modifier *pStartModifier = pModifier->getModifier("start"); + if (pStartModifier) { + pParameter->setValueWidget(StringHandler::removeFirstLastQuotes(pStartModifier->getValue()), defaultValue, pParameter->getUnit(), mNested); + pParameter->getFinalEachMenu()->setFinal(pStartModifier->isFinal()); + pParameter->getFinalEachMenu()->setEach(pStartModifier->isEach()); + } } if (hasFixed) { - ModelInstance::Modifier fixedModifier = modifier.getModifier("fixed"); - pParameter->setFixedState(StringHandler::removeFirstLastQuotes(fixedModifier.getValue()), defaultValue); - pParameter->getFixedFinalEachMenu()->setFinal(fixedModifier.isFinal()); - pParameter->getFixedFinalEachMenu()->setEach(fixedModifier.isEach()); + ModelInstance::Modifier *pFixedModifier = pModifier->getModifier("fixed"); + if (pFixedModifier) { + pParameter->setFixedState(StringHandler::removeFirstLastQuotes(pFixedModifier->getValue()), defaultValue); + pParameter->getFixedFinalEachMenu()->setFinal(pFixedModifier->isFinal()); + pParameter->getFixedFinalEachMenu()->setEach(pFixedModifier->isEach()); + } } } else { pParameter->setValueWidget(value, defaultValue, pParameter->getUnit(), mNested); } } else { // if not builtin type then use all sub modifiers - QString modifierValue = modifier.toString(); + QString modifierValue = pModifier->toString(true); if (modifierValue.startsWith("(")) { modifierValue = pParameter->getModelInstanceElement()->getName() % modifierValue; } pParameter->setValueWidget(modifierValue, defaultValue, pParameter->getUnit(), mNested); } // displayUnit - ModelInstance::Modifier displayUnitModifier = modifier.getModifier("displayUnit"); - QString displayUnit = StringHandler::removeFirstLastQuotes(displayUnitModifier.getValue()); + ModelInstance::Modifier *pDisplayUnitModifier = pModifier->getModifier("displayUnit"); + QString displayUnit; + if (pDisplayUnitModifier) { + displayUnit = StringHandler::removeFirstLastQuotes(pDisplayUnitModifier->getValue()); + } if (!displayUnit.isEmpty()) { int index = pParameter->getUnitComboBox()->findData(displayUnit); if (index < 0) { @@ -1324,8 +1341,10 @@ void ElementParameters::applyFinalStartFixedAndDisplayUnitModifiers(Parameter *p if (!defaultValue) { pParameter->setHasDisplayUnit(true); } - pParameter->getDisplayUnitFinalEachMenu()->setFinal(displayUnitModifier.isFinal()); - pParameter->getDisplayUnitFinalEachMenu()->setEach(displayUnitModifier.isEach()); + if (pDisplayUnitModifier) { + pParameter->getDisplayUnitFinalEachMenu()->setFinal(pDisplayUnitModifier->isFinal()); + pParameter->getDisplayUnitFinalEachMenu()->setEach(pDisplayUnitModifier->isEach()); + } } } } @@ -1404,11 +1423,11 @@ void ElementParameters::setUpDialog() fetchElementModifiers(); fetchClassExtendsModifiers(mpElement); // Apply the default modifiers that are given in the redeclaration of the replaceable class or component. - applyModifiers(mDefaultElementModifier, true); + applyModifier(mpDefaultElementModifier, true); // Apply the modifiers that are given in the constainedBy of the replaceable class or component. - applyModifiers(mReplaceableConstrainedByModifier, true); + applyModifier(mpReplaceableConstrainedByModifier, true); // Apply the modifiers that are given in the redeclaration of the replaceable class or component. - applyModifiers(mElementModifier, false); + applyModifier(mpElementModifier, false); foreach (Parameter *pParameter, mParametersList) { ParametersScrollArea *pParametersScrollArea = qobject_cast(mpParametersTabWidget->widget(mTabsMap.value(pParameter->getTab()))); @@ -1577,9 +1596,11 @@ void ElementParameters::fetchElementExtendsModifiers(ModelInstance::Model *pMode * Go deep in the extends hierarchy and then apply the values in bottom to top order. */ fetchElementExtendsModifiers(pExtend->getModel()); - foreach (auto modifier, pExtend->getModifier().getModifiers()) { - Parameter *pParameter = findParameter(modifier.getName()); - applyFinalStartFixedAndDisplayUnitModifiers(pParameter, modifier, true, false, true); + if (pExtend->getModifier()) { + foreach (auto *pModifier, pExtend->getModifier()->getModifiers()) { + Parameter *pParameter = findParameter(pModifier->getName()); + applyFinalStartFixedAndDisplayUnitModifiers(pParameter, pModifier, true, false, true); + } } } } @@ -1591,13 +1612,15 @@ void ElementParameters::fetchElementExtendsModifiers(ModelInstance::Model *pMode */ void ElementParameters::fetchElementModifiers() { - foreach (auto modifier, mpElement->getModifier().getModifiers()) { - Parameter *pParameter = findParameter(modifier.getName()); - ElementParameters::applyFinalStartFixedAndDisplayUnitModifiers(pParameter, modifier, mInherited || mNested, true, false); - // set final and each checkboxes in the menu - if (pParameter && !pParameter->isShowStartAndFixed()) { - pParameter->getFinalEachMenu()->setFinal(modifier.isFinal()); - pParameter->getFinalEachMenu()->setEach(modifier.isEach()); + if (mpElement->getModifier()) { + foreach (auto *pModifier, mpElement->getModifier()->getModifiers()) { + Parameter *pParameter = findParameter(pModifier->getName()); + ElementParameters::applyFinalStartFixedAndDisplayUnitModifiers(pParameter, pModifier, mInherited || mNested, true, false); + // set final and each checkboxes in the menu + if (pParameter && !pParameter->isShowStartAndFixed()) { + pParameter->getFinalEachMenu()->setFinal(pModifier->isFinal()); + pParameter->getFinalEachMenu()->setEach(pModifier->isEach()); + } } } } @@ -1616,13 +1639,15 @@ void ElementParameters::fetchClassExtendsModifiers(ModelInstance::Element *pMode auto pExtend = pModelElement->getParentModel()->getParentElement(); if (pExtend && pExtend->isExtend()) { bool hasParentElement = pExtend->getParentModel() && pExtend->getParentModel()->getParentElement(); - foreach (auto modifier, pExtend->getModifier().getModifiers()) { - if (modifier.getName().compare(mpElement->getName()) == 0) { - foreach (auto subModifier, modifier.getModifiers()) { - Parameter *pParameter = findParameter(subModifier.getName()); - applyFinalStartFixedAndDisplayUnitModifiers(pParameter, subModifier, hasParentElement, false, true); + if (pExtend->getModifier()) { + foreach (auto pModifier, pExtend->getModifier()->getModifiers()) { + if (pModifier->getName().compare(mpElement->getName()) == 0) { + foreach (auto *pSubModifier, pModifier->getModifiers()) { + Parameter *pParameter = findParameter(pSubModifier->getName()); + applyFinalStartFixedAndDisplayUnitModifiers(pParameter, pSubModifier, hasParentElement, false, true); + } + break; } - break; } } if (hasParentElement) { @@ -1633,21 +1658,21 @@ void ElementParameters::fetchClassExtendsModifiers(ModelInstance::Element *pMode } /*! - * \brief ElementParameters::applyModifiers - * Apply the modifiers of the component. - * \param modifiers + * \brief ElementParameters::applyModifier + * Apply the modifier of the component. + * \param pModifier * \param defaultValue */ -void ElementParameters::applyModifiers(const ModelInstance::Modifier modifiers, bool defaultValue) +void ElementParameters::applyModifier(ModelInstance::Modifier *pModifier, bool defaultValue) { - if (mNested) { - foreach (auto modifier, modifiers.getModifiers()) { - Parameter *pParameter = findParameter(modifier.getName()); - ElementParameters::applyFinalStartFixedAndDisplayUnitModifiers(pParameter, modifier, defaultValue, false, !mNested); + if (mNested && pModifier) { + foreach (auto pSubModifier, pModifier->getModifiers()) { + Parameter *pParameter = findParameter(pSubModifier->getName()); + ElementParameters::applyFinalStartFixedAndDisplayUnitModifiers(pParameter, pSubModifier, defaultValue, false, !mNested); // set final and each checkboxes in the menu if (pParameter && !pParameter->isShowStartAndFixed()) { - pParameter->getFinalEachMenu()->setFinal(modifier.isFinal()); - pParameter->getFinalEachMenu()->setEach(modifier.isEach()); + pParameter->getFinalEachMenu()->setFinal(pSubModifier->isFinal()); + pParameter->getFinalEachMenu()->setEach(pSubModifier->isEach()); } } } diff --git a/OMEdit/OMEditLIB/Element/ElementProperties.h b/OMEdit/OMEditLIB/Element/ElementProperties.h index 10890bea5d2..7b4b37821bb 100644 --- a/OMEdit/OMEditLIB/Element/ElementProperties.h +++ b/OMEdit/OMEditLIB/Element/ElementProperties.h @@ -217,23 +217,23 @@ class ElementParameters : public QDialog { Q_OBJECT public: - ElementParameters(ModelInstance::Element *pElement, GraphicsView *pGraphicsView, bool inherited, bool nested, const ModelInstance::Modifier defaultElementModifier, - const ModelInstance::Modifier replaceableConstrainedByModifier, const ModelInstance::Modifier elementModifier, QWidget *pParent = 0); + ElementParameters(ModelInstance::Element *pElement, GraphicsView *pGraphicsView, bool inherited, bool nested, ModelInstance::Modifier *pDefaultElementModifier, + ModelInstance::Modifier *pReplaceableConstrainedByModifier, ModelInstance::Modifier *pElementModifier, QWidget *pParent = 0); ~ElementParameters(); QString getElementParentClassName() const; GraphicsView *getGraphicsView() const {return mpGraphicsView;} bool isInherited() const {return mInherited;} QString getModification() const {return mModification;} - void applyFinalStartFixedAndDisplayUnitModifiers(Parameter *pParameter, const ModelInstance::Modifier &modifier, bool defaultValue, bool isElementModification, bool checkFinal); + void applyFinalStartFixedAndDisplayUnitModifiers(Parameter *pParameter, ModelInstance::Modifier *pModifier, bool defaultValue, bool isElementModification, bool checkFinal); void updateParameters(); private: ModelInstance::Element *mpElement; GraphicsView *mpGraphicsView; bool mInherited; bool mNested; - ModelInstance::Modifier mDefaultElementModifier; - ModelInstance::Modifier mReplaceableConstrainedByModifier; - ModelInstance::Modifier mElementModifier; + ModelInstance::Modifier *mpDefaultElementModifier; + ModelInstance::Modifier *mpReplaceableConstrainedByModifier; + ModelInstance::Modifier *mpElementModifier; QString mModification; Label *mpParametersHeading; QFrame *mHorizontalLine; @@ -261,7 +261,7 @@ class ElementParameters : public QDialog void fetchElementExtendsModifiers(ModelInstance::Model *pModelInstance); void fetchElementModifiers(); void fetchClassExtendsModifiers(ModelInstance::Element *pModelElement); - void applyModifiers(const ModelInstance::Modifier modifiers, bool defaultValue); + void applyModifier(ModelInstance::Modifier *pModifier, bool defaultValue); Parameter* findParameter(LibraryTreeItem *pLibraryTreeItem, const QString ¶meter, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive) const; Parameter* findParameter(const QString ¶meter, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive) const; public slots: diff --git a/OMEdit/OMEditLIB/Modeling/Model.cpp b/OMEdit/OMEditLIB/Modeling/Model.cpp index ad31f56d959..3dbaa4672d6 100644 --- a/OMEdit/OMEditLIB/Modeling/Model.cpp +++ b/OMEdit/OMEditLIB/Modeling/Model.cpp @@ -513,6 +513,13 @@ namespace ModelInstance mHasDialogAnnotation = false; } + Annotation::~Annotation() + { + if (mpChoices) { + delete mpChoices; + } + } + void Annotation::deserialize(const QJsonObject &jsonObject) { if (jsonObject.contains("Icon")) { @@ -581,7 +588,7 @@ namespace ModelInstance } if (jsonObject.contains("choices")) { - mChoices.deserialize(jsonObject.value("choices").toObject()); + mpChoices = new Choices(jsonObject.value("choices").toObject(), mpParentModel); } // Connection annotation if (jsonObject.contains("Line")) { @@ -686,9 +693,21 @@ namespace ModelInstance } } - Modifier::Modifier() + Modifier::Modifier(const QString &name, const QJsonValue &jsonValue, Model *pParentModel) { + mName = name; + mpParentModel = pParentModel; + deserialize(jsonValue); + } + Modifier::~Modifier() + { + if (mpElement) { + delete mpElement; + } + + qDeleteAll(mModifiers); + mModifiers.clear(); } void Modifier::deserialize(const QJsonValue &jsonValue) @@ -698,21 +717,29 @@ namespace ModelInstance for (QJsonObject::iterator modifiersIterator = modifiers.begin(); modifiersIterator != modifiers.end(); ++modifiersIterator) { const QString modifierKey = modifiersIterator.key(); const QJsonValue modifierValue = modifiersIterator.value(); - if (modifierKey.compare(QStringLiteral("$value")) == 0) { - mValue = modifierValue.toString(); + if (modifierKey.compare(QStringLiteral("$type")) == 0) { + mType = modifierValue.toString(); } else if (modifierKey.compare(QStringLiteral("final")) == 0) { mFinal = true; } else if (modifierKey.compare(QStringLiteral("each")) == 0) { mEach = true; - } else if (modifierKey.compare(QStringLiteral("redeclare")) == 0) { - mRedeclare = true; - } else if (modifierKey.compare(QStringLiteral("replaceable")) == 0) { - mReplaceable = true; + } else if (modifierKey.compare(QStringLiteral("$value")) == 0) { + if (modifierValue.isObject()) { + QJsonObject valueObject = modifierValue.toObject(); + QString kind = valueObject.value("$kind").toString(); + + if (kind.compare(QStringLiteral("component")) == 0) { + mpElement = new Component(mpParentModel, valueObject); + } else if (kind.compare(QStringLiteral("class")) == 0) { + mpElement = new ReplaceableClass(mpParentModel, valueObject); + } else { + qDebug() << "Modifier::deserialize() unhandled kind of element" << kind; + } + } else { + mValue = modifierValue.toString(); + } } else { - Modifier modifier; - modifier.setName(modifierKey); - modifier.deserialize(modifierValue); - mModifiers.append(modifier); + mModifiers.append(new Modifier(modifierKey, modifierValue, mpParentModel)); } } } else { @@ -720,50 +747,70 @@ namespace ModelInstance } } - QString Modifier::toString() const + QString Modifier::toString(bool skipTopLevel) const { - if (isRedeclare()) { - return mValue; + if (mpElement) { + return mpElement->toString(skipTopLevel); } else { QString value; - value.append(printRedeclare()); - value.append(printEach()); - value.append(printFinal()); - value.append(printReplaceable()); + if (!skipTopLevel) { + value.append(toStringEach()); + value.append(toStringFinal()); + } value.append(mName); QStringList subModifiers; - foreach (auto subModifier, mModifiers) { - subModifiers.append(subModifier.toString()); + foreach (auto *pSubModifier, mModifiers) { + subModifiers.append(pSubModifier->toString()); } if (!subModifiers.isEmpty()) { value.append("(" % subModifiers.join(", ") % ")"); } if (mValue.isEmpty()) { - return value; + if (value.compare(mName) != 0) { + return value; + } else { + return ""; + } } else { return value.append(mName.isEmpty() ? mValue : " = " % mValue); } } } - Modifier Modifier::getModifier(const QString &m) const + Modifier *Modifier::getModifier(const QString &modifier) const { - foreach (Modifier modifier, mModifiers) { - if (modifier.getName().compare(m) == 0) { - return modifier; + foreach (auto *pModifier, mModifiers) { + if (pModifier->getName().compare(modifier) == 0) { + return pModifier; } } - return Modifier(); + return 0; + } + + QString Modifier::getModifierValue(const QString &modifier) const + { + Modifier *pModifier = getModifier(modifier); + if (pModifier) { + return pModifier->getValue(); + } else { + return ""; + } + } + + bool Modifier::hasModifier(const QString &modifier) const + { + Modifier *pModifier = getModifier(modifier); + return pModifier && pModifier->getName().compare(modifier) == 0; } - QString Modifier::getModifierValue(const QString &m) const + bool Modifier::isRedeclare() const { - return getModifier(m).getValue(); + return mpElement && mpElement->isRedeclare(); } - bool Modifier::hasModifier(const QString &m) const + bool Modifier::isReplaceable() const { - return getModifier(m).getName().compare(m) == 0; + return mpElement && mpElement->getReplaceable(); } QString Modifier::getModifierValue(QStringList qualifiedModifierName) const @@ -777,43 +824,33 @@ namespace ModelInstance * so correct list items are passed to the function. */ const QString name = qualifiedModifierName.takeFirst(); - return Modifier::getModifierValue(*this, name, qualifiedModifierName); + return Modifier::getModifierValue(this, name, 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 subModifier.getValueWithoutQuotes(); - } else { - const QString name = qualifiedModifierName.takeFirst(); - return Modifier::getModifierValue(subModifier, name, qualifiedModifierName); - } - } - } - - return ""; - } - - QString Modifier::printEach() const + QString Modifier::toStringEach() const { return isEach() ? "each " : ""; } - QString Modifier::printFinal() const + QString Modifier::toStringFinal() const { return isFinal() ? "final " : ""; } - QString Modifier::printRedeclare() const + QString Modifier::getModifierValue(const Modifier *pModifier, const QString &modifierName, QStringList qualifiedModifierName) { - return isRedeclare() ? "redeclare " : ""; - } + foreach (auto *pSubModifier, pModifier->getModifiers()) { + if (pSubModifier->getName().compare(modifierName) == 0) { + if (qualifiedModifierName.isEmpty()) { + return pSubModifier->getValueWithoutQuotes(); + } else { + const QString name = qualifiedModifierName.takeFirst(); + return Modifier::getModifierValue(pSubModifier, name, qualifiedModifierName); + } + } + } - QString Modifier::printReplaceable() const - { - return isReplaceable() ? "replaceable " : ""; + return ""; } Replaceable::Replaceable(Model *pParentModel) @@ -823,6 +860,13 @@ namespace ModelInstance mComment = ""; } + Replaceable::~Replaceable() + { + if (mpModifier) { + delete mpModifier; + } + } + void Replaceable::deserialize(const QJsonValue &jsonValue) { if (jsonValue.isObject()) { @@ -830,7 +874,7 @@ namespace ModelInstance mConstrainedby = replaceableObject.value("constrainedby").toString(); if (replaceableObject.contains("modifiers")) { - mModifier.deserialize(replaceableObject.value("modifiers")); + mpModifier = new Modifier("", replaceableObject.value("modifiers"), mpParentModel); } if (replaceableObject.contains("comment")) { @@ -907,6 +951,23 @@ namespace ModelInstance } } + QString Prefixes::toString(bool skipTopLevel) const + { + QStringList value; + + if (mRedeclare) { + value.append("redeclare"); + } + if (mFinal && !skipTopLevel) { + value.append("final"); + } + if (mpReplaceable) { + value.append("replaceable"); + } + + return value.join(" "); + } + Source::Source() { mFileName = ""; @@ -1003,7 +1064,7 @@ namespace ModelInstance } else if (kind.compare(QStringLiteral("class")) == 0) { mElements.append(new ReplaceableClass(this, elementObject)); } else { - qDebug() << "Unhandled kind of element" << kind; + qDebug() << "Model::deserialize() unhandled kind of element" << kind; } } @@ -1363,7 +1424,9 @@ namespace ModelInstance if (pElement->isComponent()) { auto pComponent = dynamic_cast(pElement); if (pComponent->getName().compare(StringHandler::getFirstWordBeforeDot(parameter)) == 0) { - value = pComponent->getModifier().getValueWithoutQuotes(); + if (pComponent->getModifier()) { + value = pComponent->getModifier()->getValueWithoutQuotes(); + } // Fixes issue #7493. Handles the case where value is from instance name e.g., %instanceName.parameterName if (value.isEmpty() && pComponent->getModel()) { value = pComponent->getModel()->getParameterValue(StringHandler::getLastWordAfterDot(parameter), typeName); @@ -1382,7 +1445,9 @@ namespace ModelInstance foreach (auto pElement, mElements) { if (pElement->isExtend()) { auto pExtend = dynamic_cast(pElement); - value = pExtend->getModifier().getModifierValue(QStringList() << parameter); + if (pExtend->getModifier()) { + value = pExtend->getModifier()->getModifierValue(QStringList() << parameter); + } if (!value.isEmpty()) { return value; } else { @@ -1594,11 +1659,19 @@ namespace ModelInstance } } - Choices::Choices() + Choices::Choices(const QJsonObject &jsonObject, Model *pParentModel) { + mpParentModel = pParentModel; mCheckBox = false; mDymolaCheckBox = false; mChoices.clear(); + deserialize(jsonObject); + } + + Choices::~Choices() + { + qDeleteAll(mChoices); + mChoices.clear(); } void Choices::deserialize(const QJsonObject &jsonObject) @@ -1614,27 +1687,16 @@ namespace ModelInstance if (jsonObject.contains("choice")) { QJsonArray choices = jsonObject.value("choice").toArray(); foreach (auto choice, choices) { - QString type = ""; - if (choice.isObject()) { - QJsonObject choiceObject = choice.toObject(); - if (choiceObject.contains("$type")) { - type = choiceObject.value("$type").toString(); - } - if (choiceObject.contains("$value")) { - mChoices.append(qMakePair(choiceObject.value("$value").toString(), type)); - } - } else { - mChoices.append(qMakePair(choice.toString(), type)); - } + mChoices.append(new Modifier("", choice, mpParentModel)); } } } - QStringList Choices::getChoices() const + QStringList Choices::getChoicesStringList() const { QStringList choices; - foreach (Choice choice, mChoices) { - choices.append(choice.first); + foreach (auto *pChoice, mChoices) { + choices.append(pChoice->toString()); } return choices; } @@ -1650,12 +1712,16 @@ namespace ModelInstance if (mpModel) { delete mpModel; } + + if (mpModifier) { + delete mpModifier; + } } void Element::deserialize(const QJsonObject &jsonObject) { if (jsonObject.contains("modifiers")) { - mModifier.deserialize(jsonObject.value("modifiers")); + mpModifier = new Modifier("", jsonObject.value("modifiers"), mpParentModel); } if (jsonObject.contains("comment")) { @@ -1690,7 +1756,10 @@ namespace ModelInstance * 2. If no unit is found then check it in the derived class modifier value recursively. */ // Case 1 - QString modifierValue = mModifier.getModifierValue(modifierNames); + QString modifierValue; + if (mpModifier) { + modifierValue = mpModifier->getModifierValue(modifierNames); + } if (modifierValue.isEmpty() && mpModel) { // Case 2 if (modifierValue.isEmpty()) { @@ -1725,6 +1794,11 @@ namespace ModelInstance return mpPrefixes ? mpPrefixes.get()->getReplaceable() : nullptr; } + bool Element::isRedeclare() const + { + return mpPrefixes ? mpPrefixes.get()->isRedeclare() : false; + } + QString Element::getConnector() const { return mpPrefixes ? mpPrefixes.get()->getConnector() : ""; @@ -1772,6 +1846,14 @@ namespace ModelInstance } } + QString Element::toString(bool skipTopLevel) const + { + if (mpPrefixes) { + return mpPrefixes->toString(skipTopLevel); + } + return ""; + } + /*! * \brief Element::getDirection * Returns the direction of the element, either from the element itself or @@ -1799,7 +1881,9 @@ namespace ModelInstance foreach (auto pElement, pModel->getElements()) { if (pElement->isExtend()) { auto pExtend = dynamic_cast(pElement); - modifierValue = pExtend->getModifier().getModifierValue(modifierNames); + if (pExtend->getModifier()) { + modifierValue = pExtend->getModifier()->getModifierValue(modifierNames); + } if (modifierValue.isEmpty() && pExtend->getModel()) { modifierValue = Element::getModifierValueFromInheritedType(pExtend->getModel(), modifierNames); } else { @@ -1856,6 +1940,11 @@ namespace ModelInstance return mBaseClass; } + QString Extend::toString(bool skipTopLevel) const + { + return Element::toString(skipTopLevel); + } + Component::Component(Model *pParentModel) : Element(pParentModel) { @@ -1946,6 +2035,24 @@ namespace ModelInstance return mType; } + QString Component::toString(bool skipTopLevel) const + { + QStringList value; + + value.append(Element::toString(skipTopLevel)); + value.append(mType); + value.append(mName); + if (mpModifier) { + value.append(mpModifier->toString()); + } + if (!mComment.isEmpty()) { + value.append("\"" % mComment % "\""); + } + + value.removeAll(QString("")); + return value.join(" "); + } + ReplaceableClass::ReplaceableClass(Model *pParentModel, const QJsonObject &jsonObject) : Element(pParentModel) { @@ -1996,6 +2103,21 @@ namespace ModelInstance } } + QString ReplaceableClass::toString(bool skipTopLevel) const + { + QStringList value; + + value.append(Element::toString(skipTopLevel)); + value.append(mType); + value.append(mName); + if (!mBaseClass.isEmpty()) { + value.append("= " % mBaseClass); + } + + value.removeAll(QString("")); + return value.join(" "); + } + Part::Part() { mName = ""; @@ -2052,9 +2174,9 @@ namespace ModelInstance } } - void Name::deserialize(const QJsonArray &jsonObject) + void Name::deserialize(const QJsonArray &jsonArray) { - foreach (QJsonValue part, jsonObject) { + foreach (QJsonValue part, jsonArray) { Part partObject; partObject.deserialize(part.toObject()); mParts.append(partObject); diff --git a/OMEdit/OMEditLIB/Modeling/Model.h b/OMEdit/OMEditLIB/Modeling/Model.h index cc6a4738054..383aa467701 100644 --- a/OMEdit/OMEditLIB/Modeling/Model.h +++ b/OMEdit/OMEditLIB/Modeling/Model.h @@ -354,20 +354,23 @@ namespace ModelInstance BooleanAnnotation mConnectorSizing; }; - typedef QPair Choice; + class Modifier; class Choices { public: - Choices(); + Choices(const QJsonObject &jsonObject, Model *pParentModel); + ~Choices(); void deserialize(const QJsonObject &jsonObject); bool isCheckBox() const {return mCheckBox;} bool isDymolaCheckBox() const {return mDymolaCheckBox;} - QStringList getChoices() const; + const QList &getChoices() const {return mChoices;} + QStringList getChoicesStringList() const; private: + Model *mpParentModel; BooleanAnnotation mCheckBox; BooleanAnnotation mDymolaCheckBox; - QVector mChoices; + QList mChoices; }; class IconDiagramMap @@ -387,6 +390,7 @@ namespace ModelInstance { public: Annotation(Model *pParentModel); + ~Annotation(); void deserialize(const QJsonObject &jsonObject); IconDiagramAnnotation *getIconAnnotation() const {return mpIconAnnotation.get();} @@ -398,7 +402,7 @@ namespace ModelInstance bool hasDialogAnnotation() const {return mHasDialogAnnotation;} const DialogAnnotation &getDialogAnnotation() const {return mDialogAnnotation;} bool isEvaluate() const {return mEvaluate;} - const Choices &getChoices() const {return mChoices;} + Choices *getChoices() const {return mpChoices;} // Connection annotation Line *getLine() const {return mpLine.get();} Text *getText() const {return mpText.get();} @@ -426,7 +430,7 @@ namespace ModelInstance bool mHasDialogAnnotation; DialogAnnotation mDialogAnnotation; BooleanAnnotation mEvaluate; - Choices mChoices; + Choices *mpChoices = 0; // Connection annotation std::unique_ptr mpLine; std::unique_ptr mpText; @@ -450,58 +454,58 @@ namespace ModelInstance QStringList mTypedDims; }; + class Element; class Modifier { public: - Modifier(); + Modifier(const QString &name, const QJsonValue &jsonValue, Model *pParentModel); + ~Modifier(); void deserialize(const QJsonValue &jsonValue); const QString &getName() const {return mName;} - void setName(const QString &name) {mName = name;} - const QString &getValue() const {return mValue;} + const QString &getType() const {return mType;} QString getValueWithoutQuotes() const {return StringHandler::removeFirstLastQuotes(getValue());} - QString toString() const; - Modifier getModifier(const QString &m) const; - QString getModifierValue(const QString &m) const; + QString toString(bool skipTopLevel = false) const; + Modifier *getModifier(const QString &modifier) const; + QString getModifierValue(const QString &modifier) const; bool hasModifier(const QString &modifier) const; - const QList &getModifiers() const {return mModifiers;} + const QList &getModifiers() const {return mModifiers;} bool isFinal() const {return mFinal;} bool isEach() const {return mEach;} - bool isRedeclare() const {return mRedeclare;} - bool isReplaceable() const {return mReplaceable;} + bool isRedeclare() const; + bool isReplaceable() const; + const QString &getValue() const {return mValue;} QString getModifierValue(QStringList qualifiedModifierName) const; - - QString printEach() const; - QString printFinal() const; - QString printRedeclare() const; - QString printReplaceable() const; - private: + Model *mpParentModel; QString mName; - QString mValue; + QString mType; bool mFinal = false; bool mEach = false; - bool mRedeclare = false; - bool mReplaceable = false; - QList mModifiers; + QString mValue; + Element *mpElement = 0; + QList mModifiers; - static QString getModifierValue(const Modifier &modifier, const QString &modifierName, QStringList qualifiedModifierName); + QString toStringEach() const; + QString toStringFinal() const; + static QString getModifierValue(const Modifier *pModifier, const QString &modifierName, QStringList qualifiedModifierName); }; class Replaceable { public: Replaceable(Model *pParentModel); + ~Replaceable(); void deserialize(const QJsonValue &jsonValue); - const Modifier &getModifier() const {return mModifier;} + Modifier *getModifier() const {return mpModifier;} const QString &getConstrainedby() const {return mConstrainedby;} const QString &getComment() const {return mComment;} Annotation *getAnnotation() const {return mpAnnotation.get();} private: Model *mpParentModel; QString mConstrainedby; - Modifier mModifier; + Modifier *mpModifier = 0; QString mComment; std::unique_ptr mpAnnotation; }; @@ -517,9 +521,11 @@ namespace ModelInstance bool isInner() const {return mInner;} bool isOuter() const {return mOuter;} Replaceable *getReplaceable() const {return mpReplaceable.get();} + bool isRedeclare() const {return mRedeclare;} const QString &getConnector() const {return mConnector;} const QString &getVariability() const {return mVariability;} const QString &getDirection() const {return mDirection;} + QString toString(bool skipTopLevel = false) const; private: Model *mpParentModel; bool mPublic; @@ -551,7 +557,6 @@ namespace ModelInstance bool mReadonly; }; - class Element; class Component; class Connection; class Transition; @@ -633,7 +638,7 @@ namespace ModelInstance QString getTopLevelExtendName() const; void setModel(Model *pModel) {mpModel = pModel;} Model *getModel() const {return mpModel;} - const Modifier &getModifier() const {return mModifier;} + Modifier *getModifier() const {return mpModifier;} QString getModifierValueFromType(QStringList modifierNames); const Dimensions &getDimensions() const {return mDims;} bool isPublic() const; @@ -641,6 +646,7 @@ namespace ModelInstance bool isInner() const; bool isOuter() const; Replaceable *getReplaceable() const; + bool isRedeclare() const; QString getConnector() const; QString getVariability() const; QString getDirectionPrefix() const; @@ -659,6 +665,7 @@ namespace ModelInstance virtual bool isComponent() const = 0; virtual bool isExtend() const = 0; virtual bool isClass() const = 0; + virtual QString toString(bool skipTopLevel = false) const; QString getDirection() const; private: @@ -668,7 +675,7 @@ namespace ModelInstance Model *mpParentModel; Model *mpModel = 0; - Modifier mModifier; + Modifier *mpModifier = 0; Dimensions mDims; std::unique_ptr mpPrefixes; QString mComment; @@ -695,6 +702,7 @@ namespace ModelInstance virtual bool isComponent() const override {return false;} virtual bool isExtend() const override {return true;} virtual bool isClass() const override {return false;} + virtual QString toString(bool skipTopLevel = false) const override; }; class Component : public Element @@ -722,6 +730,7 @@ namespace ModelInstance virtual bool isComponent() const override {return true;} virtual bool isExtend() const override {return false;} virtual bool isClass() const override {return false;} + virtual QString toString(bool skipTopLevel = false) const override; }; class ReplaceableClass : public Element @@ -748,6 +757,7 @@ namespace ModelInstance virtual bool isComponent() const override {return false;} virtual bool isExtend() const override {return false;} virtual bool isClass() const override {return true;} + virtual QString toString(bool skipTopLevel = false) const override; }; class Part @@ -768,7 +778,7 @@ namespace ModelInstance public: Name(); Name(QString str); - void deserialize(const QJsonArray &jsonObject); + void deserialize(const QJsonArray &jsonArray); QString getName() const; QStringList getNameParts() const; @@ -857,6 +867,4 @@ namespace ModelInstance }; } // namespace ModelInstance -Q_DECLARE_METATYPE(ModelInstance::Choice) - #endif // MODEL_H diff --git a/OMEdit/OMEditLIB/Modeling/ModelWidgetContainer.cpp b/OMEdit/OMEditLIB/Modeling/ModelWidgetContainer.cpp index 82f525099fc..ae9567e778a 100644 --- a/OMEdit/OMEditLIB/Modeling/ModelWidgetContainer.cpp +++ b/OMEdit/OMEditLIB/Modeling/ModelWidgetContainer.cpp @@ -3960,8 +3960,10 @@ void GraphicsView::pasteItems() ModelInstance::Component *pModelInstanceComponent = GraphicsView::createModelInstanceComponent(mpModelWidget->getModelInstance(), name, className); addElementToView(pModelInstanceComponent, false, true, false, QPointF(0, 0), pComponent->getOMCPlacementAnnotation(QPointF(0, 0)), false); // set modifiers - MainWindow::instance()->getOMCProxy()->setElementModifierValue(mpModelWidget->getLibraryTreeItem()->getNameStructure(), name, - pMimeData->getModifiers().at(index).toString()); + ModelInstance::Modifier *pModifier = pMimeData->getModifiers().at(index); + if (pModifier) { + MainWindow::instance()->getOMCProxy()->setElementModifierValue(mpModelWidget->getLibraryTreeItem()->getNameStructure(), name, pModifier->toString()); + } } else { ElementInfo *pComponentInfo = new ElementInfo(pComponent->getElementInfo()); pComponentInfo->setName(name); diff --git a/OMEdit/OMEditLIB/Modeling/ModelWidgetContainer.h b/OMEdit/OMEditLIB/Modeling/ModelWidgetContainer.h index 54a1dc51913..ccb08e1983e 100644 --- a/OMEdit/OMEditLIB/Modeling/ModelWidgetContainer.h +++ b/OMEdit/OMEditLIB/Modeling/ModelWidgetContainer.h @@ -549,8 +549,8 @@ class MimeData : public QMimeData QString getName() const {return mName;} void addComponent(Element *pComponent) {mComponents.append(pComponent);} QList getComponents() const {return mComponents;} - void addModifier(ModelInstance::Modifier modifier) {mModifiers.append(modifier);} - QList getModifiers() const {return mModifiers;} + void addModifier(ModelInstance::Modifier *pModifier) {mModifiers.append(pModifier);} + QList getModifiers() const {return mModifiers;} void addConnection(LineAnnotation *pConnectionLineAnnotation) {mConnections.append(pConnectionLineAnnotation);} QList getConnections() const {return mConnections;} void addShape(ShapeAnnotation *pShapeAnnotation) {mShapes.append(pShapeAnnotation);} @@ -558,7 +558,7 @@ class MimeData : public QMimeData private: QString mName; QList mComponents; - QList mModifiers; + QList mModifiers; QList mConnections; QList mShapes; // QMimeData interface diff --git a/testsuite/openmodelica/instance-API/GetModelInstanceChoices2.mos b/testsuite/openmodelica/instance-API/GetModelInstanceChoices2.mos index 453f6eb9f2f..a0b3119ba4c 100644 --- a/testsuite/openmodelica/instance-API/GetModelInstanceChoices2.mos +++ b/testsuite/openmodelica/instance-API/GetModelInstanceChoices2.mos @@ -1,7 +1,7 @@ // name: GetModelInstanceChoices2 // keywords: // status: correct -// cflags: -d=newInst,structuredRedeclare +// cflags: -d=newInst // // diff --git a/testsuite/openmodelica/instance-API/GetModelInstanceReplaceable3.mos b/testsuite/openmodelica/instance-API/GetModelInstanceReplaceable3.mos index c3d86b1c4b0..e0e2846bb9c 100644 --- a/testsuite/openmodelica/instance-API/GetModelInstanceReplaceable3.mos +++ b/testsuite/openmodelica/instance-API/GetModelInstanceReplaceable3.mos @@ -1,7 +1,7 @@ // name: GetModelInstanceReplaceable3 // keywords: // status: correct -// cflags: -d=newInst,structuredRedeclare +// cflags: -d=newInst // // diff --git a/testsuite/openmodelica/instance-API/GetModelInstanceReplaceable5.mos b/testsuite/openmodelica/instance-API/GetModelInstanceReplaceable5.mos index 31abdb0f3de..aa5156c9aed 100644 --- a/testsuite/openmodelica/instance-API/GetModelInstanceReplaceable5.mos +++ b/testsuite/openmodelica/instance-API/GetModelInstanceReplaceable5.mos @@ -1,7 +1,7 @@ // name: GetModelInstanceReplaceable5 // keywords: // status: correct -// cflags: -d=newInst,structuredRedeclare +// cflags: -d=newInst // // diff --git a/testsuite/openmodelica/instance-API/GetModelInstanceReplaceable6.mos b/testsuite/openmodelica/instance-API/GetModelInstanceReplaceable6.mos index a90890e6d02..5c2aafc915e 100644 --- a/testsuite/openmodelica/instance-API/GetModelInstanceReplaceable6.mos +++ b/testsuite/openmodelica/instance-API/GetModelInstanceReplaceable6.mos @@ -1,7 +1,7 @@ // name: GetModelInstanceReplaceable6 // keywords: // status: correct -// cflags: -d=newInst,structuredRedeclare +// cflags: -d=newInst // // diff --git a/testsuite/openmodelica/instance-API/ModifierToJSON1.mos b/testsuite/openmodelica/instance-API/ModifierToJSON1.mos index bf16036e8a8..d266e3c0f06 100644 --- a/testsuite/openmodelica/instance-API/ModifierToJSON1.mos +++ b/testsuite/openmodelica/instance-API/ModifierToJSON1.mos @@ -1,7 +1,7 @@ // name: ModifierToJSON1 // keywords: // status: correct -// cflags: -d=newInst,structuredRedeclare +// cflags: -d=newInst // //