chiark / gitweb /
Initial fakeouts for Mangrove
[cura.git] / Cura / gui / configWizard.py
index e12bd7af9e760fa71b52247b430a41524baaff63..b5d8fa92f5f3d1300186eb7df39162fd53b49e09 100644 (file)
@@ -15,6 +15,7 @@ from Cura.util import machineCom
 from Cura.util import profile
 from Cura.util import gcodeGenerator
 from Cura.util import resources
+from Cura.util import version
 
 
 class InfoBox(wx.Panel):
@@ -62,7 +63,8 @@ class InfoBox(wx.Panel):
                self.extraInfoUrl = extraInfoUrl
                self.SetBackgroundColour('#FF8080')
                self.text.SetLabel(info)
-               self.extraInfoButton.Show(True)
+               if extraInfoUrl:
+                       self.extraInfoButton.Show(True)
                self.Layout()
                self.SetErrorIndicator()
                self.Refresh()
@@ -131,13 +133,17 @@ class ImageButton(wx.Panel):
                self.overlay = self.createOverlay(bitmap, overlay)
                self.text = wx.StaticText(self, -1, label)
                self.bmp = wx.StaticBitmap(self, -1, self.bitmap)
-               self.extra_text = wx.StaticText(self, -1, extra_label if extra_label else '')
+               if extra_label:
+                       self.extra_text = wx.StaticText(self, -1, extra_label)
+               else:
+                       self.extra_text = None
                self.selected = False
                self.callback = None
 
-               self.sizer.Add(self.text, 0, flag=wx.ALL|wx.ALIGN_CENTER, border=5)
+               self.sizer.Add(self.text, 0, flag=wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER, border=5)
                self.sizer.Add(self.bmp, 1, flag=wx.ALL|wx.ALIGN_CENTER|wx.EXPAND, border=5)
-               self.sizer.Add(self.extra_text, 0, flag=wx.ALL|wx.ALIGN_CENTER, border=5)
+               if self.extra_text:
+                       self.sizer.Add(self.extra_text, 0, flag=wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER, border=5)
                self.bmp.Bind(wx.EVT_LEFT_UP, self.OnLeftClick)
 
        def __del__(self):
@@ -150,6 +156,16 @@ class ImageButton(wx.Panel):
                                if ImageButton.__last_group__ == self:
                                        ImageButton.__last_group__ = None
 
+       def TriggerGroupCallbacks(self):
+               if self.group:
+                       for ib in ImageButton.__groups__[self.group]:
+                               if ib.GetValue() and ib.callback:
+                                       ib.callback()
+                                       break
+               else:
+                       if self.GetValue() and self.callback:
+                               self.callback()
+
        def OnLeftClick(self, e):
                self.SetValue(True)
 
@@ -174,7 +190,11 @@ class ImageButton(wx.Panel):
                self.Layout()
 
        def SetExtraLabel(self, label):
-               self.extra_text.SetLabel(label)
+               if self.extra_text:
+                       self.extra_text.SetLabel(label)
+               else:
+                       self.extra_text = wx.StaticText(self, -1, label)
+                       self.sizer.Add(self.extra_text, 0, flag=wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER, border=5)
                self.Layout()
 
        def SetBitmap(self, bitmap):
@@ -313,7 +333,7 @@ class InfoPage(wx.wizard.WizardPageSimple):
 
        def AddPanel(self):
                panel = wx.Panel(self, -1)
-               sizer = wx.GridBagSizer(5, 5)
+               sizer = wx.GridBagSizer(2, 2)
                panel.SetSizer(sizer)
                self.GetSizer().Add(panel, pos=(self.rowNr, 0), span=(1, 2), flag=wx.ALL | wx.EXPAND)
                self.rowNr += 1
@@ -658,7 +678,7 @@ class SelectParts(InfoPage):
 class UltimakerFirmwareUpgradePage(InfoPage):
        def __init__(self, parent):
                super(UltimakerFirmwareUpgradePage, self).__init__(parent, _("Upgrade Ultimaker Firmware"))
-               self.AddText(_("Firmware is the piece of software running directly on your 3D printer.\nThis firmware controls the step motors, regulates the temperature\nand ultimately makes your printer work."))
+               self.AddText(_("Firmware is the piece of software running directly on your 3D printer.\nThis firmware controls the stepper motors, regulates the temperature\nand ultimately makes your printer work."))
                self.AddHiddenSeperator()
                self.AddText(_("The firmware shipping with new Ultimakers works, but upgrades\nhave been made to make better prints, and make calibration easier."))
                self.AddHiddenSeperator()
@@ -1080,42 +1100,48 @@ class Ultimaker2ReadyPage(InfoPage):
                self.AddSeperator()
 
 class LulzbotMachineSelectPage(InfoPage):
-       IMAGE_WIDTH=350
-       IMAGE_HEIGHT=250
+       IMAGE_WIDTH=300
+       IMAGE_HEIGHT=200
 
        def __init__(self, parent):
                super(LulzbotMachineSelectPage, self).__init__(parent, _("Select your machine"))
-               self.AddBitmap(wx.Bitmap(resources.getPathForImage('Lulzbot_logo.png')))
-               self.AddText(_("Select your printer :"))
 
                self.panel = self.AddPanel()
 
