Salome HOME
Windows compatibility.
[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 from blocFissure.gmu import initLog
29 #initLog.setDebug()
30 initLog.setVerbose()
31
32 from blocFissure.gmu import geomsmesh
33 from blocFissure.gmu.casStandard import casStandard
34
35 def fissureGeneraleDlg(context):
36   # get context study, studyId, salomeGui
37   study = context.study
38   studyId = context.studyId
39   sg = context.sg
40   
41   import os
42   #import subprocess
43   #import tempfile
44   from PyQt4 import QtCore
45   from PyQt4 import QtGui
46   from PyQt4.QtGui import QFileDialog
47   from PyQt4.QtGui import QMessageBox
48   from PyQt4.QtGui import QPalette
49   from PyQt4.QtGui import QColor
50   from fissureGenerale_ui import Ui_Dialog
51   
52   class fissureGeneraleDialog(QtGui.QDialog):
53     
54     def __init__(self):
55       QtGui.QDialog.__init__(self)
56       # Set up the user interface from Designer.
57       self.ui = Ui_Dialog()
58       self.ui.setupUi(self)
59       
60       self.blackPalette = self.ui.dsb_influence.palette()
61       self.redPalette = QPalette()
62       self.redPalette.setColor(QPalette.Text, QColor(255,0,0))
63       self.NOK = False
64       
65       self.initDefaut()
66       self.initDialog(self.defaut)
67       self.ui.lb_calcul.hide()
68       
69       # Connect up the buttons.
70       self.connect(self.ui.pb_valPrec, QtCore.SIGNAL("clicked()"),
71                    self.readValPrec)
72       self.connect(self.ui.pb_reset, QtCore.SIGNAL("clicked()"),
73                    self.resetVal)
74       self.connect(self.ui.pb_recharger, QtCore.SIGNAL("clicked()"),
75                    self.recharger)
76       self.connect(self.ui.pb_sauver, QtCore.SIGNAL("clicked()"),
77                    self.sauver)
78       self.connect(self.ui.pb_maillage, QtCore.SIGNAL("clicked()"),
79                    self.selectMaillage)
80       self.connect(self.ui.pb_facefiss, QtCore.SIGNAL("clicked()"),
81                    self.selectFacefiss)
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
100       
101     def initDialog(self, dico):
102       self.ui.le_maillage.setText(dico['maillageSain'])
103       self.ui.le_facefiss.setText(dico['brepFaceFissure'])
104       self.ui.le_fondfiss.setText(str(dico['edgeFissIds']))
105       self.ui.dsb_influence.setValue(dico['lgInfluence'])
106       self.ui.dsb_meshBrepMin.setValue(dico['meshBrep'][0])
107       self.ui.dsb_meshBrepMax.setValue(dico['meshBrep'][1])
108       self.ui.dsb_rayonPipe.setValue(dico['rayonPipe'])
109       self.ui.dsb_lenSegPipe.setValue(dico['lenSegPipe'])
110       self.ui.sb_couronnes.setValue(dico['nbSegRad'])
111       self.ui.sb_secteurs.setValue(dico['nbSegCercle'])
112       self.ui.dsb_areteFaceFissure.setValue(dico['areteFaceFissure'])
113       incomplet = self.testval(dico)
114       pass
115   
116     def testval(self, dico):
117       incomplet = False
118       if not os.path.lexists(dico['maillageSain']):
119         self.ui.le_maillage.setPalette(self.redPalette)
120         incomplet = True
121       else:
122         self.ui.le_maillage.setPalette(self.blackPalette)
123       if not os.path.lexists(dico['brepFaceFissure']):
124         self.ui.le_facefiss.setPalette(self.redPalette)
125         incomplet = True
126       else:
127         self.ui.le_facefiss.setPalette(self.blackPalette)
128       edgeFissIdsOK=True
129       try:
130         l = dico['edgeFissIds']
131         for i in l:
132           if not isinstance(i, int):
133             print"not isinstance(i, int)"
134             incomplet = True
135             edgeFissIdsOK=False
136             break
137       except:
138         print "except eval"
139         incomplet = True
140         edgeFissIdsOK=False
141       if edgeFissIdsOK:
142         self.ui.le_fondfiss.setPalette(self.blackPalette)
143       else:
144         self.ui.le_fondfiss.setPalette(self.redPalette)
145       if dico['meshBrep'][0] == 0:
146         self.ui.dsb_meshBrepMin.setPalette(self.redPalette)
147         incomplet = True
148       else:
149         self.ui.dsb_meshBrepMin.setPalette(self.blackPalette)
150       if dico['meshBrep'][1] == 0:
151         self.ui.dsb_meshBrepMax.setPalette(self.redPalette)
152         incomplet = True
153       else:
154         self.ui.dsb_meshBrepMax.setPalette(self.blackPalette)
155       if dico['rayonPipe'] == 0:
156         self.ui.dsb_rayonPipe.setPalette(self.redPalette)
157         incomplet = True
158       else:
159         self.ui.dsb_rayonPipe.setPalette(self.blackPalette)
160       if dico['lenSegPipe'] == 0:
161         self.ui.dsb_lenSegPipe.setPalette(self.redPalette)
162         incomplet = True
163       else:
164         self.ui.dsb_lenSegPipe.setPalette(self.blackPalette)
165       if dico['areteFaceFissure'] == 0:
166         self.ui.dsb_areteFaceFissure.setPalette(self.redPalette)
167         incomplet = True
168       else:
169         self.ui.dsb_areteFaceFissure.setPalette(self.blackPalette)
170     
171       print "incomplet: ", incomplet
172       return incomplet
173     
174     def fileDefault(self):
175       filedef = os.path.expanduser("~/.config/salome/dialogFissureGenerale.dic")
176       print filedef
177       return filedef
178     
179     def writeDefault(self, dico):
180       filedef = self.fileDefault()
181       f = open(filedef, 'w')
182       f.write(str(dico))
183       f.close()
184     
185     def readValPrec(self):
186       filedef = self.fileDefault()
187       if os.path.exists(filedef):
188         f = open(filedef, 'r')
189         txt = f.read()
190         dico = eval(txt)
191         print dico
192         self.initDialog(dico)
193
194     def resetVal(self):
195       #self.initDefaut()
196       self.initDialog(self.defaut)
197       
198     def sauver(self):
199       print "sauver"
200       fileDiag = QFileDialog(self)
201       fileDiag.setFileMode(QFileDialog.AnyFile)
202       fileDiag.setNameFilter("Parametres *.dic (*.dic)")
203       fileDiag.setViewMode(QFileDialog.List)
204       if fileDiag.exec_() :
205         fileNames = fileDiag.selectedFiles()
206         filedef = fileNames[0]
207         dico = self.creeDico()
208         f = open(filedef, 'w')
209         f.write(str(dico))
210         f.close()
211         
212     def recharger(self):
213       print "recharger"
214       fileDiag = QFileDialog(self)
215       fileDiag.setFileMode(QFileDialog.ExistingFile)
216       fileDiag.setNameFilter("Parametres *.dic (*.dic)")
217       fileDiag.setViewMode(QFileDialog.Detail)
218       if fileDiag.exec_() :
219         fileNames = fileDiag.selectedFiles()
220         filedef = fileNames[0]
221         print filedef
222         if os.path.exists(filedef):
223           f = open(filedef, 'r')
224           txt = f.read()
225           dico = eval(txt)
226           print dico
227           self.initDialog(dico)
228           
229     def selectMaillage(self):
230       fileDiag = QFileDialog(self)
231       fileDiag.setFileMode(QFileDialog.ExistingFile)
232       fileDiag.setNameFilter("Maillage *.med (*.med)")
233       fileDiag.setViewMode(QFileDialog.Detail)
234       if fileDiag.exec_() :
235         fileNames = fileDiag.selectedFiles()
236         filedef = fileNames[0]
237         print filedef
238         self.ui.le_maillage.setText(filedef)
239          
240     def selectFacefiss(self):
241       fileDiag = QFileDialog(self)
242       fileDiag.setFileMode(QFileDialog.ExistingFile)
243       fileDiag.setNameFilter("Face fissure *.brep (*.brep)")
244       fileDiag.setViewMode(QFileDialog.Detail)
245       if fileDiag.exec_() :
246         fileNames = fileDiag.selectedFiles()
247         filedef = fileNames[0]
248         print filedef
249         self.ui.le_facefiss.setText(filedef)
250          
251     def creeDico(self):
252       dico = dict(
253                   maillageSain     = str(self.ui.le_maillage.text()),
254                   brepFaceFissure  = str(self.ui.le_facefiss.text()),
255                   edgeFissIds      = eval(str(self.ui.le_fondfiss.text())),
256                   lgInfluence      = self.ui.dsb_influence.value(),
257                   meshBrep         = [self.ui.dsb_meshBrepMin.value(),self.ui.dsb_meshBrepMax.value()],
258                   rayonPipe        = self.ui.dsb_rayonPipe.value(),
259                   lenSegPipe       = self.ui.dsb_lenSegPipe.value(),
260                   nbSegRad         = self.ui.sb_couronnes.value(),
261                   nbSegCercle      = self.ui.sb_secteurs.value(),
262                   areteFaceFissure = self.ui.dsb_areteFaceFissure.value()
263                   )
264       print dico
265       return dico
266       
267     def checkValues(self):
268       return self.NOK
269
270     def execute(self):
271       dico = self.creeDico()
272       NOK = self.testval(dico)
273       if not(NOK):
274         self.writeDefault(dico)
275         self.ui.lb_calcul.show()
276         execInstance = casStandard(dico)
277       self.NOK = NOK
278       self.accept()
279     
280     pass 
281
282 # ----------------------------------------------------------------------------
283                      
284   window = fissureGeneraleDialog()
285   retry = True
286   while(retry):
287     retry = False
288     window.exec_()
289     result = window.result()
290     if result:
291       # dialog accepted
292       print "dialog accepted, check"
293       retry = window.checkValues()
294     else:
295       print "dialog rejected, exit"
296   pass
297