chiark / gitweb /
Add back the ultimaker platform, and made the platform mesh simpler.
[cura.git] / Cura / slice / cura_sf / skeinforge_application / skeinforge_utilities / skeinforge_craft.py
1 """
2 Craft is a script to access the plugins which craft a gcode file.
3
4 The plugin buttons which are commonly used are bolded and the ones which are rarely used have normal font weight.
5
6 """
7
8 from __future__ import absolute_import
9
10 from fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret
11 from fabmetheus_utilities import archive
12 from fabmetheus_utilities import euclidean
13 from fabmetheus_utilities import gcodec
14 from fabmetheus_utilities import settings
15 from skeinforge_application.skeinforge_utilities import skeinforge_analyze
16 from skeinforge_application.skeinforge_utilities import skeinforge_polyfile
17 from skeinforge_application.skeinforge_utilities import skeinforge_profile
18 import os
19 import sys
20 import time
21
22
23 __author__ = 'Enrique Perez (perez_enrique@yahoo.com)'
24 __date__ = '$Date: 2008/21/04 $'
25 __license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html'
26
27
28 def getChainText( fileName, procedure ):
29         "Get a crafted shape file."
30         text=''
31         if fileName.endswith('.gcode') or fileName.endswith('.svg'):
32                 text = archive.getFileText(fileName)
33         procedures = getProcedures( procedure, text )
34         return getChainTextFromProcedures( fileName, procedures, text )
35
36 def getChainTextFromProcedures(fileName, procedures, text):
37         'Get a crafted shape file from a list of procedures.'
38         lastProcedureTime = time.time()
39         for procedure in procedures:
40                 craftModule = getCraftModule(procedure)
41                 if craftModule != None:
42                         text = craftModule.getCraftedText(fileName, text)
43                         if text == '':
44                                 print('Warning, the text was not recognized in getChainTextFromProcedures in skeinforge_craft for')
45                                 print(fileName)
46                                 return ''
47                         if gcodec.isProcedureDone( text, procedure ):
48                                 print('%s procedure took %s (%d).' % (procedure.capitalize(), euclidean.getDurationString(time.time() - lastProcedureTime), len(text)))
49                                 lastProcedureTime = time.time()
50         return text
51
52 def getCraftModule(pluginName):
53         'Get craft module.'
54         return archive.getModuleWithDirectoryPath(getPluginsDirectoryPath(), pluginName)
55
56 def getCraftPreferences(pluginName):
57         'Get craft preferences.'
58         return settings.getReadRepository(getCraftModule(pluginName).getNewRepository()).preferences
59
60 def getCraftValue(preferenceName, preferences):
61         "Get craft preferences value."
62         for preference in preferences:
63                 if preference.name.startswith(preferenceName):
64                         return preference.value
65         return None
66
67 def getLastModule():
68         "Get the last tool."
69         craftSequence = getReadCraftSequence()
70         if len( craftSequence ) < 1:
71                 return None
72         return getCraftModule( craftSequence[-1] )
73
74 def getNewRepository():
75         'Get new repository.'
76         return CraftRepository()
77
78 def getPluginFileNames():
79         "Get craft plugin fileNames."
80         craftSequence = getReadCraftSequence()
81         craftSequence.sort()
82         return craftSequence
83
84 def getPluginsDirectoryPath():
85         "Get the plugins directory path."
86         return archive.getCraftPluginsDirectoryPath()
87
88 def getProcedures(procedure, text):
89         'Get the procedures up to and including the given procedure.'
90         craftSequence = getReadCraftSequence()
91         sequenceIndexFromProcedure = 0
92         if procedure in craftSequence:
93                 sequenceIndexFromProcedure = craftSequence.index(procedure)
94         craftSequence = craftSequence[: sequenceIndexFromProcedure + 1]
95         for craftSequenceIndex in xrange(len(craftSequence) - 1, -1, -1):
96                 procedure = craftSequence[craftSequenceIndex]
97                 if gcodec.isProcedureDone(text, procedure):
98                         return craftSequence[craftSequenceIndex + 1 :]
99         return craftSequence
100
101 def getReadCraftSequence():
102         "Get profile sequence."
103         return skeinforge_profile.getCraftTypePluginModule().getCraftSequence()
104
105 def writeChainTextWithNounMessage(fileName, procedure, shouldAnalyze=True):
106         'Get and write a crafted shape file.'
107         print('')
108         print('The %s tool is parsing the file:' % procedure)
109         print(os.path.basename(fileName))
110         print('')
111         startTime = time.time()
112         fileNameSuffix = fileName[: fileName.rfind('.')] + '_' + procedure + '.gcode'
113         craftText = getChainText(fileName, procedure)
114         if craftText == '':
115                 print('Warning, there was no text output in writeChainTextWithNounMessage in skeinforge_craft for:')
116                 print(fileName)
117                 return
118         archive.writeFileText(fileNameSuffix, craftText)
119         window = None
120         if shouldAnalyze:
121                 window = skeinforge_analyze.writeOutput(fileName, fileNameSuffix, fileNameSuffix, True, craftText)
122         print('')
123         print('The %s tool has created the file:' % procedure)
124         print(fileNameSuffix)
125         print('')
126         print('It took %s to craft the file.' % euclidean.getDurationString(time.time() - startTime))
127         return window
128
129 def writeOutput(fileName, shouldAnalyze=True):
130         "Craft a gcode file with the last module."
131         pluginModule = getLastModule()
132         if pluginModule != None:
133                 return pluginModule.writeOutput(fileName, shouldAnalyze)
134
135 def writeSVGTextWithNounMessage(fileName, repository, shouldAnalyze=True):
136         'Get and write an svg text and print messages.'
137         print('')
138         print('The %s tool is parsing the file:' % repository.lowerName)
139         print(os.path.basename(fileName))
140         print('')
141         startTime = time.time()
142         fileNameSuffix = fileName[: fileName.rfind('.')] + '_' + repository.lowerName + '.svg'
143         craftText = getChainText(fileName, repository.lowerName)
144         if craftText == '':
145                 return
146         archive.writeFileText(fileNameSuffix, craftText)
147         print('')
148         print('The %s tool has created the file:' % repository.lowerName)
149         print(fileNameSuffix)
150         print('')
151         print('It took %s to craft the file.' % euclidean.getDurationString(time.time() - startTime))
152         if shouldAnalyze:
153                 settings.getReadRepository(repository)
154                 settings.openSVGPage(fileNameSuffix, repository.svgViewer.value)
155
156
157 class CraftRadioButtonsSaveListener(object):
158         "A class to update the craft radio buttons."
159         def addToDialog( self, gridPosition ):
160                 "Add this to the dialog."
161                 euclidean.addElementToListDictionaryIfNotThere( self, self.repository.repositoryDialog, settings.globalProfileSaveListenerListTable )
162                 self.gridPosition = gridPosition.getCopy()
163                 self.gridPosition.row = gridPosition.rowStart
164                 self.gridPosition.increment()
165                 self.setRadioButtons()
166
167         def getFromRadioPlugins( self, radioPlugins, repository ):
168                 "Initialize."
169                 self.name = 'CraftRadioButtonsSaveListener'
170                 self.radioPlugins = radioPlugins
171                 self.repository = repository
172                 repository.displayEntities.append(self)
173                 return self
174
175         def save(self):
176                 "Profile has been saved and craft radio plugins should be updated."
177                 self.setRadioButtons()
178
179         def setRadioButtons(self):
180                 "Profile has been saved and craft radio plugins should be updated."
181                 activeRadioPlugins = []
182                 craftSequence = skeinforge_profile.getCraftTypePluginModule().getCraftSequence()
183                 gridPosition = self.gridPosition.getCopy()
184                 isRadioPluginSelected = False
185                 settings.getReadRepository(self.repository)
186                 for radioPlugin in self.radioPlugins:
187                         if radioPlugin.name in craftSequence:
188                                 activeRadioPlugins.append(radioPlugin)
189                                 radioPlugin.incrementGridPosition(gridPosition)
190                                 if radioPlugin.value:
191                                         radioPlugin.setSelect()
192                                         isRadioPluginSelected = True
193                         else:
194                                 radioPlugin.radiobutton.grid_remove()
195                 if not isRadioPluginSelected:
196                         radioPluginNames = self.repository.importantFileNames + [activeRadioPlugins[0].name]
197                         settings.getSelectedRadioPlugin(radioPluginNames , activeRadioPlugins).setSelect()
198                 self.repository.pluginFrame.update()
199
200
201 class CraftRepository(object):
202         "A class to handle the craft settings."
203         def __init__(self):
204                 "Set the default settings, execute title & settings fileName."
205                 skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_utilities.skeinforge_craft.html', self)
206                 self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Craft', self, '')
207                 self.importantFileNames = ['carve', 'chop', 'feed', 'flow', 'lift', 'raft', 'speed']
208                 allCraftNames = archive.getPluginFileNamesFromDirectoryPath(getPluginsDirectoryPath())
209                 self.radioPlugins = settings.getRadioPluginsAddPluginFrame(getPluginsDirectoryPath(), self.importantFileNames, allCraftNames, self)
210                 CraftRadioButtonsSaveListener().getFromRadioPlugins(self.radioPlugins, self)
211                 self.executeTitle = 'Craft'
212
213         def execute(self):
214                 "Craft button has been clicked."
215                 fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, [], self.fileNameInput.wasCancelled )
216                 for fileName in fileNames:
217                         writeOutput(fileName)
218
219
220 def main():
221         "Write craft output."
222         writeOutput(' '.join(sys.argv[1 :]), False)
223
224 if __name__ == "__main__":
225         main()