-               self.LulzbotMini = ImageButton(self.panel, _("LulzBot Mini"), self.GetBitmap('Lulzbot_mini.jpg'), style=ImageButton.IB_GROUP)
-               self.LulzbotMini.OnSelected(self.OnLulzbotSelected)
-               self.LulzbotMini.SetValue(True)
-               self.LulzbotTaz5 = ImageButton(self.panel, _("LulzBot TAZ 5"), self.GetBitmap('Lulzbot_TAZ5.png'))
-               self.LulzbotTaz5.OnSelected(self.OnLulzbotSelected)
-               self.LulzbotTaz4 = ImageButton(self.panel, _("LulzBot TAZ 4"), self.GetBitmap('Lulzbot_TAZ4.jpg'))
-               self.LulzbotTaz4.OnSelected(self.OnLulzbotSelected)
-               self.OtherPrinters = ImageButton(self.panel, _("Non-LulzBot Printers"), self.GetBitmap('Other_Printers.jpg'))
+               image_size=(LulzbotMachineSelectPage.IMAGE_WIDTH, LulzbotMachineSelectPage.IMAGE_HEIGHT)
+               self.LulzbotMini = self.AddImageButton(self.panel, 0, 0, _("LulzBot Mini"),
+                                                                                          'Lulzbot_mini.jpg', image_size, style=ImageButton.IB_GROUP)
+               self.LulzbotMini.OnSelected(self.OnLulzbotMiniSelected)
+               
+               self.LulzbotTaz6 = self.AddImageButton(self.panel, 0, 1, _("LulzBot TAZ 6"),
+                                                                                          'Lulzbot_TAZ6.jpg', image_size)
+               self.LulzbotTaz6.OnSelected(self.OnLulzbotTaz6Selected)
+               
+               self.LulzbotTaz = self.AddImageButton(self.panel, 1, 0, _("LulzBot TAZ 4 or 5"),
+                                                                                          'Lulzbot_TAZ5.jpg', image_size)
+               self.LulzbotTaz.OnSelected(self.OnLulzbotTazSelected)
+               
+               self.OtherPrinters = self.AddImageButton(self.panel, 1, 1, _("Other Printers"),
+                                                                                                'Generic-3D-Printer.png', image_size)
                self.OtherPrinters.OnSelected(self.OnOthersSelected)
+               self.LulzbotMini.SetValue(True)
 
-               self.panel.GetSizer().Add(self.LulzbotMini, pos=(0, 0))
-               self.panel.GetSizer().Add(self.LulzbotTaz4, pos=(0, 1))
-               self.panel.GetSizer().Add(self.LulzbotTaz5, pos=(1, 0))
-               self.panel.GetSizer().Add(self.OtherPrinters, pos=(1, 1))
-
-       def GetBitmap(self, filename):
-               image = wx.Image(resources.getPathForImage(filename))
-               image_scaled = image.Scale(LulzbotMachineSelectPage.IMAGE_WIDTH,
-                                                                  LulzbotMachineSelectPage.IMAGE_HEIGHT, wx.IMAGE_QUALITY_HIGH)
-               return wx.BitmapFromImage(image_scaled)
+       def OnPageShown(self):
+               self.LulzbotMini.TriggerGroupCallbacks()
 
        def OnOthersSelected(self):
                wx.wizard.WizardPageSimple.Chain(self, self.GetParent().machineSelectPage)
 
-       def OnLulzbotSelected(self):
-               wx.wizard.WizardPageSimple.Chain(self, self.GetParent().lulzbotToolheadPage)
+       def OnLulzbotMiniSelected(self):
+               wx.wizard.WizardPageSimple.Chain(self, self.GetParent().lulzbotMiniToolheadPage)
+               wx.wizard.WizardPageSimple.Chain(self.GetParent().lulzbotMiniToolheadPage,
+                                                                                self.GetParent().lulzbotReadyPage)
+
+       def OnLulzbotTaz6Selected(self):
+               wx.wizard.WizardPageSimple.Chain(self, self.GetParent().lulzbotTaz6SelectPage)
+
+       def OnLulzbotTazSelected(self):
+               wx.wizard.WizardPageSimple.Chain(self, self.GetParent().lulzbotTazSelectPage)
 
        def AllowNext(self):
                return True
@@ -1124,28 +1150,23 @@ class LulzbotMachineSelectPage(InfoPage):
                return False
 
        def StoreData(self):
-               if self.LulzbotTaz4.GetValue() or self.LulzbotTaz5.GetValue() or self.LulzbotMini.GetValue():
-                       if self.LulzbotTaz4.GetValue():
+               if self.LulzbotTaz.GetValue() or self.LulzbotMini.GetValue():
+                       if self.LulzbotTaz.GetValue():
                                profile.putMachineSetting('machine_width', '290')
                                profile.putMachineSetting('machine_depth', '275')
                                profile.putMachineSetting('machine_height', '250')
-                               profile.putProfileSetting('nozzle_size', '0.35')
-                               profile.putMachineSetting('machine_name', 'LulzBot TAZ 4')
-                               profile.putMachineSetting('machine_type', 'lulzbot_TAZ_4')
                                profile.putMachineSetting('serial_baud', '115200')
-                       elif self.LulzbotTaz5.GetValue():
-                               profile.putMachineSetting('machine_width', '290')
-                               profile.putMachineSetting('machine_depth', '275')
-                               profile.putMachineSetting('machine_height', '250')
-                               profile.putMachineSetting('serial_baud', '115200')
-                               # Machine type and name are set in the nozzle select page
+                               profile.putMachineSetting('extruder_head_size_min_x', '0.0')
+                               profile.putMachineSetting('extruder_head_size_max_x', '0.0')
+                               profile.putMachineSetting('extruder_head_size_min_y', '0.0')
+                               profile.putMachineSetting('extruder_head_size_max_y', '0.0')
+                               profile.putMachineSetting('extruder_head_size_height', '0.0')
                        else:
+                               # Nozzle diameter and machine type will be set in the toolhead selection page
+                               profile.putMachineSetting('machine_name', 'LulzBot Mini')
                                profile.putMachineSetting('machine_width', '155')
                                profile.putMachineSetting('machine_depth', '155')
                                profile.putMachineSetting('machine_height', '163')
-                               profile.putProfileSetting('nozzle_size', '0.5')
-                               profile.putMachineSetting('machine_name', 'LulzBot Mini')
-                               profile.putMachineSetting('machine_type', 'lulzbot_mini')
                                profile.putMachineSetting('serial_baud', '115200')
                                profile.putMachineSetting('extruder_head_size_min_x', '40')
                                profile.putMachineSetting('extruder_head_size_max_x', '75')
