From d96ce760f8828c14ece3b42ad6668f6f55c94905 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Tue, 26 Jul 2016 20:21:00 +0200 Subject: [PATCH 1/6] CURA-1223: 3MFReader: Doing selftest and fail on broken files This commit adds a selftest before the "result" gets returned. It should break on this/these functions and popup a message about using the online repair tool. I compared the content of both files for a long time, googled about the format, but wasn't able to find a proper fix. More routines will likely need to be added here, but with those I have it is working so far very well. Sadly it is not possible to override the default message, so two messages will appear. Additionally, the URL of the link is not clickable/executable from the UX. Just acting like normal text. Contributes to CURA-1223 --- plugins/3MFReader/ThreeMFReader.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index 57d76b2783..bf25ccd440 100644 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -9,9 +9,13 @@ from UM.Math.Vector import Vector from UM.Scene.SceneNode import SceneNode from UM.Scene.GroupDecorator import GroupDecorator from UM.Math.Quaternion import Quaternion - from UM.Job import Job +from UM.Message import Message +from UM.i18n import i18nCatalog +catalog = i18nCatalog("cura") + + import math import zipfile @@ -116,4 +120,11 @@ class ThreeMFReader(MeshReader): except Exception as e: Logger.log("e", "exception occured in 3mf reader: %s", e) + try: # Selftest - There might be more functions that should fail + result.getBoundingBox() + except: + message = Message(catalog.i18nc("@info:status", "Your 3MF file seems to be broken. Please visit https://modelrepair.azurewebsites.net/ and try to repair your model!"), lifetime = 0) + message.show() + return None + return result From 4dbe895c15d8c4ffbebee18947580a73840c642d Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Wed, 27 Jul 2016 20:16:12 +0200 Subject: [PATCH 2/6] 3MF_Reader: Optionally use cElementTree This should make reading the XML faster --- plugins/3MFReader/ThreeMFReader.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index bf25ccd440..71fe8857b1 100644 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -19,7 +19,10 @@ catalog = i18nCatalog("cura") import math import zipfile -import xml.etree.ElementTree as ET +try: + import xml.etree.cElementTree as ET +except ImportError: + import xml.etree.ElementTree as ET ## Base implementation for reading 3MF files. Has no support for textures. Only loads meshes! class ThreeMFReader(MeshReader): From d4861ee6269d658be42599b6e6d1459fe1dd7561 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Wed, 27 Jul 2016 20:21:35 +0200 Subject: [PATCH 3/6] CURA-1223: Checking whether the bounding box is correct Adds an additional check, like suggested by @awhiemstra. Contributes to CURA-1223 --- plugins/3MFReader/ThreeMFReader.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index 71fe8857b1..deb6153ee3 100644 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -124,7 +124,8 @@ class ThreeMFReader(MeshReader): Logger.log("e", "exception occured in 3mf reader: %s", e) try: # Selftest - There might be more functions that should fail - result.getBoundingBox() + boundingBox = result.getBoundingBox() + boundingBox.isValid() except: message = Message(catalog.i18nc("@info:status", "Your 3MF file seems to be broken. Please visit https://modelrepair.azurewebsites.net/ and try to repair your model!"), lifetime = 0) message.show() From 9f280717d880cb9d132f43a47aef133f64b5bf76 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Wed, 27 Jul 2016 21:14:21 +0200 Subject: [PATCH 4/6] Clean up __init__ --- plugins/3MFReader/ThreeMFReader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index deb6153ee3..74db9fe946 100644 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -27,7 +27,7 @@ except ImportError: ## Base implementation for reading 3MF files. Has no support for textures. Only loads meshes! class ThreeMFReader(MeshReader): def __init__(self): - super(ThreeMFReader, self).__init__() + super().__init__() self._supported_extensions = [".3mf"] self._namespaces = { From d99827109ab836963d523322ef00b0e6cf9675bd Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Wed, 27 Jul 2016 21:20:55 +0200 Subject: [PATCH 5/6] Revert "Clean up __init__" This reverts commit 44c64c4ac766fc7e085d338cb1f21c949851c9ba. --- plugins/3MFReader/ThreeMFReader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index 74db9fe946..deb6153ee3 100644 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -27,7 +27,7 @@ except ImportError: ## Base implementation for reading 3MF files. Has no support for textures. Only loads meshes! class ThreeMFReader(MeshReader): def __init__(self): - super().__init__() + super(ThreeMFReader, self).__init__() self._supported_extensions = [".3mf"] self._namespaces = { From 5f540a7a78d004b2642cfc275b8a56e5f9676dff Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Wed, 27 Jul 2016 21:22:30 +0200 Subject: [PATCH 6/6] Revert "Revert "Clean up __init__"" This reverts commit d99827109ab836963d523322ef00b0e6cf9675bd. --- plugins/3MFReader/ThreeMFReader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index deb6153ee3..74db9fe946 100644 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -27,7 +27,7 @@ except ImportError: ## Base implementation for reading 3MF files. Has no support for textures. Only loads meshes! class ThreeMFReader(MeshReader): def __init__(self): - super(ThreeMFReader, self).__init__() + super().__init__() self._supported_extensions = [".3mf"] self._namespaces = {