--- /dev/null
+--- ori/48/fabmetheus_utilities/archive.py
++++ target/SF48/fabmetheus_utilities/archive.py
+@@ -18,7 +18,7 @@
+ __license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html'
+
+
+-globalTemporarySettingsPath = os.path.join(os.path.expanduser('~'), '.skeinforge')
++globalTemporarySettingsPath = os.path.join(os.path.expanduser('~'), '.skeinforge_pypy')
+
+
+ def addToNamePathDictionary(directoryPath, namePathDictionary):
+--- ori/48/fabmetheus_utilities/settings.py
++++ target/SF48/fabmetheus_utilities/settings.py
+@@ -301,7 +301,7 @@
+ if repository.baseNameSynonym != None:
+ text = archive.getFileText(archive.getProfilesPath(getProfileName(repository.baseNameSynonym, repository)), False)
+ if text == '':
+- print('The default %s will be written in the .skeinforge folder in the home directory.' % repository.title.lower() )
++ print('The default %s will be written in the .skeinforge_pypy folder in the home directory.' % repository.title.lower() )
+ text = archive.getFileText(getProfilesDirectoryInAboveDirectory(getProfileBaseName(repository)), False)
+ if text != '':
+ readSettingsFromText(repository, text)
+--- ori/48/skeinforge_application/alterations/end.gcode
++++ target/SF48/skeinforge_application/alterations/end.gcode
+@@ -0,0 +1,10 @@
++(start of end.gcode)
++M104 S0 (extruder heat off)
++M106 (fan on)
++G91 (relative positioning)
++G1 Z+10 E-5 F400 (move Z up a bit and retract filament by 5mm)
++G1 X-20 Y-20 F1500 (move X and Y over a bit)
++M84 (steppers off)
++G90 (absolute positioning)
++(end of end.gcode)
++
+--- ori/48/skeinforge_application/alterations/start.gcode
++++ target/SF48/skeinforge_application/alterations/start.gcode
+@@ -0,0 +1,31 @@
++(start of start.txt)
++M92 E926.5 (the number of extruder steps to take in 1mm of filament)
++G21 (metric values)
++G21
++G21 (all the extra G21 commands are comments - skeinforge eats lines without a gcode)
++G21
++G90 (absolute positioning)
++G21
++G28 X0 Y0 (move X/Y to min endstops)
++G28 Z0 (move Z to min endstops)
++G21
++G21 ( if your prints start too high, try changing the Z0.0 below )
++G21 ( to Z1.0 - the number after the Z is the actual, physical )
++G21 ( height of the nozzle in mm. This can take some messing around )
++G21 ( with to get just right... )
++G21
++G92 X0 Y0 Z0 E0 (reset software position to front/left/z=0.0)
++G21
++G1 Z15.0 F400 (move the platform down 15mm)
++G92 E0 (zero the extruded length)
++G21
++G1 F75 E5 (extrude 5mm of feed stock)
++G1 F75 E3.5 (reverse feed stock by 1.5mm)
++G92 E0 (zero the extruded length again)
++G21
++M1 (Clean the nozzle then press YES to continue...)
++G21
++G1 X100 Y100 F3500 (go to the middle of the platform)
++G1 Z0.0 F400 (back to Z=0 and start the print!)
++(end of start.txt)
++
+--- ori/48/skeinforge_application/skeinforge_plugins/analyze_plugins/skeinlayer.py
++++ target/SF48/skeinforge_application/skeinforge_plugins/analyze_plugins/skeinlayer.py
+@@ -200,7 +200,7 @@
+ self.baseNameSynonym = 'skeinview.csv'
+ self.fileNameInput = settings.FileNameInput().getFromFileName( [ ('Gcode text files', '*.gcode') ], 'Open File for Skeinlayer', self, '')
+ self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Skeinlayer')
+- self.activateSkeinlayer = settings.BooleanSetting().getFromValue('Activate Skeinlayer', self, True )
++ self.activateSkeinlayer = settings.BooleanSetting().getFromValue('Activate Skeinlayer', self, False )
+ self.addAnimation()
+ self.drawArrows = settings.BooleanSetting().getFromValue('Draw Arrows', self, True )
+ self.goAroundExtruderOffTravel = settings.BooleanSetting().getFromValue('Go Around Extruder Off Travel', self, False )
+--- ori/48/skeinforge_application/skeinforge_plugins/craft_plugins/carve.py
++++ target/SF48/skeinforge_application/skeinforge_plugins/craft_plugins/carve.py
+@@ -161,10 +161,10 @@
+ self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getTranslatorFileTypeTuples(), 'Open File for Carve', self, '')
+ self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Carve')
+ self.addLayerTemplateToSVG = settings.BooleanSetting().getFromValue('Add Layer Template to SVG', self, True)
+- self.edgeWidthOverHeight = settings.FloatSpin().getFromValue( 1.4, 'Edge Width over Height (ratio):', self, 2.2, 1.8 )
++ self.edgeWidth = settings.FloatSpin().getFromValue( 0.1, 'Edge Width (mm):', self, 2.2, 0.4 )
+ self.extraDecimalPlaces = settings.FloatSpin().getFromValue(0.0, 'Extra Decimal Places (float):', self, 3.0, 2.0)
+ self.importCoarseness = settings.FloatSpin().getFromValue( 0.5, 'Import Coarseness (ratio):', self, 2.0, 1.0 )
+- self.layerHeight = settings.FloatSpin().getFromValue( 0.1, 'Layer Height (mm):', self, 1.0, 0.4 )
++ self.layerHeight = settings.FloatSpin().getFromValue( 0.1, 'Layer Height (mm):', self, 1.0, 0.2 )
+ settings.LabelSeparator().getFromRepository(self)
+ settings.LabelDisplay().getFromName('- Layers -', self )
+ self.layersFrom = settings.IntSpin().getFromValue( 0, 'Layers From (index):', self, 20, 0 )
+@@ -190,7 +190,7 @@
+ def getCarvedSVG(self, carving, fileName, repository):
+ "Parse gnu triangulated surface text and store the carved gcode."
+ layerHeight = repository.layerHeight.value
+- edgeWidth = repository.edgeWidthOverHeight.value * layerHeight
++ edgeWidth = repository.edgeWidth.value
+ carving.setCarveLayerHeight(layerHeight)
+ importRadius = 0.5 * repository.importCoarseness.value * abs(edgeWidth)
+ carving.setCarveImportRadius(max(importRadius, 0.001 * layerHeight))
+@@ -201,7 +201,7 @@
+ return ''
+ layerHeight = carving.getCarveLayerHeight()
+ decimalPlacesCarried = euclidean.getDecimalPlacesCarried(repository.extraDecimalPlaces.value, layerHeight)
+- edgeWidth = repository.edgeWidthOverHeight.value * layerHeight
++ edgeWidth = repository.edgeWidth.value
+ svgWriter = svg_writer.SVGWriter(
+ repository.addLayerTemplateToSVG.value,
+ carving.getCarveCornerMaximum(),
+--- ori/48/skeinforge_application/skeinforge_plugins/craft_plugins/chamber.py
++++ target/SF48/skeinforge_application/skeinforge_plugins/craft_plugins/chamber.py
+@@ -205,7 +205,7 @@
+ skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.chamber.html', self )
+ self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Chamber', self, '')
+ self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Chamber')
+- self.activateChamber = settings.BooleanSetting().getFromValue('Activate Chamber', self, True )
++ self.activateChamber = settings.BooleanSetting().getFromValue('Activate Chamber', self, False )
+ settings.LabelSeparator().getFromRepository(self)
+ settings.LabelDisplay().getFromName('- Bed -', self )
+ self.bedTemperature = settings.FloatSpin().getFromValue(20.0, 'Bed Temperature (Celcius):', self, 90.0, 60.0)
+--- ori/48/skeinforge_application/skeinforge_plugins/craft_plugins/clip.py
++++ target/SF48/skeinforge_application/skeinforge_plugins/craft_plugins/clip.py
+@@ -92,7 +92,7 @@
+ skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.clip.html', self )
+ self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Clip', self, '')
+ self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Clip')
+- self.activateClip = settings.BooleanSetting().getFromValue('Activate Clip', self, True )
++ self.activateClip = settings.BooleanSetting().getFromValue('Activate Clip', self, False )
+ self.clipOverEdgeWidth = settings.FloatSpin().getFromValue( 0.1, 'Clip Over Perimeter Width (ratio):', self, 0.8, 0.5 )
+ self.maximumConnectionDistanceOverEdgeWidth = settings.FloatSpin().getFromValue( 1.0, 'Maximum Connection Distance Over Perimeter Width (ratio):', self, 20.0, 10.0 )
+ self.executeTitle = 'Clip'
+--- ori/48/skeinforge_application/skeinforge_plugins/craft_plugins/comb.py
++++ target/SF48/skeinforge_application/skeinforge_plugins/craft_plugins/comb.py
+@@ -160,7 +160,7 @@
+ skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.comb.html', self )
+ self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Comb', self, '')
+ self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Comb')
+- self.activateComb = settings.BooleanSetting().getFromValue('Activate Comb', self, False )
++ self.activateComb = settings.BooleanSetting().getFromValue('Activate Comb', self, True )
+ self.runningJumpSpace = settings.FloatSpin().getFromValue(0.0, 'Running Jump Space (mm):', self, 5.0, 2.0)
+ self.executeTitle = 'Comb'
+
+--- ori/48/skeinforge_application/skeinforge_plugins/craft_plugins/cool.py
++++ target/SF48/skeinforge_application/skeinforge_plugins/craft_plugins/cool.py
+@@ -149,7 +149,7 @@
+ self.orbit = settings.MenuRadio().getFromMenuButtonDisplay(self.coolType, 'Orbit', self, False)
+ self.slowDown = settings.MenuRadio().getFromMenuButtonDisplay(self.coolType, 'Slow Down', self, True)
+ self.maximumCool = settings.FloatSpin().getFromValue(0.0, 'Maximum Cool (Celcius):', self, 10.0, 2.0)
+- self.minimumLayerTime = settings.FloatSpin().getFromValue(0.0, 'Minimum Layer Time (seconds):', self, 120.0, 60.0)
++ self.minimumLayerTime = settings.FloatSpin().getFromValue(0.0, 'Minimum Layer Time (seconds):', self, 120.0, 10.0)
+ self.minimumOrbitalRadius = settings.FloatSpin().getFromValue(
+ 0.0, 'Minimum Orbital Radius (millimeters):', self, 20.0, 10.0)
+ settings.LabelSeparator().getFromRepository(self)
+--- ori/48/skeinforge_application/skeinforge_plugins/craft_plugins/dimension.py
++++ target/SF48/skeinforge_application/skeinforge_plugins/craft_plugins/dimension.py
+@@ -148,7 +148,7 @@
+ skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.dimension.html', self )
+ self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Dimension', self, '')
+ self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Dimension')
+- self.activateDimension = settings.BooleanSetting().getFromValue('Activate Dimension', self, False )
++ self.activateDimension = settings.BooleanSetting().getFromValue('Activate Dimension', self, True )
+ extrusionDistanceFormatLatentStringVar = settings.LatentStringVar()
+ self.extrusionDistanceFormatChoiceLabel = settings.LabelDisplay().getFromName('Extrusion Distance Format Choice: ', self )
+ settings.Radio().getFromRadio( extrusionDistanceFormatLatentStringVar, 'Absolute Extrusion Distance', self, True )
+@@ -156,7 +156,7 @@
+ self.extruderRetractionSpeed = settings.FloatSpin().getFromValue( 4.0, 'Extruder Retraction Speed (mm/s):', self, 34.0, 13.3 )
+ settings.LabelSeparator().getFromRepository(self)
+ settings.LabelDisplay().getFromName('- Filament -', self )
+- self.filamentDiameter = settings.FloatSpin().getFromValue(1.0, 'Filament Diameter (mm):', self, 6.0, 2.8)
++ self.filamentDiameter = settings.FloatSpin().getFromValue(1.0, 'Filament Diameter (mm):', self, 6.0, 2.89)
+ self.filamentPackingDensity = settings.FloatSpin().getFromValue(0.7, 'Filament Packing Density (ratio):', self, 1.0, 0.85)
+ settings.LabelSeparator().getFromRepository(self)
+ self.maximumEValueBeforeReset = settings.FloatSpin().getFromValue(0.0, 'Maximum E Value before Reset (float):', self, 999999.9, 91234.0)
+--- ori/48/skeinforge_application/skeinforge_plugins/craft_plugins/export.py
++++ target/SF48/skeinforge_application/skeinforge_plugins/craft_plugins/export.py
+@@ -338,17 +338,20 @@
+ self.exportLabel = settings.LabelDisplay().getFromName('Export Operations: ', self)
+ self.exportPlugins = []
+ exportLatentStringVar = settings.LatentStringVar()
+- self.doNotChangeOutput = settings.RadioCapitalized().getFromRadio(exportLatentStringVar, 'Do Not Change Output', self, True)
++ self.doNotChangeOutput = settings.RadioCapitalized().getFromRadio(exportLatentStringVar, 'Do Not Change Output', self, False)
+ self.doNotChangeOutput.directoryPath = None
+ allExportPluginFileNames = exportPluginFileNames + exportStaticPluginFileNames
+ for exportPluginFileName in allExportPluginFileNames:
+ exportPlugin = None
++ default = False
++ if exportPluginFileName == "gcode_small":
++ default = True
+ if exportPluginFileName in exportPluginFileNames:
+ path = os.path.join(exportPluginsFolderPath, exportPluginFileName)
+- exportPlugin = settings.RadioCapitalizedButton().getFromPath(exportLatentStringVar, exportPluginFileName, path, self, False)
++ exportPlugin = settings.RadioCapitalizedButton().getFromPath(exportLatentStringVar, exportPluginFileName, path, self, default)
+ exportPlugin.directoryPath = exportPluginsFolderPath
+ else:
+- exportPlugin = settings.RadioCapitalized().getFromRadio(exportLatentStringVar, exportPluginFileName, self, False)
++ exportPlugin = settings.RadioCapitalized().getFromRadio(exportLatentStringVar, exportPluginFileName, self, default)
+ exportPlugin.directoryPath = exportStaticDirectoryPath
+ self.exportPlugins.append(exportPlugin)
+ self.fileExtension = settings.StringSetting().getFromValue('File Extension:', self, 'gcode')
+--- ori/48/skeinforge_application/skeinforge_plugins/craft_plugins/fill.py
++++ target/SF48/skeinforge_application/skeinforge_plugins/craft_plugins/fill.py
+@@ -798,7 +798,7 @@
+ self.infillPatternLine = settings.Radio().getFromRadio( infillLatentStringVar, 'Line', self, True )
+ self.infillPerimeterOverlap = settings.FloatSpin().getFromValue( 0.0, 'Infill Perimeter Overlap (ratio):', self, 0.4, 0.15 )
+ self.infillSolidity = settings.FloatSpin().getFromValue( 0.04, 'Infill Solidity (ratio):', self, 0.3, 0.2 )
+- self.infillWidthOverThickness = settings.FloatSpin().getFromValue(1.3, 'Infill Width over Thickness (ratio):', self, 1.7, 1.5)
++ self.infillWidth = settings.FloatSpin().getFromValue( 0.1, 'Infill Width:', self, 1.7, 0.4 )
+ settings.LabelSeparator().getFromRepository(self)
+ self.solidSurfaceThickness = settings.IntSpin().getFromValue(0, 'Solid Surface Thickness (layers):', self, 5, 3)
+ self.startFromChoice = settings.MenuButtonDisplay().getFromName('Start From Choice:', self)
+@@ -1247,7 +1247,7 @@
+ return
+ elif firstWord == '(<layerHeight>':
+ self.layerHeight = float(splitLine[1])
+- self.infillWidth = self.repository.infillWidthOverThickness.value * self.layerHeight
++ self.infillWidth = self.repository.infillWidth.value
+ self.surroundingSlope = math.tan(math.radians(min(self.repository.surroundingAngle.value, 80.0)))
+ self.distanceFeedRate.addTagRoundedLine('infillPerimeterOverlap', self.repository.infillPerimeterOverlap.value)
+ self.distanceFeedRate.addTagRoundedLine('infillWidth', self.infillWidth)
+--- ori/48/skeinforge_application/skeinforge_plugins/craft_plugins/home.py
++++ target/SF48/skeinforge_application/skeinforge_plugins/craft_plugins/home.py
+@@ -82,10 +82,10 @@
+ skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.home.html', self)
+ self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Home', self, '')
+ self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Home')
+- self.activateHome = settings.BooleanSetting().getFromValue('Activate Home', self, True )
++ self.activateHome = settings.BooleanSetting().getFromValue('Activate Home', self, False )
+ self.nameOfHomeFile = settings.StringSetting().getFromValue('Name of Home File:', self, 'home.gcode')
+ self.executeTitle = 'Home'
+-
++
+ def execute(self):
+ "Home button has been clicked."
+ fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled)
+--- ori/48/skeinforge_application/skeinforge_plugins/craft_plugins/jitter.py
++++ target/SF48/skeinforge_application/skeinforge_plugins/craft_plugins/jitter.py
+@@ -116,7 +116,7 @@
+ skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.jitter.html', self)
+ self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Jitter', self, '')
+ self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Jitter')
+- self.activateJitter = settings.BooleanSetting().getFromValue('Activate Jitter', self, True)
++ self.activateJitter = settings.BooleanSetting().getFromValue('Activate Jitter', self, False)
+ self.jitterOverEdgeWidth = settings.FloatSpin().getFromValue(1.0, 'Jitter Over Perimeter Width (ratio):', self, 3.0, 2.0)
+ self.executeTitle = 'Jitter'
+
+--- ori/48/skeinforge_application/skeinforge_plugins/craft_plugins/limit.py
++++ target/SF48/skeinforge_application/skeinforge_plugins/craft_plugins/limit.py
+@@ -86,7 +86,7 @@
+ skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.limit.html', self )
+ self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Limit', self, '')
+ self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Limit')
+- self.activateLimit = settings.BooleanSetting().getFromValue('Activate Limit', self, True)
++ self.activateLimit = settings.BooleanSetting().getFromValue('Activate Limit', self, False)
+ self.maximumInitialFeedRate = settings.FloatSpin().getFromValue(0.5, 'Maximum Initial Feed Rate (mm/s):', self, 10.0, 1.0)
+ self.executeTitle = 'Limit'
+
+--- ori/48/skeinforge_application/skeinforge_plugins/craft_plugins/multiply.py
++++ target/SF48/skeinforge_application/skeinforge_plugins/craft_plugins/multiply.py
+@@ -112,11 +112,11 @@
+ self.fileNameInput = settings.FileNameInput().getFromFileName(
+ fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Multiply', self, '')
+ self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Multiply')
+- self.activateMultiply = settings.BooleanSetting().getFromValue('Activate Multiply', self, False)
++ self.activateMultiply = settings.BooleanSetting().getFromValue('Activate Multiply', self, True)
+ settings.LabelSeparator().getFromRepository(self)
+ settings.LabelDisplay().getFromName('- Center -', self )
+- self.centerX = settings.FloatSpin().getFromValue(-100.0, 'Center X (mm):', self, 100.0, 0.0)
+- self.centerY = settings.FloatSpin().getFromValue(-100.0, 'Center Y (mm):', self, 100.0, 0.0)
++ self.centerX = settings.FloatSpin().getFromValue(-100.0, 'Center X (mm):', self, 100.0, 105.0)
++ self.centerY = settings.FloatSpin().getFromValue(-100.0, 'Center Y (mm):', self, 100.0, 105.0)
+ settings.LabelSeparator().getFromRepository(self)
+ settings.LabelDisplay().getFromName('- Number of Cells -', self)
+ self.numberOfColumns = settings.IntSpin().getFromValue(1, 'Number of Columns (integer):', self, 10, 1)
+--- ori/48/skeinforge_application/skeinforge_plugins/craft_plugins/raft.py
++++ target/SF48/skeinforge_application/skeinforge_plugins/craft_plugins/raft.py
+@@ -351,7 +351,7 @@
+ self.baseInfillDensity = settings.FloatSpin().getFromValue(0.3, 'Base Infill Density (ratio):', self, 0.9, 0.5)
+ self.baseLayerThicknessOverLayerThickness = settings.FloatSpin().getFromValue(
+ 1.0, 'Base Layer Thickness over Layer Thickness:', self, 3.0, 2.0)
+- self.baseLayers = settings.IntSpin().getFromValue(0, 'Base Layers (integer):', self, 3, 1)
++ self.baseLayers = settings.IntSpin().getFromValue(0, 'Base Layers (integer):', self, 3, 0)
+ self.baseNozzleLiftOverBaseLayerThickness = settings.FloatSpin().getFromValue(
+ 0.2, 'Base Nozzle Lift over Base Layer Thickness (ratio):', self, 0.8, 0.4)
+ settings.LabelSeparator().getFromRepository(self)
+@@ -369,7 +369,7 @@
+ self.interfaceLayerThicknessOverLayerThickness = settings.FloatSpin().getFromValue(
+ 1.0, 'Interface Layer Thickness over Layer Thickness:', self, 3.0, 1.0)
+ self.interfaceLayers = settings.IntSpin().getFromValue(
+- 0, 'Interface Layers (integer):', self, 3, 2)
++ 0, 'Interface Layers (integer):', self, 3, 0)
+ self.interfaceNozzleLiftOverInterfaceLayerThickness = settings.FloatSpin().getFromValue(
+ 0.25, 'Interface Nozzle Lift over Interface Layer Thickness (ratio):', self, 0.85, 0.45)
+ settings.LabelSeparator().getFromRepository(self)
+--- ori/48/skeinforge_application/skeinforge_plugins/craft_plugins/speed.py
++++ target/SF48/skeinforge_application/skeinforge_plugins/craft_plugins/speed.py
+@@ -184,18 +184,22 @@
+ self.dutyCycleAtBeginning = settings.FloatSpin().getFromValue( 0.0, 'Duty Cyle at Beginning (portion):', self, 1.0, 1.0 )
+ self.dutyCycleAtEnding = settings.FloatSpin().getFromValue( 0.0, 'Duty Cyle at Ending (portion):', self, 1.0, 0.0 )
+ settings.LabelSeparator().getFromRepository(self)
+- self.feedRatePerSecond = settings.FloatSpin().getFromValue( 2.0, 'Feed Rate (mm/s):', self, 50.0, 16.0 )
+- self.flowRateSetting = settings.FloatSpin().getFromValue( 50.0, 'Flow Rate Setting (float):', self, 250.0, 210.0 )
++ self.feedRatePerSecond = settings.FloatSpin().getFromValue( 2.0, 'Feed Rate (mm/s):', self, 250.0, 50.0 )
++ self.flowRateSetting = settings.FloatSpin().getFromValue( 50.0, 'Flow Rate Setting (float):', self, 250.0, 50.0 )
+ settings.LabelSeparator().getFromRepository(self)
+- settings.LabelDisplay().getFromName('- Object First Layer -', self)
++ settings.LabelDisplay().getFromName('- Object First Layers -', self)
+ self.objectFirstLayerFeedRateInfillMultiplier = settings.FloatSpin().getFromValue(
+ 0.2, 'Object First Layer Feed Rate Infill Multiplier (ratio):', self, 1.0, 0.4)
+ self.objectFirstLayerFeedRatePerimeterMultiplier = settings.FloatSpin().getFromValue(
+ 0.2, 'Object First Layer Feed Rate Perimeter Multiplier (ratio):', self, 1.0, 0.4)
++ self.objectFirstLayerFeedRateTravelMultiplier = settings.FloatSpin().getFromValue(
++ 0.2, 'Object First Layer Feed Rate Travel Multiplier (ratio):', self, 1.0, 0.4)
+ self.objectFirstLayerFlowRateInfillMultiplier = settings.FloatSpin().getFromValue(
+ 0.2, 'Object First Layer Flow Rate Infill Multiplier (ratio):', self, 1.0, 0.4)
+ self.objectFirstLayerFlowRatePerimeterMultiplier = settings.FloatSpin().getFromValue(
+ 0.2, 'Object First Layer Flow Rate Perimeter Multiplier (ratio):', self, 1.0, 0.4)
++ self.objectFirstLayersLayerAmount = settings.IntSpin().getFromValue(
++ 1, 'Object First Layers Amount Of Layers For Speed Change:', self, 10, 3)
+ settings.LabelSeparator().getFromRepository(self)
+ self.orbitalFeedRateOverOperatingFeedRate = settings.FloatSpin().getFromValue( 0.1, 'Orbital Feed Rate over Operating Feed Rate (ratio):', self, 0.9, 0.5 )
+ self.maximumZFeedRatePerSecond = settings.FloatSpin().getFromValue(0.5, 'Maximum Z Feed Rate (mm/s):', self, 10.0, 1.0)
+@@ -204,7 +208,7 @@
+ self.perimeterFeedRateMultiplier = settings.FloatSpin().getFromValue(0.5, 'Perimeter Feed Rate Multiplier (ratio):', self, 1.0, 1.0)
+ self.perimeterFlowRateMultiplier = settings.FloatSpin().getFromValue(0.5, 'Perimeter Flow Rate Multiplier (ratio):', self, 1.0, 1.0)
+ settings.LabelSeparator().getFromRepository(self)
+- self.travelFeedRatePerSecond = settings.FloatSpin().getFromValue( 2.0, 'Travel Feed Rate (mm/s):', self, 50.0, 16.0 )
++ self.travelFeedRatePerSecond = settings.FloatSpin().getFromValue( 2.0, 'Travel Feed Rate (mm/s):', self, 350.0, 250.0 )
+ self.executeTitle = 'Speed'
+
+ def execute(self):
+@@ -237,11 +241,11 @@
+ flowRate *= self.repository.bridgeFlowRateMultiplier.value
+ if self.isEdgePath:
+ flowRate *= self.repository.perimeterFlowRateMultiplier.value
+- if self.layerIndex == 0:
++ if self.layerIndex < self.repository.objectFirstLayersLayerAmount.value:
+ if self.isEdgePath:
+- flowRate *= self.repository.objectFirstLayerFlowRatePerimeterMultiplier.value
++ flowRate *= ((self.repository.objectFirstLayerFlowRatePerimeterMultiplier.value * (self.repository.objectFirstLayersLayerAmount.value - self.layerIndex)) + self.layerIndex) / self.repository.objectFirstLayersLayerAmount.value
+ else:
+- flowRate *= self.repository.objectFirstLayerFlowRateInfillMultiplier.value
++ flowRate *= ((self.repository.objectFirstLayerFlowRateInfillMultiplier.value * (self.repository.objectFirstLayersLayerAmount.value - self.layerIndex)) + self.layerIndex) / self.repository.objectFirstLayersLayerAmount.value
+ if flowRate != self.oldFlowRate:
+ self.distanceFeedRate.addLine('M108 S' + euclidean.getFourSignificantFigures(flowRate))
+ self.oldFlowRate = flowRate
+@@ -274,14 +278,16 @@
+ feedRateMinute *= self.repository.bridgeFeedRateMultiplier.value
+ if self.isEdgePath:
+ feedRateMinute *= self.repository.perimeterFeedRateMultiplier.value
+- if self.layerIndex == 0:
++ if self.layerIndex < self.repository.objectFirstLayersLayerAmount.value:
+ if self.isEdgePath:
+- feedRateMinute *= self.repository.objectFirstLayerFeedRatePerimeterMultiplier.value
++ feedRateMinute *= ((self.repository.objectFirstLayerFeedRatePerimeterMultiplier.value * (self.repository.objectFirstLayersLayerAmount.value - self.layerIndex)) + self.layerIndex) / self.repository.objectFirstLayersLayerAmount.value
+ else:
+- feedRateMinute *= self.repository.objectFirstLayerFeedRateInfillMultiplier.value
++ feedRateMinute *= ((self.repository.objectFirstLayerFeedRateInfillMultiplier.value * (self.repository.objectFirstLayersLayerAmount.value - self.layerIndex)) + self.layerIndex) / self.repository.objectFirstLayersLayerAmount.value
+ self.addFlowRateLine()
+ if not self.isExtruderActive:
+ feedRateMinute = self.travelFeedRateMinute
++ if self.layerIndex < self.repository.objectFirstLayersLayerAmount.value:
++ feedRateMinute *= ((self.repository.objectFirstLayerFeedRateTravelMultiplier.value * (self.repository.objectFirstLayersLayerAmount.value - self.layerIndex)) + self.layerIndex) / self.repository.objectFirstLayersLayerAmount.value
+ return self.distanceFeedRate.getLineWithFeedRate(feedRateMinute, line, splitLine)
+
+ def parseInitialization(self):
+--- ori/48/skeinforge_application/skeinforge_plugins/craft_plugins/temperature.py
++++ target/SF48/skeinforge_application/skeinforge_plugins/craft_plugins/temperature.py
+@@ -126,7 +126,7 @@
+ skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.temperature.html', self )
+ self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Temperature', self, '')
+ self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Temperature')
+- self.activateTemperature = settings.BooleanSetting().getFromValue('Activate Temperature', self, True )
++ self.activateTemperature = settings.BooleanSetting().getFromValue('Activate Temperature', self, False )
+ settings.LabelSeparator().getFromRepository(self)
+ settings.LabelDisplay().getFromName('- Rate -', self )
+ self.coolingRate = settings.FloatSpin().getFromValue( 1.0, 'Cooling Rate (Celcius/second):', self, 20.0, 3.0 )
+--- ori/48/skeinforge_application/skeinforge.py
++++ target/SF48/skeinforge_application/skeinforge.py
+@@ -228,6 +228,8 @@
+ from skeinforge_application.skeinforge_utilities import skeinforge_profile
+ import os
+ import sys
++import platform
++import subprocess
+
+
+ # document raft, stretch, then carve, comb, fill, inset, oozebane, splodge, temperature, speed once they are updated
+@@ -561,7 +563,6 @@
+ repository = getNewRepository()
+ repository.fileNameInput.value = fileName
+ repository.execute()
+- settings.startMainLoopFromConstructor(repository)
+
+
+ class SkeinforgeRepository:
+@@ -578,13 +579,35 @@
+ settings.LabelDisplay().getFromName('', self)
+ importantFileNames = ['craft', 'profile']
+ getRadioPluginsAddPluginGroupFrame(archive.getSkeinforgePluginsPath(), importantFileNames, getPluginFileNames(), self)
+- self.executeTitle = 'Skeinforge'
++ self.executeTitle = 'Skeinforge a file...'
++
++ def getPyPyExe(self):
++ pypyExe = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../../pypy-1.7/pypy.exe"));
++ if os.path.exists(pypyExe):
++ return pypyExe
++ pypyExe = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../../pypy-1.7/bin/pypy"));
++ if os.path.exists(pypyExe):
++ return pypyExe
++ pypyExe = "/bin/pypy";
++ if os.path.exists(pypyExe):
++ return pypyExe
++ pypyExe = "/usr/bin/pypy";
++ if os.path.exists(pypyExe):
++ return pypyExe
++ pypyExe = "/usr/local/bin/pypy";
++ if os.path.exists(pypyExe):
++ return pypyExe
++ return False
+
+ def execute(self):
+ 'Skeinforge button has been clicked.'
+ fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled)
++ pypyExe = self.getPyPyExe()
+ for fileName in fileNames:
+- skeinforge_craft.writeOutput(fileName)
++ if pypyExe == False or platform.python_implementation() == "PyPy":
++ skeinforge_craft.writeOutput(fileName)
++ else:
++ subprocess.call([pypyExe, __file__, fileName])
+
+ def save(self):
+ 'Profile has been saved and profile menu should be updated.'