@@ -1156,11 +1177,6 @@ class LulzbotMachineSelectPage(InfoPage):
                        profile.putMachineSetting('machine_center_is_zero', 'False')
                        profile.putMachineSetting('gcode_flavor', 'RepRap (Marlin/Sprinter)')
                        profile.putMachineSetting('has_heated_bed', 'True')
-                       profile.putMachineSetting('extruder_head_size_min_x', '0.0')
-                       profile.putMachineSetting('extruder_head_size_min_y', '0.0')
-                       profile.putMachineSetting('extruder_head_size_max_x', '0.0')
-                       profile.putMachineSetting('extruder_head_size_max_y', '0.0')
-                       profile.putMachineSetting('extruder_head_size_height', '0.0')
                        profile.putProfileSetting('retraction_enable', 'True')
                        profile.putPreference('startMode', 'Simple')
                        profile.putProfileSetting('wall_thickness', float(profile.getProfileSetting('nozzle_size')) * 2)
@@ -1169,148 +1185,380 @@ class LulzbotMachineSelectPage(InfoPage):
 class LulzbotReadyPage(InfoPage):
        def __init__(self, parent):
                super(LulzbotReadyPage, self).__init__(parent, _("LulzBot TAZ/Mini"))
-               self.AddBitmap(wx.Bitmap(resources.getPathForImage('Lulzbot_logo.png')))
                self.AddText(_('Cura is now ready to be used with your LulzBot 3D printer.'))
                self.AddSeperator()
                self.AddText(_('For more information about using Cura with your LulzBot'))
                self.AddText(_('3D printer, please visit www.LulzBot.com/cura'))
                self.AddSeperator()
 
-class LulzbotToolheadSelectPage(InfoPage):
-       url='http://lulzbot.com/toolhead-identification'
+class LulzbotMiniToolheadSelectPage(InfoPage):
+       def __init__(self, parent, allowBack = True):
+               super(LulzbotMiniToolheadSelectPage, self).__init__(parent, _("LulzBot Mini Tool Head Selection"))
+
+               self.allowBack = allowBack
+               self.panel = self.AddPanel()
+               image_size=(LulzbotMachineSelectPage.IMAGE_WIDTH, LulzbotMachineSelectPage.IMAGE_HEIGHT)
+               self.standard = self.AddImageButton(self.panel, 0, 0, _('Standard LulzBot Mini'),
+                                                                                       'Lulzbot_mini.jpg', image_size,
+                                                                                       style=ImageButton.IB_GROUP)
+               self.flexy = self.AddImageButton(self.panel, 0, 1, _('LulzBot Mini with Flexystruder'),
+                                                                                       'Lulzbot_Toolhead_Mini_Flexystruder.jpg', image_size)
+               self.standard.SetValue(True)
+
+       def AllowBack(self):
+               return self.allowBack
+
+       def StoreData(self):
+               if self.standard.GetValue():
+                       profile.putProfileSetting('nozzle_size', '0.5')
+                       profile.putMachineSetting('extruder_amount', '1')
+                       profile.putMachineSetting('toolhead', 'Single Extruder v2')
+                       profile.putMachineSetting('toolhead_shortname', '')
+                       profile.putMachineSetting('machine_type', 'lulzbot_mini')
+               else:
+                       profile.putProfileSetting('nozzle_size', '0.6')
+                       profile.putMachineSetting('extruder_amount', '1')
+                       profile.putMachineSetting('toolhead', 'Flexystruder v2')
+                       profile.putMachineSetting('toolhead_shortname', 'Flexystruder')
+                       profile.putMachineSetting('machine_type', 'lulzbot_mini_flexystruder')
 
+class LulzbotTaz6SelectPage(InfoPage):
        def __init__(self, parent):
