2 Fabmetheus interpret is a fabmetheus utility to interpret a file, turning it into fabmetheus constructive solid geometry xml.
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.
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
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'
25 def getCarving(fileName):
27 pluginModule = getInterpretPlugin(fileName)
28 if pluginModule == None:
30 return pluginModule.getCarving(fileName)
32 def getGNUTranslatorFilesUnmodified():
33 "Get the file types from the translators in the import plugins folder."
34 return archive.getFilesWithFileTypesWithoutWords(getImportPluginFileNames())
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') )
43 def getImportPluginFileNames():
44 "Get interpret plugin fileNames."
45 return archive.getPluginFileNamesFromDirectoryPath( getPluginsDirectoryPath() )
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:
57 print('Could not find plugin to handle ' + fileName )
60 def getNewRepository():
62 return InterpretRepository()
64 def getPluginsDirectoryPath():
65 "Get the plugins directory path."
66 return archive.getInterpretPluginsPath()
68 def getTranslatorFileTypeTuples():
69 "Get the file types from the translators in the import plugins folder."
70 importPluginFileNames = getImportPluginFileNames()
72 for importPluginFileName in importPluginFileNames:
73 fileTypeTitle = importPluginFileName.upper() + ' files'
74 fileType = ( fileTypeTitle, '*.' + importPluginFileName )
75 fileTypeTuples.append( fileType )
79 def getWindowAnalyzeFile(fileName):
80 "Get file interpretion."
81 startTime = time.time()
82 carving = getCarving(fileName)
85 interpretGcode = str( carving )
86 if interpretGcode == '':
88 repository = settings.getReadRepository( InterpretRepository() )
89 if repository.printInterpretion.value:
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
101 if textProgram == 'webbrowser':
102 settings.openWebPage(suffixFileName)
104 textFilePath = '"' + os.path.normpath(suffixFileName) + '"' # " to send in file name with spaces
105 shellCommand = textProgram + ' ' + textFilePath
106 print('Sending the shell command:')
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".')
116 class InterpretRepository:
117 "A class to handle the interpret settings."
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'
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)