Package PyFoam :: Package Applications :: Module APoMaFoXiiQt
[hide private]
[frames] | no frames]

Source Code for Module PyFoam.Applications.APoMaFoXiiQt

  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       
24 -class APoMaFoXiiQt(PyFoamApplication, 25 CommonCaseBuilder):
26 - def __init__(self,args=None):
27 description="""\ 28 APoMaFoX is "A Poor Mans FoamX". 29 30 A small text interface to the CaseBuilder-Functionality 31 """ 32 PyFoamApplication.__init__(self, 33 args=args, 34 description=description, 35 usage="%prog <caseBuilderFile>", 36 interspersed=True, 37 nr=0, 38 exactNr=False)
39
40 - def addOptions(self):
42
43 - def run(self):
44 if self.pathInfo(): 45 return 46 47 app = QtGui.QApplication(self.parser.getArgs()) 48 49 fName=None 50 if len(self.parser.getArgs())==0: 51 dialog=CaseBuilderBrowser() 52 if len(dialog.descriptions)==1: 53 fName=dialog.descriptions[0][1] 54 self.warning("Automatically choosing the only description",fName) 55 elif len(self.parser.getArgs())==1: 56 fName=self.searchDescriptionFile(self.parser.getArgs()[0]) 57 58 if not path.exists(fName): 59 error("The description file",fName,"does not exist") 60 else: 61 error("Too many arguments") 62 63 if fName!=None: 64 dialog=CaseBuilderDialog(fName) 65 66 dialog.show() 67 sys.exit(app.exec_())
68
69 -class ComboWrapper(QtGui.QComboBox):
70 - def __init__(self):
71 super(ComboWrapper,self).__init__()
72
73 - def text(self):
74 return str(self.currentText())
75
76 -class FilenameWrapper(QtGui.QWidget):
77 - def __init__(self,parent=None):
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
87 - def pushed(self):
88 try: 89 theDir=path.dirname(self.text()) 90 except AttributeError: 91 theDir=path.abspath(path.curdir) 92 93 fName=QtGui.QFileDialog.getOpenFileName(self, # parent 94 "Select File", # caption 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
104 - def text(self):
105 return path.abspath(str(self.name.text()))
106
107 -class CaseBuilderQt(QtGui.QDialog):
108 """The common denominator for the windows"""
109 - def __init__(self,parent=None):
110 super(CaseBuilderQt,self).__init__(parent) 111 self.status=None
112
113 - def setStatus(self,text):
114 print text 115 if not self.status: 116 self.status=QtGui.QStatusBar(self) 117 self.layout().addWidget(self.status) 118 119 self.status.showMessage(text)
120
121 -class CaseBuilderBrowser(CaseBuilderQt):
122 """A browser of all the available descriptions"""
123 - def __init__(self):
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
157 - def selectPressed(self):
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
178 -class CaseBuilderDialog(CaseBuilderQt):
179 """A dialog for a CaswBuilder-dialog"""
180 - def __init__(self,fName,parent=None):
181 CaseBuilderQt.__init__(self,parent=parent) 182 183 self.desc=CaseBuilderFile(fName) 184 185 # print "Read case description",self.desc.name() 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
284 - def generatePressed(self):
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