-               super(LulzbotToolheadSelectPage, self).__init__(parent, _("LulzBot Toolhead Selection"))
-
-               self.mini_choices = [_('Standard'), _('Flexystruder')]
-               self.taz_choices = [_('Standard v1'),
-                                          _('Standard v2 0.35 mm nozzle'), _('Standard v2 0.5 mm nozzle'),
-                                          _('Flexystruder v1'), _('Flexystruder v2'),
-                                          _('Dually v1'), _('Dually v2'),
-                                          _('FlexyDually v1'), _('FlexyDually v2')]
-               self.description_map = {
-                               _('Standard'): _('This is the standard toolhead that comes with the Lulzbot Mini'),
-                               _('Flexystruder'): _('This is the Flexystruder for the Lulzbot Mini\nIt is used for printing Flexible materials'),
-                               _('Standard v1'): _('This is the standard toolhead that comes with the Lulzbot TAZ 1-2-3 and TAZ 4.\nIt uses the Budaschnozzle for the hotend'),
-                               _('Standard v2 0.35 mm nozzle'): _('This is the standard toolhead that comes with the Lulzbot TAZ 5.\nIt uses the Hexagon hotend and a 0.35 mm nozzle'),
-                               _('Standard v2 0.5 mm nozzle'): _('This is the standard toolhead that comes with the Lulzbot TAZ 5.\nIt uses the Hexagon hotend and a 0.5 mm nozzle'),
-                               _('Flexystruder v1'): _('It\'s the flexy!'),
-                               _('Flexystruder v2'): _('It\'s the flexy v2!'),
-                               _('Dually v1'): _('It\'s the dualy v1!'),
-                               _('Dually v2'): _('It\'s the dual v2!'),
-                               _('FlexyDually v1'): _('It\'s the flexy dually v1!'),
-                               _('FlexyDually v2'): _('It\'s the flexy dual v2!')
-               }
-               self.image_map = {
-                               _('Standard'): 'Lulzbot_Toolhead_Mini_Standard.jpg',
-                               _('Flexystruder'): 'Lulzbot_logo.png',
-                               _('Standard v1'): 'Lulzbot_logo.png',
-                               _('Standard v2 0.35 mm nozzle'): 'Lulzbot_Toolhead_TAZ_Single_v2.jpg',
-                               _('Standard v2 0.5 mm nozzle'): 'Lulzbot_Toolhead_TAZ_Single_v2.jpg',
-                               _('Flexystruder v1'): 'Lulzbot_Toolhead_TAZ_Flexystruder_v1.jpg',
-                               _('Flexystruder v2'): 'Lulzbot_logo.png',
-                               _('Dually v1'): 'Lulzbot_Toolhead_TAZ_Dually_v1.jpg',
-                               _('Dually v2'): 'Lulzbot_logo.png',
-                               _('FlexyDually v1'): 'Lulzbot_logo.png',
-                               _('FlexyDually v2'): 'Lulzbot_logo.png'
-               }
-               self.AddBitmap(wx.Bitmap(resources.getPathForImage('Lulzbot_logo.png')))
-               printer_name = profile.getMachineSetting('machine_type')
-               self.Bind(wx.wizard.EVT_WIZARD_PAGE_SHOWN, self.OnPageShown)
-
-               self.AddText(_('Please select your currently installed Tool Head'))
-               txt = self.AddText(_('It is important to select the correct Tool head for your printer.\n' +
-                                                        'Flashing the wrong firmware on your printer can cause damage to your printer and to your toolhead\n' +
-                                                        'If you are not sure which toolhead you have, please refer to this webpage for more information: '))
-               txt.SetForegroundColour(wx.RED)
-               button = self.AddButton(self.url)
-               button.Bind(wx.EVT_BUTTON, self.OnUrlClick)
+               super(LulzbotTaz6SelectPage, self).__init__(parent, _("LulzBot TAZ 6 Selection"))
+
+               self.panel = self.AddPanel()
+               image_size=(LulzbotMachineSelectPage.IMAGE_WIDTH, LulzbotMachineSelectPage.IMAGE_HEIGHT)
+               self.taz6 = self.AddImageButton(self.panel, 0, 0, _('Tilapia'),
+                                                                               'Lulzbot_Toolhead_TAZ_Tilapia.jpg', image_size,
+                                                                               style=ImageButton.IB_GROUP)
+               self.taz6.OnSelected(self.OnTilapiaSelected)
+               self.taz6.SetValue(True)
+
+       def OnPageShown(self):
+               self.taz6.TriggerGroupCallbacks()
+
+       def OnTilapiaSelected(self):
+               wx.wizard.WizardPageSimple.Chain(self, self.GetParent().lulzbotReadyPage)
+
+       def StoreData(self):
+               profile.putProfileSetting('nozzle_size',  '0.5')
+               profile.putMachineSetting('extruder_amount', '1')
+               profile.putMachineSetting('toolhead', 'Single Extruder Tilapia')
+               profile.putMachineSetting('toolhead_shortname', 'Tilapia')
+               profile.putMachineSetting('machine_type', 'lulzbot_TAZ_6_Single_Tilapia')
+               profile.putMachineSetting('machine_name', 'LulzBot TAZ 6')
+
+class LulzbotTazSelectPage(InfoPage):
+       def __init__(self, parent):
+               super(LulzbotTazSelectPage, self).__init__(parent, _("LulzBot TAZ 4-5 Selection"))
+
+               self.panel = self.AddPanel()
+               image_size=(LulzbotMachineSelectPage.IMAGE_WIDTH, LulzbotMachineSelectPage.IMAGE_HEIGHT)
+               self.taz5 = self.AddImageButton(self.panel, 0, 0, _('Stock TAZ 5 (PEI && v2)'),
+                                                                               'Lulzbot_TAZ_5_Hex_and_PEI.jpg', image_size,
+                                                                               style=ImageButton.IB_GROUP)
+               self.taz5.OnSelected(self.OnTaz5Selected)
+               self.taz4 = self.AddImageButton(self.panel, 0, 1, _('Stock TAZ 4 (PET && v1)'),
+                                                                               'Lulzbot_TAZ_4_Buda_and_PET.jpg', image_size)
+               self.taz4.OnSelected(self.OnTaz4Selected)
+               self.modified = self.AddImageButton(self.panel, 1, 0, _('Modified LulzBot TAZ 4 or 5'),
+                                                                                       'Lulzbot_TAZ5.jpg', image_size)
+               self.modified.OnSelected(self.OnModifiedSelected)
+               self.taz5.SetValue(True)
+
+       def OnPageShown(self):
+               self.taz5.TriggerGroupCallbacks()
+
+       def OnTaz5Selected(self):
+               wx.wizard.WizardPageSimple.Chain(self, self.GetParent().lulzbotTaz5NozzleSelectPage)
+               wx.wizard.WizardPageSimple.Chain(self.GetParent().lulzbotTaz5NozzleSelectPage,
+                                                                                self.GetParent().lulzbotReadyPage)
+
+       def OnTaz4Selected(self):
+               wx.wizard.WizardPageSimple.Chain(self, self.GetParent().lulzbotReadyPage)
+
+       def OnModifiedSelected(self):
+               wx.wizard.WizardPageSimple.Chain(self, self.GetParent().lulzbotTazBedSelectPage)
+               wx.wizard.WizardPageSimple.Chain(self.GetParent().lulzbotTazBedSelectPage,
+                                                                                self.GetParent().lulzbotTazHotendPage)
+
+       def StoreData(self):
+               if self.taz5.GetValue():
+                       profile.putProfileSetting('nozzle_size',  '0.5')
+                       profile.putMachineSetting('extruder_amount', '1')
+                       profile.putMachineSetting('toolhead', 'Single Extruder V2')
+                       profile.putMachineSetting('toolhead_shortname', '')
+                       profile.putMachineSetting('machine_type', 'lulzbot_TAZ_5_SingleV2')
+                       profile.putMachineSetting('machine_name', 'LulzBot TAZ 5')
+               elif self.taz4.GetValue():
+                       profile.putProfileSetting('nozzle_size', '0.35')
+                       profile.putMachineSetting('extruder_amount', '1')
+                       profile.putMachineSetting('toolhead', 'Single Extruder V1')
+                       profile.putMachineSetting('toolhead_shortname', '')
+                       profile.putMachineSetting('machine_type', 'lulzbot_TAZ_4_SingleV1')
+                       profile.putMachineSetting('machine_name', 'LulzBot TAZ 4')
+
+class LulzbotTazBedSelectPage(InfoPage):
+       def __init__(self, parent):
+               super(LulzbotTazBedSelectPage, self).__init__(parent, _("Bed Surface"))
 
