From cde3799702a7176f4f631e9dec18a5ef9f46edef Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 23 Jan 2018 14:46:44 +0100 Subject: [PATCH 1/5] CURA-4848 removing the debugging list because it's not a threading issue --- cura/Settings/GlobalStack.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index cc3a29aa8b..7873f12355 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -31,7 +31,6 @@ class GlobalStack(CuraContainerStack): # and if so, to bypass the resolve to prevent an infinite recursion that would occur # if the resolve function tried to access the same property it is a resolve for. self._resolving_settings = set() - self._resolving_settings2 = [] # For debugging CURA-4848, if it happens ## Get the list of extruders of this stack. # @@ -92,17 +91,16 @@ class GlobalStack(CuraContainerStack): # Handle the "resolve" property. if self._shouldResolve(key, property_name, context): - self._resolving_settings2.append(key) self._resolving_settings.add(key) resolve = super().getProperty(key, "resolve", context) if key not in self._resolving_settings: - Logger.log("e", "Key [%s] should really have been in set(%s) and [%s]. Now I'm gonna crash", key, str(self._resolving_settings), str(self._resolving_settings2)) + # For debugging CURA-4848, if it happens + Logger.log("e", "Key [%s] should really have been in set(%s). Now I'm gonna crash", key, str(self._resolving_settings)) Logger.log("d", "------ context ------") for stack in context.stack_of_containers: Logger.log("d", "Context: %s", stack.getId()) Logger.log("d", "------ context end ------") self._resolving_settings.remove(key) - self._resolving_settings2.pop() if resolve is not None: return resolve From def86defe65ecc0b7de710a60715e04fd7700961 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 23 Jan 2018 16:17:38 +0100 Subject: [PATCH 2/5] CURA-4848 Global stack now does its infinite resolve prevention on per thread basis --- cura/Settings/GlobalStack.py | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index 7873f12355..6d18bf615b 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -1,6 +1,8 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +from collections import defaultdict +import threading from typing import Any, Dict, Optional from PyQt5.QtCore import pyqtProperty @@ -30,7 +32,8 @@ class GlobalStack(CuraContainerStack): # This property is used to track which settings we are calculating the "resolve" for # and if so, to bypass the resolve to prevent an infinite recursion that would occur # if the resolve function tried to access the same property it is a resolve for. - self._resolving_settings = set() + # Per thread we have our own resolving_settings, or strange things sometimes occur. + self._resolving_settings = defaultdict(set) # keys are thread names ## Get the list of extruders of this stack. # @@ -91,16 +94,10 @@ class GlobalStack(CuraContainerStack): # Handle the "resolve" property. if self._shouldResolve(key, property_name, context): - self._resolving_settings.add(key) + current_thread = threading.current_thread() + self._resolving_settings[current_thread.name].add(key) resolve = super().getProperty(key, "resolve", context) - if key not in self._resolving_settings: - # For debugging CURA-4848, if it happens - Logger.log("e", "Key [%s] should really have been in set(%s). Now I'm gonna crash", key, str(self._resolving_settings)) - Logger.log("d", "------ context ------") - for stack in context.stack_of_containers: - Logger.log("d", "Context: %s", stack.getId()) - Logger.log("d", "------ context end ------") - self._resolving_settings.remove(key) + self._resolving_settings[current_thread.name].remove(key) if resolve is not None: return resolve @@ -152,7 +149,8 @@ class GlobalStack(CuraContainerStack): # Do not try to resolve anything but the "value" property return False - if key in self._resolving_settings: + current_thread = threading.current_thread() + if key in self._resolving_settings[current_thread.name]: # To prevent infinite recursion, if getProperty is called with the same key as # we are already trying to resolve, we should not try to resolve again. Since # this can happen multiple times when trying to resolve a value, we need to From a6f5f8ea6860433a427f4e4dfd8e8b25335f8e9a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 23 Jan 2018 20:37:24 +0100 Subject: [PATCH 3/5] Revert "Revert "Rename Enable Travel Optimization to Infill Travel Optimization"" This reverts commit 3ec4cc6a0ba466df7d454084b51a0becbc3d7d32. --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 0451bd2539..60ede2c3b0 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5308,7 +5308,7 @@ }, "infill_enable_travel_optimization": { - "label": "Enable Travel Optimization", + "label": "Infill Travel Optimization", "description": "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased.", "type": "bool", "default_value": false, From 9488c39f6854f880340b7cfa4cdb2875c63604e9 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 24 Jan 2018 11:07:13 +0100 Subject: [PATCH 4/5] Update plugin browser version as we have breaking changes in Cura 3.2 --- plugins/PluginBrowser/PluginBrowser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 35b88b3465..5c5c5ba4ea 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -25,7 +25,7 @@ class PluginBrowser(QObject, Extension): def __init__(self, parent=None): super().__init__(parent) - self._api_version = 2 + self._api_version = 3 self._api_url = "http://software.ultimaker.com/cura/v%s/" % self._api_version self._plugin_list_request = None From c47199104467ea4acc17c04f9d4abff4363f1ad6 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 24 Jan 2018 13:30:08 +0100 Subject: [PATCH 5/5] Update plugin browser version to 4 as network rewrite has another set of breaking changes --- plugins/PluginBrowser/PluginBrowser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 5c5c5ba4ea..13fa553779 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -25,7 +25,7 @@ class PluginBrowser(QObject, Extension): def __init__(self, parent=None): super().__init__(parent) - self._api_version = 3 + self._api_version = 4 self._api_url = "http://software.ultimaker.com/cura/v%s/" % self._api_version self._plugin_list_request = None