""" This page is in the table of contents. Temperature is a script to set the temperature for the object and raft. ==Operation== The default 'Activate Temperature' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. ==Settings== ===Rate=== The default cooling rate and heating rate for the extruder were both been derived from bothacker's graph at: http://bothacker.com/wp-content/uploads/2009/09/18h5m53s9.29.2009.png ====Cooling Rate==== Default is three degrees Celcius per second. Defines the cooling rate of the extruder. ====Heating Rate==== Default is ten degrees Celcius per second. Defines the heating rate of the extruder. ===Temperature=== ====Chamber Temperature==== Default is twenty five degrees Celcius. Defines the chamber temperature. If there is no chamber, the chamber temperature will be slightly higher than room temperature. ====Base Temperature==== Default for ABS is two hundred degrees Celcius. Defines the raft base temperature. ====Interface Temperature==== Default for ABS is two hundred degrees Celcius. Defines the raft interface temperature. ====Object First Layer Infill Temperature==== Default for ABS is 195 degrees Celcius. Defines the infill temperature of the first layer of the object. ====Object First Layer Perimeter Temperature==== Default for ABS is two hundred and twenty degrees Celcius. Defines the perimeter temperature of the first layer of the object. ====Object Next Layers Temperature==== Default for ABS is two hundred and thirty degrees Celcius. Defines the temperature of the next layers of the object. ====Support Layers Temperature==== Default for ABS is two hundred degrees Celcius. Defines the support layers temperature. ====Supported Layers Temperature==== Default for ABS is two hundred and thirty degrees Celcius. Defines the temperature of the supported layers of the object, those layers which are right above a support layer. ==Examples== The following examples add temperature information to the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and temperature.py. > python temperature.py This brings up the temperature dialog. > python temperature.py Screw Holder Bottom.stl The temperature tool is parsing the file: Screw Holder Bottom.stl .. The temperature tool has created the file: .. Screw Holder Bottom_temperature.gcode > python Python 2.5.1 (r251:54863, Sep 22 2007, 01:43:31) [GCC 4.2.1 (SUSE Linux)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import temperature >>> temperature.main() This brings up the temperature dialog. >>> temperature.writeOutput( 'Screw Holder Bottom.stl' ) The temperature tool is parsing the file: Screw Holder Bottom.stl .. The temperature tool has created the file: .. Screw Holder Bottom_temperature.gcode """ 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__ from skeinforge_tools import analyze from skeinforge_tools import profile from skeinforge_tools.meta_plugins import polyfile from skeinforge_tools.skeinforge_utilities import consecution from skeinforge_tools.skeinforge_utilities import euclidean from skeinforge_tools.skeinforge_utilities import gcodec from skeinforge_tools.skeinforge_utilities import intercircle from skeinforge_tools.skeinforge_utilities import interpret from skeinforge_tools.skeinforge_utilities import settings import math import sys __author__ = "Enrique Perez (perez_enrique@yahoo.com)" __date__ = "$Date: 2008/21/04 $" __license__ = "GPL 3.0" def getCraftedText( fileName, text = '', repository = None ): "Temperature the file or text." return getCraftedTextFromText( gcodec.getTextIfEmpty( fileName, text ), repository ) def getCraftedTextFromText( gcodeText, repository = None ): "Temperature a gcode linear move text." if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'temperature' ): return gcodeText if repository == None: repository = settings.getReadRepository( TemperatureRepository() ) if not repository.activateTemperature.value: return gcodeText return TemperatureSkein().getCraftedGcode( gcodeText, repository ) def getNewRepository(): "Get the repository constructor." return TemperatureRepository() def writeOutput( fileName = '' ): "Temperature a gcode linear move file." fileName = interpret.getFirstTranslatorFileNameUnmodified( fileName ) if fileName != '': consecution.writeChainTextWithNounMessage( fileName, 'temperature' ) class TemperatureRepository: "A class to handle the temperature settings." def __init__( self ): "Set the default settings, execute title & settings fileName." profile.addListsToCraftTypeRepository( 'skeinforge_tools.craft_plugins.temperature.html', self ) self.fileNameInput = settings.FileNameInput().getFromFileName( interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Temperature', self, '' ) self.activateTemperature = settings.BooleanSetting().getFromValue( 'Activate Temperature:', self, True ) settings.LabelSeparator().getFromRepository( self ) settings.LabelDisplay().getFromName( '- Rate -', self ) self.coolingRate = settings.FloatSpin().getFromValue( 0.0, 'Cooling Rate (Celcius/second):', self, 20.0, 3.0 ) self.heatingRate = settings.FloatSpin().getFromValue( 0.0, 'Heating Rate (Celcius/second):', self, 20.0, 10.0 ) settings.LabelSeparator().getFromRepository( self ) settings.LabelDisplay().getFromName( '- Temperature -', self ) self.chamberTemperature = settings.FloatSpin().getFromValue( 0.0, 'Chamber Temperature (Celcius):', self, 100.0, 25.0 ) self.baseTemperature = settings.FloatSpin().getFromValue( 140.0, 'Base Temperature (Celcius):', self, 260.0, 200.0 ) self.interfaceTemperature = settings.FloatSpin().getFromValue( 140.0, 'Interface Temperature (Celcius):', self, 260.0, 200.0 ) self.objectFirstLayerInfillTemperature = settings.FloatSpin().getFromValue( 140.0, 'Object First Layer Infill Temperature (Celcius):', self, 260.0, 195.0 ) self.objectFirstLayerPerimeterTemperature = settings.FloatSpin().getFromValue( 140.0, 'Object First Layer Perimeter Temperature (Celcius):', self, 260.0, 220.0 ) self.objectNextLayersTemperature = settings.FloatSpin().getFromValue( 140.0, 'Object Next Layers Temperature (Celcius):', self, 260.0, 230.0 ) self.supportLayersTemperature = settings.FloatSpin().getFromValue( 140.0, 'Support Layers Temperature (Celcius):', self, 260.0, 200.0 ) self.supportedLayersTemperature = settings.FloatSpin().getFromValue( 140.0, 'Supported Layers Temperature (Celcius):', self, 260.0, 230.0 ) self.executeTitle = 'Temperature' def execute( self ): "Temperature button has been clicked." fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled ) for fileName in fileNames: writeOutput( fileName ) class TemperatureSkein: "A class to temperature a skein of extrusions." def __init__( self ): self.distanceFeedRate = gcodec.DistanceFeedRate() self.lineIndex = 0 self.lines = None def getCraftedGcode( self, gcodeText, repository ): "Parse gcode text and store the temperature gcode." self.repository = repository self.lines = gcodec.getTextLines( gcodeText ) self.parseInitialization() self.distanceFeedRate.addLines( self.lines[ self.lineIndex : ] ) # for line in self.lines[ self.lineIndex : ]: # self.parseLine( line ) return self.distanceFeedRate.output.getvalue() def parseInitialization( self ): "Parse gcode initialization and store the parameters." for self.lineIndex in xrange( len( self.lines ) ): line = self.lines[ self.lineIndex ] splitLine = gcodec.getSplitLineBeforeBracketSemicolon( line ) firstWord = gcodec.getFirstWord( splitLine ) self.distanceFeedRate.parseSplitLine( firstWord, splitLine ) if firstWord == '()': self.distanceFeedRate.addLine( '( temperature )' ) return elif firstWord == '(': self.distanceFeedRate.addTagBracketedLine( 'coolingRate', self.repository.coolingRate.value ) self.distanceFeedRate.addTagBracketedLine( 'heatingRate', self.repository.heatingRate.value ) self.distanceFeedRate.addTagBracketedLine( 'chamberTemperature', self.repository.chamberTemperature.value ) self.distanceFeedRate.addTagBracketedLine( 'baseTemperature', self.repository.baseTemperature.value ) self.distanceFeedRate.addTagBracketedLine( 'interfaceTemperature', self.repository.interfaceTemperature.value ) self.distanceFeedRate.addTagBracketedLine( 'objectFirstLayerInfillTemperature', self.repository.objectFirstLayerInfillTemperature.value ) self.distanceFeedRate.addTagBracketedLine( 'objectFirstLayerPerimeterTemperature', self.repository.objectFirstLayerPerimeterTemperature.value ) self.distanceFeedRate.addTagBracketedLine( 'objectNextLayersTemperature', self.repository.objectNextLayersTemperature.value ) self.distanceFeedRate.addTagBracketedLine( 'supportLayersTemperature', self.repository.supportLayersTemperature.value ) self.distanceFeedRate.addTagBracketedLine( 'supportedLayersTemperature', self.repository.supportedLayersTemperature.value ) self.distanceFeedRate.addLine( line ) def main(): "Display the temperature dialog." if len( sys.argv ) > 1: writeOutput( ' '.join( sys.argv[ 1 : ] ) ) else: settings.startMainLoopFromConstructor( getNewRepository() ) if __name__ == "__main__": main()