-               self.AddSeperator()
-               #self.combo = self.AddCombo(_('Currently installed Toolhead'), [''])
-               #self.combo.SetEditable(False)
-               #self.combo.Bind(wx.EVT_COMBOBOX, self.OnToolheadSelected)
-               #self.description = self.AddText('\n\n')
-               #self.description.SetFont(wx.Font(11, wx.SWISS, wx.NORMAL, wx.BOLD))
-               #self.image = self.AddBitmap(wx.Bitmap(resources.getPathForImage(self.image_map[self.mini_choices[0]])))
                self.panel = self.AddPanel()
-               ib1 = ImageButton(self.panel, "Mini", wx.Bitmap(resources.getPathForImage('Lulzbot_Toolhead_TAZ_Flexystruder_v1.jpg')), "Some description", style=ImageButton.IB_GROUP)
-               ib2 = ImageButton(self.panel, "TAZ 4 ", wx.Bitmap(resources.getPathForImage('Lulzbot_Toolhead_TAZ_Single_v2.jpg')), "Some description 2")
-               ib3 = ImageButton(self.panel, "TAZ 5 ", wx.Bitmap(resources.getPathForImage('Lulzbot_Toolhead_TAZ_Flexystruder_v1.jpg')))
-               ib4 = ImageButton(self.panel, "Others ", wx.Bitmap(resources.getPathForImage('Lulzbot_Toolhead_TAZ_Dually_v1.jpg')))
-               self.panel.GetSizer().Add(ib1, pos=(0, 0), flag=wx.EXPAND)
-               self.panel.GetSizer().Add(ib2, pos=(0, 1), flag=wx.EXPAND)
-               self.panel.GetSizer().Add(ib3, pos=(1, 0), flag=wx.EXPAND)
-               self.panel.GetSizer().Add(ib4, pos=(1, 1), flag=wx.EXPAND)
-
-
-       def OnPageShown(self, e):
-               printer_name = profile.getMachineSetting('machine_type')
-               if printer_name == 'lulzbot_mini':
-                       choices = self.mini_choices
-                       default = 0
+               image_size=(LulzbotMachineSelectPage.IMAGE_WIDTH, LulzbotMachineSelectPage.IMAGE_HEIGHT)
+               self.pei = self.AddImageButton(self.panel, 0, 0, _('PEI'),
+                                                                          'Lulzbot_TAZ_PEI_Bed.jpg', image_size,
+                                                                          style=ImageButton.IB_GROUP)
+               self.pet = self.AddImageButton(self.panel, 0, 1, _('PET'),
+                                                                          'Lulzbot_TAZ_PET_Bed.jpg', image_size)
+               self.pei.SetValue(True)
+
+       def StoreData(self):
+               if self.pei.GetValue():
+                       profile.putMachineSetting('machine_type', 'lulzbot_TAZ_5')
+                       profile.putMachineSetting('machine_name', 'LulzBot TAZ 5')
                else:
-                       choices = self.taz_choices
-                       if printer_name == 'lulzbot_TAZ_4':
-                               default = 0
-                       elif printer_name == 'lulzbot_TAZ_5':
-                               default = 1
+                       profile.putMachineSetting('machine_type', 'lulzbot_TAZ_4')
+                       profile.putMachineSetting('machine_name', 'LulzBot TAZ 4')
+
+
+class LulzbotTazToolheadSelectPage(InfoPage):
+       def __init__(self, parent):
+               super(LulzbotTazToolheadSelectPage, self).__init__(parent, _("LulzBot TAZ Tool Head Selection"))
+
+               self.panel = self.AddPanel()
+               image_size=(LulzbotMachineSelectPage.IMAGE_WIDTH, LulzbotMachineSelectPage.IMAGE_HEIGHT)
+               self.single = self.AddImageButton(self.panel, 0, 0, _('Single Extruder v1'),
+                                                                                       'Lulzbot_Toolhead_TAZ_Single_v1.jpg', image_size,
+                                                                                       style=ImageButton.IB_GROUP)
+               self.flexy = self.AddImageButton(self.panel, 0, 1, _('Flexystruder v1'),
+                                                                                       'Lulzbot_Toolhead_TAZ_Flexystruder_v1.jpg', image_size)
+               self.dually = self.AddImageButton(self.panel, 1, 0, _('Dual Extruder v1'),
+                                                                                       'Lulzbot_Toolhead_TAZ_Dual_Extruder_v1.jpg', image_size)
+               self.flexydually = self.AddImageButton(self.panel, 1, 1, _('FlexyDually v1'),
+                                                                                       'Lulzbot_Toolhead_TAZ_FlexyDually_v1.jpg', image_size)
+               self.SetVersion(1)
+               self.single.SetValue(True)
+
+       def SetVersion(self, version):
+               image_size=(LulzbotMachineSelectPage.IMAGE_WIDTH, LulzbotMachineSelectPage.IMAGE_HEIGHT)
+               self.single.SetBitmap(self.GetBitmap('Lulzbot_Toolhead_TAZ_Single_v%d.jpg' % version, image_size))
+               self.single.SetLabel(_('Single Extruder v%d' % version))
+               self.flexy.SetBitmap(self.GetBitmap('Lulzbot_Toolhead_TAZ_Flexystruder_v%d.jpg' % version, image_size))
+               self.flexy.SetLabel(_('Flexystruder v%d' % version))
+               self.dually.SetBitmap(self.GetBitmap('Lulzbot_Toolhead_TAZ_Dual_Extruder_v%d.jpg' % version, image_size))
+               self.dually.SetLabel(_('Dual Extruder v%d' % version))
+               self.flexydually.SetBitmap(self.GetBitmap('Lulzbot_Toolhead_TAZ_FlexyDually_v%d.jpg' % version, image_size))
+               self.flexydually.SetLabel(_('FlexyDually v%d' % version))
+               self.version = version
+               if version == 1:
+                       self.single.OnSelected(None)
+                       self.flexy.OnSelected(None)
+                       self.dually.OnSelected(None)
+                       self.flexydually.OnSelected(None)
+                       wx.wizard.WizardPageSimple.Chain(self, self.GetParent().lulzbotFirmwarePage)
+               elif version == 2:
+                       self.single.OnSelected(self.OnSingleV2)
+                       self.flexy.OnSelected(self.OnNonSingle)
+                       self.dually.OnSelected(self.OnNonSingle)
+                       self.flexydually.OnSelected(self.OnNonSingle)
+                       if self.single.GetValue():
+                               wx.wizard.WizardPageSimple.Chain(self, self.GetParent().lulzbotTaz5NozzleSelectPage)
+                               wx.wizard.WizardPageSimple.Chain(self.GetParent().lulzbotTaz5NozzleSelectPage, self.GetParent().lulzbotFirmwarePage)
                        else:
