|
36 | 36 | #include "Util/Helper.h" |
37 | 37 | #include "MessagesWidget.h" |
38 | 38 | #include "Options/OptionsDialog.h" |
| 39 | +#include "MainWindow.h" |
| 40 | +#include "OMC/OMCProxy.h" |
39 | 41 |
|
40 | 42 | #include <QRectF> |
41 | 43 | #include <QtMath> |
@@ -736,22 +738,6 @@ namespace ModelInstance |
736 | 738 | deserialize(jsonValue); |
737 | 739 | } |
738 | 740 |
|
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 | | - |
755 | 741 | Modifier::~Modifier() |
756 | 742 | { |
757 | 743 | if (mpElement) { |
@@ -858,9 +844,31 @@ namespace ModelInstance |
858 | 844 | return pModifier && pModifier->getName().compare(modifier) == 0; |
859 | 845 | } |
860 | 846 |
|
| 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 | + |
861 | 869 | void Modifier::addModifier(const Modifier *pModifier) |
862 | 870 | { |
863 | | - mModifiers.append(new Modifier(pModifier)); |
| 871 | + mModifiers.append(createModifier(pModifier, mpParentModel)); |
864 | 872 | } |
865 | 873 |
|
866 | 874 | bool Modifier::isRedeclare() const |
@@ -2301,6 +2309,24 @@ namespace ModelInstance |
2301 | 2309 | return modifiers; |
2302 | 2310 | } |
2303 | 2311 |
|
| 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 | + |
2304 | 2330 | /*! |
2305 | 2331 | * \brief Component::mergeModifiers |
2306 | 2332 | * Merges pModifier2 into pModifier1 |
@@ -2329,24 +2355,6 @@ namespace ModelInstance |
2329 | 2355 | } |
2330 | 2356 | } |
2331 | 2357 |
|
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 | | - |
2350 | 2358 | /*! |
2351 | 2359 | * \brief Component::getQualifiedName |
2352 | 2360 | * Returns the qualified name of the component. |
@@ -2396,13 +2404,13 @@ namespace ModelInstance |
2396 | 2404 | if (mpModifier) { |
2397 | 2405 | Modifier *pModifier = nullptr; |
2398 | 2406 | if (mergeExtendsModifiers) { |
2399 | | - // Merge extends modifiers. See issue #13301 |
| 2407 | + // Merge extends modifiers. See issue #13301 and #13516. |
2400 | 2408 | QList<Modifier *> extendsModifiers = getExtendsModifiers(mpModifier); |
2401 | | - pModifier = Component::mergeModifiersIntoOne(extendsModifiers); |
| 2409 | + pModifier = mergeModifiersIntoOne(extendsModifiers); |
2402 | 2410 | } |
2403 | 2411 |
|
2404 | 2412 | if (pModifier) { |
2405 | | - mergeModifiers(pModifier, mpModifier); |
| 2413 | + Component::mergeModifiers(pModifier, mpModifier); |
2406 | 2414 | // we don't need the name coming from the extend modification |
2407 | 2415 | pModifier->setName(""); |
2408 | 2416 | value.append(pModifier->toString()); |
|
0 commit comments