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