chiark / gitweb /
Add uppercase STL and HEX to file dialog filters for linux/MacOS
[cura.git] / Cura / cura_sf / fabmetheus_utilities / fabmetheus_tools / fabmetheus_interpret.py
1 """
2 Fabmetheus interpret is a fabmetheus utility to interpret a file, turning it into fabmetheus constructive solid geometry xml.
3
4 """
5
6 from __future__ import absolute_import
7 #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.
8 import __init__
9
10 from fabmetheus_utilities import archive
11 from fabmetheus_utilities import euclidean
12 from fabmetheus_utilities import gcodec
13 from fabmetheus_utilities import settings
14 from skeinforge_application.skeinforge_utilities import skeinforge_polyfile
15 from skeinforge_application.skeinforge_utilities import skeinforge_profile
16 import os
17 import time
18
19
20 __author__ = 'Enrique Perez (perez_enrique@yahoo.com)'
21 __date__ = '$Date: 2008/21/04 $'
22 __license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html'
23
24
25 def getCarving(fileName):
26         "Get carving."
27         pluginModule = getInterpretPlugin(fileName)
28         if pluginModule == None:
29                 return None
30         return pluginModule.getCarving(fileName)
31
32 def getGNUTranslatorFilesUnmodified():
33         "Get the file types from the translators in the import plugins folder."
34         return archive.getFilesWithFileTypesWithoutWords(getImportPluginFileNames())
35
36 def getGNUTranslatorGcodeFileTypeTuples():
37         "Get the file type tuples from the translators in the import plugins folder plus gcode."
38         fileTypeTuples = getTranslatorFileTypeTuples()
39         fileTypeTuples.append( ('Gcode text files', '*.gcode') )
40         fileTypeTuples.sort()
41         return fileTypeTuples
42
43 def getImportPluginFileNames():
44         "Get interpret plugin fileNames."
45         return archive.getPluginFileNamesFromDirectoryPath( getPluginsDirectoryPath() )
46
47 def getInterpretPlugin(fileName):
48         "Get the interpret plugin for the file."
49         importPluginFileNames = getImportPluginFileNames()
50         for importPluginFileName in importPluginFileNames:
51                 fileTypeDot = '.' + importPluginFileName
52                 if fileName[ - len(fileTypeDot) : ].lower() == fileTypeDot:
53                         importPluginsDirectoryPath = getPluginsDirectoryPath()
54                         pluginModule = archive.getModuleWithDirectoryPath( importPluginsDirectoryPath, importPluginFileName )
55                         if pluginModule != None:
56                                 return pluginModule
57         print('Could not find plugin to handle ' + fileName )
58         return None
59
60 def getNewRepository():
61         'Get new repository.'
62         return InterpretRepository()
63
64 def getPluginsDirectoryPath():
65         "Get the plugins directory path."
66         return archive.getInterpretPluginsPath()
67
68 def getTranslatorFileTypeTuples():
69         "Get the file types from the translators in the import plugins folder."
70         importPluginFileNames = getImportPluginFileNames()
71         fileTypeTuples = []
72         for importPluginFileName in importPluginFileNames:
73                 fileTypeTitle = importPluginFileName.upper() + ' files'
74                 fileType = ( fileTypeTitle, '*.' + importPluginFileName )
75                 fileTypeTuples.append( fileType )
76         fileTypeTuples.sort()
77         return fileTypeTuples
78
79 def getWindowAnalyzeFile(fileName):
80         "Get file interpretion."
81         startTime = time.time()
82         carving = getCarving(fileName)
83         if carving == None:
84                 return None
85         interpretGcode = str( carving )
86         if interpretGcode == '':
87                 return None
88         repository = settings.getReadRepository( InterpretRepository() )
89         if repository.printInterpretion.value:
90                 print(interpretGcode)
91         suffixFileName = fileName[ : fileName.rfind('.') ] + '_interpret.' + carving.getInterpretationSuffix()
92         suffixDirectoryName = os.path.dirname(suffixFileName)
93         suffixReplacedBaseName = os.path.basename(suffixFileName).replace(' ', '_')
94         suffixFileName = os.path.join( suffixDirectoryName, suffixReplacedBaseName )
95         archive.writeFileText( suffixFileName, interpretGcode )
96         print('The interpret file is saved as ' + archive.getSummarizedFileName(suffixFileName) )
97         print('It took %s to interpret the file.' % euclidean.getDurationString( time.time() - startTime ) )
98         textProgram = repository.textProgram.value
99         if textProgram == '':
100                 return None
101         if textProgram == 'webbrowser':
102                 settings.openWebPage(suffixFileName)
103                 return None
104         textFilePath = '"' + os.path.normpath(suffixFileName) + '"' # " to send in file name with spaces
105         shellCommand = textProgram + ' ' + textFilePath
106         print('Sending the shell command:')
107         print(shellCommand)
108         commandResult = os.system(shellCommand)
109         if commandResult != 0:
110                 print('It may be that the system could not find the %s program.' % textProgram )
111                 print('If so, try installing the %s program or look for another one, like Open Office which can be found at:' % textProgram )
112                 print('http://www.openoffice.org/')
113                 print('Open office writer can then be started from the command line with the command "soffice -writer".')
114
115
116 class InterpretRepository:
117         "A class to handle the interpret settings."
118         def __init__(self):
119                 "Set the default settings, execute title & settings fileName."
120                 skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.analyze_plugins.interpret.html', self)
121                 self.fileNameInput = settings.FileNameInput().getFromFileName( getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Interpret', self, '')
122                 self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Interpret')
123                 self.activateInterpret = settings.BooleanSetting().getFromValue('Activate Interpret', self, False )
124                 self.printInterpretion = settings.BooleanSetting().getFromValue('Print Interpretion', self, False )
125                 self.textProgram = settings.StringSetting().getFromValue('Text Program:', self, 'webbrowser')
126                 self.executeTitle = 'Interpret'
127
128         def execute(self):
129                 "Write button has been clicked."
130                 fileNames = skeinforge_polyfile.getFileOrGcodeDirectory( self.fileNameInput.value, self.fileNameInput.wasCancelled )
131                 for fileName in fileNames:
132                         getWindowAnalyzeFile(fileName)