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