diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index f7d2cc01f1..397a63c194 100644 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -187,10 +187,12 @@ class ThreeMFReader(MeshReader): build_item_node = self._createNodeFromObject(object, self._base_name + "_" + str(id)) # compensate for original center position, if object(s) is/are not around its zero position - extents = build_item_node.getMeshData().getExtents() - center_vector = Vector(extents.center.x, extents.center.y, extents.center.z) transform_matrix = Matrix() - transform_matrix.setByTranslation(center_vector) + mesh_data = build_item_node.getMeshData() + if mesh_data is not None: + extents = mesh_data.getExtents() + center_vector = Vector(extents.center.x, extents.center.y, extents.center.z) + transform_matrix.setByTranslation(center_vector) # offset with transform from 3mf transform = build_item.get("transform") diff --git a/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py b/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py index c96bf8bacf..6d8b5021ae 100644 --- a/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py +++ b/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py @@ -17,41 +17,60 @@ class OSXRemovableDrivePlugin(RemovableDrivePlugin.RemovableDrivePlugin): drives = {} p = subprocess.Popen(["system_profiler", "SPUSBDataType", "-xml"], stdout = subprocess.PIPE) plist = plistlib.loads(p.communicate()[0]) - p.wait() - for entry in plist: - if "_items" in entry: - for item in entry["_items"]: - for dev in item["_items"]: - if "removable_media" in dev and dev["removable_media"] == "yes" and "volumes" in dev and len(dev["volumes"]) > 0: - for vol in dev["volumes"]: - if "mount_point" in vol: - volume = vol["mount_point"] - drives[volume] = os.path.basename(volume) + result = self._recursiveSearch(plist, "removable_media") p = subprocess.Popen(["system_profiler", "SPCardReaderDataType", "-xml"], stdout=subprocess.PIPE) plist = plistlib.loads(p.communicate()[0]) - p.wait() - for entry in plist: - if "_items" in entry: - for item in entry["_items"]: - for dev in item["_items"]: - if "removable_media" in dev and dev["removable_media"] == "yes" and "volumes" in dev and len(dev["volumes"]) > 0: - for vol in dev["volumes"]: - if "mount_point" in vol: - volume = vol["mount_point"] - drives[volume] = os.path.basename(volume) + result.extend(self._recursiveSearch(plist, "removable_media")) + + for drive in result: + # Ignore everything not explicitly marked as removable + if drive["removable_media"] != "yes": + continue + + # Ignore any removable device that does not have an actual volume + if "volumes" not in drive or not drive["volumes"]: + continue + + for volume in drive["volumes"]: + if not "mount_point" in volume: + continue + + mount_point = volume["mount_point"] + + if "_name" in volume: + drive_name = volume["_name"] + else: + drive_name = os.path.basename(mount_point) + + drives[mount_point] = drive_name return drives def performEjectDevice(self, device): p = subprocess.Popen(["diskutil", "eject", device.getId()], stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE) output = p.communicate() - Logger.log("d", "umount returned: %s.", repr(output)) return_code = p.wait() if return_code != 0: return False else: - return True \ No newline at end of file + return True + + # Recursively search for key in a plist parsed by plistlib + def _recursiveSearch(self, plist, key): + result = [] + for entry in plist: + if key in entry: + result.append(entry) + continue + + if "_items" in entry: + result.extend(self._recursiveSearch(entry["_items"], key)) + + if "Media" in entry: + result.extend(self._recursiveSearch(entry["Media"], key)) + + return result diff --git a/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py b/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py index 64c98dea60..dce2b311bb 100644 --- a/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py +++ b/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py @@ -2,6 +2,7 @@ # Cura is released under the terms of the AGPLv3 or higher. import configparser #To get version numbers from config files. +import os import os.path import io @@ -19,8 +20,14 @@ class VersionUpgrade22to24(VersionUpgrade): config = configparser.ConfigParser(interpolation = None) config.read_string(serialised) # Read the input string as config file. config.set("general", "version", "3") - containers = config.get("general", "containers") - container_list = containers.split(",") + + container_list = [] + if config.has_section("containers"): + for index, container_id in config.items("containers"): + container_list.append(container_id) + elif config.has_option("general", "containers"): + containers = config.get("general", "containers") + container_list = containers.split(",") user_variants = self.__getUserVariants() name_path_dict = {} @@ -45,7 +52,13 @@ class VersionUpgrade22to24(VersionUpgrade): container_list = new_container_list - config.set("general", "containers", ",".join(container_list)) + if not config.has_section("containers"): + config.add_section("containers") + + config.remove_option("general", "containers") + + for index in range(len(container_list)): + config.set("containers", index, container_list[index]) output = io.StringIO() config.write(output) diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index 71bbcccbdd..5e492bf531 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -106,6 +106,8 @@ "line_width": { "value": "machine_nozzle_size * 0.875" }, "machine_min_cool_heat_time_window": { "value": "15" }, "default_material_print_temperature": { "value": "200" }, + "material_bed_temperature": { "maximum_value": "115" }, + "material_bed_temperature_layer_0": { "maximum_value": "115" }, "material_standby_temperature": { "value": "100" }, "multiple_mesh_overlap": { "value": "0" }, "prime_tower_enable": { "value": "True" }, diff --git a/resources/extruders/ultimaker_original_dual_1st.def.json b/resources/extruders/ultimaker_original_dual_1st.def.json index 058dbf3028..62ec8479c9 100644 --- a/resources/extruders/ultimaker_original_dual_1st.def.json +++ b/resources/extruders/ultimaker_original_dual_1st.def.json @@ -1,7 +1,7 @@ { "id": "ultimaker_original_dual_1st", "version": 2, - "name": "1st Extruder", + "name": "Extruder 1", "inherits": "fdmextruder", "metadata": { "machine": "ultimaker_original_dual", diff --git a/resources/extruders/ultimaker_original_dual_2nd.def.json b/resources/extruders/ultimaker_original_dual_2nd.def.json index 4b600d0281..42a4da524b 100644 --- a/resources/extruders/ultimaker_original_dual_2nd.def.json +++ b/resources/extruders/ultimaker_original_dual_2nd.def.json @@ -1,7 +1,7 @@ { "id": "ultimaker_original_dual_2nd", "version": 2, - "name": "2nd Extruder", + "name": "Extruder 2", "inherits": "fdmextruder", "metadata": { "machine": "ultimaker_original_dual", diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 5f20f92b20..6af3985527 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -84,7 +84,7 @@ Item onTextChanged: { - definitionsModel.filter = {"label": "*" + text}; + definitionsModel.filter = {"i18n_label": "*" + text}; findingSettings = (text.length > 0); if(findingSettings != lastFindingSettings) { diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 543ca0c26e..f9c314d660 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -116,6 +116,7 @@ Rectangle background: Rectangle { color: control.hovered ? UM.Theme.getColor("button_hover") : control.pressed ? UM.Theme.getColor("button_hover") : UM.Theme.getColor("sidebar_header_bar") + Behavior on color { ColorAnimation { duration: 50; } } UM.RecolorImage { id: downArrow