From 8fd1b62c99e407f76a6abad32c859d8d41114c4f Mon Sep 17 00:00:00 2001
From: Matthias Puchner <github@mpuchner.de>
Date: Thu, 16 Dec 2021 12:30:13 +0100
Subject: [PATCH] adapt Roughness handling; minor changes

---
 GUI/Model/From/FromDomain.cpp       |  7 ++---
 GUI/Model/Sample/MultiLayerItem.cpp |  1 -
 GUI/Model/Session/SessionXML.h      |  2 +-
 GUI/Model/To/ToDomain.cpp           | 41 ++++++++++++-----------------
 GUI/Model/To/ToDomain.h             |  4 +--
 5 files changed, 23 insertions(+), 32 deletions(-)

diff --git a/GUI/Model/From/FromDomain.cpp b/GUI/Model/From/FromDomain.cpp
index 4d90cd13c71..6ded486da92 100644
--- a/GUI/Model/From/FromDomain.cpp
+++ b/GUI/Model/From/FromDomain.cpp
@@ -373,14 +373,15 @@ void GUI::Transform::FromDomain::setLayerItem(LayerItem* layerItem, const Layer*
                                               const LayerInterface* top_interface)
 {
     layerItem->thickness().set(layer->thickness());
-    layerItem->setRoughnessType<LayerZeroRoughnessItem>();
+    layerItem->clearRoughness();
     layerItem->numSlices().set(layer->numberOfSlices());
 
     if (top_interface) {
         const LayerRoughness* roughness = top_interface->roughness();
         if (GUI::Transform::FromDomain::isValidRoughness(roughness)) {
-            auto* roughnessItem = layerItem->setRoughnessType<LayerBasicRoughnessItem>();
-            GUI::Transform::FromDomain::setRoughnessItem(roughnessItem, *roughness);
+            layerItem->setBasicRoughness();
+            GUI::Transform::FromDomain::setRoughnessItem(layerItem->roughness().currentItem(),
+                                                         *roughness);
         }
     }
 }
diff --git a/GUI/Model/Sample/MultiLayerItem.cpp b/GUI/Model/Sample/MultiLayerItem.cpp
index baa3a88b1f9..394b354a3d4 100644
--- a/GUI/Model/Sample/MultiLayerItem.cpp
+++ b/GUI/Model/Sample/MultiLayerItem.cpp
@@ -28,7 +28,6 @@ const QString Name("Name");
 const QString Uid("Uid");
 } // namespace Tags
 
-
 } // namespace
 
 MultiLayerItem::MultiLayerItem()
diff --git a/GUI/Model/Session/SessionXML.h b/GUI/Model/Session/SessionXML.h
index c03edbf1767..f131def1dce 100644
--- a/GUI/Model/Session/SessionXML.h
+++ b/GUI/Model/Session/SessionXML.h
@@ -17,10 +17,10 @@
 
 #include "GUI/Model/Types/DoubleDescriptor.h"
 #include <QVariant>
+#include <QXmlStreamWriter> // used in every including file
 #include <heinz/Complex.h>
 #include <heinz/Vectors3D.h>
 
-class QXmlStreamWriter;
 class QXmlStreamReader;
 class SessionItem;
 class MessageService;
diff --git a/GUI/Model/To/ToDomain.cpp b/GUI/Model/To/ToDomain.cpp
index 133d2f506dc..4a0177fe1df 100644
--- a/GUI/Model/To/ToDomain.cpp
+++ b/GUI/Model/To/ToDomain.cpp
@@ -49,8 +49,9 @@ std::unique_ptr<MultiLayer> createMultiLayer(const MultiLayerItem& item)
     return P_multilayer;
 }
 
