2 Craft is a script to access the plugins which craft a gcode file.
4 The plugin buttons which are commonly used are bolded and the ones which are rarely used have normal font weight.
8 from __future__ import absolute_import
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
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'
28 def getChainText( fileName, procedure ):
29 "Get a crafted shape file."
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 )
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)
44 print('Warning, the text was not recognized in getChainTextFromProcedures in skeinforge_craft for')
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()
52 def getCraftModule(pluginName):
54 return archive.getModuleWithDirectoryPath(getPluginsDirectoryPath(), pluginName)
56 def getCraftPreferences(pluginName):
57 'Get craft preferences.'
58 return settings.getReadRepository(getCraftModule(pluginName).getNewRepository()).preferences
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
69 craftSequence = getReadCraftSequence()
70 if len( craftSequence ) < 1:
72 return getCraftModule( craftSequence[-1] )
74 def getNewRepository():
76 return CraftRepository()
78 def getPluginFileNames():
79 "Get craft plugin fileNames."
80 craftSequence = getReadCraftSequence()
84 def getPluginsDirectoryPath():
85 "Get the plugins directory path."
86 return archive.getCraftPluginsDirectoryPath()
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 :]
101 def getReadCraftSequence():
102 "Get profile sequence."
103 return skeinforge_profile.getCraftTypePluginModule().getCraftSequence()
105 def writeChainTextWithNounMessage(fileName, procedure, shouldAnalyze=True):
106 'Get and write a crafted shape file.'
108 print('The %s tool is parsing the file:' % procedure)
109 print(os.path.basename(fileName))
111 startTime = time.time()
112 fileNameSuffix = fileName[: fileName.rfind('.')] + '_' + procedure + '.gcode'
113 craftText = getChainText(fileName, procedure)
115 print('Warning, there was no text output in writeChainTextWithNounMessage in skeinforge_craft for:')
118 archive.writeFileText(fileNameSuffix, craftText)
121 window = skeinforge_analyze.writeOutput(fileName, fileNameSuffix, fileNameSuffix, True, craftText)
123 print('The %s tool has created the file:' % procedure)
124 print(fileNameSuffix)
126 print('It took %s to craft the file.' % euclidean.getDurationString(time.time() - startTime))
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)
135 def writeSVGTextWithNounMessage(fileName, repository, shouldAnalyze=True):
136 'Get and write an svg text and print messages.'
138 print('The %s tool is parsing the file:' % repository.lowerName)
139 print(os.path.basename(fileName))
141 startTime = time.time()
142 fileNameSuffix = fileName[: fileName.rfind('.')] + '_' + repository.lowerName + '.svg'
143 craftText = getChainText(fileName, repository.lowerName)
146 archive.writeFileText(fileNameSuffix, craftText)
148 print('The %s tool has created the file:' % repository.lowerName)
149 print(fileNameSuffix)
151 print('It took %s to craft the file.' % euclidean.getDurationString(time.time() - startTime))
153 settings.getReadRepository(repository)
154 settings.openSVGPage(fileNameSuffix, repository.svgViewer.value)
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()
167 def getFromRadioPlugins( self, radioPlugins, repository ):
169 self.name = 'CraftRadioButtonsSaveListener'
170 self.radioPlugins = radioPlugins
171 self.repository = repository
172 repository.displayEntities.append(self)
176 "Profile has been saved and craft radio plugins should be updated."
177 self.setRadioButtons()
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
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()
201 class CraftRepository(object):
202 "A class to handle the craft settings."
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'
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)
221 "Write craft output."
222 writeOutput(' '.join(sys.argv[1 :]), False)
224 if __name__ == "__main__":