1 """
2 Exports the slicedModel to a file.
3
4 Credits:
5 Original Author: Enrique Perez (http://skeinforge.com)
6 Contributors: Please see the documentation in Skeinforge
7 Modifed as SFACT: Ahmet Cem Turan (github.com/ahmetcemturan/SFACT)
8
9 License:
10 GNU Affero General Public License http://www.gnu.org/licenses/agpl.html
11 """
12
13 from config import config
14 from datetime import timedelta
15 from fabmetheus_utilities import archive, euclidean
16 from utilities import memory_tracker
17 from gcode_writer import GcodeWriter
18 from StringIO import StringIO
19 import datetime
20 import logging
21 import os
22 import string
23 import time
24 try:
25 import cPickle as pickle
26 except:
27 import pickle
28
29 logger = logging.getLogger('export')
30 name = 'export'
31
40
42 'A class to export a skein of extrusions.'
44 self.slicedModel = slicedModel
45 self.deleteComments = config.getboolean(name, 'delete.comments')
46 self.fileExtension = config.get(name, 'file.extension')
47 self.nameOfReplaceFile = config.get(name, 'replace.filename')
48 self.exportSlicedModel = config.getboolean(name, 'export.slicedmodel')
49 self.exportSlicedModelExtension = config.get(name, 'export.slicedmodel.extension')
50 self.addProfileExtension = config.getboolean(name, 'file.extension.profile')
51 self.exportPickledSlicedModel = config.getboolean(name, 'export.pickled.slicedmodel')
52 self.exportPickledSlicedModelExtension = config.get(name, 'export.pickled.slicedmodel.extension')
53 self.overwritePickledSlicedModel = config.getboolean(name, 'overwrite.pickled.slicedmodel')
54
56 'Get text with strings replaced according to replace.csv file.'
57
58 fullReplaceFilePath = os.path.join('alterations', nameOfReplaceFile)
59
60 if self.nameOfReplaceFile == '' or not os.path.exists(fullReplaceFilePath):
61 return replaceableExportGcode
62
63 fullReplaceText = archive.getFileText(fullReplaceFilePath)
64 replaceLines = archive.getTextLines(fullReplaceText)
65 if len(replaceLines) < 1:
66 return replaceableExportGcode
67 for replaceLine in replaceLines:
68 splitLine = replaceLine.replace('\\n', '\t').split('\t')
69 if len(splitLine) > 0:
70 replaceableExportGcode = replaceableExportGcode.replace(splitLine[0], '\n'.join(splitLine[1 :]))
71 output = StringIO()
72
73 for line in archive.getTextLines(replaceableExportGcode):
74 if line != '':
75 output.write(line + '\n')
76
77 return output.getvalue()
78
80 'Perform final modifications to slicedModel and performs export.'
81
82 filename = self.slicedModel.runtimeParameters.inputFilename
83 filenamePrefix = os.path.splitext(filename)[0]
84
85 if self.slicedModel.runtimeParameters.outputFilename != None:
86 exportFileName = self.slicedModel.runtimeParameters.outputFilename
87 else :
88 exportFileName = filenamePrefix
89 profileName = self.slicedModel.runtimeParameters.profileName
90
91 if self.addProfileExtension and profileName:
92 exportFileName += '.' + string.replace(profileName, ' ', '_')
93 exportFileName += '.' + self.fileExtension
94 self.slicedModel.runtimeParameters.outputFilename = exportFileName
95
96 replaceableExportGcode = self.getReplaceableExportGcode(self.nameOfReplaceFile, GcodeWriter(self.slicedModel).getSlicedModelAsGcode())
97 archive.writeFileText(exportFileName, replaceableExportGcode)
98
99 if self.exportSlicedModel:
100 fileNamePenultimate = filenamePrefix + '.' + self.exportSlicedModelExtension
101 archive.writeFileText(fileNamePenultimate, str(self.slicedModel))
102 logger.info('Sliced Model slicedModel exported to: %s', fileNamePenultimate)
103
104 if self.exportPickledSlicedModel:
105 fileNamePickled = filenamePrefix + '.' + self.exportPickledSlicedModelExtension
106 if os.path.exists(fileNamePickled) and not self.overwritePickledSlicedModel:
107 backupFilename = '%s.%s.bak' % (fileNamePickled, datetime.datetime.now().strftime('%Y%m%d_%H%M%S_%f'))
108 os.rename(fileNamePickled, backupFilename)
109 logger.info('Existing slicedmodel file backed up to: %s', backupFilename)
110 logger.info('Pickled slicedmodel exported to: %s', fileNamePickled)
111 archive.writeFileText(fileNamePickled, pickle.dumps(self.slicedModel))
112
113 logger.info('Gcode exported to: %s', os.path.basename(exportFileName))
114