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