Salome HOME
Merge remote branch 'origin/V7_dev'
[modules/smesh.git] / src / Tools / blocFissure / ihm / fissureGenerale_plugin.py
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2006-2016  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, or (at your option) any later version.
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_exemple, QtCore.SIGNAL("clicked()"),
67                    self.genereExemples)
68       self.connect(self.ui.pb_valPrec, QtCore.SIGNAL("clicked()"),
69                    self.readValPrec)
70       self.connect(self.ui.pb_reset, QtCore.SIGNAL("clicked()"),
71                    self.resetVal)
72       self.connect(self.ui.pb_recharger, QtCore.SIGNAL("clicked()"),
73                    self.recharger)
74       self.connect(self.ui.pb_sauver, QtCore.SIGNAL("clicked()"),
75                    self.sauver)
76       self.connect(self.ui.pb_maillage, QtCore.SIGNAL("clicked()"),
77                    self.selectMaillage)
78       self.connect(self.ui.pb_facefiss, QtCore.SIGNAL("clicked()"),
79                    self.selectFacefiss)
80       self.connect(self.ui.pb_reptrav, QtCore.SIGNAL("clicked()"),
81                    self.selectReptrav)
82       self.connect(self.ui.pb_nomres, QtCore.SIGNAL("clicked()"),
83                    self.selectNomres)
84       self.disconnect(self.ui.bb_OkCancel, QtCore.SIGNAL("accepted()"), self.accept)
85       self.connect(self.ui.bb_OkCancel, QtCore.SIGNAL("accepted()"),
86                    self.execute)
87     
88     def initDefaut(self):
89       self.defaut = dict(
90         nomCas            = 'angleCube',
91         maillageSain      = os.path.join(gmu.pathBloc, 'materielCasTests/CubeAngle.med'),
92         brepFaceFissure   = os.path.join(gmu.pathBloc, "materielCasTests/CubeAngleFiss.brep"),
93         edgeFissIds       = [4],
94         lgInfluence       = 20,
95         meshBrep          = (5,10),
96         rayonPipe         = 5,
97         lenSegPipe        = 2.5,
98         nbSegRad          = 5,
99         nbSegCercle       = 32,
100         areteFaceFissure  = 10,
101         areteVives        = 0,
102         reptrav           = '.',
103         nomres            = 'casStandard_fissure.med',
104         verbosite         = 0)
105
106       
107     def initDialog(self, dico):
108       self.ui.le_maillage.setText(dico['maillageSain'])
109       self.ui.le_facefiss.setText(dico['brepFaceFissure'])
110       self.ui.le_fondfiss.setText(str(dico['edgeFissIds']))
111       self.ui.dsb_influence.setValue(dico['lgInfluence'])
112       self.ui.dsb_meshBrepMin.setValue(dico['meshBrep'][0])
113       self.ui.dsb_meshBrepMax.setValue(dico['meshBrep'][1])
114       self.ui.dsb_rayonPipe.setValue(dico['rayonPipe'])
115       self.ui.dsb_lenSegPipe.setValue(dico['lenSegPipe'])
116       self.ui.sb_couronnes.setValue(dico['nbSegRad'])
117       self.ui.sb_secteurs.setValue(dico['nbSegCercle'])
118       self.ui.dsb_areteFaceFissure.setValue(dico['areteFaceFissure'])
119       if dico.has_key('aretesVives'):
120         self.ui.dsb_aretesVives.setValue(dico['aretesVives'])
121       else:
122         self.ui.dsb_aretesVives.setValue(0)
123       self.ui.le_reptrav.setText(os.path.abspath(dico['reptrav']))
124       self.ui.le_nomres.setText(os.path.split(dico['nomres'])[1])
125       self.ui.cb_log.setCurrentIndex(dico['verbosite'])
126       incomplet = self.testval(dico)
127       pass
128   
129     def testval(self, dico):
130       incomplet = False
131       if not os.path.lexists(dico['maillageSain']):
132         self.ui.le_maillage.setPalette(self.redPalette)
133         incomplet = True
134       else:
135         self.ui.le_maillage.setPalette(self.blackPalette)
136       if not os.path.lexists(dico['brepFaceFissure']):
137         self.ui.le_facefiss.setPalette(self.redPalette)
138         incomplet = True
139       else:
140         self.ui.le_facefiss.setPalette(self.blackPalette)
141       edgeFissIdsOK=True
142       try:
143         l = dico['edgeFissIds']
144         for i in l:
145           if not isinstance(i, int):
146             print"not isinstance(i, int)"
147             incomplet = True
148             edgeFissIdsOK=False
149             break
150       except:
151         print "except eval"
152         incomplet = True
153         edgeFissIdsOK=False
154       if edgeFissIdsOK:
155         self.ui.le_fondfiss.setPalette(self.blackPalette)
156       else:
157         self.ui.le_fondfiss.setPalette(self.redPalette)
158       if dico['meshBrep'][0] == 0:
159         self.ui.dsb_meshBrepMin.setPalette(self.redPalette)
160         incomplet = True
161       else:
162         self.ui.dsb_meshBrepMin.setPalette(self.blackPalette)
163       if dico['meshBrep'][1] == 0:
164         self.ui.dsb_meshBrepMax.setPalette(self.redPalette)
165         incomplet = True
166       else:
167         self.ui.dsb_meshBrepMax.setPalette(self.blackPalette)
168       if dico['rayonPipe'] == 0:
169         self.ui.dsb_rayonPipe.setPalette(self.redPalette)
170         incomplet = True
171       else:
172         self.ui.dsb_rayonPipe.setPalette(self.blackPalette)
173       if dico['lenSegPipe'] == 0:
174         self.ui.dsb_lenSegPipe.setPalette(self.redPalette)
175         incomplet = True
176       else:
177         self.ui.dsb_lenSegPipe.setPalette(self.blackPalette)
178       if dico['areteFaceFissure'] == 0:
179         self.ui.dsb_areteFaceFissure.setPalette(self.redPalette)
180         incomplet = True
181       else:
182         self.ui.dsb_areteFaceFissure.setPalette(self.blackPalette)
183     
184       print "incomplet: ", incomplet
185       return incomplet
186     
187     def fileDefault(self):
188       filedef = os.path.expanduser("~/.config/salome/dialogFissureGenerale.dic")
189       print filedef
190       return filedef
191     
192     def writeDefault(self, dico):
193       filedef = self.fileDefault()
194       f = open(filedef, 'w')
195       f.write(str(dico))
196       f.close()
197     
198     def genereExemples(self):
199       maillageSain      = os.path.join(gmu.pathBloc, 'materielCasTests/CubeAngle.med')
200       brepFaceFissure   = os.path.join(gmu.pathBloc, "materielCasTests/CubeAngleFiss.brep")
201       if (os.path.exists(maillageSain) and os.path.exists(brepFaceFissure)):
202         self.initDialog(self.defaut)
203       else:
204         self.ui.lb_calcul.setText("--- Generation exemples en cours ---")
205         self.ui.lb_calcul.show()
206         from blocFissure.materielCasTests import genereMateriel
207         self.ui.lb_calcul.hide()
208         self.initDialog(self.defaut)
209       
210     def readValPrec(self):
211       filedef = self.fileDefault()
212       if os.path.exists(filedef):
213         f = open(filedef, 'r')
214         txt = f.read()
215         dico = eval(txt)
216         print dico
217         self.initDialog(dico)
218
219     def resetVal(self):
220       #self.initDefaut()
221       self.initDialog(self.defaut)
222       
223     def setLogVerbosity(self, logfile):
224       from blocFissure.gmu import initLog # le mode de log s'initialise une seule fois
225       print "setLogVerbosity"
226       index = self.ui.cb_log.currentIndex()
227       print index
228       if index == 0:
229         initLog.setRelease(logfile)
230       elif index == 1:
231         initLog.setVerbose(logfile)
232       elif index == 2:
233         initLog.setDebug(logfile)
234       
235       
236     def sauver(self):
237       print "sauver"
238       fileDiag = QFileDialog(self)
239       fileDiag.setFileMode(QFileDialog.AnyFile)
240       fileDiag.setNameFilter("Parametres *.dic (*.dic)")
241       fileDiag.setViewMode(QFileDialog.List)
242       if fileDiag.exec_() :
243         fileNames = fileDiag.selectedFiles()
244         filedef = fileNames[0]
245         if filedef[-4:] not in ['.dic']:
246           filedef += '.dic'
247         dico = self.creeDico()
248         f = open(filedef, 'w')
249         f.write(str(dico))
250         f.close()
251         
252     def recharger(self):
253       print "recharger"
254       fileDiag = QFileDialog(self)
255       fileDiag.setFileMode(QFileDialog.ExistingFile)
256       fileDiag.setNameFilter("Parametres *.dic (*.dic)")
257       fileDiag.setViewMode(QFileDialog.Detail)
258       if fileDiag.exec_() :
259         fileNames = fileDiag.selectedFiles()
260         filedef = fileNames[0]
261         print filedef
262         if os.path.exists(filedef):
263           f = open(filedef, 'r')
264           txt = f.read()
265           dico = eval(txt)
266           print dico
267           self.initDialog(dico)
268           
269     def selectMaillage(self):
270       fileDiag = QFileDialog(self)
271       fileDiag.setFileMode(QFileDialog.ExistingFile)
272       fileDiag.setNameFilter("Maillage *.med (*.med)")
273       fileDiag.setViewMode(QFileDialog.Detail)
274       if fileDiag.exec_() :
275         fileNames = fileDiag.selectedFiles()
276         filedef = fileNames[0]
277         print filedef
278         self.ui.le_maillage.setText(filedef)
279          
280     def selectFacefiss(self):
281       fileDiag = QFileDialog(self)
282       fileDiag.setFileMode(QFileDialog.ExistingFile)
283       fileDiag.setNameFilter("Face fissure *.brep (*.brep)")
284       fileDiag.setViewMode(QFileDialog.Detail)
285       if fileDiag.exec_() :
286         fileNames = fileDiag.selectedFiles()
287         filedef = fileNames[0]
288         print filedef
289         self.ui.le_facefiss.setText(filedef)
290          
291     def selectReptrav(self):
292       fileDiag = QFileDialog(self)
293       fileDiag.setFileMode(QFileDialog.Directory)
294       fileDiag.setViewMode(QFileDialog.Detail)
295       fileDiag.setDirectory(self.ui.le_reptrav.text())
296       if fileDiag.exec_() :
297         fileNames = fileDiag.selectedFiles()
298         reptrav = str(fileNames[0])
299         print "reptrav ", reptrav
300         self.ui.le_reptrav.setText(os.path.abspath(reptrav))
301         
302          
303     def selectNomres(self):
304       fileDiag = QFileDialog(self)
305       fileDiag.setFileMode(QFileDialog.AnyFile)
306       fileDiag.setViewMode(QFileDialog.Detail)
307       nomres=str(os.path.split(str(self.ui.le_nomres.text()))[1])
308       fileDiag.setDirectory(self.ui.le_reptrav.text())
309       fileDiag.selectFile(nomres)
310       fileDiag.setNameFilter("Maillage *.med (*.med)")
311       self.ui.le_nomres.setText(nomres)
312       if fileDiag.exec_() :
313         fileNames = fileDiag.selectedFiles()
314         tempnom = os.path.split(str(fileNames[0]))[1]
315         print "nomres ", tempnom
316         self.ui.le_nomres.setText(tempnom)
317       else:
318         self.ui.le_nomres.setText(nomres)
319          
320     def creeDico(self):
321       dico = dict(
322                   maillageSain     = str(self.ui.le_maillage.text()),
323                   brepFaceFissure  = str(self.ui.le_facefiss.text()),
324                   edgeFissIds      = eval(str(self.ui.le_fondfiss.text())),
325                   lgInfluence      = self.ui.dsb_influence.value(),
326                   meshBrep         = [self.ui.dsb_meshBrepMin.value(),self.ui.dsb_meshBrepMax.value()],
327                   rayonPipe        = self.ui.dsb_rayonPipe.value(),
328                   lenSegPipe       = self.ui.dsb_lenSegPipe.value(),
329                   nbSegRad         = self.ui.sb_couronnes.value(),
330                   nbSegCercle      = self.ui.sb_secteurs.value(),
331                   areteFaceFissure = self.ui.dsb_areteFaceFissure.value(),
332                   aretesVives      = self.ui.dsb_aretesVives.value(),
333                   reptrav          = str(self.ui.le_reptrav.text()),
334                   nomres           = str(self.ui.le_nomres.text()),
335                   verbosite        = self.ui.cb_log.currentIndex()
336                   )
337       print dico
338       return dico
339       
340     def checkValues(self):
341       return self.NOK
342
343     def execute(self):
344       print "execute"
345       dico = self.creeDico()
346       NOK = self.testval(dico)
347       if not(NOK):
348         self.writeDefault(dico)
349         self.ui.lb_calcul.setText("--- Calcul en cours ---")
350         self.ui.lb_calcul.show()
351         logfile=os.path.join(dico['reptrav'], dico['nomres']+".log")
352         self.setLogVerbosity(logfile)
353         from blocFissure.gmu import geomsmesh               # après intialisation log dans setLogVerbosity
354         from blocFissure.gmu.casStandard import casStandard # après intialisation log dans setLogVerbosity
355         from blocFissure.gmu.fissError import fissError
356         try:
357           execInstance = casStandard(dico)
358         except fissError as erreur:
359           print '-'*60
360           print type(erreur)
361           print '-'*60
362           print erreur.msg
363           print '-'*60
364           for ligne in erreur.pile:
365             print repr(ligne)        
366           print '-'*60
367           texte = erreur.msg
368 #           texte += +"<br>" +'-'*60 +"<br>"
369 #           for ligne in erreur.pile:
370 #             texte += repr(ligne) +"<br>"
371           mbox = QMessageBox(self)
372           mbox.setWindowTitle("erreur blocFissure")
373           mbox.setText(QString.fromUtf8(texte))
374           mbox.exec_()          
375 #        except Exception as erreur:
376 #          print "exception non répertoriée"
377       self.NOK = NOK
378       self.ui.lb_calcul.hide()
379       #self.accept()
380     
381     pass 
382
383 # ----------------------------------------------------------------------------
384   
385   print "main"                   
386   window = fissureGeneraleDialog()
387   retry = True
388   while(retry):
389     retry = False
390     window.exec_()
391     result = window.result()
392     if result:
393       # dialog accepted
394       print "dialog accepted, check"
395       retry = window.checkValues()
396     else:
397       print "dialog rejected, exit"
398   pass
399