chiark / gitweb /
Add the feature where support material is generated with a dual extrusion setup.
authordaid <daid303@gmail.com>
Wed, 12 Sep 2012 15:02:42 +0000 (17:02 +0200)
committerdaid <daid303@gmail.com>
Wed, 12 Sep 2012 15:02:42 +0000 (17:02 +0200)
Cura/cura_sf/fabmetheus_utilities/settings.py
Cura/cura_sf/skeinforge_application/skeinforge_plugins/craft_plugins/raft.py
Cura/gui/alterationPanel.py
Cura/gui/mainWindow.py
Cura/util/profile.py

index b7aeaa14d056d6580ac2540ae20e903aa1a38b6b..9734ba865fd88dfaca6e36ac846899960e6a6db4 100644 (file)
@@ -25,6 +25,8 @@ def storedSettingInt(name):
        return lambda setting: int(profile.getProfileSettingFloat(name))
 def storedPreference(name):
        return lambda setting: profile.getPreference(name)
+def storedPreferenceFloat(name):
+       return lambda setting: profile.getPreferenceFloat(name)
 def storedSettingInvertBoolean(name):
        return lambda setting: profile.getProfileSetting(name) == "False"
 
@@ -240,6 +242,8 @@ def getProfileInformation():
                        'Support_Material_Choice_': storedSetting('support'),
                        'Support_Minimum_Angle_degrees': DEFSET,
                        'Support_Margin_mm': '3.0',
