diff --git a/cura/Arranging/ShapeArray.py b/cura/Arranging/ShapeArray.py index 840f9731c2..5607c03663 100644 --- a/cura/Arranging/ShapeArray.py +++ b/cura/Arranging/ShapeArray.py @@ -3,7 +3,7 @@ import numpy import copy -from typing import Optional, Tuple, TYPE_CHECKING +from typing import Optional, Tuple, TYPE_CHECKING, Union from UM.Math.Polygon import Polygon @@ -14,14 +14,14 @@ if TYPE_CHECKING: class ShapeArray: """Polygon representation as an array for use with :py:class:`cura.Arranging.Arrange.Arrange`""" - def __init__(self, arr: numpy.array, offset_x: float, offset_y: float, scale: float = 1) -> None: + def __init__(self, arr: numpy.ndarray, offset_x: float, offset_y: float, scale: float = 1) -> None: self.arr = arr self.offset_x = offset_x self.offset_y = offset_y self.scale = scale @classmethod - def fromPolygon(cls, vertices: numpy.array, scale: float = 1) -> "ShapeArray": + def fromPolygon(cls, vertices: numpy.ndarray, scale: float = 1) -> "ShapeArray": """Instantiate from a bunch of vertices :param vertices: @@ -98,7 +98,7 @@ class ShapeArray: return offset_shape_arr, hull_shape_arr @classmethod - def arrayFromPolygon(cls, shape: Tuple[int, int], vertices: numpy.array) -> numpy.array: + def arrayFromPolygon(cls, shape: Union[Tuple[int, int], numpy.ndarray], vertices: numpy.ndarray) -> numpy.ndarray: """Create :py:class:`numpy.ndarray` with dimensions defined by shape Fills polygon defined by vertices with ones, all other values zero @@ -110,7 +110,7 @@ class ShapeArray: :return: numpy array with dimensions defined by shape """ - base_array = numpy.zeros(shape, dtype = numpy.int32) # Initialize your array of zeros + base_array = numpy.zeros(shape, dtype = numpy.int32) # type: ignore # Initialize your array of zeros fill = numpy.ones(base_array.shape) * True # Initialize boolean array defining shape fill @@ -126,7 +126,7 @@ class ShapeArray: return base_array @classmethod - def _check(cls, p1: numpy.array, p2: numpy.array, base_array: numpy.array) -> Optional[numpy.array]: + def _check(cls, p1: numpy.ndarray, p2: numpy.ndarray, base_array: numpy.ndarray) -> Optional[numpy.ndarray]: """Return indices that mark one side of the line, used by arrayFromPolygon Uses the line defined by p1 and p2 to check array of diff --git a/cura/LayerPolygon.py b/cura/LayerPolygon.py index 6e518e984a..7f62a0a8fa 100644 --- a/cura/LayerPolygon.py +++ b/cura/LayerPolygon.py @@ -65,7 +65,7 @@ class LayerPolygon: # When type is used as index returns true if type == LayerPolygon.InfillType or type == LayerPolygon.SkinType or type == LayerPolygon.SupportInfillType # Should be generated in better way, not hardcoded. - self._is_infill_or_skin_type_map = numpy.array([0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0], dtype = numpy.bool) + self._is_infill_or_skin_type_map = numpy.array([0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0], dtype = bool) self._build_cache_line_mesh_mask = None # type: Optional[numpy.ndarray] self._build_cache_needed_points = None # type: Optional[numpy.ndarray] @@ -73,18 +73,17 @@ class LayerPolygon: def buildCache(self) -> None: # For the line mesh we do not draw Infill or Jumps. Therefore those lines are filtered out. self._build_cache_line_mesh_mask = numpy.ones(self._jump_mask.shape, dtype = bool) - mesh_line_count = numpy.sum(self._build_cache_line_mesh_mask) self._index_begin = 0 - self._index_end = mesh_line_count + self._index_end = cast(int, numpy.sum(self._build_cache_line_mesh_mask)) - self._build_cache_needed_points = numpy.ones((len(self._types), 2), dtype = numpy.bool) + self._build_cache_needed_points = numpy.ones((len(self._types), 2), dtype = bool) # Only if the type of line segment changes do we need to add an extra vertex to change colors self._build_cache_needed_points[1:, 0][:, numpy.newaxis] = self._types[1:] != self._types[:-1] # Mark points as unneeded if they are of types we don't want in the line mesh according to the calculated mask numpy.logical_and(self._build_cache_needed_points, self._build_cache_line_mesh_mask, self._build_cache_needed_points ) self._vertex_begin = 0 - self._vertex_end = numpy.sum( self._build_cache_needed_points ) + self._vertex_end = cast(int, numpy.sum(self._build_cache_needed_points)) def build(self, vertex_offset: int, index_offset: int, vertices: numpy.ndarray, colors: numpy.ndarray, line_dimensions: numpy.ndarray, feedrates: numpy.ndarray, extruders: numpy.ndarray, line_types: numpy.ndarray, indices: numpy.ndarray) -> None: """Set all the arrays provided by the function caller, representing the LayerPolygon diff --git a/cura/OAuth2/KeyringAttribute.py b/cura/OAuth2/KeyringAttribute.py index 37781cd889..1d5bfaba3a 100644 --- a/cura/OAuth2/KeyringAttribute.py +++ b/cura/OAuth2/KeyringAttribute.py @@ -1,6 +1,6 @@ # Copyright (c) 2021 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import Type, TYPE_CHECKING +from typing import Type, TYPE_CHECKING, Optional, List import keyring from keyring.backend import KeyringBackend @@ -20,14 +20,15 @@ if Platform.isWindows() and hasattr(sys, "frozen"): keyring.set_keyring(WinVaultKeyring()) # Even if errors happen, we don't want this stored locally: -DONT_EVER_STORE_LOCALLY = ["refresh_token"] +DONT_EVER_STORE_LOCALLY: List[str] = ["refresh_token"] + class KeyringAttribute: """ Descriptor for attributes that need to be stored in the keyring. With Fallback behaviour to the preference cfg file """ - def __get__(self, instance: Type["BaseModel"], owner: type) -> str: - if self._store_secure: + def __get__(self, instance: "BaseModel", owner: type) -> Optional[str]: + if self._store_secure: # type: ignore try: value = keyring.get_password("cura", self._keyring_name) return value if value != "" else None @@ -38,7 +39,7 @@ class KeyringAttribute: else: return getattr(instance, self._name) - def __set__(self, instance: Type["BaseModel"], value: str): + def __set__(self, instance: "BaseModel", value: Optional[str]): if self._store_secure: setattr(instance, self._name, None) try: diff --git a/cura/Snapshot.py b/cura/Snapshot.py index bc7da4080a..ca9c442fb5 100644 --- a/cura/Snapshot.py +++ b/cura/Snapshot.py @@ -25,8 +25,8 @@ class Snapshot: pixels = numpy.frombuffer(pixel_array, dtype=numpy.uint8).reshape([height, width, 4]) # Find indices of non zero pixels nonzero_pixels = numpy.nonzero(pixels) - min_y, min_x, min_a_ = numpy.amin(nonzero_pixels, axis=1) - max_y, max_x, max_a_ = numpy.amax(nonzero_pixels, axis=1) + min_y, min_x, min_a_ = numpy.amin(nonzero_pixels, axis=1) # type: ignore + max_y, max_x, max_a_ = numpy.amax(nonzero_pixels, axis=1) # type: ignore return min_x, max_x, min_y, max_y diff --git a/plugins/AMFReader/AMFReader.py b/plugins/AMFReader/AMFReader.py index ef785f2f53..5bbd25df1b 100644 --- a/plugins/AMFReader/AMFReader.py +++ b/plugins/AMFReader/AMFReader.py @@ -157,22 +157,22 @@ class AMFReader(MeshReader): tri_faces = tri_node.faces tri_vertices = tri_node.vertices - indices = [] - vertices = [] + indices_list = [] + vertices_list = [] index_count = 0 face_count = 0 for tri_face in tri_faces: face = [] for tri_index in tri_face: - vertices.append(tri_vertices[tri_index]) + vertices_list.append(tri_vertices[tri_index]) face.append(index_count) index_count += 1 - indices.append(face) + indices_list.append(face) face_count += 1 - vertices = numpy.asarray(vertices, dtype = numpy.float32) - indices = numpy.asarray(indices, dtype = numpy.int32) + vertices = numpy.asarray(vertices_list, dtype = numpy.float32) + indices = numpy.asarray(indices_list, dtype = numpy.int32) normals = calculateNormalsFromIndexedVertices(vertices, indices, face_count) mesh_data = MeshData(vertices = vertices, indices = indices, normals = normals,file_name = file_name) diff --git a/plugins/PostProcessingPlugin/PostProcessingPlugin.qml b/plugins/PostProcessingPlugin/PostProcessingPlugin.qml index 743e149866..2b3a141aa0 100644 --- a/plugins/PostProcessingPlugin/PostProcessingPlugin.qml +++ b/plugins/PostProcessingPlugin/PostProcessingPlugin.qml @@ -3,7 +3,9 @@ import QtQuick 2.2 import QtQuick.Controls 1.1 +import QtQuick.Controls 2.15 as QQC2 import QtQuick.Controls.Styles 1.1 +import QtQml.Models 2.15 as Models import QtQuick.Layouts 1.1 import QtQuick.Dialogs 1.1 import QtQuick.Window 2.2 @@ -235,7 +237,7 @@ UM.Dialog anchors.leftMargin: base.textMargin anchors.top: activeScriptsList.bottom anchors.topMargin: base.textMargin - menu: scriptsMenu + onClicked: scriptsMenu.open() style: ButtonStyle { label: Label @@ -244,15 +246,16 @@ UM.Dialog } } } - Menu + QQC2.Menu { id: scriptsMenu + width: parent.width - Instantiator + Models.Instantiator { model: manager.loadedScriptList - MenuItem + QQC2.MenuItem { text: manager.getScriptLabelByKey(modelData.toString()) onTriggered: manager.addScriptToList(modelData.toString()) @@ -422,7 +425,7 @@ UM.Dialog tooltip.target.x = position.x + 1 } - onHideTooltip: tooltip.hide() + function onHideTooltip() { tooltip.hide() } } } } diff --git a/plugins/TrimeshReader/TrimeshReader.py b/plugins/TrimeshReader/TrimeshReader.py index cbec2e2482..6aea321f15 100644 --- a/plugins/TrimeshReader/TrimeshReader.py +++ b/plugins/TrimeshReader/TrimeshReader.py @@ -145,22 +145,22 @@ class TrimeshReader(MeshReader): tri_faces = tri_node.faces tri_vertices = tri_node.vertices - indices = [] - vertices = [] + indices_list = [] + vertices_list = [] index_count = 0 face_count = 0 for tri_face in tri_faces: face = [] for tri_index in tri_face: - vertices.append(tri_vertices[tri_index]) + vertices_list.append(tri_vertices[tri_index]) face.append(index_count) index_count += 1 - indices.append(face) + indices_list.append(face) face_count += 1 - vertices = numpy.asarray(vertices, dtype = numpy.float32) - indices = numpy.asarray(indices, dtype = numpy.int32) + vertices = numpy.asarray(vertices_list, dtype = numpy.float32) + indices = numpy.asarray(indices_list, dtype = numpy.int32) normals = calculateNormalsFromIndexedVertices(vertices, indices, face_count) mesh_data = MeshData(vertices = vertices, indices = indices, normals = normals, file_name = file_name) diff --git a/plugins/VersionUpgrade/VersionUpgrade48to49/VersionUpgrade48to49.py b/plugins/VersionUpgrade/VersionUpgrade48to49/VersionUpgrade48to49.py index 789830ef08..5ce3cb724f 100644 --- a/plugins/VersionUpgrade/VersionUpgrade48to49/VersionUpgrade48to49.py +++ b/plugins/VersionUpgrade/VersionUpgrade48to49/VersionUpgrade48to49.py @@ -29,7 +29,7 @@ class VersionUpgrade48to49(VersionUpgrade): # Update visibility settings to include new top_bottom category parser["general"]["visible_settings"] += ";top_bottom" - if any([setting in parser["cura"]["categories_expanded"] for setting in self._moved_visibility_settings]): + if "categories_expanded" in parser["cura"] and any([setting in parser["cura"]["categories_expanded"] for setting in self._moved_visibility_settings]): parser["cura"]["categories_expanded"] += ";top_bottom" result = io.StringIO() @@ -102,7 +102,7 @@ class VersionUpgrade48to49(VersionUpgrade): if "shell" in parser: for setting in parser["shell"]: if setting in self._moved_visibility_settings: - parser["top_bottom"][setting] = None + parser["top_bottom"][setting] = None # type: ignore del parser["shell"][setting] result = io.StringIO() diff --git a/resources/texts/change_log.txt b/resources/texts/change_log.txt index 0070cf535d..e75b51ee44 100644 --- a/resources/texts/change_log.txt +++ b/resources/texts/change_log.txt @@ -22,8 +22,8 @@ The ability to have thumbnails embedded. Contributed by Gravedigger7789. * Add checkbox for Extruder Offsets. Ability to enable or disable the extruder offsets to gcode. This will be enabled by default, unless it is in the printer's def.json file. Contributed by RFBomb. -* Various Mac OSX (and other) fixes afforded by upgrades to Python (to 3.8) and Qt (to 5.15). -If you had (UX, visual, graphics card) problems, specifically on (newer) Mac OSX versions, please try this new version. +* Cura should work properly on MacOS 'Big Sur' now, afforded by upgrades to Python (to 3.8) and Qt (to 5.15). +If you had (UX, visual, graphics card) problems, specifically on (newer) MacOS versions, like Big Sur, you should be able to use this new version. * Known UX issues that will be fixed before final in our current plan - Custom menu Materials and Nozzle menu now open at cursor position instead of under the menu button. @@ -31,6 +31,7 @@ If you had (UX, visual, graphics card) problems, specifically on (newer) Mac OSX - Drop downs in Preference screen don't react to mouse-scroll. - Default language not selected in Preference screen. - Changelog takes long too load. +- Setting Visibility submenu items in the Preference screen are greyed-out and can't be selected on Mac OSX. * Bug Fixes - Fixed a security vulnerability on windows permitting the openssl library used to launch other programs. Thanks to Xavier Danest for raising this bug.