1
2
3
4 import wx
5
6
7
8
9 from wx.lib.dialogs import *
10
11 import os
12
13 from arcjobtool.ArcUtils import *
14 from arcjobtool.Tasks import *
15 from arcjobtool.plugins.Plugins import *
16 from arcjobtool.PlatformUtils import *
17
18 runScriptTemplate = """#!/bin/sh
19 octave %s
20 """
21
24 BaseTask.__init__(self)
25
26 self.description = "Octave"
27
28
29
30 self.__mainFile = ""
31 self.packages = []
32 self.extraFiles = []
33
35 """
36 Abstract routine responsible for returning a
37 run-script for the job.
38 """
39 return runScriptTemplate % (self.__mainFile)
40
42 """
43 Abstract routines responsible for returning a jobdescription for
44 the job.
45 """
46
47
48
49 job = ManagedJobDescription();
50 job.Application.Executable.Name = "run.sh"
51 job.Identification.JobName = str(taskName)
52 job.Resources.TotalWallTime = arc.ScalableTimeInt(self.cpuTime*60)
53
54
55
56
57 for inputFile in self.inputFiles.keys():
58 url = self.inputFiles[inputFile]
59 if url == "":
60 fullPath = os.path.join(taskDir, inputFile)
61 job.addInputFile(fullPath)
62 else:
63 job.addInputFile(inputFile, url)
64
65 job.addRuntimeEnvironment("ENV/OCTAVE/OCTAVE",">=","1.0.0")
66 job.Application.Output = "stdout.txt"
67 job.Application.Error = "stderr.txt"
68 job.addOutputFile("/", "")
69
70 return job
71
73 config.add_section("octaveplugin")
74 config.set("octaveplugin", "mainfile", self.mainFile)
75
77 try:
78 self.mainFile = config.get("octaveplugin", "mainfile")
79 except:
80 pass
81
82 - def setMainFile(self, filename):
83 self.__mainFile = filename
84
85 - def getMainFile(self):
86 return self.__mainFile
87
90
93
96
99
100 mainFile = property(getMainFile, setMainFile)
101
157
158
161
162 kwds["style"] = wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER|wx.THICK_FRAME
163 wx.Dialog.__init__(self, *args, **kwds)
164 self.notebook_1 = wx.Notebook(self, -1, style=0)
165 self.generalPane = wx.Panel(self.notebook_1, -1)
166 self.nameLabel = wx.StaticText(self.generalPane, -1, "Name", style=wx.ALIGN_RIGHT)
167 self.jobNameText = wx.TextCtrl(self.generalPane, -1, "", style=wx.TE_READONLY)
168 self.cputTimeLabel = wx.StaticText(self.generalPane, -1, "CPU Time (min)", style=wx.ALIGN_RIGHT)
169 self.cpuTimeText = wx.TextCtrl(self.generalPane, -1, "")
170 self.notifyLabel = wx.StaticText(self.generalPane, -1, "Notify (email)", style=wx.ALIGN_RIGHT)
171 self.notifyText = wx.TextCtrl(self.generalPane, -1, "")
172 self.notifyMemoryLabel = wx.StaticText(self.generalPane, -1, "Memory (MB)", style=wx.ALIGN_RIGHT)
173 self.memoryText = wx.TextCtrl(self.generalPane, -1, "")
174 self.inputFilePane = wx.Panel(self.notebook_1, -1)
175 self.inputFilesLabel = wx.StaticText(self.inputFilePane, -1, "Input files")
176 self.inputFileList = wx.ListBox(self.inputFilePane, -1, choices=[])
177 self.createFileButton = wx.Button(self.inputFilePane, -1, "Create...")
178 self.addFileButton = wx.Button(self.inputFilePane, -1, "Add...")
179 self.removeFileButton = wx.Button(self.inputFilePane, -1, "Remove")
180 self.clearFilesButton = wx.Button(self.inputFilePane, -1, "Clear")
181 self.inputFileEditButton = wx.Button(self.inputFilePane, -1, "Edit...")
182 self.mainFileLabel = wx.StaticText(self.inputFilePane, -1, "Main octave file")
183 self.mainFileChoice = wx.Choice(self.inputFilePane, -1, choices=[])
184 self.parameterPane = wx.Panel(self.notebook_1, -1)
185 self.parameterFilesLabel = wx.StaticText(self.parameterPane, -1, "Parameter substitution files")
186 self.paramFilesList = wx.ListBox(self.parameterPane, -1, choices=[])
187 self.AddParamFileButton = wx.Button(self.parameterPane, -1, "Add...")
188 self.removeParamFileButton = wx.Button(self.parameterPane, -1, "Remove")
189 self.clearParamFilesButton = wx.Button(self.parameterPane, -1, "Clear")
190 self.paramFileEditButton = wx.Button(self.parameterPane, -1, "Edit...")
191 self.static_line_1 = wx.StaticLine(self.parameterPane, -1)
192 self.sweepSizeLabel = wx.StaticText(self.parameterPane, -1, "Sweep size", style=wx.ALIGN_RIGHT)
193 self.sweepSizeSpinner = wx.SpinCtrl(self.parameterPane, -1, "0", min=1, max=1000)
194 self.saveButton = wx.Button(self, -1, "Save")
195 self.closeButton = wx.Button(self, -1, "Close")
196
197 self.__set_properties()
198 self.__do_layout()
199
200 self.Bind(wx.EVT_BUTTON, self.onCreateFile, self.createFileButton)
201 self.Bind(wx.EVT_BUTTON, self.onAddFile, self.addFileButton)
202 self.Bind(wx.EVT_BUTTON, self.onRemoveFile, self.removeFileButton)
203 self.Bind(wx.EVT_BUTTON, self.onClearFiles, self.clearFilesButton)
204 self.Bind(wx.EVT_BUTTON, self.onEditInputFile, self.inputFileEditButton)
205 self.Bind(wx.EVT_CHOICE, self.onSelectMainFile, self.mainFileChoice)
206 self.Bind(wx.EVT_BUTTON, self.onAddParamFile, self.AddParamFileButton)
207 self.Bind(wx.EVT_BUTTON, self.onRemoveParamFileButton, self.removeParamFileButton)
208 self.Bind(wx.EVT_BUTTON, self.onClearParamFilesButton, self.clearParamFilesButton)
209 self.Bind(wx.EVT_BUTTON, self.onEditParamFile, self.paramFileEditButton)
210 self.Bind(wx.EVT_BUTTON, self.onSave, self.saveButton)
211 self.Bind(wx.EVT_BUTTON, self.onClose, self.closeButton)
212
213
215
216 self.SetTitle("Octave job definition")
217 self.SetSize((410, 368))
218 self.nameLabel.SetMinSize((120, -1))
219 self.jobNameText.SetMinSize((-1, 27))
220 self.cputTimeLabel.SetMinSize((120, -1))
221 self.cpuTimeText.SetMinSize((-1, 27))
222 self.notifyLabel.SetMinSize((120, -1))
223 self.notifyText.SetMinSize((-1, 27))
224 self.notifyMemoryLabel.SetMinSize((120, -1))
225 self.memoryText.SetMinSize((-1, 27))
226 self.sweepSizeLabel.SetMinSize((120, -1))
227
228
230
231 sizer_1 = wx.BoxSizer(wx.VERTICAL)
232 sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
233 sizer_11 = wx.BoxSizer(wx.VERTICAL)
234 sizer_12 = wx.BoxSizer(wx.HORIZONTAL)
235 sizer_13 = wx.BoxSizer(wx.HORIZONTAL)
236 sizer_14 = wx.BoxSizer(wx.VERTICAL)
237 sizer_9 = wx.BoxSizer(wx.VERTICAL)
238 sizer_10 = wx.BoxSizer(wx.VERTICAL)
239 sizer_8 = wx.BoxSizer(wx.HORIZONTAL)
240 sizer_9_copy = wx.BoxSizer(wx.VERTICAL)
241 sizer_3 = wx.BoxSizer(wx.VERTICAL)
242 sizer_7 = wx.BoxSizer(wx.HORIZONTAL)
243 sizer_6 = wx.BoxSizer(wx.HORIZONTAL)
244 sizer_5 = wx.BoxSizer(wx.HORIZONTAL)
245 sizer_4 = wx.BoxSizer(wx.HORIZONTAL)
246 sizer_4.Add(self.nameLabel, 0, wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5)
247 sizer_4.Add(self.jobNameText, 1, wx.RIGHT|wx.EXPAND, 4)
248 sizer_3.Add(sizer_4, 0, wx.TOP|wx.EXPAND, 10)
249 sizer_5.Add(self.cputTimeLabel, 0, wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5)
250 sizer_5.Add(self.cpuTimeText, 1, wx.RIGHT|wx.EXPAND|wx.ADJUST_MINSIZE, 4)
251 sizer_3.Add(sizer_5, 0, wx.EXPAND, 0)
252 sizer_6.Add(self.notifyLabel, 0, wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5)
253 sizer_6.Add(self.notifyText, 1, wx.RIGHT|wx.EXPAND|wx.ADJUST_MINSIZE, 4)
254 sizer_3.Add(sizer_6, 0, wx.EXPAND, 0)
255 sizer_7.Add(self.notifyMemoryLabel, 0, wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5)
256 sizer_7.Add(self.memoryText, 1, wx.RIGHT|wx.EXPAND|wx.ADJUST_MINSIZE, 5)
257 sizer_3.Add(sizer_7, 0, wx.EXPAND, 0)
258 self.generalPane.SetSizer(sizer_3)
259 sizer_9.Add(self.inputFilesLabel, 0, wx.LEFT|wx.TOP|wx.ADJUST_MINSIZE, 4)
260 sizer_8.Add(self.inputFileList, 1, wx.ALL|wx.EXPAND|wx.ADJUST_MINSIZE, 4)
261 sizer_9_copy.Add(self.createFileButton, 0, wx.ADJUST_MINSIZE, 0)
262 sizer_9_copy.Add(self.addFileButton, 0, wx.ADJUST_MINSIZE, 0)
263 sizer_9_copy.Add(self.removeFileButton, 0, wx.ADJUST_MINSIZE, 0)
264 sizer_9_copy.Add(self.clearFilesButton, 0, wx.ADJUST_MINSIZE, 0)
265 sizer_9_copy.Add(self.inputFileEditButton, 0, wx.TOP|wx.ADJUST_MINSIZE, 7)
266 sizer_8.Add(sizer_9_copy, 0, wx.ALL|wx.EXPAND, 4)
267 sizer_9.Add(sizer_8, 1, wx.EXPAND, 0)
268 sizer_10.Add(self.mainFileLabel, 0, wx.ADJUST_MINSIZE, 0)
269 sizer_10.Add(self.mainFileChoice, 0, wx.EXPAND|wx.ADJUST_MINSIZE, 0)
270 sizer_9.Add(sizer_10, 0, wx.ALL|wx.EXPAND, 4)
271 self.inputFilePane.SetSizer(sizer_9)
272 sizer_11.Add(self.parameterFilesLabel, 0, wx.LEFT|wx.TOP|wx.ADJUST_MINSIZE, 4)
273 sizer_13.Add(self.paramFilesList, 1, wx.ALL|wx.EXPAND|wx.ADJUST_MINSIZE, 4)
274 sizer_14.Add(self.AddParamFileButton, 0, wx.ADJUST_MINSIZE, 0)
275 sizer_14.Add(self.removeParamFileButton, 0, wx.ADJUST_MINSIZE, 0)
276 sizer_14.Add(self.clearParamFilesButton, 0, wx.ADJUST_MINSIZE, 0)
277 sizer_14.Add(self.paramFileEditButton, 0, wx.TOP|wx.ADJUST_MINSIZE, 7)
278 sizer_13.Add(sizer_14, 0, wx.ALL|wx.EXPAND, 4)
279 sizer_11.Add(sizer_13, 1, wx.EXPAND, 0)
280 sizer_11.Add(self.static_line_1, 0, wx.TOP|wx.EXPAND, 5)
281 sizer_12.Add(self.sweepSizeLabel, 0, wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 0)
282 sizer_12.Add(self.sweepSizeSpinner, 0, wx.TOP|wx.ADJUST_MINSIZE, 2)
283 sizer_11.Add(sizer_12, 0, wx.TOP|wx.BOTTOM|wx.EXPAND, 4)
284 self.parameterPane.SetSizer(sizer_11)
285 self.notebook_1.AddPage(self.generalPane, "General")
286 self.notebook_1.AddPage(self.inputFilePane, "Input files")
287 self.notebook_1.AddPage(self.parameterPane, "Parameters")
288 sizer_1.Add(self.notebook_1, 1, wx.ALL|wx.EXPAND, 8)
289 sizer_2.Add(self.saveButton, 0, wx.ADJUST_MINSIZE, 0)
290 sizer_2.Add(self.closeButton, 0, wx.ADJUST_MINSIZE, 0)
291 sizer_1.Add(sizer_2, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER_HORIZONTAL, 4)
292 self.SetSizer(sizer_1)
293 self.Layout()
294
295
323
325
326 self.paramFilesList.Clear()
327
328
329
330 if self.__task!=None:
331 for sweepFile in self.__task.sweepFiles.keys():
332 print sweepFile
333 self.paramFilesList.Append(sweepFile)
334
335
337 self.__task.cpuTime = int(self.cpuTimeText.GetValue())
338 self.__task.notify = self.notifyText.GetValue()
339 self.__task.memory = int(self.memoryText.GetValue())
340 self.__task.sweepSize = int(self.sweepSizeSpinner.GetValue())
341 self.__task.dirty = True
342 self.Close()
343
345 self.__task.dirty = False
346 self.Close()
347
349 self.__task = task
350
351 self.jobNameText.SetValue(self.__task.name)
352 self.cpuTimeText.SetValue(str(self.__task.cpuTime))
353 self.notifyText.SetValue(self.__task.notify)
354 self.memoryText.SetValue(str(self.__task.memory))
355 self.sweepSizeSpinner.SetValue(int(self.__task.sweepSize))
356
357 self.__setupInputFiles()
358 self.__setupSweepFiles()
359
362
364 inputFilename = wx.FileSelector("Add input file", default_path=os.getcwd())
365 if inputFilename != "":
366 self.__task.addAndCopyInputFile(inputFilename)
367 self.__setupInputFiles()
368
370 if self.inputFileList.GetStringSelection()!="":
371 self.__task.removeInputFile(self.inputFileList.GetStringSelection())
372 self.__setupInputFiles()
373
375 self.__task.clearInputFiles()
376 self.__setupInputFiles()
377
378 task = property(getTask, setTask)
379
380 - def onSelectMainFile(self, event):
381 mainFile = self.mainFileChoice.GetStringSelection()
382 if mainFile != "":
383 self.__task.mainFile = mainFile
384
386 result = singleChoiceDialog(self, "Add file for substitution", "Input files", self.__task.inputFiles)
387 if result.accepted:
388 self.__task.addSweepFile(result.selection)
389 self.__setupSweepFiles()
390
392 if self.paramFilesList.GetStringSelection()!="":
393 self.__task.removeSweepFile(self.paramFilesList.GetStringSelection())
394 self.__setupSweepFiles()
395
397 self.__task.clearSweepFiles()
398 self.__setupSweepFiles()
399
401 if self.inputFileList.GetStringSelection()!="":
402 fullPath = os.path.join(self.__task.workDir,self.inputFileList.GetStringSelection())
403 editFile(fullPath)
404
406 if self.paramFilesList.GetStringSelection()!="":
407 fullPath = os.path.join(self.__task.workDir,self.paramFilesList.GetStringSelection())
408 editFile(fullPath)
409
411 result = textEntryDialog(self, "Create file", "Filename", "noname.m")
412
413 if result.accepted:
414 fullPath = os.path.join(self.__task.workDir, str(result.text))
415
416 newFile = open(fullPath, "w")
417 newFile.close()
418
419 editFile(fullPath)
420
421 self.__task.addAndCopyInputFile(fullPath, copyFile = False)
422 self.__setupInputFiles()
423
424
425
426 if __name__ == "__main__":
427 app = wx.PySimpleApp(0)
428 wx.InitAllImageHandlers()
429 mainDialog = OctavePluginDialog(None, -1, "")
430 app.SetTopWindow(mainDialog)
431 mainDialog.Show()
432 app.MainLoop()
433