def read(self, file_name, **kwargs): try: for id, reader in self._mesh_readers.items(): result = reader.read(file_name) if result is not None: if kwargs.get("center", True): # If the result has a mesh and no children it needs to be centered if result.getMeshData() and len(result.getChildren()) == 0: extents = result.getMeshData().getExtents() move_vector = Vector() move_vector.setX(extents.center.x) move_vector.setY(extents.center.y) # Ensure that bottom is on 0 (above plate) move_vector.setZ(extents.center.z) result.setCenterPosition(move_vector) if result.getMeshData().getExtents().bottom != 0: result.translate(Vector(0,-result.getMeshData().getExtents().bottom ,0)) # Move all the meshes of children so that toolhandles are shown in the correct place. for node in result.getChildren(): if node.getMeshData(): extents = node.getMeshData().getExtents() m = Matrix() m.translate(-extents.center) node.setMeshData(node.getMeshData().getTransformed(m)) node.translate(extents.center) return result except OSError as e: Logger.log("e", str(e)) Logger.log("w", "Unable to read file %s", file_name) return None #unable to read
def readerRead(self, reader, file_name, **kwargs): try: results = reader.read(file_name) if results is not None: if type(results) is not list: results = [results] for result in results: if kwargs.get("center", True): # If the result has a mesh and no children it needs to be centered if result.getMeshData() and len(result.getChildren()) == 0: extents = result.getMeshData().getExtents() move_vector = Vector(extents.center.x, extents.center.y, extents.center.z) result.setCenterPosition(move_vector) # Move all the meshes of children so that toolhandles are shown in the correct place. for node in result.getChildren(): if node.getMeshData(): extents = node.getMeshData().getExtents() m = Matrix() m.translate(-extents.center) node.setMeshData(node.getMeshData().getTransformed(m)) node.translate(extents.center) return results except OSError as e: Logger.log("e", str(e)) Logger.log("w", "Unable to read file %s", file_name) return None # unable to read
def resetMeshOrigin(self) -> None: nodes_list = self._getSelectedNodes() if not nodes_list: return op = GroupedOperation() for node in nodes_list: mesh_data = node.getMeshData() if not mesh_data: continue extents = mesh_data.getExtents() center = Vector(extents.center.x, extents.center.y, extents.center.z) translation = Matrix() translation.setByTranslation(-center) transformed_mesh_data = mesh_data.getTransformed(translation).set(zero_position=Vector()) new_transformation = Matrix(node.getLocalTransformation().getData()) # Matrix.copy() is not available in Cura 3.5-4.0 new_transformation.translate(center) op.addOperation(SetMeshDataAndNameOperation(node, transformed_mesh_data, node.getName())) op.addOperation(SetTransformMatrixOperation(node, new_transformation)) op.push()
def readerRead(self, reader, file_name, **kwargs): try: results = reader.read(file_name) if results is not None: if type(results) is not list: results = [results] for result in results: if kwargs.get("center", True): # If the result has a mesh and no children it needs to be centered if result.getMeshData() and len( result.getChildren()) == 0: extents = result.getMeshData().getExtents() move_vector = Vector(extents.center.x, extents.center.y, extents.center.z) result.setCenterPosition(move_vector) # Move all the meshes of children so that toolhandles are shown in the correct place. for node in result.getChildren(): if node.getMeshData(): extents = node.getMeshData().getExtents() m = Matrix() m.translate(-extents.center) node.setMeshData( node.getMeshData().getTransformed(m)) node.translate(extents.center) return results except OSError as e: Logger.log("e", str(e)) Logger.log("w", "Unable to read file %s", file_name) return None # unable to read
def readerRead(self, reader, file_name, **kwargs): """Try to read the mesh_data from a file using a specified MeshReader. :param reader: the MeshReader to read the file with. :param file_name: The name of the mesh to load. :param kwargs: Keyword arguments. Possible values are: - Center: True if the model should be centered around (0,0,0), False if it should be loaded as-is. Defaults to True. :returns: MeshData if it was able to read the file, None otherwise. """ try: results = reader.read(file_name) if results is not None: if type(results) is not list: results = [results] for result in results: if kwargs.get("center", True): # If the result has a mesh and no children it needs to be centered if result.getMeshData() and len( result.getChildren()) == 0: extents = result.getMeshData().getExtents() move_vector = Vector(extents.center.x, extents.center.y, extents.center.z) result.setCenterPosition(move_vector) # Move all the meshes of children so that toolhandles are shown in the correct place. for node in result.getChildren(): if node.getMeshData(): extents = node.getMeshData().getExtents() m = Matrix() m.translate(-extents.center) node.setMeshData( node.getMeshData().getTransformed(m)) node.translate(extents.center) return results except OSError as e: Logger.logException("e", str(e)) Logger.log("w", "Unable to read file %s", file_name) return None # unable to read
def render(self) -> None: if not self._shader: self._shader = OpenGL.getInstance().createShaderProgram( os.path.join( os.path.dirname(os.path.abspath(__file__)), "resources", "shaders", "coordinates.shader", ) ) self._shader.setUniformValue("u_axisId", self._axis) # Create a new batch to be rendered batch = RenderBatch(self._shader) # Fill up the batch with objects that can be sliced. ` for node in DepthFirstIterator(self._scene.getRoot()): # type: ignore #Ignore type error because iter() should get called automatically by Python syntax. if ( node.callDecoration("isSliceable") and node.getMeshData() and node.isVisible() ): batch.addItem(node.getWorldTransformation(), node.getMeshData()) z_fight_distance = 0.2 # Distance between buildplate and disallowed area meshes to prevent z-fighting buildplate_transform = Matrix() buildplate_transform.setToIdentity() buildplate_transform.translate(Vector(0, z_fight_distance, 0)) buildplate_mesh = CuraApplication.getInstance().getBuildVolume()._grid_mesh batch.addItem(buildplate_transform, buildplate_mesh) width, height = self.getSize() self.bind() self._gl.glViewport(0, 0, width, height) self._gl.glClearColor(1.0, 1.0, 1.0, 0.0) self._gl.glClear(self._gl.GL_COLOR_BUFFER_BIT | self._gl.GL_DEPTH_BUFFER_BIT) batch.render(self._scene.getActiveCamera()) self.release()
def read(self, file_name, **kwargs): try: for id, reader in self._mesh_readers.items(): result = reader.read(file_name) if result is not None: if kwargs.get("center", True): # If the result has a mesh and no children it needs to be centered if result.getMeshData() and len( result.getChildren()) == 0: extents = result.getMeshData().getExtents() move_vector = Vector() move_vector.setX(extents.center.x) move_vector.setY( extents.center.y ) # Ensure that bottom is on 0 (above plate) move_vector.setZ(extents.center.z) result.setCenterPosition(move_vector) if result.getMeshData().getExtents().bottom != 0: result.translate( Vector( 0, -result.getMeshData().getExtents(). bottom, 0)) # Move all the meshes of children so that toolhandles are shown in the correct place. for node in result.getChildren(): if node.getMeshData(): extents = node.getMeshData().getExtents() m = Matrix() m.translate(-extents.center) node.setMeshData( node.getMeshData().getTransformed(m)) node.translate(extents.center) return result except OSError as e: Logger.log("e", str(e)) Logger.log("w", "Unable to read file %s", file_name) return None #unable to read
def test_translate(self): matrix = Matrix() matrix.translate(Vector(1, 1, 1)) assert matrix.getTranslation() == Vector(1, 1, 1) matrix.translate(Vector(2, 3, 4)) assert matrix.getTranslation() == Vector(3, 4, 5)