chiark / gitweb /
Add uppercase STL and HEX to file dialog filters for linux/MacOS
[cura.git] / Cura / skeinforge_application / skeinforge_plugins / craft.py
1 """
2 This page is in the table of contents.
3 Craft is a script to access the plugins which craft a gcode file.
4
5 The plugin buttons which are commonly used are bolded and the ones which are rarely used have normal font weight.
6
7 """
8
9 from __future__ import absolute_import
10 #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.
11 import __init__
12
13 from fabmetheus_utilities import archive
14 from fabmetheus_utilities import euclidean
15 from fabmetheus_utilities import gcodec
16 from fabmetheus_utilities import settings
17 from skeinforge_application.skeinforge_utilities import skeinforge_craft
18 from skeinforge_application.skeinforge_utilities import skeinforge_profile
19 import os
20 import sys
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 addSubmenus( menu, pluginFileName, pluginFolderPath, pluginPath ):
29         "Add a tool plugin menu."
30         submenu = settings.Tkinter.Menu( menu, tearoff = 0 )
31         menu.add_cascade( label = pluginFileName.capitalize(), menu = submenu )
32         settings.ToolDialog().addPluginToMenu( submenu, pluginPath )
33         submenu.add_separator()
34         submenuFileNames = archive.getPluginFileNamesFromDirectoryPath( pluginFolderPath )
35         for submenuFileName in submenuFileNames:
36                 settings.ToolDialog().addPluginToMenu( submenu, os.path.join( pluginFolderPath, submenuFileName ) )
37
38 def addToCraftMenu( menu ):
39         "Add a craft plugin menu."
40         settings.ToolDialog().addPluginToMenu(menu, archive.getUntilDot(archive.getSkeinforgePluginsPath('craft.py')))
41         menu.add_separator()
42         directoryPath = skeinforge_craft.getPluginsDirectoryPath()
43         directoryFolders = settings.getFolders(directoryPath)
44         pluginFileNames = skeinforge_craft.getPluginFileNames()
45         for pluginFileName in pluginFileNames:
46                 pluginFolderName = pluginFileName + '_plugins'
47                 pluginPath = os.path.join( directoryPath, pluginFileName )
48                 if pluginFolderName in directoryFolders:
49                         addSubmenus( menu, pluginFileName, os.path.join( directoryPath, pluginFolderName ), pluginPath )
50                 else:
51                         settings.ToolDialog().addPluginToMenu( menu, pluginPath )
52
53 def addToMenu( master, menu, repository, window ):
54         "Add a tool plugin menu."
55         CraftMenuSaveListener( menu, window )
56
57 def getNewRepository():
58         'Get new repository.'
59         return skeinforge_craft.CraftRepository()
60
61 def writeOutput(fileName):
62         "Craft a gcode file."
63         return skeinforge_craft.writeOutput(fileName)
64
65
66 class CraftMenuSaveListener:
67         "A class to update a craft menu."
68         def __init__( self, menu, window ):
69                 "Set the menu."
70                 self.menu = menu
71                 addToCraftMenu( menu )
72                 euclidean.addElementToListDictionaryIfNotThere( self, window, settings.globalProfileSaveListenerListTable )
73
74         def save(self):
75                 "Profile has been saved and profile menu should be updated."
76                 settings.deleteMenuItems( self.menu )
77                 addToCraftMenu( self.menu )
78
79
80 class CraftRadioButtonsSaveListener:
81         "A class to update the craft radio buttons."
82         def addToDialog( self, gridPosition ):
83                 "Add this to the dialog."
84                 euclidean.addElementToListDictionaryIfNotThere( self, self.repository.repositoryDialog, settings.globalProfileSaveListenerListTable )
85                 self.gridPosition = gridPosition.getCopy()
86                 self.gridPosition.increment()
87                 self.gridPosition.row = gridPosition.rowStart
88                 self.setRadioButtons()
89
90         def getFromRadioPlugins( self, radioPlugins, repository ):
91                 "Initialize."
92                 self.name = 'CraftRadioButtonsSaveListener'
93                 self.radioPlugins = radioPlugins
94                 self.repository = repository
95                 repository.displayEntities.append(self)
96                 return self
97
98         def save(self):
99                 "Profile has been saved and craft radio plugins should be updated."
100                 self.setRadioButtons()
101
102         def setRadioButtons(self):
103                 "Profile has been saved and craft radio plugins should be updated."
104                 craftSequence = skeinforge_profile.getCraftTypePluginModule().getCraftSequence()
105                 gridPosition = self.gridPosition.getCopy()
106                 maximumValue = False
107                 activeRadioPlugins = []
108                 for radioPlugin in self.radioPlugins:
109                         if radioPlugin.name in craftSequence:
110                                 activeRadioPlugins.append( radioPlugin )
111                                 radioPlugin.incrementGridPosition(gridPosition)
112                                 maximumValue = max( radioPlugin.value, maximumValue )
113                         else:
114                                 radioPlugin.radiobutton.grid_remove()
115                 if not maximumValue:
116                         selectedRadioPlugin = settings.getSelectedRadioPlugin( self.repository.importantFileNames + [ activeRadioPlugins[0].name ], activeRadioPlugins ).setSelect()
117                 self.repository.pluginFrame.update()
118
119
120 def main():
121         "Display the craft dialog."
122         if len(sys.argv) > 1:
123                 settings.startMainLoopFromWindow(writeOutput(' '.join(sys.argv[1 :])))
124         else:
125                 settings.startMainLoopFromConstructor(getNewRepository())
126
127 if __name__ == "__main__":
128         main()