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