chiark / gitweb /
Make the fan speed adjustable between min/max, depending on the slowdown due to cooli...
authordaid <daid303@gmail.com>
Tue, 3 Jul 2012 15:45:18 +0000 (17:45 +0200)
committerdaid <daid303@gmail.com>
Tue, 3 Jul 2012 15:45:18 +0000 (17:45 +0200)
Cura/cura_sf/fabmetheus_utilities/settings.py
Cura/cura_sf/skeinforge_application/skeinforge_plugins/craft_plugins/cool.py
Cura/gui/expertConfig.py
Cura/util/profile.py

index 997f039a6fa0d3b5abf37435851d09bbf4c7242e..b7aeaa14d056d6580ac2540ae20e903aa1a38b6b 100644 (file)
@@ -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,
index eb363a8cddd94e06fd872a9180b6954ff266faf5..84f96d096092b55e37acce0c36ad7caa0402bd16 100644 (file)
@@ -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:
index 3e409eed7c678560b1d91d8139f1b8e47d9f96a1..4e3f703dadcc21f82af2b006ab81e12174e1176e 100644 (file)
@@ -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)")
index 4c4165345af3c847cc0d27a987599da9b02f4e98..8d7975ac58150ca49cad10e061c2ce13b5418b5c 100644 (file)
@@ -41,6 +41,7 @@ profileDefaultSettings = {
        'fan_enabled': 'True',\r
        'fan_layer': '1',\r
        'fan_speed': '100',\r
+       'fan_speed_max': '100',\r
        'model_scale': '1.0',\r
        'flip_x': 'False',\r
        'flip_y': 'False',\r