1 """
2 Application-class that implements pyFoamAPoMaFoX.py (A Poor Man's FoamX)
3 """
4 from optparse import OptionGroup
5 from os import path
6 import os
7 import shutil
8 import sys
9
10 from PyFoam.Applications.PyFoamApplication import PyFoamApplication
11 from PyFoam.Applications.CaseBuilderBackend import CaseBuilderFile,CaseBuilderDescriptionList
12 from PyFoam.Applications.CommonCaseBuilder import CommonCaseBuilder
13 from PyFoam import configuration as config
14
15 from PyFoam.Error import error,warning
16
17 try:
18 import PyQt4
19 except ImportError:
20 error("This application needs an installed PyQt4-library")
21
22 from PyQt4 import QtCore, QtGui
23
68
72
74 return str(self.currentText())
75
78 super(FilenameWrapper,self).__init__(parent)
79 layout=QtGui.QHBoxLayout()
80 self.name=QtGui.QLineEdit()
81 layout.addWidget(self.name)
82 button=QtGui.QPushButton("File ...")
83 layout.addWidget(button)
84 self.connect(button,QtCore.SIGNAL("clicked()"),self.pushed)
85 self.setLayout(layout)
86
88 try:
89 theDir=path.dirname(self.text())
90 except AttributeError:
91 theDir=path.abspath(path.curdir)
92
93 fName=QtGui.QFileDialog.getOpenFileName(self,
94 "Select File",
95 theDir)
96 if fName!="":
97 self.setText(str(fName))
98
99 return False
100
101 - def setText(self,txt):
102 self.name.setText(txt)
103
105 return path.abspath(str(self.name.text()))
106
108 """The common denominator for the windows"""
112
120
122 """A browser of all the available descriptions"""
124 CaseBuilderQt.__init__(self)
125
126 self.descriptions=CaseBuilderDescriptionList()
127 if len(self.descriptions)==0:
128 error("No description-files (.pfcb) found in path",config().get("CaseBuilder","descriptionpath"))
129
130 mainLayout = QtGui.QVBoxLayout()
131 self.setLayout(mainLayout)
132
133 self.descriptsList = QtGui.QListWidget()
134 self.descriptsList.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
135 mainLayout.addWidget(self.descriptsList)
136
137 self.itemlist=[]
138 for d in self.descriptions:
139 item=QtGui.QListWidgetItem(d[2])
140 item.setToolTip(d[3])
141 self.descriptsList.addItem(item)
142 self.itemlist.append((item,d))
143
144 buttons=QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Cancel)
145 mainLayout.addWidget(buttons)
146 selectButton=QtGui.QPushButton("Select")
147 selectButton.setToolTip("Select the case description that we want to work with")
148 buttons.addButton(selectButton,QtGui.QDialogButtonBox.AcceptRole)
149 try:
150 buttons.accepted.connect(self.selectPressed)
151 buttons.rejected.connect(self.reject)
152 except AttributeError:
153 warning("Old QT-version where QDialogButtonBox doesn't have the accepted/rejected-attributes")
154 self.connect(buttons,QtCore.SIGNAL("accepted()"),self.selectPressed)
155 self.connect(buttons,QtCore.SIGNAL("rejected()"),self.reject)
156
158 self.setStatus("Pressed selected")
159 selected=self.descriptsList.selectedItems()
160 if len(selected)!=1:
161 self.setStatus("Nothing selected")
162 return
163
164 desc=None
165 for it,d in self.itemlist:
166 if it==selected[0]:
167 desc=d
168 break
169
170 if desc==None:
171 self.setStatus("Did not find the selection")
172 return
173
174 self.setStatus("")
175 sub=CaseBuilderDialog(desc[1],parent=self)
176 sub.show()
177
179 """A dialog for a CaswBuilder-dialog"""
181 CaseBuilderQt.__init__(self,parent=parent)
182
183 self.desc=CaseBuilderFile(fName)
184
185
186
187 mainLayout = QtGui.QVBoxLayout()
188 self.setLayout(mainLayout)
189
190 mainLayout.addWidget(QtGui.QLabel("Builder Template: "
191 + self.desc.name()
192 +"\n"+self.desc.description()))
193
194 mainLayout.addWidget(QtGui.QLabel("Data Template: "
195 + self.desc.templatePath()))
196
197 try:
198 caseLayout=QtGui.QFormLayout()
199 except AttributeError:
200 warning("Qt-version without QFormLayout")
201 caseLayout=QtGui.QVBoxLayout()
202
203 mainLayout.addLayout(caseLayout)
204
205 self.caseName=QtGui.QLineEdit()
206 self.caseName.setToolTip("The name under which the case will be saved")
207
208 try:
209 caseLayout.addRow("Case name",self.caseName)
210 except AttributeError:
211 caseLayout.addWidget(QtGui.QLabel("Case name"))
212 caseLayout.addWidget(self.caseName)
213
214 args=self.desc.arguments()
215 mLen=apply(max,map(len,args))
216 aDesc=self.desc.argumentDescriptions()
217 aDef=self.desc.argumentDefaults()
218 allArgs=self.desc.argumentDict()
219
220 self.argfields={}
221
222 groups=[None]+self.desc.argumentGroups()
223 gDesc=self.desc.argumentGroupDescription()
224
225 theGroupTabs=QtGui.QTabWidget()
226 mainLayout.addWidget(theGroupTabs)
227
228 for g in groups:
229 if g==None:
230 name="Default"
231 desc="All the arguments that did not fit into another group"
232 else:
233 name=g
234 desc=gDesc[g]
235 gWidget=QtGui.QWidget()
236 try:
237 gLayout=QtGui.QFormLayout()
238 except AttributeError:
239 gLayout=QtGui.QVBoxLayout()
240 gWidget.setLayout(gLayout)
241 idx=theGroupTabs.addTab(gWidget,name)
242 theGroupTabs.setTabToolTip(idx,desc)
243
244 for a in self.desc.groupArguments(g):
245 theType=allArgs[a].type
246 if theType=="file":
247 print "File",a
248 aWidget=FilenameWrapper(self)
249 aWidget.setText(aDef[a])
250 elif theType=="selection":
251 aWidget=ComboWrapper()
252 aWidget.addItems(allArgs[a].values)
253 aWidget.setCurrentIndex(allArgs[a].values.index(aDef[a]))
254 else:
255 aWidget=QtGui.QLineEdit()
256 aWidget.setText(aDef[a])
257 aWidget.setToolTip(aDesc[a])
258 self.argfields[a]=aWidget
259 try:
260 gLayout.addRow(a,aWidget)
261 except AttributeError:
262 gLayout.addWidget(QtGui.QLabel(a))
263 gLayout.addWidget(aWidget)
264
265 bottomLayout=QtGui.QHBoxLayout()
266 mainLayout.addLayout(bottomLayout)
267
268 self.noClose=QtGui.QCheckBox("Don't close")
269 self.noClose.setToolTip("Do not close after 'Generate'")
270 bottomLayout.addWidget(self.noClose)
271
272 buttons=QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Cancel)
273 bottomLayout.addWidget(buttons)
274 generateButton=QtGui.QPushButton("Generate")
275 generateButton.setToolTip("Copy the template case and modify it according to the settings")
276 buttons.addButton(generateButton,QtGui.QDialogButtonBox.AcceptRole)
277 try:
278 buttons.accepted.connect(self.generatePressed)
279 buttons.rejected.connect(self.reject)
280 except AttributeError:
281 self.connect(buttons,QtCore.SIGNAL("accepted()"),self.generatePressed)
282 self.connect(buttons,QtCore.SIGNAL("rejected()"),self.reject)
283
285 self.setStatus("Pressed generate")
286 ok=False
287
288 caseName=str(self.caseName.text())
289 if len(caseName)==0:
290 self.setStatus("Casename empty")
291 return
292
293 if path.exists(caseName):
294 self.setStatus("Directory "+caseName+" already existing")
295 return
296
297 self.setStatus("Generating the case "+caseName)
298 args={}
299 for i,a in enumerate(self.desc.arguments()):
300 args[a]=str(self.argfields[a].text())
301 if len(args[a])==0:
302 self.setStatus("No argument "+a+" was given")
303 return
304
305 msg=self.desc.verifyArguments(args)
306 if msg:
307 self.setStatus(msg)
308 return
309
310 self.setStatus("With the arguments "+str(args))
311
312 self.desc.buildCase(caseName,args)
313 ok=True
314 if ok:
315 self.setStatus("")
316 if not self.noClose.isChecked():
317 self.accept()
318 else:
319 self.setStatus("Generated "+caseName)
320