diff --git a/Cura/avr_isp/intelHex.py b/Cura/avr_isp/intelHex.py
index 95c77a4..2023873 100644
--- a/Cura/avr_isp/intelHex.py
+++ b/Cura/avr_isp/intelHex.py
@@ -30,6 +30,6 @@ def readHex(filename):
elif recType == 2: #Extended Segment Address Record
extraAddr = int(line[9:13], 16) * 16
else:
- print recType, recLen, addr, checkSum, line
+ print(recType, recLen, addr, checkSum, line)
f.close()
return data
\ No newline at end of file
diff --git a/Cura/avr_isp/ispBase.py b/Cura/avr_isp/ispBase.py
index 2e61334..5330d53 100644
--- a/Cura/avr_isp/ispBase.py
+++ b/Cura/avr_isp/ispBase.py
@@ -12,9 +12,9 @@ class IspBase():
raise IspError("Chip with signature: " + str(self.getSignature()) + "not found")
self.chipErase()
- print "Flashing %i bytes" % len(flashData)
+ print("Flashing %i bytes" % len(flashData))
self.writeFlash(flashData)
- print "Verifying %i bytes" % len(flashData)
+ print("Verifying %i bytes" % len(flashData))
self.verifyFlash(flashData)
#low level ISP commands
diff --git a/Cura/avr_isp/stk500v2.py b/Cura/avr_isp/stk500v2.py
index 58991b5..3945fb9 100644
--- a/Cura/avr_isp/stk500v2.py
+++ b/Cura/avr_isp/stk500v2.py
@@ -101,7 +101,7 @@ class Stk500v2(ispBase.IspBase):
raise ispBase.IspError("Timeout")
b = struct.unpack(">B", s)[0]
checksum ^= b
- #print hex(b)
+ #print(hex(b))
if state == 'Start':
if b == 0x1B:
state = 'GetSeq'
diff --git a/Cura/cura_sf/fabmetheus_utilities/archive.py b/Cura/cura_sf/fabmetheus_utilities/archive.py
index c9e5655..767dfd0 100644
--- a/Cura/cura_sf/fabmetheus_utilities/archive.py
+++ b/Cura/cura_sf/fabmetheus_utilities/archive.py
@@ -115,7 +115,7 @@ def getFilePathsByDirectory(directoryName):
if os.path.dirname(name) == subpath:
filePaths.append(os.path.join(zipfilename, name))
z.close()
- print directoryName, filePaths
+ print(directoryName, filePaths)
return filePaths
def getFilePathsRecursively(fileInDirectory=''):
diff --git a/Cura/cura_sf/fabmetheus_utilities/euclidean.py b/Cura/cura_sf/fabmetheus_utilities/euclidean.py
index f9c3148..898666c 100644
--- a/Cura/cura_sf/fabmetheus_utilities/euclidean.py
+++ b/Cura/cura_sf/fabmetheus_utilities/euclidean.py
@@ -32,10 +32,15 @@ import __init__
from fabmetheus_utilities.vector3 import Vector3
from fabmetheus_utilities import xml_simple_writer
-import cStringIO
+
+import sys
import math
import random
+if sys.version_info.major < 3:
+ import cStringIO
+else:
+ import io as cStringIO
__author__ = 'Enrique Perez (perez_enrique@yahoo.com)'
__date__ = '$Date: 2008/21/04 $'
diff --git a/Cura/cura_sf/fabmetheus_utilities/gcodec.py b/Cura/cura_sf/fabmetheus_utilities/gcodec.py
index b348674..1a6ac77 100644
--- a/Cura/cura_sf/fabmetheus_utilities/gcodec.py
+++ b/Cura/cura_sf/fabmetheus_utilities/gcodec.py
@@ -23,12 +23,16 @@ import __init__
from fabmetheus_utilities.vector3 import Vector3
from fabmetheus_utilities import archive
from fabmetheus_utilities import euclidean
-import cStringIO
+
import math
import os
import sys
import traceback
+if sys.version_info.major < 3:
+ import cStringIO
+else:
+ import io as cStringIO
__author__ = 'Enrique Perez (perez_enrique@yahoo.com)'
__date__ = '$Date: 2008/21/04 $'
diff --git a/Cura/cura_sf/fabmetheus_utilities/settings.py b/Cura/cura_sf/fabmetheus_utilities/settings.py
index 92d3262..997f039 100644
--- a/Cura/cura_sf/fabmetheus_utilities/settings.py
+++ b/Cura/cura_sf/fabmetheus_utilities/settings.py
@@ -25,6 +25,8 @@ def storedSettingInt(name):
return lambda setting: int(profile.getProfileSettingFloat(name))
def storedPreference(name):
return lambda setting: profile.getPreference(name)
+def storedSettingInvertBoolean(name):
+ return lambda setting: profile.getProfileSetting(name) == "False"
def ifSettingAboveZero(name):
return lambda setting: profile.getProfileSettingFloat(name) > 0
@@ -376,10 +378,9 @@ def getProfileInformation():
'Filament_Packing_Density_ratio': storedSettingFloat("filament_density"),
'Maximum_E_Value_before_Reset_float': DEFSET,
'Minimum_Travel_for_Retraction_millimeters': storedSettingFloat("retraction_min_travel"),
- 'Retract_Within_Island': DEFSET,
+ 'Retract_Within_Island': storedSettingInvertBoolean("retract_on_jumps_only"),
'Retraction_Distance_millimeters': storedSettingFloat('retraction_amount'),
'Restart_Extra_Distance_millimeters': storedSettingFloat('retraction_extra'),
- 'Only_Retract_On_Jumps': storedSetting("retract_on_jumps_only"),
},'alteration': {
'Activate_Alteration': storedSetting('add_start_end_gcode'),
'Name_of_End_File': "end.gcode",
@@ -414,7 +415,7 @@ def getReadRepository(repository):
info = getProfileInformation()
if not info.has_key(repository.name):
- print "Warning: Plugin: " + repository.name + " missing from Cura info"
+ print("Warning: Plugin: " + repository.name + " missing from Cura info")
return repository
info = info[repository.name]
@@ -422,7 +423,7 @@ def getReadRepository(repository):
for p in repository.preferences:
name = safeConfigName(p.name)
if not info.has_key(name):
- print "Setting: " + repository.name + ":" + name + " missing from Cura info"
+ print("Setting: " + repository.name + ":" + name + " missing from Cura info")
continue
if isinstance(info[name], types.FunctionType):
p.setValueToString(str(info[name](p)))
@@ -432,11 +433,11 @@ def getReadRepository(repository):
return repository
def printProgress(layerIndex, procedureName):
- print ("Progress[" + procedureName + ":" + str(layerIndex+1) + "]")
+ print("Progress[" + procedureName + ":" + str(layerIndex+1) + "]")
sys.stdout.flush()
def printProgressByNumber(layerIndex, numberOfLayers, procedureName):
- print ("Progress[" + procedureName + ":" + str(layerIndex+1) + ":" + str(numberOfLayers) + "]")
+ print("Progress[" + procedureName + ":" + str(layerIndex+1) + ":" + str(numberOfLayers) + "]")
sys.stdout.flush()
def getAlterationFileLines(fileName):
diff --git a/Cura/cura_sf/fabmetheus_utilities/svg_writer.py b/Cura/cura_sf/fabmetheus_utilities/svg_writer.py
index 15855d2..a744a0b 100644
--- a/Cura/cura_sf/fabmetheus_utilities/svg_writer.py
+++ b/Cura/cura_sf/fabmetheus_utilities/svg_writer.py
@@ -198,7 +198,7 @@ class SVGWriter:
self.setMetadataNoscriptElement('minZ', 'Z: ', self.cornerMinimum.z)
self.textHeight = float( self.sliceDictionary['textHeight'] )
controlTop = len(loopLayers) * (self.margin + self.extent.y * self.unitScale + self.textHeight) + self.marginTop + self.textHeight
- self.svgElement.getFirstChildByLocalName('title').setTextContent(os.path.basename(fileName) + ' - Slice Layers')
+ self.svgElement.getFirstChildByLocalName('title').setTextContent(os.path.basename(fileName).encode("utf-8") + ' - Slice Layers')
svgElementDictionary['height'] = '%spx' % self.getRounded(max(controlTop, self.controlBoxHeightMargin))
width = max(self.extent.x * self.unitScale, svgMinWidth)
svgElementDictionary['width'] = '%spx' % self.getRounded( width )
diff --git a/Cura/cura_sf/fabmetheus_utilities/xml_simple_writer.py b/Cura/cura_sf/fabmetheus_utilities/xml_simple_writer.py
index 99e5ca6..460ffca 100644
--- a/Cura/cura_sf/fabmetheus_utilities/xml_simple_writer.py
+++ b/Cura/cura_sf/fabmetheus_utilities/xml_simple_writer.py
@@ -8,7 +8,12 @@ from __future__ import absolute_import
#Init has to be imported first because it has code to workaround the python bug where relative imports don't work if the module is imported as a main module.
import __init__
-import cStringIO
+import sys
+
+if sys.version_info.major < 3:
+ import cStringIO
+else:
+ import io as cStringIO
__author__ = 'Enrique Perez (perez_enrique@yahoo.com)'
diff --git a/Cura/cura_sf/skeinforge_application/skeinforge_plugins/craft_plugins/dimension.py b/Cura/cura_sf/skeinforge_application/skeinforge_plugins/craft_plugins/dimension.py
index 684f8e9..bc08ce8 100644
--- a/Cura/cura_sf/skeinforge_application/skeinforge_plugins/craft_plugins/dimension.py
+++ b/Cura/cura_sf/skeinforge_application/skeinforge_plugins/craft_plugins/dimension.py
@@ -165,7 +165,6 @@ class DimensionRepository:
self.retractionDistance = settings.FloatSpin().getFromValue( 0.0, 'Retraction Distance (millimeters):', self, 100.0, 0.0 )
self.restartExtraDistance = settings.FloatSpin().getFromValue( 0.0, 'Restart Extra Distance (millimeters):', self, 100.0, 0.0 )
self.executeTitle = 'Dimension'
- self.onlyRetractOnJumps = settings.BooleanSetting().getFromValue('Only Retract On Jumps', self, True )
def execute(self):
'Dimension button has been clicked.'
@@ -194,7 +193,6 @@ class DimensionSkein:
self.zDistanceRatio = 5.0
self.addRetraction = True
self.reverseRetraction = False
- self.onlyRetractOnJumps = True
def addLinearMoveExtrusionDistanceLine(self, extrusionDistance):
'Get the extrusion distance string from the extrusion distance.'
@@ -206,7 +204,6 @@ class DimensionSkein:
def getCraftedGcode(self, gcodeText, repository):
'Parse gcode text and store the dimension gcode.'
self.repository = repository
- self.onlyRetractOnJumps = repository.onlyRetractOnJumps.value
filamentRadius = 0.5 * repository.filamentDiameter.value
filamentPackingArea = math.pi * filamentRadius * filamentRadius * repository.filamentPackingDensity.value
self.minimumTravelForRetraction = self.repository.minimumTravelForRetraction.value
@@ -264,7 +261,7 @@ class DimensionSkein:
if isActive:
if not self.repository.retractWithinIsland.value:
locationEnclosureIndex = self.getSmallestEnclosureIndex(location.dropAxis())
- if locationEnclosureIndex != self.getSmallestEnclosureIndex(self.oldLocation.dropAxis()):
+ if locationEnclosureIndex == self.getSmallestEnclosureIndex(self.oldLocation.dropAxis()):
return None
locationMinusOld = location - self.oldLocation
xyTravel = abs(locationMinusOld.dropAxis())
@@ -306,7 +303,7 @@ class DimensionSkein:
'Get the retraction ratio.'
distanceToNextThread = self.getDistanceToNextThread(lineIndex)
if distanceToNextThread == None:
- return 1.0
+ return 0.0
if distanceToNextThread >= self.doubleMinimumTravelForRetraction:
return 1.0
if distanceToNextThread <= self.minimumTravelForRetraction:
@@ -384,15 +381,6 @@ class DimensionSkein:
self.absoluteDistanceMode = True
elif firstWord == 'G91':
self.absoluteDistanceMode = False
- elif firstWord == '()':
- if self.onlyRetractOnJumps:
- self.addRetraction = False
- elif firstWord == '()':
- if self.onlyRetractOnJumps:
- self.addRetraction = True
- self.retractionRatio = self.getRetractionRatio(lineIndex)
- self.addLinearMoveExtrusionDistanceLine(-self.repository.retractionDistance.value * self.retractionRatio)
- self.reverseRetraction = True
elif firstWord == '(':
self.layerIndex += 1
settings.printProgress(self.layerIndex, 'dimension')
@@ -401,9 +389,8 @@ class DimensionSkein:
self.distanceFeedRate.addLine('G92 E0')
self.totalExtrusionDistance = 0.0
elif firstWord == 'M101':
- if self.reverseRetraction:
+ if self.retractionRatio > 0.0:
self.addLinearMoveExtrusionDistanceLine(self.restartDistance * self.retractionRatio)
- self.reverseRetraction = False
if self.totalExtrusionDistance > self.repository.maximumEValueBeforeReset.value:
if not self.repository.relativeExtrusionDistance.value:
self.distanceFeedRate.addLine('G92 E0')
@@ -411,9 +398,8 @@ class DimensionSkein:
self.isExtruderActive = True
elif firstWord == 'M103':
self.retractionRatio = self.getRetractionRatio(lineIndex)
- if self.addRetraction:
+ if self.retractionRatio > 0.0:
self.addLinearMoveExtrusionDistanceLine(-self.repository.retractionDistance.value * self.retractionRatio)
- self.reverseRetraction = True
self.isExtruderActive = False
elif firstWord == 'M108':
self.flowRate = float( splitLine[1][1 :] )
diff --git a/Cura/gui/expertConfig.py b/Cura/gui/expertConfig.py
index 9ab2f1c..3e409ee 100644
--- a/Cura/gui/expertConfig.py
+++ b/Cura/gui/expertConfig.py
@@ -68,7 +68,9 @@ class expertConfigWindow(configBase.configWindowBase):
configBase.TitleRow(right, "Dwindle")
c = configBase.SettingRow(right, "Enable dwindle", 'enable_dwindle', False, 'Dwindle is used to slow down near the end of a printed line, and reducing the amount of filament printed near the end. This to release the preasure on the printer head.')
c = configBase.SettingRow(right, "Pent up volume (mm3)", 'dwindle_pent_up_volume', '0.4', 'Amount of plastic inside the nozzle under pressure. This normally comes out as ooze after printing.')
+ validators.validFloat(c, 0.0001)
c = configBase.SettingRow(right, "Slow down volume (mm3)", 'dwindle_slowdown_volume', '5.0', 'Amount of printing volume that is used to slow down to release the pressure.')
+ validators.validFloat(c, 0.0001)
main.Fit()
self.Fit()
diff --git a/Cura/gui/preview3d.py b/Cura/gui/preview3d.py
index 49659d8..6eb6334 100644
--- a/Cura/gui/preview3d.py
+++ b/Cura/gui/preview3d.py
@@ -234,6 +234,7 @@ class previewPanel(wx.Panel):
obj.dirty = False
obj.mesh = mesh
self.updateModelTransform()
+ self.errorList = []
wx.CallAfter(self.updateToolbar)
wx.CallAfter(self.glCanvas.Refresh)
@@ -243,7 +244,6 @@ class previewPanel(wx.Panel):
gcode.progressCallback = self.loadProgress
gcode.load(self.gcodeFilename)
self.gcodeDirty = False
- self.errorList = []
self.gcode = gcode
self.gcodeDirty = True
wx.CallAfter(self.updateToolbar)
@@ -455,6 +455,7 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, [0.8, 0.8, 0.8, 1.0]);
glColor3f(1.0,1.0,1.0)
+ glPushMatrix()
glTranslate(self.parent.machineCenter.x, self.parent.machineCenter.y, 0)
for obj in self.parent.objectList:
if obj.mesh == None:
@@ -529,7 +530,8 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
glLightfv(GL_LIGHT0, GL_AMBIENT, map(lambda x: x / 5, self.objColor[self.parent.objectList.index(obj)]))
glEnable(GL_LIGHTING)
self.drawModel(obj)
-
+
+ glPopMatrix()
if self.viewMode == "Normal" or self.viewMode == "Transparent" or self.viewMode == "X-Ray":
glDisable(GL_LIGHTING)
glDisable(GL_DEPTH_TEST)
diff --git a/Cura/gui/projectPlanner.py b/Cura/gui/projectPlanner.py
index 8096129..c7fecfd 100644
--- a/Cura/gui/projectPlanner.py
+++ b/Cura/gui/projectPlanner.py
@@ -25,6 +25,7 @@ from gui import printWindow
from util import profile
from util import util3d
from util import stl
+from util import mesh
from util import sliceRun
from util import gcodeInterpreter
from util import exporer
@@ -137,6 +138,7 @@ class projectPlanner(wx.Frame):
self.list = []
self.selection = None
+ self.printMode = 0
self.machineSize = util3d.Vector3(profile.getPreferenceFloat('machine_width'), profile.getPreferenceFloat('machine_depth'), profile.getPreferenceFloat('machine_height'))
self.headSizeMin = util3d.Vector3(profile.getPreferenceFloat('extruder_head_size_min_x'), profile.getPreferenceFloat('extruder_head_size_min_y'),0)
@@ -160,6 +162,11 @@ class projectPlanner(wx.Frame):
toolbarUtil.NormalButton(self.toolbar, self.OnPreferences, 'preferences.png', 'Project planner preferences')
self.toolbar.AddSeparator()
toolbarUtil.NormalButton(self.toolbar, self.OnCutMesh, 'cut-mesh.png', 'Cut a plate STL into multiple STL files, and add those files to the project.\nNote: Splitting up plates sometimes takes a few minutes.')
+ toolbarUtil.NormalButton(self.toolbar, self.OnSaveCombinedSTL, 'save-combination.png', 'Save all the combined STL files into a single STL file as a plate.')
+ self.toolbar.AddSeparator()
+ group = []
+ self.printOneAtATime = toolbarUtil.RadioButton(self.toolbar, group, 'view-normal-on.png', 'view-normal-off.png', 'Print one object at a time', callback=self.OnPrintTypeChange)
+ self.printAllAtOnce = toolbarUtil.RadioButton(self.toolbar, group, 'all-at-once-on.png', 'all-at-once-off.png', 'Print all the objects at once', callback=self.OnPrintTypeChange)
self.toolbar.AddSeparator()
toolbarUtil.NormalButton(self.toolbar, self.OnQuit, 'exit.png', 'Close project planner')
@@ -271,6 +278,27 @@ class projectPlanner(wx.Frame):
self.preview.Refresh()
dlg.Destroy()
+ def OnPrintTypeChange(self):
+ self.printMode = 0
+ if self.printAllAtOnce.GetValue():
+ self.printMode = 1
+ self.preview.Refresh()
+
+ def OnSaveCombinedSTL(self, e):
+ dlg=wx.FileDialog(self, "Save as STL", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_SAVE)
+ dlg.SetWildcard("STL files (*.stl)|*.stl;*.STL")
+ if dlg.ShowModal() == wx.ID_OK:
+ self._saveCombinedSTL(dlg.GetPath())
+ dlg.Destroy()
+
+ def _saveCombinedSTL(filename):
+ output = mesh.mesh()
+ for item in self.list:
+ offset = util3d.Vector3(item.centerX, item.centerY, 0)
+ for f in item.faces:
+ output.addFace(f.v[0] * item.scale + offset, f.v[1] * item.scale + offset, f.v[2] * item.scale + offset)
+ stl.saveAsSTL(output, filename)
+
def OnSaveProject(self, e):
dlg=wx.FileDialog(self, "Save project file", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_SAVE)
dlg.SetWildcard("Project files (*.curaproject)|*.curaproject")
@@ -471,6 +499,10 @@ class projectPlanner(wx.Frame):
if profile.getProfileSetting('support') != 'None':
extraSizeMin = extraSizeMin + util3d.Vector3(3.0, 0, 0)
extraSizeMax = extraSizeMax + util3d.Vector3(3.0, 0, 0)
+
+ if self.printMode == 1:
+ extraSizeMin = util3d.Vector3(6.0, 6.0, 0)
+ extraSizeMax = util3d.Vector3(6.0, 6.0, 0)
if extraSizeMin.x > extraSizeMax.x:
posX = self.machineSize.x
@@ -515,52 +547,6 @@ class projectPlanner(wx.Frame):
return (maxX - minX) + (maxY - minY)
def OnSlice(self, e):
- put = profile.setTempOverride
- oldProfile = profile.getGlobalProfileString()
-
- put('model_multiply_x', '1')
- put('model_multiply_y', '1')
- put('enable_raft', 'False')
- put('add_start_end_gcode', 'False')
- put('gcode_extension', 'project_tmp')
-
- clearZ = 0
- actionList = []
- for item in self.list:
- if item.profile != None and os.path.isfile(item.profile):
- profile.loadGlobalProfile(item.profile)
- put('machine_center_x', item.centerX - self.extruderOffset[item.extruder].x)
- put('machine_center_y', item.centerY - self.extruderOffset[item.extruder].y)
- put('model_scale', item.scale)
- put('flip_x', item.flipX)
- put('flip_y', item.flipY)
- put('flip_z', item.flipZ)
- put('model_rotate_base', item.rotate)
- put('swap_xz', item.swapXZ)
- put('swap_yz', item.swapYZ)
-
- action = Action()
- action.sliceCmd = sliceRun.getSliceCommand(item.filename)
- action.centerX = item.centerX
- action.centerY = item.centerY
- action.extruder = item.extruder
- action.filename = item.filename
- clearZ = max(clearZ, item.getMaximum().z * item.scale + 5.0)
- action.clearZ = clearZ
- action.leaveResultForNextSlice = False
- action.usePreviousSlice = False
- actionList.append(action)
-
- if self.list.index(item) > 0 and item.isSameExceptForPosition(self.list[self.list.index(item)-1]):
- actionList[-2].leaveResultForNextSlice = True
- actionList[-1].usePreviousSlice = True
-
- if item.profile != None:
- profile.loadGlobalProfileFromString(oldProfile)
-
- #Restore the old profile.
- profile.resetTempOverride()
-
dlg=wx.FileDialog(self, "Save project gcode file", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_SAVE)
dlg.SetWildcard("GCode file (*.gcode)|*.gcode")
if dlg.ShowModal() != wx.ID_OK:
@@ -568,6 +554,73 @@ class projectPlanner(wx.Frame):
return
resultFilename = dlg.GetPath()
dlg.Destroy()
+
+ put = profile.setTempOverride
+ oldProfile = profile.getGlobalProfileString()
+
+ put('add_start_end_gcode', 'False')
+ put('gcode_extension', 'project_tmp')
+ if self.printMode == 0:
+ put('enable_raft', 'False')
+
+ clearZ = 0
+ actionList = []
+ for item in self.list:
+ if item.profile != None and os.path.isfile(item.profile):
+ profile.loadGlobalProfile(item.profile)
+ put('machine_center_x', item.centerX - self.extruderOffset[item.extruder].x)
+ put('machine_center_y', item.centerY - self.extruderOffset[item.extruder].y)
+ put('model_scale', item.scale)
+ put('flip_x', item.flipX)
+ put('flip_y', item.flipY)
+ put('flip_z', item.flipZ)
+ put('model_rotate_base', item.rotate)
+ put('swap_xz', item.swapXZ)
+ put('swap_yz', item.swapYZ)
+
+ action = Action()
+ action.sliceCmd = sliceRun.getSliceCommand(item.filename)
+ action.centerX = item.centerX
+ action.centerY = item.centerY
+ action.extruder = item.extruder
+ action.filename = item.filename
+ clearZ = max(clearZ, item.getMaximum().z * item.scale + 5.0)
+ action.clearZ = clearZ
+ action.leaveResultForNextSlice = False
+ action.usePreviousSlice = False
+ actionList.append(action)
+
+ if self.list.index(item) > 0 and item.isSameExceptForPosition(self.list[self.list.index(item)-1]):
+ actionList[-2].leaveResultForNextSlice = True
+ actionList[-1].usePreviousSlice = True
+
+ if item.profile != None:
+ profile.loadGlobalProfileFromString(oldProfile)
+
+ else:
+ self._saveCombinedSTL(resultFilename + "_temp_.stl")
+ put('model_scale', 1.0)
+ put('flip_x', False)
+ put('flip_y', False)
+ put('flip_z', False)
+ put('model_rotate_base', 0)
+ put('swap_xz', False)
+ put('swap_yz', False)
+ actionList = []
+
+ action = Action()
+ action.sliceCmd = sliceRun.getSliceCommand(resultFilename + "_temp_.stl")
+ action.centerX = profile.getProfileSettingFloat('machine_center_x')
+ action.centerY = profile.getProfileSettingFloat('machine_center_y')
+ action.extruder = 0
+ action.filename = resultFilename + "_temp_.stl"
+ action.clearZ = 0
+ action.leaveResultForNextSlice = False
+ action.usePreviousSlice = False
+ actionList.append(action)
+
+ #Restore the old profile.
+ profile.resetTempOverride()
pspw = ProjectSliceProgressWindow(actionList, resultFilename)
pspw.extruderOffset = self.extruderOffset
@@ -702,6 +755,13 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
skirtSize = profile.getProfileSettingFloat('skirt_line_count') * profile.calculateEdgeWidth() + profile.getProfileSettingFloat('skirt_gap')
extraSizeMin = extraSizeMin + util3d.Vector3(skirtSize, skirtSize, 0)
extraSizeMax = extraSizeMax + util3d.Vector3(skirtSize, skirtSize, 0)
+ if profile.getProfileSetting('support') != 'None':
+ extraSizeMin = extraSizeMin + util3d.Vector3(3.0, 0, 0)
+ extraSizeMax = extraSizeMax + util3d.Vector3(3.0, 0, 0)
+
+ if self.parent.printMode == 1:
+ extraSizeMin = util3d.Vector3(6.0, 6.0, 0)
+ extraSizeMax = util3d.Vector3(6.0, 6.0, 0)
for item in self.parent.list:
item.validPlacement = True
diff --git a/Cura/gui/simpleMode.py b/Cura/gui/simpleMode.py
index f3730dd..8fee979 100644
--- a/Cura/gui/simpleMode.py
+++ b/Cura/gui/simpleMode.py
@@ -192,7 +192,7 @@ class simpleModeWindow(configBase.configWindowBase):
put('bottom_layer_speed', '25')
put('cool_min_layer_time', '10')
put('fan_enabled', 'True')
- put('fan_layer', '0')
+ put('fan_layer', '1')
put('fan_speed', '100')
#put('model_scale', '1.0')
#put('flip_x', 'False')
diff --git a/Cura/gui/sliceProgessPanel.py b/Cura/gui/sliceProgessPanel.py
index 344ea64..8a6a518 100644
--- a/Cura/gui/sliceProgessPanel.py
+++ b/Cura/gui/sliceProgessPanel.py
@@ -40,7 +40,7 @@ class sliceProgessPanel(wx.Panel):
cmdList = []
for filename in self.filelist:
idx = self.filelist.index(filename)
- print filename, idx
+ #print filename, idx
if idx > 0:
profile.setTempOverride('fan_enabled', 'False')
profile.setTempOverride('skirt_line_count', '0')
diff --git a/Cura/images/save-combination.png b/Cura/images/save-combination.png
new file mode 100644
index 0000000..a633824
Binary files /dev/null and b/Cura/images/save-combination.png differ
diff --git a/Cura/util/profile.py b/Cura/util/profile.py
index fdc7135..6c06afb 100644
--- a/Cura/util/profile.py
+++ b/Cura/util/profile.py
@@ -3,7 +3,11 @@ from __future__ import division
#Init has to be imported first because it has code to workaround the python bug where relative imports don't work if the module is imported as a main module.
import __init__
-import ConfigParser, os, traceback, math, re, zlib, base64, time, sys
+import os, traceback, math, re, zlib, base64, time, sys
+if sys.version_info.major < 3:
+ import ConfigParser
+else:
+ import configparser as ConfigParser
#########################################################
## Default settings when none are found.
@@ -247,13 +251,13 @@ def getProfileSetting(name):
if name in profileDefaultSettings:
default = profileDefaultSettings[name]
else:
- print "Missing default setting for: '" + name + "'"
+ print("Missing default setting for: '" + name + "'")
profileDefaultSettings[name] = ''
default = ''
if not globalProfileParser.has_section('profile'):
globalProfileParser.add_section('profile')
globalProfileParser.set('profile', name, str(default))
- #print name + " not found in profile, so using default: " + str(default)
+ #print(name + " not found in profile, so using default: " + str(default))
return default
return globalProfileParser.get('profile', name)
@@ -304,13 +308,13 @@ def getPreference(name):
if name in preferencesDefaultSettings:
default = preferencesDefaultSettings[name]
else:
- print "Missing default setting for: '" + name + "'"
+ print("Missing default setting for: '" + name + "'")
preferencesDefaultSettings[name] = ''
default = ''
if not globalPreferenceParser.has_section('preference'):
globalPreferenceParser.add_section('preference')
globalPreferenceParser.set('preference', name, str(default))
- #print name + " not found in preferences, so using default: " + str(default)
+ #print(name + " not found in preferences, so using default: " + str(default))
return default
return unicode(globalPreferenceParser.get('preference', name), "utf-8")
@@ -406,12 +410,12 @@ def getAlterationFile(filename):
if filename in alterationDefault:
default = alterationDefault[filename]
else:
- print "Missing default alteration for: '" + filename + "'"
+ print("Missing default alteration for: '" + filename + "'")
alterationDefault[filename] = ''
default = ''
if not globalProfileParser.has_section('alterations'):
globalProfileParser.add_section('alterations')
- #print "Using default for: %s" % (filename)
+ #print("Using default for: %s" % (filename))
globalProfileParser.set('alterations', filename, default)
return unicode(globalProfileParser.get('alterations', filename), "utf-8")
diff --git a/Cura/util/sliceRun.py b/Cura/util/sliceRun.py
index 483dbc5..44b0a99 100644
--- a/Cura/util/sliceRun.py
+++ b/Cura/util/sliceRun.py
@@ -30,7 +30,7 @@ sliceStepTimeFactor = {
}
totalRunTimeFactor = 0
-for v in sliceStepTimeFactor.itervalues():
+for v in sliceStepTimeFactor.values():
totalRunTimeFactor += v
def getPyPyExe():
@@ -75,22 +75,24 @@ def runSlice(fileNames):
"Run the slicer on the files. If we are running with PyPy then just do the slicing action. If we are running as Python, try to find pypy."
pypyExe = getPyPyExe()
for fileName in fileNames:
+ if fileName.startswith("#UTF8#"):
+ fileName = unicode(fileName[6:], "utf-8")
if platform.python_implementation() == "PyPy":
skeinforge_craft.writeOutput(fileName)
elif pypyExe == False:
if not hasattr(sys, 'frozen'):
- print "************************************************"
- print "* Failed to find pypy, so slicing with python! *"
- print "************************************************"
+ print("************************************************")
+ print("* Failed to find pypy, so slicing with python! *")
+ print("************************************************")
skeinforge_craft.writeOutput(fileName)
- print "************************************************"
- print "* Failed to find pypy, so sliced with python! *"
- print "************************************************"
+ print("************************************************")
+ print("* Failed to find pypy, so sliced with python! *")
+ print("************************************************")
else:
- print "******************************************************************"
- print "* Failed to find pypy, we need pypy to slice with a frozen build *"
- print "* Place pypy in the same directory as Cura so Cura can find it. *"
- print "******************************************************************"
+ print("******************************************************************")
+ print("* Failed to find pypy, we need pypy to slice with a frozen build *")
+ print("* Place pypy in the same directory as Cura so Cura can find it. *")
+ print("******************************************************************")
sys.exit(1)
else:
subprocess.call(getSliceCommand(fileName))
@@ -161,6 +163,12 @@ def getSliceCommand(filename):
else:
mainScriptFile = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", os.path.split(sys.argv[0])[1]))
cmd = [pypyExe, mainScriptFile, '-p', profile.getGlobalProfileString()]
- cmd.append(filename)
+ if platform.system() == "Windows":
+ try:
+ cmd.append(str(filename))
+ except UnicodeEncodeError:
+ cmd.append("#UTF8#" + filename.encode("utf-8"))
+ else:
+ cmd.append(filename)
return cmd
diff --git a/Cura/util/stl.py b/Cura/util/stl.py
index 8b87a41..9642ff2 100644
--- a/Cura/util/stl.py
+++ b/Cura/util/stl.py
@@ -70,7 +70,7 @@ def saveAsSTL(mesh, filename):
if __name__ == '__main__':
for filename in sys.argv[1:]:
m = stlModel().load(filename)
- print "Loaded %d faces" % (len(m.faces))
+ print("Loaded %d faces" % (len(m.faces)))
parts = m.splitToParts()
for p in parts:
saveAsSTL(p, "export_%i.stl" % parts.index(p))
diff --git a/Cura/util/svg.py b/Cura/util/svg.py
index ebb4c55..c68206f 100644
--- a/Cura/util/svg.py
+++ b/Cura/util/svg.py
@@ -92,7 +92,7 @@ def processPath(e):
curPath = [p]
paths.append(curPath)
i = 0
- print param
+ print(param)
while i < len(param):
endPoint = p + complex(param[i+5], -param[i+6])
addArc(curPath, p, endPoint, complex(param[i], param[i+1]), param[i+2], param[i+3], param[i+4])
@@ -102,7 +102,7 @@ def processPath(e):
elif cmd == 'Z' or cmd == 'z':
curPath.append(curPath[0])
elif cmd != None:
- print cmd
+ print(cmd)
cmd = c
param = []
return paths
diff --git a/Cura/util/util3d.py b/Cura/util/util3d.py
index 43146a7..2592785 100644
--- a/Cura/util/util3d.py
+++ b/Cura/util/util3d.py
@@ -311,6 +311,6 @@ if __name__ == '__main__':
tree.insert(AABB(Vector3(0,0,0), Vector3(0,0,0)))
tree.insert(AABB(Vector3(1,1,1), Vector3(1,1,1)))
tree.insert(AABB(Vector3(0.5,0.5,0.5), Vector3(0.5,0.5,0.5)))
- print tree
- print tree.query(AABB(Vector3(0,0,0), Vector3(0,0,0)))
+ print(tree)
+ print(tree.query(AABB(Vector3(0,0,0), Vector3(0,0,0))))
diff --git a/Cura/util/version.py b/Cura/util/version.py
index 2c27a55..624abf7 100644
--- a/Cura/util/version.py
+++ b/Cura/util/version.py
@@ -16,5 +16,5 @@ def getVersion():
return "?"
if __name__ == '__main__':
- print getVersion()
+ print(getVersion())