Skip to content

Commit dba6a0b

Browse files
authored
Take care of redeclare when copying extends modification (#13528)
Fixes #13516
1 parent f45fba9 commit dba6a0b

File tree

2 files changed

+47
-40
lines changed

2 files changed

+47
-40
lines changed

OMEdit/OMEditLIB/Modeling/Model.cpp

Lines changed: 46 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
#include "Util/Helper.h"
3737
#include "MessagesWidget.h"
3838
#include "Options/OptionsDialog.h"
39+
#include "MainWindow.h"
40+
#include "OMC/OMCProxy.h"
3941

4042
#include <QRectF>
4143
#include <QtMath>
@@ -736,22 +738,6 @@ namespace ModelInstance
736738
deserialize(jsonValue);
737739
}
738740

739-
Modifier::Modifier(const Modifier *pModifier)
740-
{
741-
mName = pModifier->getName();
742-
mpParentModel = pModifier->getParentModel();
743-
mType = pModifier->getType();
744-
mFinal = pModifier->isFinal();
745-
mEach = pModifier->isEach();
746-
mComment = pModifier->getComment();
747-
mpElement = 0; // perhaps not needed for deep copy. This constructor is used only during copy/paste of elements.
748-
mValue = pModifier->getValue();
749-
mValueDefined = pModifier->isValueDefined();
750-
foreach (auto pSubModifier, pModifier->getModifiers()) {
751-
mModifiers.append(new Modifier(pSubModifier));
752-
}
753-
}
754-
755741
Modifier::~Modifier()
756742
{
757743
if (mpElement) {
@@ -858,9 +844,31 @@ namespace ModelInstance
858844
return pModifier && pModifier->getName().compare(modifier) == 0;
859845
}
860846

847+
/*!
848+
* \brief createModifier
849+
* Creates the Modifier from another Modifier.\n
850+
* See issue #13301 and #13516.\n
851+
* Dump the modifier as string and use OMCProxy::modifierToJSON to convert it to JSON.\n
852+
* Contruct new Modifier instance with JSON.
853+
* \param pModifier
854+
* \return
855+
*/
856+
Modifier *createModifier(const Modifier *pModifier, Model *pParentModel)
857+
{
858+
// If value is defined then we wrap within parenthesis otherwise its not needed.
859+
if (pModifier->isValueDefined()) {
860+
QJsonObject jsonObject = MainWindow::instance()->getOMCProxy()->modifierToJSON("(" % pModifier->toString() % ")");
861+
return new Modifier(pModifier->getName(), jsonObject.value(pModifier->getName()), pParentModel);
862+
} else {
863+
QJsonObject jsonObject;
864+
jsonObject.insert("modifiers", MainWindow::instance()->getOMCProxy()->modifierToJSON(pModifier->toString()));
865+
return new Modifier(pModifier->getName(), jsonObject.value("modifiers"), pParentModel);
866+
}
867+
}
868+
861869
void Modifier::addModifier(const Modifier *pModifier)
862870
{
863-
mModifiers.append(new Modifier(pModifier));
871+
mModifiers.append(createModifier(pModifier, mpParentModel));
864872
}
865873

866874
bool Modifier::isRedeclare() const
@@ -2301,6 +2309,24 @@ namespace ModelInstance
23012309
return modifiers;
23022310
}
23032311

2312+
/*!
2313+
* \brief Component::mergeModifiersIntoOne
2314+
* Merges the list of all extends modifiers into one modifier.
2315+
* \param extendsModifiers
2316+
* \return
2317+
*/
2318+
Modifier *Component::mergeModifiersIntoOne(QList<Modifier *> extendsModifiers) const
2319+
{
2320+
Modifier *pModifier = nullptr;
2321+
if (!extendsModifiers.isEmpty()) {
2322+
pModifier = createModifier(extendsModifiers.last(), mpParentModel);
2323+
for (int i = extendsModifiers.size() - 2 ; i >= 0 ; i--) {
2324+
Component::mergeModifiers(pModifier, extendsModifiers.at(i));
2325+
}
2326+
}
2327+
return pModifier;
2328+
}
2329+
23042330
/*!
23052331
* \brief Component::mergeModifiers
23062332
* Merges pModifier2 into pModifier1
@@ -2329,24 +2355,6 @@ namespace ModelInstance
23292355
}
23302356
}
23312357

2332-
/*!
2333-
* \brief Component::mergeModifiersIntoOne
2334-
* Merges the list of all extends modifiers into one modifier.
2335-
* \param extendsModifiers
2336-
* \return
2337-
*/
2338-
Modifier* Component::mergeModifiersIntoOne(QList<Modifier *> extendsModifiers)
2339-
{
2340-
Modifier *pModifier = nullptr;
2341-
if (!extendsModifiers.isEmpty()) {
2342-
pModifier = new Modifier(extendsModifiers.last());
2343-
for (int i = extendsModifiers.size() - 2 ; i >= 0 ; i--) {
2344-
Component::mergeModifiers(pModifier, extendsModifiers.at(i));
2345-
}
2346-
}
2347-
return pModifier;
2348-
}
2349-
23502358
/*!
23512359
* \brief Component::getQualifiedName
23522360
* Returns the qualified name of the component.
@@ -2396,13 +2404,13 @@ namespace ModelInstance
23962404
if (mpModifier) {
23972405
Modifier *pModifier = nullptr;
23982406
if (mergeExtendsModifiers) {
2399-
// Merge extends modifiers. See issue #13301
2407+
// Merge extends modifiers. See issue #13301 and #13516.
24002408
QList<Modifier *> extendsModifiers = getExtendsModifiers(mpModifier);
2401-
pModifier = Component::mergeModifiersIntoOne(extendsModifiers);
2409+
pModifier = mergeModifiersIntoOne(extendsModifiers);
24022410
}
24032411

24042412
if (pModifier) {
2405-
mergeModifiers(pModifier, mpModifier);
2413+
Component::mergeModifiers(pModifier, mpModifier);
24062414
// we don't need the name coming from the extend modification
24072415
pModifier->setName("");
24082416
value.append(pModifier->toString());

OMEdit/OMEditLIB/Modeling/Model.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,6 @@ namespace ModelInstance
477477
{
478478
public:
479479
Modifier(const QString &name, const QJsonValue &jsonValue, Model *pParentModel);
480-
Modifier(const Modifier *pModifier);
481480
~Modifier();
482481
void deserialize(const QJsonValue &jsonValue);
483482

@@ -762,8 +761,8 @@ namespace ModelInstance
762761
private:
763762
void deserialize_impl(const QJsonObject &jsonObject) override;
764763
QList<Modifier*> getExtendsModifiers(const Modifier *pModifier) const;
764+
Modifier *mergeModifiersIntoOne(QList<Modifier*> extendsModifiers) const;
765765
static void mergeModifiers(Modifier *pModifier1, Modifier *pModifier2);
766-
static Modifier *mergeModifiersIntoOne(QList<Modifier*> extendsModifiers);
767766
private:
768767
QString mName;
769768
bool mCondition = true;

0 commit comments

Comments
 (0)