1
2 """Parse options for the PyFoam-Scripts"""
3
4 from optparse import OptionParser,TitledHelpFormatter
5 from PyFoam import versionString
6
7 from PyFoam.FoamInformation import changeFoamVersion
8 from PyFoam.FoamInformation import oldAppConvention as oldApp
9
10 from PyFoam.Error import error,warning
11
12 from os import path
13
15 """Wrapper to the usual OptionParser to honor the conventions of OpenFOAM-utilities
16
17 Options that are not used by the script are passed to the OpenFOAM-application"""
18
19 - def __init__(self,args=None,usage=None,version=None,description=None,interspersed=False):
20 """
21 @param usage: usage string. If missing a default is used
22 @param version: if missing the PyFoam-version is used
23 @param description: description of the utility
24 @param interspersed: needs to be false if options should be passed to an OpenFOAM-utility
25 @param args: Command line arguments. If unset sys.argv[1:] is used.
26 Can be a string: it will be splitted then unsing the spaces (very primitive), or a list of strings (prefered)
27 """
28 if usage==None:
29 if oldApp():
30 usage="%prog [options] <foamApplication> <caseDir> <caseName> [foamOptions]"
31 else:
32 usage="%prog [options] <foamApplication> [foamOptions]"
33
34 if version==None:
35 version="%prog "+versionString()
36
37 if args==None:
38 self.argLine=None
39 elif type(args)==str:
40 self.argLine=args.split()
41 else:
42 self.argLine=map(str,args)
43
44 OptionParser.__init__(self,usage=usage,version=version,description=description,formatter=TitledHelpFormatter())
45
46 if interspersed:
47 self.enable_interspersed_args()
48 else:
49 self.disable_interspersed_args()
50
51 self.options=None
52 self.args=None
53
54 - def parse(self,nr=None,exactNr=True):
55 """
56 parse the options
57 @param nr: minimum number of arguments that are to be passed to the application
58 3 is default for pre-1.5 versions of OpenFOAM
59 """
60 (self.options,self.args)=self.parse_args(args=self.argLine)
61
62 if "foamVersion" in dir(self.options):
63 if self.options.foamVersion!=None:
64 if self.options.force32 and self.options.force64:
65 error("A version can't be 32 and 64 bit at the same time")
66 changeFoamVersion(self.options.foamVersion,
67 force64=self.options.force64,
68 force32=self.options.force32,
69 compileOption=self.options.compileOption)
70 elif self.options.force32 or self.options.force64:
71 warning("Foring version to be 32 or 64 bit, but no version chosen. Doing nothing")
72 elif self.options.compileOption:
73 warning("No OpenFOAM-version chosen. Can't set compile-option to",self.options.compileOption)
74
75 if nr==None:
76 if oldApp():
77 nr=3
78 else:
79 nr=1
80
81 if len(self.args)<nr:
82 self.error("Too few arguments (%d needed, %d given)" %(nr,len(self.args)))
83
84 maxNr=nr
85 if not oldApp():
86 if "-case" in self.args:
87 maxNr+=2
88
89 if exactNr and len(self.args)>maxNr:
90 self.error("Too many arguments (%d needed, %d given)" %(nr,len(self.args)))
91
92 tmp=self.args
93 self.args=[]
94 for a in tmp:
95 if a.find(" ")>=0 or a.find("(")>=0:
96 a="\""+a+"\""
97 self.args.append(a)
98
100 """Return the arguments left after parsing"""
101 if self.args!=None:
102 return self.args
103 else:
104 return []
105
107 """Return the OpenFOAM-Application to be run"""
108 if self.args!=None:
109 return self.args[0]
110 else:
111 return None
112
114 """Return the options"""
115 if self.options==None:
116 self.error("options have not been parsed yet")
117
118 return self.options
119
129