+                       'Support_Offset_X_mm': lambda setting: -profile.getPreferenceFloat('extruder_offset_x1') if profile.getProfileSetting('support_dual_extrusion') == 'True' and int(profile.getPreference('extruder_amount')) > 1 else '0',
+                       'Support_Offset_Y_mm': lambda setting: -profile.getPreferenceFloat('extruder_offset_y1') if profile.getProfileSetting('support_dual_extrusion') == 'True' and int(profile.getPreference('extruder_amount')) > 1 else '0',
                },'skirt': {
                        'Skirt_line_count': storedSetting("skirt_line_count"),
                        'Convex': "True",
index 230a5f3da620ddeea0850b9c22d05c5a60f8aada..c364cf910b24e3dcb3b26b17bee3ea2cd485a5f8 100644 (file)
@@ -402,6 +402,8 @@ class RaftRepository:
                self.executeTitle = 'Raft'
                self.supportMargin = settings.FloatSpin().getFromValue(
                        1.0, 'Support Margin (mm):', self, 5.0, 3.0)
+               self.supportOffsetX = settings.FloatSpin().getFromValue(0.0, 'Support Offset X (mm):', self, 100.0, 0.0)
+               self.supportOffsetY = settings.FloatSpin().getFromValue(0.0, 'Support Offset Y (mm):', self, 100.0, 0.0)
 
        def execute(self):
                'Raft button has been clicked.'
@@ -698,8 +700,8 @@ class RaftSkein:
 
        def addSupportLayerTemperature(self, endpoints, z):
                'Add support layer and temperature before the object layer.'
-               self.distanceFeedRate.addLine('(<supportLayer>)')
                self.distanceFeedRate.addLinesSetAbsoluteDistanceMode(self.supportStartLines)
+               self.distanceFeedRate.addLine('(<supportLayer>)')
                self.addTemperatureOrbits(endpoints, self.supportedLayersTemperature, z)
                aroundPixelTable = {}
                aroundWidth = 0.34321 * self.interfaceStep
@@ -717,6 +719,7 @@ class RaftSkein:
                                supportFlowRateMultiplied = self.operatingFlowRate * self.objectFirstLayerFlowRateInfillMultiplier
                self.addFlowRate(supportFlowRateMultiplied)
                for path in paths:
+                       path = map(lambda p: p + complex(self.supportOffsetX, self.supportOffsetY), path)
                        self.distanceFeedRate.addGcodeFromFeedRateThreadZ(feedRateMinuteMultiplied, path, self.travelFeedRateMinute, z)
                self.addFlowRate(self.oldFlowRate)
                self.addTemperatureOrbits(endpoints, self.supportLayersTemperature, z)
@@ -815,6 +818,8 @@ class RaftSkein:
                self.minimumSupportRatio = math.tan( math.radians( repository.supportMinimumAngle.value ) )
                self.supportEndLines = settings.getAlterationFileLines(repository.nameOfSupportEndFile.value)
                self.supportStartLines = settings.getAlterationFileLines(repository.nameOfSupportStartFile.value)
+               self.supportOffsetX = repository.supportOffsetX.value
+               self.supportOffsetY = repository.supportOffsetY.value
                self.lines = archive.getTextLines(gcodeText)
                self.parseInitialization()
                self.temperatureChangeTimeBeforeRaft = 0.0
index da227b2bee4db7961797f6fa6215ac920a6cfbb3..6c532eeef2be6d1036c27a2e251c6248aad5e57a 100644 (file)
@@ -8,7 +8,7 @@ class alterationPanel(wx.Panel):
        def __init__(self, parent):\r
                wx.Panel.__init__(self, parent,-1)\r
 \r
-               self.alterationFileList = ['start.gcode', 'end.gcode', 'support_start.gcode', 'support_end.gcode', 'nextobject.gcode', 'replace.csv']\r
+               self.alterationFileList = ['start.gcode', 'end.gcode', 'nextobject.gcode', 'replace.csv']\r
                if int(profile.getPreference('extruder_amount')) > 1:\r
                        self.alterationFileList.append('switchExtruder.gcode')\r
                self.currentFile = None\r
index 85110cfd1a76381c7d80bc3bff59a3dc72aa2045..f20b01b4b26439e7da5e68a346f2c72470efed6f 100644 (file)
@@ -38,6 +38,8 @@ class mainWindow(configBase.configWindowBase):
        "Main user interface window"
        def __init__(self):
                super(mainWindow, self).__init__(title='Cura - ' + version.getVersion())
+
+               extruderCount = int(profile.getPreference('extruder_amount'))
                
                wx.EVT_CLOSE(self, self.OnClose)
                #self.SetIcon(icon.getMainIcon())
@@ -151,6 +153,8 @@ class mainWindow(configBase.configWindowBase):
                configBase.TitleRow(right, "Support")
                c = configBase.SettingRow(right, "Support type", 'support', ['None', 'Exterior Only', 'Everywhere', 'Empty Layers Only'], 'Type of support structure build.\n"Exterior only" is the most commonly used support setting.\n\nNone does not do any support.\nExterior only only creates support on the outside.\nEverywhere creates support even on the insides of the model.\nOnly on empty layers is for stacked objects.')
                c = configBase.SettingRow(right, "Add raft", 'enable_raft', False, 'A raft is a few layers of lines below the bottom of the object. It prevents warping. Full raft settings can be found in the expert settings.\nFor PLA this is usually not required. But if you print with ABS it is almost required.')
+               if extruderCount > 1:
+                       c = configBase.SettingRow(right, "Support dual extrusion", 'support_dual_extrusion', False, 'Print the support material with the 2nd extruder in a dual extrusion setup. The primary extruder will be used for normal material, while the second extruder is used to print support material.')
 
                configBase.TitleRow(right, "Filament")
                c = configBase.SettingRow(right, "Diameter (mm)", 'filament_diameter', '2.89', 'Diameter of your filament, as accurately as possible.\nIf you cannot measure this value you will have to callibrate it, a higher number means less extrusion, a smaller number generates more extrusion.')
@@ -212,7 +216,6 @@ class mainWindow(configBase.configWindowBase):
                self.Bind(wx.EVT_BUTTON, self.OnSlice, sliceButton)
                self.Bind(wx.EVT_BUTTON, self.OnPrint, printButton)
 
-               extruderCount = int(profile.getPreference('extruder_amount'))
                if extruderCount > 1:
                        loadButton2 = wx.Button(self, -1, 'Load Dual')
                        self.Bind(wx.EVT_BUTTON, lambda e: self._showModelLoadDialog(2), loadButton2)
index 468fd997dc0ed6e5be1f6df3c0159e413ff850a6..7d91cf4425bbb4fdeaa705c654fec2afe6c69c8b 100644 (file)
@@ -60,6 +60,7 @@ profileDefaultSettings = {
        'fill_overlap': '15',\r
        'support_rate': '50',\r
        'support_distance': '0.5',\r
+       'support_dual_extrusion': 'False',\r
        'joris': 'False',\r
        'enable_skin': 'False',\r
        'enable_raft': 'False',\r
@@ -365,6 +366,8 @@ def isPreference(name):
 tempOverride = {}\r
 def setTempOverride(name, value):\r
        tempOverride[name] = unicode(value).encode("utf-8")\r
+def clearTempOverride(name):\r
+       del tempOverride[name]\r
 def resetTempOverride():\r
        tempOverride.clear()\r
 \r
@@ -500,13 +503,22 @@ def getAlterationFileContents(filename):
                        prefix += 'M109 S%f\n' % (temp)\r
                if bedTemp > 0 and not '{print_bed_temperature}' in alterationContents:\r
                        prefix += 'M190 S%f\n' % (bedTemp)\r
-                       \r
        elif filename == 'end.gcode':\r
                #Append the profile string to the end of the GCode, so we can load it from the GCode file later.\r
                postfix = ';CURA_PROFILE_STRING:%s\n' % (getGlobalProfileString())\r
        elif filename == 'replace.csv':\r
                #Always remove the extruder on/off M codes. These are no longer needed in 5D printing.\r
                prefix = 'M101\nM103\n'\r
-       \r
+       elif filename == 'support_start.gcode' or filename == 'support_end.gcode':\r
+               #Add support start/end code \r
+               if getProfileSetting('support_dual_extrusion') == 'True' and int(getPreference('extruder_amount')) > 1:\r
+                       if filename == 'support_start.gcode':\r
+                               setTempOverride('extruder', '1')\r
+                       else:\r
+                               setTempOverride('extruder', '0')\r
+                       alterationContents = getAlterationFileContents('switchExtruder.gcode')\r
+                       clearTempOverride('extruder')\r
+               else:\r
+                       alterationContents = ''\r
        return unicode(prefix + re.sub("(.)\{([^\}]*)\}", replaceTagMatch, alterationContents).rstrip() + '\n' + postfix).encode('utf-8')\r
 \r