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