Salome HOME
general crack dialog, user message mecanism for some errors
[modules/smesh.git] / src / Tools / blocFissure / ihm / fissureGenerale_plugin.py
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2006-2015  EDF R&D
4 #
5 # This library is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU Lesser General Public
7 # License as published by the Free Software Foundation; either
8 # version 2.1 of the License.
9 #
10 # This library is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 # Lesser General Public License for more details.
14 #
15 # You should have received a copy of the GNU Lesser General Public
16 # License along with this library; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
18 #
19 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #
21
22 # if you already have plugins defined in a salome_plugins.py file, add this file at the end.
23 # if not, copy this file as ${HOME}/Plugins/smesh_plugins.py or ${APPLI}/Plugins/smesh_plugins.py
24
25 import sys, traceback
26 import math
27 from blocFissure import gmu
28
29 def fissureGeneraleDlg(context):
30   # get context study, studyId, salomeGui
31   study = context.study
32   studyId = context.studyId
33   sg = context.sg
34   
35   import os
36   #import subprocess
37   #import tempfile
38   from PyQt4 import QtCore
39   from PyQt4 import QtGui
40   from PyQt4.QtGui import QFileDialog
41   from PyQt4.QtGui import QMessageBox
42   from PyQt4.QtGui import QPalette
43   from PyQt4.QtGui import QColor
44   from PyQt4.QtCore import QString
45   from fissureGenerale_ui import Ui_Dialog
46   
47   class fissureGeneraleDialog(QtGui.QDialog):
48     
49     def __init__(self):
50       print "__init__"
51       QtGui.QDialog.__init__(self)
52       # Set up the user interface from Designer.
53       self.ui = Ui_Dialog()
54       self.ui.setupUi(self)
55       
56       self.blackPalette = self.ui.dsb_influence.palette()
57       self.redPalette = QPalette()
58       self.redPalette.setColor(QPalette.Text, QColor(255,0,0))
59       self.NOK = False
60       
61       self.initDefaut()
62       self.initDialog(self.defaut)
63       self.ui.lb_calcul.hide()
64       
65       # Connect up the buttons.
66       self.connect(self.ui.pb_valPrec, QtCore.SIGNAL("clicked()"),
67                    self.readValPrec)
68       self.connect(self.ui.pb_reset, QtCore.SIGNAL("clicked()"),
69                    self.resetVal)
70       self.connect(self.ui.pb_recharger, QtCore.SIGNAL("clicked()"),
71                    self.recharger)
72       self.connect(self.ui.pb_sauver, QtCore.SIGNAL("clicked()"),
73                    self.sauver)
74       self.connect(self.ui.pb_maillage, QtCore.SIGNAL("clicked()"),
75                    self.selectMaillage)
76       self.connect(self.ui.pb_facefiss, QtCore.SIGNAL("clicked()"),
77                    self.selectFacefiss)
78       self.connect(self.ui.pb_reptrav, QtCore.SIGNAL("clicked()"),
79                    self.selectReptrav)
80       self.connect(self.ui.pb_nomres, QtCore.SIGNAL("clicked()"),
81                    self.selectNomres)
82       self.disconnect(self.ui.bb_OkCancel, QtCore.SIGNAL("accepted()"), self.accept)
83       self.connect(self.ui.bb_OkCancel, QtCore.SIGNAL("accepted()"),
84                    self.execute)
85     
86     def initDefaut(self):
87       self.defaut = dict(
88         nomCas            = 'angleCube',
89         maillageSain      = os.path.join(gmu.pathBloc, 'materielCasTests/CubeAngle.med'),
90         brepFaceFissure   = os.path.join(gmu.pathBloc, "materielCasTests/CubeAngleFiss.brep"),
91         edgeFissIds       = [4],
92         lgInfluence       = 20,
93         meshBrep          = (5,10),
94         rayonPipe         = 5,
95         lenSegPipe        = 2.5,
96         nbSegRad          = 5,
97         nbSegCercle       = 32,
98         areteFaceFissure  = 10,
99         reptrav           = '.',
100         nomres            = 'casStandard_fissure.med')
101
102       
103     def initDialog(self, dico):
104       self.ui.le_maillage.setText(dico['maillageSain'])
105       self.ui.le_facefiss.setText(dico['brepFaceFissure'])
106       self.ui.le_fondfiss.setText(str(dico['edgeFissIds']))
107       self.ui.dsb_influence.setValue(dico['lgInfluence'])
108       self.ui.dsb_meshBrepMin.setValue(dico['meshBrep'][0])
109       self.ui.dsb_meshBrepMax.setValue(dico['meshBrep'][1])
110       self.ui.dsb_rayonPipe.setValue(dico['rayonPipe'])
111       self.ui.dsb_lenSegPipe.setValue(dico['lenSegPipe'])
112       self.ui.sb_couronnes.setValue(dico['nbSegRad'])
113       self.ui.sb_secteurs.setValue(dico['nbSegCercle'])
114       self.ui.dsb_areteFaceFissure.setValue(dico['areteFaceFissure'])
115       self.ui.le_reptrav.setText(os.path.abspath(dico['reptrav']))
116       self.ui.le_nomres.setText(os.path.split(dico['nomres'])[1])
117       incomplet = self.testval(dico)
118       pass
119   
120     def testval(self, dico):
121       incomplet = False
122       if not os.path.lexists(dico['maillageSain']):
123         self.ui.le_maillage.setPalette(self.redPalette)
124         incomplet = True
125       else:
126         self.ui.le_maillage.setPalette(self.blackPalette)
127       if not os.path.lexists(dico['brepFaceFissure']):
128         self.ui.le_facefiss.setPalette(self.redPalette)
129         incomplet = True
130       else:
131         self.ui.le_facefiss.setPalette(self.blackPalette)
132       edgeFissIdsOK=True
133       try:
134         l = dico['edgeFissIds']
135         for i in l:
136           if not isinstance(i, int):
137             print"not isinstance(i, int)"
138             incomplet = True
139             edgeFissIdsOK=False
140             break
141       except:
142         print "except eval"
143         incomplet = True
144         edgeFissIdsOK=False
145       if edgeFissIdsOK:
146         self.ui.le_fondfiss.setPalette(self.blackPalette)
147       else:
148         self.ui.le_fondfiss.setPalette(self.redPalette)
149       if dico['meshBrep'][0] == 0:
150         self.ui.dsb_meshBrepMin.setPalette(self.redPalette)
151         incomplet = True
152       else:
153         self.ui.dsb_meshBrepMin.setPalette(self.blackPalette)
154       if dico['meshBrep'][1] == 0:
155         self.ui.dsb_meshBrepMax.setPalette(self.redPalette)
156         incomplet = True
157       else:
158         self.ui.dsb_meshBrepMax.setPalette(self.blackPalette)
159       if dico['rayonPipe'] == 0:
160         self.ui.dsb_rayonPipe.setPalette(self.redPalette)
161         incomplet = True
162       else:
163         self.ui.dsb_rayonPipe.setPalette(self.blackPalette)
164       if dico['lenSegPipe'] == 0:
165         self.ui.dsb_lenSegPipe.setPalette(self.redPalette)
166         incomplet = True
167       else:
168         self.ui.dsb_lenSegPipe.setPalette(self.blackPalette)
169       if dico['areteFaceFissure'] == 0:
170         self.ui.dsb_areteFaceFissure.setPalette(self.redPalette)
171         incomplet = True
172       else:
173         self.ui.dsb_areteFaceFissure.setPalette(self.blackPalette)
174     
175       print "incomplet: ", incomplet
176       return incomplet
177     
178     def fileDefault(self):
179       filedef = os.path.expanduser("~/.config/salome/dialogFissureGenerale.dic")
180       print filedef
181       return filedef
182     
183     def writeDefault(self, dico):
184       filedef = self.fileDefault()
185       f = open(filedef, 'w')
186       f.write(str(dico))
187       f.close()
188     
189     def readValPrec(self):
190       filedef = self.fileDefault()
191       if os.path.exists(filedef):
192         f = open(filedef, 'r')
193         txt = f.read()
194         dico = eval(txt)
195         print dico
196         self.initDialog(dico)
197
198     def resetVal(self):
199       #self.initDefaut()
200       self.initDialog(self.defaut)
201       
202     def setLogVerbosity(self, logfile):
203       from blocFissure.gmu import initLog # le mode de log s'initialise une seule fois
204       print "setLogVerbosity"
205       index = self.ui.cb_log.currentIndex()
206       print index
207       if index == 0:
208         initLog.setRelease(logfile)
209       elif index == 1:
210         initLog.setVerbose(logfile)
211       elif index == 2:
212         initLog.setDebug(logfile)
213       
214       
215     def sauver(self):
216       print "sauver"
217       fileDiag = QFileDialog(self)
218       fileDiag.setFileMode(QFileDialog.AnyFile)
219       fileDiag.setNameFilter("Parametres *.dic (*.dic)")
220       fileDiag.setViewMode(QFileDialog.List)
221       if fileDiag.exec_() :
222         fileNames = fileDiag.selectedFiles()
223         filedef = fileNames[0]
224         dico = self.creeDico()
225         f = open(filedef, 'w')
226         f.write(str(dico))
227         f.close()
228         
229     def recharger(self):
230       print "recharger"
231       fileDiag = QFileDialog(self)
232       fileDiag.setFileMode(QFileDialog.ExistingFile)
233       fileDiag.setNameFilter("Parametres *.dic (*.dic)")
234       fileDiag.setViewMode(QFileDialog.Detail)
235       if fileDiag.exec_() :
236         fileNames = fileDiag.selectedFiles()
237         filedef = fileNames[0]
238         print filedef
239         if os.path.exists(filedef):
240           f = open(filedef, 'r')
241           txt = f.read()
242           dico = eval(txt)
243           print dico
244           self.initDialog(dico)
245           
246     def selectMaillage(self):
247       fileDiag = QFileDialog(self)
248       fileDiag.setFileMode(QFileDialog.ExistingFile)
249       fileDiag.setNameFilter("Maillage *.med (*.med)")
250       fileDiag.setViewMode(QFileDialog.Detail)
251       if fileDiag.exec_() :
252         fileNames = fileDiag.selectedFiles()
253         filedef = fileNames[0]
254         print filedef
255         self.ui.le_maillage.setText(filedef)
256          
257     def selectFacefiss(self):
258       fileDiag = QFileDialog(self)
259       fileDiag.setFileMode(QFileDialog.ExistingFile)
260       fileDiag.setNameFilter("Face fissure *.brep (*.brep)")
261       fileDiag.setViewMode(QFileDialog.Detail)
262       if fileDiag.exec_() :
263         fileNames = fileDiag.selectedFiles()
264         filedef = fileNames[0]
265         print filedef
266         self.ui.le_facefiss.setText(filedef)
267          
268     def selectReptrav(self):
269       fileDiag = QFileDialog(self)
270       fileDiag.setFileMode(QFileDialog.Directory)
271       fileDiag.setViewMode(QFileDialog.Detail)
272       fileDiag.setDirectory(self.ui.le_reptrav.text())
273       if fileDiag.exec_() :
274         fileNames = fileDiag.selectedFiles()
275         reptrav = str(fileNames[0])
276         print "reptrav ", reptrav
277         self.ui.le_reptrav.setText(os.path.abspath(reptrav))
278         
279          
280     def selectNomres(self):
281       fileDiag = QFileDialog(self)
282       fileDiag.setFileMode(QFileDialog.AnyFile)
283       fileDiag.setViewMode(QFileDialog.Detail)
284       nomres=str(os.path.split(str(self.ui.le_nomres.text()))[1])
285       fileDiag.setDirectory(self.ui.le_reptrav.text())
286       fileDiag.selectFile(nomres)
287       fileDiag.setNameFilter("Maillage *.med (*.med)")
288       self.ui.le_nomres.setText(nomres)
289       if fileDiag.exec_() :
290         fileNames = fileDiag.selectedFiles()
291         tempnom = os.path.split(str(fileNames[0]))[1]
292         print "nomres ", tempnom
293         self.ui.le_nomres.setText(tempnom)
294       else:
295         self.ui.le_nomres.setText(nomres)
296          
297     def creeDico(self):
298       dico = dict(
299                   maillageSain     = str(self.ui.le_maillage.text()),
300                   brepFaceFissure  = str(self.ui.le_facefiss.text()),
301                   edgeFissIds      = eval(str(self.ui.le_fondfiss.text())),
302                   lgInfluence      = self.ui.dsb_influence.value(),
303                   meshBrep         = [self.ui.dsb_meshBrepMin.value(),self.ui.dsb_meshBrepMax.value()],
304                   rayonPipe        = self.ui.dsb_rayonPipe.value(),
305                   lenSegPipe       = self.ui.dsb_lenSegPipe.value(),
306                   nbSegRad         = self.ui.sb_couronnes.value(),
307                   nbSegCercle      = self.ui.sb_secteurs.value(),
308                   areteFaceFissure = self.ui.dsb_areteFaceFissure.value(),
309                   reptrav          = str(self.ui.le_reptrav.text()),
310                   nomres           = str(self.ui.le_nomres.text()),
311                   verbosite        = self.ui.cb_log.currentIndex()
312                   )
313       print dico
314       return dico
315       
316     def checkValues(self):
317       return self.NOK
318
319     def execute(self):
320       print "execute"
321       dico = self.creeDico()
322       NOK = self.testval(dico)
323       if not(NOK):
324         self.writeDefault(dico)
325         self.ui.lb_calcul.show()
326         logfile=os.path.join(dico['reptrav'], dico['nomres']+".log")
327         self.setLogVerbosity(logfile)
328         from blocFissure.gmu import geomsmesh               # après intialisation log dans setLogVerbosity
329         from blocFissure.gmu.casStandard import casStandard # après intialisation log dans setLogVerbosity
330         from blocFissure.gmu.fissError import fissError
331         try:
332           execInstance = casStandard(dico)
333         except fissError as erreur:
334           print '-'*60
335           print type(erreur)
336           print '-'*60
337           print erreur.msg
338           print '-'*60
339           for ligne in erreur.pile:
340             print repr(ligne)        
341           print '-'*60
342           texte = erreur.msg
343 #           texte += +"<br>" +'-'*60 +"<br>"
344 #           for ligne in erreur.pile:
345 #             texte += repr(ligne) +"<br>"
346           mbox = QMessageBox(self)
347           mbox.setWindowTitle("erreur blocFissure")
348           mbox.setText(QString.fromUtf8(texte))
349           mbox.exec_()          
350 #        except Exception as erreur:
351 #          print "exception non répertoriée"
352       self.NOK = NOK
353       self.accept()
354     
355     pass 
356
357 # ----------------------------------------------------------------------------
358   
359   print "main"                   
360   window = fissureGeneraleDialog()
361   retry = True
362   while(retry):
363     retry = False
364     window.exec_()
365     result = window.result()
366     if result:
367       # dialog accepted
368       print "dialog accepted, check"
369       retry = window.checkValues()
370     else:
371       print "dialog rejected, exit"
372   pass
373