Salome HOME
general crack dialog, working dir and result file
[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 fissureGenerale_ui import Ui_Dialog
45   
46   class fissureGeneraleDialog(QtGui.QDialog):
47     
48     def __init__(self):
49       print "__init__"
50       QtGui.QDialog.__init__(self)
51       # Set up the user interface from Designer.
52       self.ui = Ui_Dialog()
53       self.ui.setupUi(self)
54       
55       self.blackPalette = self.ui.dsb_influence.palette()
56       self.redPalette = QPalette()
57       self.redPalette.setColor(QPalette.Text, QColor(255,0,0))
58       self.NOK = False
59       
60       self.initDefaut()
61       self.initDialog(self.defaut)
62       self.ui.lb_calcul.hide()
63       
64       # Connect up the buttons.
65       self.connect(self.ui.pb_valPrec, QtCore.SIGNAL("clicked()"),
66                    self.readValPrec)
67       self.connect(self.ui.pb_reset, QtCore.SIGNAL("clicked()"),
68                    self.resetVal)
69       self.connect(self.ui.pb_recharger, QtCore.SIGNAL("clicked()"),
70                    self.recharger)
71       self.connect(self.ui.pb_sauver, QtCore.SIGNAL("clicked()"),
72                    self.sauver)
73       self.connect(self.ui.pb_maillage, QtCore.SIGNAL("clicked()"),
74                    self.selectMaillage)
75       self.connect(self.ui.pb_facefiss, QtCore.SIGNAL("clicked()"),
76                    self.selectFacefiss)
77       self.connect(self.ui.pb_reptrav, QtCore.SIGNAL("clicked()"),
78                    self.selectReptrav)
79       self.connect(self.ui.pb_nomres, QtCore.SIGNAL("clicked()"),
80                    self.selectNomres)
81       self.disconnect(self.ui.bb_OkCancel, QtCore.SIGNAL("accepted()"), self.accept)
82       self.connect(self.ui.bb_OkCancel, QtCore.SIGNAL("accepted()"),
83                    self.execute)
84     
85     def initDefaut(self):
86       self.defaut = dict(
87         nomCas            = 'angleCube',
88         maillageSain      = os.path.join(gmu.pathBloc, 'materielCasTests/CubeAngle.med'),
89         brepFaceFissure   = os.path.join(gmu.pathBloc, "materielCasTests/CubeAngleFiss.brep"),
90         edgeFissIds       = [4],
91         lgInfluence       = 20,
92         meshBrep          = (5,10),
93         rayonPipe         = 5,
94         lenSegPipe        = 2.5,
95         nbSegRad          = 5,
96         nbSegCercle       = 32,
97         areteFaceFissure  = 10,
98         reptrav           = '.',
99         nomres            = 'casStandard_fissure.med')
100
101       
102     def initDialog(self, dico):
103       self.ui.le_maillage.setText(dico['maillageSain'])
104       self.ui.le_facefiss.setText(dico['brepFaceFissure'])
105       self.ui.le_fondfiss.setText(str(dico['edgeFissIds']))
106       self.ui.dsb_influence.setValue(dico['lgInfluence'])
107       self.ui.dsb_meshBrepMin.setValue(dico['meshBrep'][0])
108       self.ui.dsb_meshBrepMax.setValue(dico['meshBrep'][1])
109       self.ui.dsb_rayonPipe.setValue(dico['rayonPipe'])
110       self.ui.dsb_lenSegPipe.setValue(dico['lenSegPipe'])
111       self.ui.sb_couronnes.setValue(dico['nbSegRad'])
112       self.ui.sb_secteurs.setValue(dico['nbSegCercle'])
113       self.ui.dsb_areteFaceFissure.setValue(dico['areteFaceFissure'])
114       self.ui.le_reptrav.setText(os.path.abspath(dico['reptrav']))
115       self.ui.le_nomres.setText(os.path.split(dico['nomres'])[1])
116       incomplet = self.testval(dico)
117       pass
118   
119     def testval(self, dico):
120       incomplet = False
121       if not os.path.lexists(dico['maillageSain']):
122         self.ui.le_maillage.setPalette(self.redPalette)
123         incomplet = True
124       else:
125         self.ui.le_maillage.setPalette(self.blackPalette)
126       if not os.path.lexists(dico['brepFaceFissure']):
127         self.ui.le_facefiss.setPalette(self.redPalette)
128         incomplet = True
129       else:
130         self.ui.le_facefiss.setPalette(self.blackPalette)
131       edgeFissIdsOK=True
132       try:
133         l = dico['edgeFissIds']
134         for i in l:
135           if not isinstance(i, int):
136             print"not isinstance(i, int)"
137             incomplet = True
138             edgeFissIdsOK=False
139             break
140       except:
141         print "except eval"
142         incomplet = True
143         edgeFissIdsOK=False
144       if edgeFissIdsOK:
145         self.ui.le_fondfiss.setPalette(self.blackPalette)
146       else:
147         self.ui.le_fondfiss.setPalette(self.redPalette)
148       if dico['meshBrep'][0] == 0:
149         self.ui.dsb_meshBrepMin.setPalette(self.redPalette)
150         incomplet = True
151       else:
152         self.ui.dsb_meshBrepMin.setPalette(self.blackPalette)
153       if dico['meshBrep'][1] == 0:
154         self.ui.dsb_meshBrepMax.setPalette(self.redPalette)
155         incomplet = True
156       else:
157         self.ui.dsb_meshBrepMax.setPalette(self.blackPalette)
158       if dico['rayonPipe'] == 0:
159         self.ui.dsb_rayonPipe.setPalette(self.redPalette)
160         incomplet = True
161       else:
162         self.ui.dsb_rayonPipe.setPalette(self.blackPalette)
163       if dico['lenSegPipe'] == 0:
164         self.ui.dsb_lenSegPipe.setPalette(self.redPalette)
165         incomplet = True
166       else:
167         self.ui.dsb_lenSegPipe.setPalette(self.blackPalette)
168       if dico['areteFaceFissure'] == 0:
169         self.ui.dsb_areteFaceFissure.setPalette(self.redPalette)
170         incomplet = True
171       else:
172         self.ui.dsb_areteFaceFissure.setPalette(self.blackPalette)
173     
174       print "incomplet: ", incomplet
175       return incomplet
176     
177     def fileDefault(self):
178       filedef = os.path.expanduser("~/.config/salome/dialogFissureGenerale.dic")
179       print filedef
180       return filedef
181     
182     def writeDefault(self, dico):
183       filedef = self.fileDefault()
184       f = open(filedef, 'w')
185       f.write(str(dico))
186       f.close()
187     
188     def readValPrec(self):
189       filedef = self.fileDefault()
190       if os.path.exists(filedef):
191         f = open(filedef, 'r')
192         txt = f.read()
193         dico = eval(txt)
194         print dico
195         self.initDialog(dico)
196
197     def resetVal(self):
198       #self.initDefaut()
199       self.initDialog(self.defaut)
200       
201     def setLogVerbosity(self):
202       from blocFissure.gmu import initLog # le mode de log s'initialise une seule fois
203       print "setLogVerbosity"
204       index = self.ui.cb_log.currentIndex()
205       print index
206       if index == 0:
207         initLog.setRelease()
208       elif index == 1:
209         initLog.setVerbose()
210       elif index == 2:
211         initLog.setDebug()
212       
213       
214     def sauver(self):
215       print "sauver"
216       fileDiag = QFileDialog(self)
217       fileDiag.setFileMode(QFileDialog.AnyFile)
218       fileDiag.setNameFilter("Parametres *.dic (*.dic)")
219       fileDiag.setViewMode(QFileDialog.List)
220       if fileDiag.exec_() :
221         fileNames = fileDiag.selectedFiles()
222         filedef = fileNames[0]
223         dico = self.creeDico()
224         f = open(filedef, 'w')
225         f.write(str(dico))
226         f.close()
227         
228     def recharger(self):
229       print "recharger"
230       fileDiag = QFileDialog(self)
231       fileDiag.setFileMode(QFileDialog.ExistingFile)
232       fileDiag.setNameFilter("Parametres *.dic (*.dic)")
233       fileDiag.setViewMode(QFileDialog.Detail)
234       if fileDiag.exec_() :
235         fileNames = fileDiag.selectedFiles()
236         filedef = fileNames[0]
237         print filedef
238         if os.path.exists(filedef):
239           f = open(filedef, 'r')
240           txt = f.read()
241           dico = eval(txt)
242           print dico
243           self.initDialog(dico)
244           
245     def selectMaillage(self):
246       fileDiag = QFileDialog(self)
247       fileDiag.setFileMode(QFileDialog.ExistingFile)
248       fileDiag.setNameFilter("Maillage *.med (*.med)")
249       fileDiag.setViewMode(QFileDialog.Detail)
250       if fileDiag.exec_() :
251         fileNames = fileDiag.selectedFiles()
252         filedef = fileNames[0]
253         print filedef
254         self.ui.le_maillage.setText(filedef)
255          
256     def selectFacefiss(self):
257       fileDiag = QFileDialog(self)
258       fileDiag.setFileMode(QFileDialog.ExistingFile)
259       fileDiag.setNameFilter("Face fissure *.brep (*.brep)")
260       fileDiag.setViewMode(QFileDialog.Detail)
261       if fileDiag.exec_() :
262         fileNames = fileDiag.selectedFiles()
263         filedef = fileNames[0]
264         print filedef
265         self.ui.le_facefiss.setText(filedef)
266          
267     def selectReptrav(self):
268       fileDiag = QFileDialog(self)
269       fileDiag.setFileMode(QFileDialog.Directory)
270       fileDiag.setViewMode(QFileDialog.Detail)
271       fileDiag.setDirectory(self.ui.le_reptrav.text())
272       if fileDiag.exec_() :
273         fileNames = fileDiag.selectedFiles()
274         reptrav = str(fileNames[0])
275         print "reptrav ", reptrav
276         self.ui.le_reptrav.setText(os.path.abspath(reptrav))
277         
278          
279     def selectNomres(self):
280       fileDiag = QFileDialog(self)
281       fileDiag.setFileMode(QFileDialog.AnyFile)
282       fileDiag.setViewMode(QFileDialog.Detail)
283       nomres=str(os.path.split(str(self.ui.le_nomres.text()))[1])
284       fileDiag.setDirectory(self.ui.le_reptrav.text())
285       fileDiag.selectFile(nomres)
286       fileDiag.setNameFilter("Maillage *.med (*.med)")
287       self.ui.le_nomres.setText(nomres)
288       if fileDiag.exec_() :
289         fileNames = fileDiag.selectedFiles()
290         tempnom = os.path.split(str(fileNames[0]))[1]
291         print "nomres ", tempnom
292         self.ui.le_nomres.setText(tempnom)
293       else:
294         self.ui.le_nomres.setText(nomres)
295          
296     def creeDico(self):
297       dico = dict(
298                   maillageSain     = str(self.ui.le_maillage.text()),
299                   brepFaceFissure  = str(self.ui.le_facefiss.text()),
300                   edgeFissIds      = eval(str(self.ui.le_fondfiss.text())),
301                   lgInfluence      = self.ui.dsb_influence.value(),
302                   meshBrep         = [self.ui.dsb_meshBrepMin.value(),self.ui.dsb_meshBrepMax.value()],
303                   rayonPipe        = self.ui.dsb_rayonPipe.value(),
304                   lenSegPipe       = self.ui.dsb_lenSegPipe.value(),
305                   nbSegRad         = self.ui.sb_couronnes.value(),
306                   nbSegCercle      = self.ui.sb_secteurs.value(),
307                   areteFaceFissure = self.ui.dsb_areteFaceFissure.value(),
308                   reptrav          = str(self.ui.le_reptrav.text()),
309                   nomres           = str(self.ui.le_nomres.text()),
310                   )
311       print dico
312       return dico
313       
314     def checkValues(self):
315       return self.NOK
316
317     def execute(self):
318       print "execute"
319       dico = self.creeDico()
320       NOK = self.testval(dico)
321       if not(NOK):
322         self.writeDefault(dico)
323         self.ui.lb_calcul.show()
324         self.setLogVerbosity()
325         from blocFissure.gmu import geomsmesh               # après intialisation log dans setLogVerbosity
326         from blocFissure.gmu.casStandard import casStandard # après intialisation log dans setLogVerbosity
327         execInstance = casStandard(dico)
328       self.NOK = NOK
329       self.accept()
330     
331     pass 
332
333 # ----------------------------------------------------------------------------
334   
335   print "main"                   
336   window = fissureGeneraleDialog()
337   retry = True
338   while(retry):
339     retry = False
340     window.exec_()
341     result = window.result()
342     if result:
343       # dialog accepted
344       print "dialog accepted, check"
345       retry = window.checkValues()
346     else:
347       print "dialog rejected, exit"
348   pass
349