-                               default = 2
+                               wx.wizard.WizardPageSimple.Chain(self, self.GetParent().lulzbotFirmwarePage)
+               wx.wizard.WizardPageSimple.Chain(self.GetParent().lulzbotFirmwarePage, self.GetParent().lulzbotReadyPage)
 
-               self.combo.Clear()
-               self.combo.AppendItems(choices)
-               self.combo.SetValue(choices[default])
-               self.OnToolheadSelected(e)
+       def OnSingleV2(self):
+               wx.wizard.WizardPageSimple.Chain(self, self.GetParent().lulzbotTaz5NozzleSelectPage)
+               wx.wizard.WizardPageSimple.Chain(self.GetParent().lulzbotTaz5NozzleSelectPage, self.GetParent().lulzbotFirmwarePage)
 
-       def OnUrlClick(self, e):
-               webbrowser.open(LulzbotToolheadSelectPage.url)
+       def OnNonSingle(self):
+               wx.wizard.WizardPageSimple.Chain(self, self.GetParent().lulzbotFirmwarePage)
 
-       def OnToolheadSelected(self, e):
-               toolhead = self.combo.GetValue()
-               if self.description_map.has_key(toolhead):
-                       self.image.SetBitmap(wx.Bitmap(resources.getPathForImage(self.image_map[toolhead])))
-                       self.description.SetLabel(self.description_map[toolhead])
+       def StoreData(self):
+               if profile.getMachineSetting('machine_type').startswith('lulzbot_TAZ_4'):
+                       taz_version = 4
                else:
-                       self.image.SetBitmap(wx.NullBitmap)
-                       self.description.SetLabel('\n\n')
-               self.Layout()
-               self.Fit()
+                       taz_version = 5
+               version = (taz_version, self.version)
+               if self.single.GetValue():
+                       profile.putProfileSetting('nozzle_size', '0.5' if self.version == 2 else '0.35')
+                       profile.putMachineSetting('extruder_amount', '1')
+                       profile.putMachineSetting('toolhead', 'Single Extruder V%d' % self.version)
+                       profile.putMachineSetting('toolhead_shortname', '')
+                       profile.putMachineSetting('machine_type', 'lulzbot_TAZ_%d_SingleV%d' % version)
+               elif self.flexy.GetValue():
+                       profile.putProfileSetting('nozzle_size', '0.6')
+                       profile.putMachineSetting('extruder_amount', '1')
+                       profile.putMachineSetting('toolhead', 'Flexystruder V%d' % self.version)
+                       profile.putMachineSetting('toolhead_shortname', 'Flexystruder v%d' % self.version)
+                       profile.putMachineSetting('machine_type', 'lulzbot_TAZ_%d_FlexystruderV%d' % version)
+               elif self.dually.GetValue():
+                       profile.putProfileSetting('nozzle_size', '0.5')
+                       profile.putMachineSetting('extruder_amount', '2')
+                       profile.putMachineSetting('extruder_offset_x1', '0.0')
+                       profile.putMachineSetting('extruder_offset_y1', '-50.0' if self.version == 2 else '-52.00')
+                       profile.putMachineSetting('toolhead', 'Dual Extruder V%d' % self.version)
+                       profile.putMachineSetting('toolhead_shortname', 'Dual v%d' % self.version)
+                       profile.putMachineSetting('machine_type', 'lulzbot_TAZ_%d_DualV%d' % version)
+               elif self.flexydually.GetValue():
+                       profile.putProfileSetting('nozzle_size', '0.6')
+                       profile.putMachineSetting('extruder_amount', '2')
+                       profile.putMachineSetting('extruder_offset_x1', '0.0')
+                       profile.putMachineSetting('extruder_offset_y1', '-50.0' if self.version == 2 else '-52.00')
+                       profile.putMachineSetting('toolhead', 'FlexyDually V%d' % self.version)
+                       profile.putMachineSetting('toolhead_shortname', 'FlexyDually v%d' % self.version)
+                       profile.putMachineSetting('machine_type', 'lulzbot_TAZ_%d_FlexyDuallyV%d' % version)
+
 
+class LulzbotHotendSelectPage(InfoPage):
+       def __init__(self, parent, allowBack = True):
+               super(LulzbotHotendSelectPage, self).__init__(parent, _("LulzBot Tool Head Hot end Selection"))
 
