diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index c296f14a52..0d6b9f3095 100644 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -31,6 +31,7 @@ class ThreeMFReader(MeshReader): "cura": "http://software.ultimaker.com/xml/cura/3mf/2015/10" } self._base_name = "" + self._unit = None def _createNodeFromObject(self, object, name = ""): node = SceneNode() @@ -117,6 +118,7 @@ class ThreeMFReader(MeshReader): self._base_name = os.path.basename(file_name) try: self._root = ET.parse(archive.open("3D/3dmodel.model")) + self._unit = self._root.getroot().get("unit") build_items = self._root.findall("./3mf:build/3mf:item", self._namespaces) @@ -148,5 +150,35 @@ class ThreeMFReader(MeshReader): translation = Vector(x=-global_container_stack.getProperty("machine_width", "value") / 2, z=0, y=-global_container_stack.getProperty("machine_depth", "value") / 2) result.translate(translation) + result.scale(self._getScaleFromUnit(self._unit)) result.setEnabled(False) # The result should not be moved in any way, so disable it. return result + + ## Create a scale vector based on a unit string. + # The core spec defines the following: + # * micron + # * millimeter (default) + # * centimeter + # * inch + # * foot + # * meter + def _getScaleFromUnit(self, unit): + if unit is None: + unit = "millimeter" + if unit == "micron": + scale = 0.001 + elif unit == "millimeter": + scale = 1 + elif unit == "centimeter": + scale = 10 + elif unit == "inch": + scale = 25.4 + elif unit == "foot": + scale = 304.8 + elif unit == "meter": + scale = 1000 + else: + Logger.log("w", "Unrecognised unit %s used. Assuming mm instead", unit) + scale = 1 + + return Vector(scale, scale, scale) \ No newline at end of file