-std::unique_ptr<Layer> createLayer(const LayerItem& item, bool isFirstOrLastLayer)
+std::unique_ptr<Layer> createLayer(const LayerItem& item)
 {
+    const bool isFirstOrLastLayer = item.isTopLayer() || item.isBottomLayer();
     auto P_layer = std::make_unique<Layer>(*item.materialItem()->createMaterial(),
                                            isFirstOrLastLayer ? 0.0 : item.thickness());
     P_layer->setNumberOfSlices(item.numSlices());
@@ -109,9 +110,9 @@ std::unique_ptr<ParticleLayout> buildParticleLayout(const ParticleLayoutItem& it
     return P_layout;
 }
 
-std::unique_ptr<Layer> buildLayer(const LayerItem& item, bool isFirstOrLastLayer)
+std::unique_ptr<Layer> buildLayer(const LayerItem& item)
 {
-    auto P_layer = createLayer(item, isFirstOrLastLayer);
+    auto P_layer = createLayer(item);
     for (ParticleLayoutItem* layout : item.layouts()) {
         auto P_layout = buildParticleLayout(*layout);
         if (P_layout)
@@ -122,18 +123,13 @@ std::unique_ptr<Layer> buildLayer(const LayerItem& item, bool isFirstOrLastLayer
 
 } // namespace
 
-std::unique_ptr<LayerRoughness> GUI::Transform::ToDomain::createLayerRoughness(
-    const std::variant<LayerZeroRoughnessItem*, LayerBasicRoughnessItem*>& roughness)
+std::unique_ptr<LayerRoughness>
+GUI::Transform::ToDomain::createLayerRoughness(LayerBasicRoughnessItem* roughness)
 {
-    if (std::holds_alternative<LayerZeroRoughnessItem*>(roughness))
+    if (!roughness)
         return nullptr;
-    if (std::holds_alternative<LayerBasicRoughnessItem*>(roughness)) {
-        const auto& basicRoughnessItem = *std::get<LayerBasicRoughnessItem*>(roughness);
-        return std::make_unique<LayerRoughness>(basicRoughnessItem.sigma(),
-                                                basicRoughnessItem.hurst(),
-                                                basicRoughnessItem.lateralCorrelationLength());
-    }
-    ASSERT(0);
+    return std::make_unique<LayerRoughness>(roughness->sigma(), roughness->hurst(),
+                                            roughness->lateralCorrelationLength());
 }
 
 std::unique_ptr<MultiLayer>
@@ -141,17 +137,14 @@ GUI::Transform::ToDomain::buildMultiLayer(const MultiLayerItem& multiLayerItem)
 {
     auto P_multilayer = createMultiLayer(multiLayerItem);
     for (auto* layerItem : multiLayerItem.layers()) {
-        const bool isFirstLayer = layerItem == multiLayerItem.layers().first();
-        const bool isLastLayer = layerItem == multiLayerItem.layers().last();
-        auto P_layer = buildLayer(*layerItem, isFirstLayer || isLastLayer);
-        if (P_layer) {
-            const auto roughness = layerItem->roughness().currentItem();
-            auto P_roughness = createLayerRoughness(roughness);
-            if (P_roughness && !isFirstLayer)
-                P_multilayer->addLayerWithTopRoughness(*P_layer, *P_roughness);
-            else
-                P_multilayer->addLayer(*P_layer);
-        }
+        auto P_layer = buildLayer(*layerItem);
+        ASSERT(P_layer);
+        const auto roughness = layerItem->roughness().currentItem();
+        auto P_roughness = createLayerRoughness(roughness);
+        if (P_roughness && !layerItem->isTopLayer())
+            P_multilayer->addLayerWithTopRoughness(*P_layer, *P_roughness);
+        else
+            P_multilayer->addLayer(*P_layer);
     }
     return P_multilayer;
 }
diff --git a/GUI/Model/To/ToDomain.h b/GUI/Model/To/ToDomain.h
index 7fb9eb4225d..fc8fa75c15d 100644
--- a/GUI/Model/To/ToDomain.h
+++ b/GUI/Model/To/ToDomain.h
@@ -21,14 +21,12 @@
 class LayerItem;
 class MultiLayerItem;
 class MultiLayer;
-class LayerZeroRoughnessItem;
 class LayerBasicRoughnessItem;
 class LayerRoughness;
 
 namespace GUI::Transform::ToDomain {
 
-std::unique_ptr<LayerRoughness> createLayerRoughness(
-    const std::variant<LayerZeroRoughnessItem*, LayerBasicRoughnessItem*>& roughness);
+std::unique_ptr<LayerRoughness> createLayerRoughness(LayerBasicRoughnessItem* roughness);
 
 std::unique_ptr<MultiLayer> buildMultiLayer(const MultiLayerItem& item);
 
-- 
GitLab