From 1070cbf99e07d4b4042eabc216a8b2d8ee4dc302 Mon Sep 17 00:00:00 2001 From: daid Date: Tue, 3 Jul 2012 17:45:18 +0200 Subject: [PATCH] Make the fan speed adjustable between min/max, depending on the slowdown due to cooling. Fixed #47 --- Cura/cura_sf/fabmetheus_utilities/settings.py | 3 ++- .../skeinforge_plugins/craft_plugins/cool.py | 19 +++++++++++++++++-- Cura/gui/expertConfig.py | 4 +++- Cura/util/profile.py | 1 + 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/Cura/cura_sf/fabmetheus_utilities/settings.py b/Cura/cura_sf/fabmetheus_utilities/settings.py index 997f039..b7aeaa1 100644 --- a/Cura/cura_sf/fabmetheus_utilities/settings.py +++ b/Cura/cura_sf/fabmetheus_utilities/settings.py @@ -304,7 +304,8 @@ def getProfileInformation(): 'Turn_Fan_Off_at_Ending': storedSetting("fan_enabled"), 'Minimum_feed_rate_mm/s': storedSettingFloat("cool_min_feedrate"), 'Fan_on_at_layer': storedSettingInt('fan_layer'), - 'Fan_speed_%': storedSettingInt('fan_speed'), + 'Fan_speed_min_%': storedSettingInt('fan_speed'), + 'Fan_speed_max_%': storedSettingInt('fan_speed_max'), },'hop': { 'Activate_Hop': "False", 'Hop_Over_Layer_Thickness_ratio': DEFSET, diff --git a/Cura/cura_sf/skeinforge_application/skeinforge_plugins/craft_plugins/cool.py b/Cura/cura_sf/skeinforge_application/skeinforge_plugins/craft_plugins/cool.py index eb363a8..84f96d0 100644 --- a/Cura/cura_sf/skeinforge_application/skeinforge_plugins/craft_plugins/cool.py +++ b/Cura/cura_sf/skeinforge_application/skeinforge_plugins/craft_plugins/cool.py @@ -164,7 +164,8 @@ class CoolRepository: self.minimumFeedRate = settings.FloatSpin().getFromValue(0.0, 'Minimum feed rate (mm/s):', self, 10.0, 5.0) self.fanTurnOnLayerNr = settings.IntSpin().getFromValue(0, 'Fan on at layer:', self, 100, 0) - self.fanSpeed = settings.IntSpin().getFromValue(0, 'Fan speed (%):', self, 100, 100) + self.fanSpeedMin = settings.IntSpin().getFromValue(0, 'Fan speed min (%):', self, 100, 100) + self.fanSpeedMax = settings.IntSpin().getFromValue(0, 'Fan speed max (%):', self, 100, 100) def execute(self): 'Cool button has been clicked.' @@ -193,6 +194,8 @@ class CoolSkein: self.oldLocation = None self.oldTemperature = None self.minFeedrate = 0 + self.fanEnabled = False + self.lastFanSpeed = 0 def addCoolOrbits(self, remainingOrbitTime): 'Add the minimum radius cool orbits.' @@ -232,6 +235,16 @@ class CoolSkein: self.coolTemperature = self.oldTemperature - layerCool self.addTemperature(self.coolTemperature) + def addFanSpeed(self, remainingOrbitTime): + if self.repository.minimumLayerTime.value < 0.0001: + fanSpeed = self.repository.fanSpeedMin.value + else: + f = min(1.0, 2.0 * remainingOrbitTime / self.repository.minimumLayerTime.value) + fanSpeed = self.repository.fanSpeedMin.value + (self.repository.fanSpeedMax.value - self.repository.fanSpeedMin.value) * f + if self.lastFanSpeed != fanSpeed: + self.distanceFeedRate.addLine('M106 S%d' % (fanSpeed * 255 / 100)) + self.lastFanSpeed = fanSpeed + def addFlowRate(self, flowRate): 'Add a multipled line of flow rate if different.' if flowRate != None: @@ -374,11 +387,13 @@ class CoolSkein: self.layerCount.printProgressIncrement('cool') self.distanceFeedRate.addLine(line) if self.repository.turnFanOnAtBeginning.value and self.repository.fanTurnOnLayerNr.value == self.layerCount.layerIndex: - self.distanceFeedRate.addLine('M106 S%d' % (self.repository.fanSpeed.value * 255 / 100)) + self.fanEnabled = True self.distanceFeedRate.addLinesSetAbsoluteDistanceMode(self.coolStartLines) layerTime = self.getLayerTime() remainingOrbitTime = max(self.repository.minimumLayerTime.value - layerTime, 0.0) self.addCoolTemperature(remainingOrbitTime) + if self.fanEnabled: + self.addFanSpeed(remainingOrbitTime) if self.repository.orbit.value: self.addOrbitsIfNecessary(remainingOrbitTime) else: diff --git a/Cura/gui/expertConfig.py b/Cura/gui/expertConfig.py index 3e409ee..4e3f703 100644 --- a/Cura/gui/expertConfig.py +++ b/Cura/gui/expertConfig.py @@ -28,7 +28,9 @@ class expertConfigWindow(configBase.configWindowBase): validators.validFloat(c, 0.0) c = configBase.SettingRow(left, "Fan on layer number", 'fan_layer', '0', 'The layer at which the fan is turned on. The first layer is layer 0. The first layer can stick better if you turn on the fan on, on the 2nd layer.') validators.validInt(c, 0) - c = configBase.SettingRow(left, "Fan speed (%)", 'fan_speed', '100', 'When the fan is turned on, it is enabled at this speed setting.') + c = configBase.SettingRow(left, "Fan speed min (%)", 'fan_speed', '100', 'When the fan is turned on, it is enabled at this speed setting. If cool slows down the layer, the fan is adjusted between the min and max speed. Minimal fan speed is used if the layer is not slowed down due to cooling.') + validators.validInt(c, 0, 100) + c = configBase.SettingRow(left, "Fan speed max (%)", 'fan_speed_max', '100', 'When the fan is turned on, it is enabled at this speed setting. If cool slows down the layer, the fan is adjusted between the min and max speed. Maximal fan speed is used if the layer is slowed down due to cooling by more then 200%.') validators.validInt(c, 0, 100) configBase.TitleRow(left, "Raft (if enabled)") diff --git a/Cura/util/profile.py b/Cura/util/profile.py index 4c41653..8d7975a 100644 --- a/Cura/util/profile.py +++ b/Cura/util/profile.py @@ -41,6 +41,7 @@ profileDefaultSettings = { 'fan_enabled': 'True', 'fan_layer': '1', 'fan_speed': '100', + 'fan_speed_max': '100', 'model_scale': '1.0', 'flip_x': 'False', 'flip_y': 'False',