-class Taz5NozzleSelectPage(InfoPage):
-       url='http://lulzbot.com/printer-identification'
+               self.allowBack = allowBack
+               self.panel = self.AddPanel()
+               image_size=(LulzbotMachineSelectPage.IMAGE_WIDTH, LulzbotMachineSelectPage.IMAGE_HEIGHT)
+               self.v1 = self.AddImageButton(self.panel, 0, 0, _('v1 (Budaschnozzle)'),
+                                                                                       'Lulzbot_Toolhead_v1.jpg', image_size,
+                                                                                       style=ImageButton.IB_GROUP)
+               self.v2 = self.AddImageButton(self.panel, 0, 1, _('v2 (LulzBot Hexagon)'),
+                                                                                       'Lulzbot_Toolhead_v2.jpg', image_size)
+               self.v1.SetValue(True)
+
+       def AllowBack(self):
+               return self.allowBack
+
+       def StoreData(self):
+               self.GetParent().lulzbotTazToolheadPage.SetVersion(1 if self.v1.GetValue() else 2)
+
+class LulzbotTaz5NozzleSelectPage(InfoPage):
+       url2='http://lulzbot.com/printer-identification'
 
        def __init__(self, parent):
-               super(Taz5NozzleSelectPage, self).__init__(parent, _("LulzBot TAZ5"))
-               self.AddBitmap(wx.Bitmap(resources.getPathForImage('Lulzbot_logo.png')))
+               super(LulzbotTaz5NozzleSelectPage, self).__init__(parent, _("LulzBot TAZ Single v2 Nozzle Selection"))
 
-               self.AddText(_(' '))
-               self.AddText(_('Please select nozzle size:'))
+               self.AddText(_('Please select your LulzBot Hexagon Hot End\'s nozzle diameter:'))
                self.Nozzle35Radio = self.AddRadioButton("0.35 mm", style=wx.RB_GROUP)
                self.Nozzle35Radio.SetValue(True)
                self.Nozzle50Radio = self.AddRadioButton("0.5 mm")
                self.AddText(_(' '))
                self.AddSeperator()
 
-               self.AddText(_('If you are not sure which nozzle size you have'))
+               self.AddText(_('If you are not sure which nozzle diameter you have,'))
                self.AddText(_('please check this webpage: '))
-               button = self.AddButton(Taz5NozzleSelectPage.url)
+               button = self.AddButton(LulzbotTaz5NozzleSelectPage.url2)
                button.Bind(wx.EVT_BUTTON, self.OnUrlClick)
 
        def OnUrlClick(self, e):
-               webbrowser.open(Taz5NozzleSelectPage.url)
+               webbrowser.open(LulzbotTaz5NozzleSelectPage.url2)
 
        def StoreData(self):
+               if profile.getMachineSetting('machine_type').startswith('lulzbot_TAZ_4'):
+                       taz_version = 4
+               else:
+                       taz_version = 5
                if self.Nozzle35Radio.GetValue():
                        profile.putProfileSetting('nozzle_size', '0.35')
-                       profile.putMachineSetting('machine_name', 'LulzBot TAZ 5 (0.35 nozzle)')
-                       profile.putMachineSetting('machine_type', 'lulzbot_TAZ_5')
+                       profile.putMachineSetting('toolhead', 'Single Extruder v2 (0.35mm nozzle)')
+                       profile.putMachineSetting('toolhead_shortname', '0.35 nozzle')
+                       profile.putMachineSetting('machine_type', 'lulzbot_TAZ_%d_035nozzle' % taz_version)
 
                else:
                        profile.putProfileSetting('nozzle_size', '0.5')
