From f2a40913042c6f136dc619229600c5ba4d8ab5e8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 10 Aug 2015 16:38:46 +0200 Subject: [PATCH] First implementation of 3mf reader --- plugins/3MFReader/ThreeMFReader.py | 49 ++++++++++++++++++++++++++++++ plugins/3MFReader/__init__.py | 25 +++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 plugins/3MFReader/ThreeMFReader.py create mode 100644 plugins/3MFReader/__init__.py diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py new file mode 100644 index 0000000000..35991a877f --- /dev/null +++ b/plugins/3MFReader/ThreeMFReader.py @@ -0,0 +1,49 @@ +# Copyright (c) 2015 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +from UM.Mesh.MeshReader import MeshReader +from UM.Mesh.MeshData import MeshData +from UM.Logger import Logger +from UM.Math.Matrix import Matrix +from UM.Math.Vector import Vector + +import os +import struct +import math +from os import listdir +import untangle +import zipfile + +class ThreeMFReader(MeshReader): + def __init__(self): + super(ThreeMFReader, self).__init__() + self._supported_extension = ".3mf" + + def read(self, file_name): + extension = os.path.splitext(file_name)[1] + if extension.lower() == self._supported_extension: + mesh = MeshData() + archive = zipfile.ZipFile(file_name, 'r') + #print(archive.read("3D/3dmodel.model")) + try: + object = untangle.parse(archive.read("3D/3dmodel.model").decode("utf-8")) + for object in object.model.resources.object: + vertex_list = [] + for vertex in object.mesh.vertices.vertex: + vertex_list.append([vertex['x'],vertex['y'],vertex['z']]) + + mesh.reserveFaceCount(len(object.mesh.triangles.triangle)) + for triangle in object.mesh.triangles.triangle: + v1 = int(triangle["v1"]) + v2 = int(triangle["v2"]) + v3 = int(triangle["v3"]) + mesh.addFace(vertex_list[v1][0],vertex_list[v1][1],vertex_list[v1][2],vertex_list[v2][0],vertex_list[v2][1],vertex_list[v2][2],vertex_list[v3][0],vertex_list[v3][1],vertex_list[v3][2]) + #if not mesh.hasNormals(): + mesh.calculateNormals() + + return mesh + #object.mesh.vertices + #object.mesh.triangles + + except Exception as e: + print(e) diff --git a/plugins/3MFReader/__init__.py b/plugins/3MFReader/__init__.py new file mode 100644 index 0000000000..04bf2decf5 --- /dev/null +++ b/plugins/3MFReader/__init__.py @@ -0,0 +1,25 @@ +# Copyright (c) 2015 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +from UM.i18n import i18nCatalog +catalog = i18nCatalog("cura") + +from . import ThreeMFReader + +def getMetaData(): + return { + "plugin": { + "name": "3MF Reader", + "author": "Ultimaker", + "version": "1.0", + "description": catalog.i18nc("3MF Reader plugin description", "Provides support for reading 3MF files."), + "api": 2 + }, + "mesh_reader": { + "extension": "3mf", + "description": catalog.i18nc("3MF Reader plugin file type", "3MF File") + } + } + +def register(app): + return { "mesh_reader": ThreeMFReader.ThreeMFReader() }