return lambda setting: float(profile.getProfileSetting(name)) / 100
def calculateEdgeWidth(setting):
- wallThickness = float(profile.getProfileSetting('wall_thickness'))
- nozzleSize = float(profile.getProfileSetting('nozzle_size'))
-
- if wallThickness < nozzleSize:
- return wallThickness
-
- lineCount = int(wallThickness / nozzleSize)
- lineWidth = wallThickness / lineCount
- lineWidthAlt = wallThickness / (lineCount + 1)
- if lineWidth > nozzleSize * 1.5:
- return lineWidthAlt
- return lineWidth
+ return profile.calculateEdgeWidth()
def calculateShells(setting):
- return calculateShellsImp(float(profile.getProfileSetting('wall_thickness')))
+ return profile.calculateLineCount() - 1
def calculateShellsBase(setting):
- return calculateShellsImp(float(profile.getProfileSetting('wall_thickness')) + float(profile.getProfileSetting('extra_base_wall_thickness')))
-
-def calculateShellsImp(wallThickness):
- nozzleSize = float(profile.getProfileSetting('nozzle_size'))
+ edgeWidth = profile.calculateEdgeWidth()
+ extraWall = float(profile.getProfileSetting('extra_base_wall_thickness'))
- if wallThickness < nozzleSize:
- return 0
-
- lineCount = int(wallThickness / nozzleSize + 0.0001)
- lineWidth = wallThickness / lineCount
- lineWidthAlt = wallThickness / (lineCount + 1)
- if lineWidth > nozzleSize * 1.5:
- return lineCount
- return lineCount - 1
+ return profile.calculateLineCount() - 1 + int(extraWall / edgeWidth + 0.0001)
def calculateSolidLayerCount(setting):
- layerHeight = float(profile.getProfileSetting('layer_height'))
- solidThickness = float(profile.getProfileSetting('solid_layer_thickness'))
- ret = int(math.ceil(solidThickness / layerHeight - 0.0001))
- return ret
+ return profile.calculateSolidLayerCount()
def firstLayerSpeedRatio(setting):
bottomSpeed = float(profile.getProfileSetting('bottom_layer_speed'))
import ConfigParser\r
import os\r
import traceback\r
+import math\r
\r
#Single place to store the defaults, so we have a consistent set of default settings.\r
profileDefaultSettings = {\r
'steps_per_e': '0',\r
'serial_port': 'AUTO',\r
'serial_baud': '250000',\r
+ 'slicer': 'Cura (Skeinforge based)',\r
}\r
\r
def getDefaultProfilePath():\r
globalPreferenceParser.add_section('preference')\r
globalPreferenceParser.set('preference', name, str(value))\r
globalPreferenceParser.write(open(getPreferencePath(), 'w'))\r
+\r
+## Utility functions to calculate common profile values\r
+\r
+def calculateEdgeWidth():\r
+ wallThickness = float(getProfileSetting('wall_thickness'))\r
+ nozzleSize = float(getProfileSetting('nozzle_size'))\r
+ \r
+ if wallThickness < nozzleSize:\r
+ return wallThickness\r
+\r
+ lineCount = int(wallThickness / nozzleSize)\r
+ lineWidth = wallThickness / lineCount\r
+ lineWidthAlt = wallThickness / (lineCount + 1)\r
+ if lineWidth > nozzleSize * 1.5:\r
+ return lineWidthAlt\r
+ return lineWidth\r
+\r
+def calculateLineCount():\r
+ wallThickness = float(getProfileSetting('wall_thickness'))\r
+ nozzleSize = float(getProfileSetting('nozzle_size'))\r
+ \r
+ if wallThickness < nozzleSize:\r
+ return 1\r
+\r
+ lineCount = int(wallThickness / nozzleSize + 0.0001)\r
+ lineWidth = wallThickness / lineCount\r
+ lineWidthAlt = wallThickness / (lineCount + 1)\r
+ if lineWidth > nozzleSize * 1.5:\r
+ return lineCount + 1\r
+ return lineCount\r
+\r
+def calculateSolidLayerCount():\r
+ layerHeight = float(getProfileSetting('layer_height'))\r
+ solidThickness = float(getProfileSetting('solid_layer_thickness'))\r
+ return int(math.ceil(solidThickness / layerHeight - 0.0001))\r
+\r
import platform, os, subprocess, sys
from skeinforge_application.skeinforge_utilities import skeinforge_craft
+from newui import profile
def getPyPyExe():
"Return the path to the pypy executable if we can find it. Else return False"
return pypyExe
return False
+def getSlic3rExe():
+ "Return the path to the pypy executable if we can find it. Else return False"
+ if platform.system() == "Windows":
+ exeName = "slic3r.exe"
+ slic3rExe = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../../Slic3r/bin/slic3r.exe"));
+ else:
+ exeName = "slic3r"
+ slic3rExe = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../../Slic3r/bin/slic3r"));
+ if os.path.exists(slic3rExe):
+ return slic3rExe
+
+ path = os.environ['PATH']
+ paths = path.split(os.pathsep)
+ for p in paths:
+ slic3rExe = os.path.join(p, exeName)
+ if os.path.exists(slic3rExe):
+ return slic3rExe
+ return False
+
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()
subprocess.call([pypyExe, os.path.join(sys.path[0], sys.argv[0]), fileName])
def getSliceCommand(filename):
- pypyExe = getPyPyExe()
- if pypyExe == False:
- pypyExe = sys.executable
- return [pypyExe, os.path.join(sys.path[0], os.path.split(sys.argv[0])[1]), filename]
+ if profile.getPreference('slicer').startswith('Slic3r'):
+ slic3rExe = getSlic3rExe()
+ if slic3rExe == False:
+ return False
+ cmd = [slic3rExe,
+ '--output-filename-format', '[input_filename_base]_export.gcode',
+ '--nozzle-diameter', str(profile.calculateEdgeWidth()),
+ '--print-center', '%s,%s' % (profile.getProfileSetting('machine_center_x'), profile.getProfileSetting('machine_center_y')),
+ '--z-offset', '0',
+ '--gcode-flavor', 'reprap',
+ '--gcode-comments',
+ '--filament-diameter', profile.getProfileSetting('filament_diameter'),
+ '--extrusion-multiplier', profile.getProfileSetting('filament_density'),
+ '--temperature', profile.getProfileSetting('print_temperature'),
+ '--travel-speed', profile.getProfileSetting('travel_speed'),
+ '--perimeter-speed', profile.getProfileSetting('print_speed'),
+ '--small-perimeter-speed', profile.getProfileSetting('print_speed'),
+ '--infill-speed', profile.getProfileSetting('print_speed'),
+ '--solid-infill-speed', profile.getProfileSetting('print_speed'),
+ '--bridge-speed', profile.getProfileSetting('print_speed'),
+ '--bottom-layer-speed-ratio', str(float(profile.getProfileSetting('bottom_layer_speed')) / float(profile.getProfileSetting('print_speed'))),
+ '--layer-height', profile.getProfileSetting('layer_height'),
+ '--first-layer-height-ratio', '1.0',
+ '--infill-every-layers', '1',
+ '--perimeters', str(profile.calculateLineCount()),
+ '--solid-layers', str(profile.calculateSolidLayerCount()),
+ '--fill-density', str(float(profile.getProfileSetting('fill_density'))/100),
+ '--fill-angle', '45',
+ '--fill-pattern', 'rectilinear',
+ '--solid-fill-pattern', 'rectilinear',
+ '--start-gcode', '',
+ '--end-gcode', '',
+ '--retract-length', profile.getProfileSetting('retraction_amount'),
+ '--retract-speed', str(int(float(profile.getProfileSetting('retraction_speed')))),
+ '--retract-restart-extra', profile.getProfileSetting('retraction_extra'),
+ '--retract-before-travel', profile.getProfileSetting('retraction_min_travel'),
+ '--retract-lift', '0',
+ '--slowdown-below-layer-time', profile.getProfileSetting('cool_min_layer_time'),
+ '--min-print-speed', profile.getProfileSetting('cool_min_feedrate'),
+ '--skirts', profile.getProfileSetting('skirt_line_count'),
+ '--skirt-distance', str(int(float(profile.getProfileSetting('skirt_gap')))),
+ '--skirt-height', '1',
+ '--scale', profile.getProfileSetting('model_scale'),
+ '--rotate', profile.getProfileSetting('model_rotate_base'),
+ '--duplicate-x', profile.getProfileSetting('model_multiply_x'),
+ '--duplicate-y', profile.getProfileSetting('model_multiply_y'),
+ '--duplicate-distance', '10']
+ if profile.getProfileSetting('support') != 'None':
+ cmd.extend(['--support-material'])
+ cmd.extend([filename])
+ return cmd
+ else:
+ pypyExe = getPyPyExe()
+ if pypyExe == False:
+ pypyExe = sys.executable
+ return [pypyExe, os.path.join(sys.path[0], os.path.split(sys.argv[0])[1]), filename]
+