From fb2973e6f0fcd99de3f3b600cb54a1af04464618 Mon Sep 17 00:00:00 2001
From: Matthias Puchner <github@mpuchner.de>
Date: Wed, 1 Dec 2021 15:16:47 +0100
Subject: [PATCH] improve project reading/writing

---
 GUI/Model/Project/ProjectDocument.cpp | 13 ++++++++++++-
 GUI/Model/Session/SessionXML.cpp      |  2 +-
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/GUI/Model/Project/ProjectDocument.cpp b/GUI/Model/Project/ProjectDocument.cpp
index e2b3723845a..4dc755ab5fa 100644
--- a/GUI/Model/Project/ProjectDocument.cpp
+++ b/GUI/Model/Project/ProjectDocument.cpp
@@ -339,9 +339,10 @@ ProjectDocument::ReadResult ProjectDocument::readProject(QIODevice* device,
                     else if (reader.name() == SimulationOptionsTag) {
                         m_simulationOptionsItem.readContentFrom(&reader);
                         reader.skipCurrentElement();
+                        ASSERT(reader.name() == SimulationOptionsTag);
                     } else if (reader.name() == MaterialsTag) {
                         m_materials.readContentFrom(&reader);
-                        reader.skipCurrentElement();
+                        ASSERT(reader.name() == MaterialsTag);
                     } else
                         m_applicationModels.readFrom(&reader, &messageService);
             }
@@ -353,6 +354,16 @@ ProjectDocument::ReadResult ProjectDocument::readProject(QIODevice* device,
         for (auto itemWithMaterial : multiLayerItem->itemsWithMaterial())
             itemWithMaterial->setMaterialModel(materialModel());
 
+    // make a sanity check whether all materials are present
+    for (auto multiLayerItem : m_applicationModels.sampleModel()->multiLayerItems())
+        for (auto itemWithMaterial : multiLayerItem->itemsWithMaterial())
+            if (itemWithMaterial->materialItem() == nullptr) {
+                QString message = QString("Material link is broken (id: '%1')")
+                                      .arg(itemWithMaterial->materialIdentifier());
+                messageService.addError(this, message);
+                return ReadResult::error;
+            }
+
     if (reader.hasError()) {
         QString message = QString("Format error '%1'").arg(reader.errorString());
         messageService.addError(this, message);
diff --git a/GUI/Model/Session/SessionXML.cpp b/GUI/Model/Session/SessionXML.cpp
index ce963bbd232..bca4da3f09b 100644
--- a/GUI/Model/Session/SessionXML.cpp
+++ b/GUI/Model/Session/SessionXML.cpp
@@ -157,7 +157,7 @@ void GUI::Session::XML::writeAttribute(QXmlStreamWriter* writer, const QString&
 void GUI::Session::XML::writeAttribute(QXmlStreamWriter* writer, const QString& attributeName,
                                        double d)
 {
-    writer->writeAttribute(attributeName, QString::number(d, 'e', 12));
+    writer->writeAttribute(attributeName, d == 0.0 ? "0" : QString::number(d, 'e', 12));
 }
 
 void GUI::Session::XML::writeAttribute(QXmlStreamWriter* writer, const QString& attributeName,
-- 
GitLab