-                       profile.putMachineSetting('machine_name', 'LulzBot TAZ 5 (0.5 nozzle)')
-                       profile.putMachineSetting('machine_type', 'lulzbot_TAZ_5_05nozzle')
+                       profile.putMachineSetting('toolhead', 'Single Extruder v2 (0.5mm nozzle)')
+                       profile.putMachineSetting('toolhead_shortname', '0.5 nozzle')
+                       profile.putMachineSetting('machine_type', 'lulzbot_TAZ_%d_05nozzle' % taz_version)
+
+class LulzbotFirmwareUpdatePage(InfoPage):
+       def __init__(self, parent):
+               super(LulzbotFirmwareUpdatePage, self).__init__(parent, _("LulzBot Firmware Update"))
+
+               self.AddText(_("Your LulzBot printer\'s firmware will now be updated.\n" +
+               "Note: this will overwrite your existing firmware."))
+               self.AddSeperator()
+               self.AddText(_("Follow these steps to prevent writing firmware to the wrong device:\n" +
+                                          "    1) Unplug all USB devices from your computer\n" +
+                                          "    2) Plug your 3D Printer into the computer with a USB cable\n" +
+                                          "    3) Turn on your 3D Printer\n" +
+                                          "    4) Click \"Flash the firmware\""))
+               self.AddHiddenSeperator()
+               upgradeButton, skipUpgradeButton = self.AddDualButton(_('Flash the firmware'), _('Skip upgrade'))
+               upgradeButton.Bind(wx.EVT_BUTTON, self.OnUpgradeClick)
+               skipUpgradeButton.Bind(wx.EVT_BUTTON, self.OnSkipClick)
+
+       def AllowNext(self):
+               return version.isDevVersion()
+
+       def OnUpgradeClick(self, e):
+               if firmwareInstall.InstallFirmware():
+                       self.GetParent().FindWindowById(wx.ID_FORWARD).Enable()
+                       self.GetParent().ShowPage(self.GetNext())
+
+       def OnSkipClick(self, e):
+               dlg = wx.MessageDialog(self,
+                       _("CAUTION: Updating firmware is necessary when changing the\n" \
+                         "tool head on your LulzBot desktop 3D Printer." \
+                         "\n\n" +
+                         "Are you sure you want to skip the firmware update?"),
+                       _('Skip firmware update?'),
+                       wx.YES_NO | wx.ICON_EXCLAMATION)
+               skip = dlg.ShowModal() == wx.ID_YES
+               dlg.Destroy()
+               if skip:
+                       self.GetParent().FindWindowById(wx.ID_FORWARD).Enable()
+                       self.GetParent().ShowPage(self.GetNext())
+
+class LulzbotChangeToolheadWizard(wx.wizard.Wizard):
+       def __init__(self):
+               super(LulzbotChangeToolheadWizard, self).__init__(None, -1, _("Change LulzBot Tool Head Wizard"))
+
+               self._nozzle_size = profile.getProfileSettingFloat('nozzle_size')
+               self._machine_name = profile.getMachineSetting('machine_name')
+               self._machine_type = profile.getMachineSetting('machine_type')
+               self._extruder_amount = int(profile.getMachineSettingFloat('extruder_amount'))
+
+               self.Bind(wx.wizard.EVT_WIZARD_PAGE_CHANGED, self.OnPageChanged)
+               self.Bind(wx.wizard.EVT_WIZARD_PAGE_CHANGING, self.OnPageChanging)
+               self.Bind(wx.wizard.EVT_WIZARD_CANCEL, self.OnCancel)
+
+               self.lulzbotReadyPage = LulzbotReadyPage(self)
+               self.lulzbotFirmwarePage = LulzbotFirmwareUpdatePage(self)
+               self.lulzbotMiniToolheadPage = LulzbotMiniToolheadSelectPage(self, False)
+               self.lulzbotTazToolheadPage = LulzbotTazToolheadSelectPage(self)
+               self.lulzbotTazHotendPage = LulzbotHotendSelectPage(self, False)
+               self.lulzbotTaz5NozzleSelectPage = LulzbotTaz5NozzleSelectPage(self)
+               self.lulzbotTazBedSelectPage = LulzbotTazBedSelectPage(self)
+               self.lulzbotTazSelectPage = LulzbotTazSelectPage(self)
+               self.lulzbotTaz6SelectPage = LulzbotTaz6SelectPage(self)
+
+               wx.wizard.WizardPageSimple.Chain(self.lulzbotMiniToolheadPage, self.lulzbotReadyPage)
+               wx.wizard.WizardPageSimple.Chain(self.lulzbotTazHotendPage, self.lulzbotTazToolheadPage)
+
+               if profile.getMachineSetting('machine_type').startswith('lulzbot_mini'):
+                       self.RunWizard(self.lulzbotMiniToolheadPage)
+               else:
+                       self.RunWizard(self.lulzbotTazHotendPage)
+               self.Destroy()
+
+       def OnPageChanging(self, e):
+               e.GetPage().StoreData()
+
+       def OnPageChanged(self, e):
+               if e.GetPage().AllowNext():
+                       self.FindWindowById(wx.ID_FORWARD).Enable()
+               else:
+                       self.FindWindowById(wx.ID_FORWARD).Disable()
+               if e.GetPage().AllowBack():
+                       self.FindWindowById(wx.ID_BACKWARD).Enable()
+               else:
+                       self.FindWindowById(wx.ID_BACKWARD).Disable()
+               if hasattr(e.GetPage(), 'OnPageShown'):
+                       e.GetPage().OnPageShown()
+
+       def OnCancel(self, e):
+               profile.putProfileSetting('nozzle_size', self._nozzle_size)
+               profile.putMachineSetting('machine_name', self._machine_name)
+               profile.putMachineSetting('machine_type', self._machine_type)
+               profile.putMachineSetting('extruder_amount', self._extruder_amount)
 
 class ConfigWizard(wx.wizard.Wizard):
        def __init__(self, addNew = False):
@@ -1339,12 +1587,18 @@ class ConfigWizard(wx.wizard.Wizard):
 
                self.ultimaker2ReadyPage = Ultimaker2ReadyPage(self)
                self.lulzbotReadyPage = LulzbotReadyPage(self)
-               self.taz5NozzleSelectPage = Taz5NozzleSelectPage(self)
-               self.lulzbotToolheadPage = LulzbotToolheadSelectPage(self)
+               self.lulzbotFirmwarePage = LulzbotFirmwareUpdatePage(self)
+               self.lulzbotMiniToolheadPage = LulzbotMiniToolheadSelectPage(self)
+               self.lulzbotTazToolheadPage = LulzbotTazToolheadSelectPage(self)
+               self.lulzbotTazHotendPage = LulzbotHotendSelectPage(self)
+               self.lulzbotTaz5NozzleSelectPage = LulzbotTaz5NozzleSelectPage(self)
                self.lulzbotMachineSelectPage = LulzbotMachineSelectPage(self)
+               self.lulzbotTazBedSelectPage = LulzbotTazBedSelectPage(self)
+               self.lulzbotTazSelectPage = LulzbotTazSelectPage(self)
 
-               wx.wizard.WizardPageSimple.Chain(self.lulzbotMachineSelectPage, self.lulzbotToolheadPage)
-               wx.wizard.WizardPageSimple.Chain(self.lulzbotToolheadPage, self.lulzbotReadyPage)
+               wx.wizard.WizardPageSimple.Chain(self.lulzbotMachineSelectPage, self.lulzbotMiniToolheadPage)
+               wx.wizard.WizardPageSimple.Chain(self.lulzbotMiniToolheadPage, self.lulzbotReadyPage)
+               wx.wizard.WizardPageSimple.Chain(self.lulzbotTazHotendPage, self.lulzbotTazToolheadPage)
                wx.wizard.WizardPageSimple.Chain(self.machineSelectPage, self.ultimakerSelectParts)
                wx.wizard.WizardPageSimple.Chain(self.ultimakerSelectParts, self.ultimakerFirmwareUpgradePage)
                wx.wizard.WizardPageSimple.Chain(self.ultimakerFirmwareUpgradePage, self.ultimakerCheckupPage)
@@ -1367,6 +1621,8 @@ class ConfigWizard(wx.wizard.Wizard):
                        self.FindWindowById(wx.ID_BACKWARD).Enable()
                else:
                        self.FindWindowById(wx.ID_BACKWARD).Disable()
+               if hasattr(e.GetPage(), 'OnPageShown'):
+                       e.GetPage().OnPageShown()
 
        def OnCancel(self, e):
                new_machine_index = int(profile.getPreferenceFloat('active_machine'))