Salome HOME
Install tests.set
[modules/smesh.git] / src / Tools / blocFissure / ihm / fissureCoude_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 fissureCoudeDlg(context):
30   # get context study, salomeGui
31   study = context.study
32   sg = context.sg
33   
34   import os
35   #import subprocess
36   #import tempfile
37   from qtsalome import QFileDialog, QMessageBox, QPalette, QColor, QDialog
38   from fissureCoude_ui import Ui_Dialog
39   
40   class fissureCoudeDialog(QDialog):
41     
42     def __init__(self):
43       QDialog.__init__(self)
44       # Set up the user interface from Designer.
45       self.ui = Ui_Dialog()
46       self.ui.setupUi(self)
47       
48       self.blackPalette = self.ui.dsb_angle.palette()
49       self.redPalette = QPalette()
50       self.redPalette.setColor(QPalette.Text, QColor(255,0,0))
51       self.NOK = False
52       
53       self.initDefaut()
54       self.initDialog(self.defaut)
55       self.ui.dsb_angle.setSpecialValueText("saisie_obligatoire")
56       self.ui.dsb_rCintr.setSpecialValueText("saisie_obligatoire")
57       self.ui.dsb_lTubeP1.setSpecialValueText("saisie_obligatoire")
58       self.ui.dsb_lTubeP2.setSpecialValueText("saisie_obligatoire")
59       self.ui.dsb_epais.setSpecialValueText("saisie_obligatoire")
60       self.ui.dsb_dext.setSpecialValueText("saisie_obligatoire")
61       self.ui.dsb_profondeur.setSpecialValueText("saisie_obligatoire")
62       self.ui.dsb_longueur.setSpecialValueText("saisie_obligatoire")
63       self.ui.dsb_azimut.setSpecialValueText("saisie_obligatoire")
64       self.ui.dsb_orientation.setSpecialValueText("saisie_obligatoire")
65       self.ui.dsb_posiAngul.setSpecialValueText("saisie_obligatoire")
66       self.ui.dsb_absCurv.setSpecialValueText("saisie_obligatoire")
67       self.ui.sb_nbTranches.setSpecialValueText("saisie_obligatoire")
68       self.ui.sb_nbCouronne.setSpecialValueText("saisie_obligatoire")
69       self.ui.sb_nbSecteur.setSpecialValueText("saisie_obligatoire")
70       self.ui.dsb_aretesFaceFissure.setSpecialValueText("automatique")
71       self.ui.dsb_influence.setSpecialValueText("automatique")
72       self.ui.lb_calcul.hide()
73       
74       # Connect up the buttons.
75       self.ui.pb_valPrec.clicked.connect(self.readValPrec)
76       self.ui.pb_reset.clicked.connect(self.resetVal)
77       self.ui.pb_recharger.clicked.connect(self.recharger)
78       self.ui.pb_sauver.clicked.connect(self.sauver)
79       self.ui.buttonBox.accepted.disconnect(self.accept)
80       self.ui.buttonBox.accepted.connect(self.execute)
81     
82     def initDefaut(self):
83       self.defaut = dict(
84         angle             = -181.0,
85         rCintr            = 0.0,
86         lTubeP1           = 0.0,
87         lTubeP2           = 0.0,
88         epais             = 0.0,
89         dext              = 0.0,
90         profondeur        = 0.0,
91         longueur          = 0.0,
92         azimut            = -181.0,
93         orientation       = -1.0,
94         posiAngul         = -181.0,
95         absCurv           = 0.0,
96         nbTranches        = 7,
97         nbCouronnes       = 1,
98         nbSecteurs        = 3,
99         cbOptDiscrSain    = False,
100         cbOptDiscrFiss    = False,
101         rbPosiAngul       = True,
102         rbFissExt         = True,
103         cbForceEllipse    = False,
104         nbAxeTubeP1       = 15,
105         nbAxeTubeP2       = 15,
106         nbAxeCoude        = 10,
107         nbCirconf         = 20,
108         nbEpaisseur       = 3,
109         rayonTore         = 2.0,
110         aretesFaceFissure = 0.0,
111         influence         = 0.0,
112         )
113       
114     def initDialog(self, dico):
115       self.ui.dsb_angle.setValue(dico['angle'])
116       self.ui.dsb_rCintr.setValue(dico['rCintr'])
117       self.ui.dsb_lTubeP1.setValue(dico['lTubeP1'])
118       self.ui.dsb_lTubeP2.setValue(dico['lTubeP2'])
119       self.ui.dsb_epais.setValue(dico['epais'])
120       self.ui.dsb_dext.setValue(dico['dext'])
121       self.ui.dsb_profondeur.setValue(dico['profondeur'])
122       self.ui.dsb_longueur.setValue(dico['longueur'])
123       self.ui.dsb_azimut.setValue(dico['azimut'])
124       self.ui.dsb_orientation.setValue(dico['orientation'])
125       self.ui.dsb_posiAngul.setValue(dico['posiAngul'])
126       self.ui.dsb_absCurv.setValue(dico['absCurv'])
127       self.ui.sb_nbTranches.setValue(dico['nbTranches'])
128       self.ui.sb_nbCouronne.setValue(dico['nbCouronnes'])
129       self.ui.sb_nbSecteur.setValue(dico['nbSecteurs'])
130       self.ui.dsb_aretesFaceFissure.setValue(dico['aretesFaceFissure'])
131       self.ui.dsb_influence.setValue(dico['influence'])
132       self.ui.sb_nbAxeTubeP1.setValue(dico['nbAxeTubeP1'])
133       self.ui.sb_nbAxeTubeP2.setValue(dico['nbAxeTubeP2'])
134       self.ui.sb_nbAxeCoude.setValue(dico['nbAxeCoude'])
135       self.ui.sb_nbCirconf.setValue(dico['nbCirconf'])
136       self.ui.sb_nbEpaisseur.setValue(dico['nbEpaisseur'])
137       self.ui.dsb_rayonTore.setValue(dico['rayonTore'])
138       #self.ui.cb_optDiscrSain.setChecked(False)
139       #self.ui.gb_discrSain.setShown(False)
140       self.ui.cb_optDiscrSain.setChecked(not(dico['cbOptDiscrSain']))
141       self.ui.cb_optDiscrSain.click()
142       self.ui.cb_optDiscrFiss.setChecked(not(dico['cbOptDiscrFiss']))
143       self.ui.cb_optDiscrFiss.click()
144       if dico['rbPosiAngul']:
145         self.ui.dsb_absCurv.setEnabled(False)
146         self.ui.dsb_posiAngul.setEnabled(True)
147         self.ui.rb_posiAngul.setChecked(True)
148         #self.ui.rb_posiAngul.click()
149       else:
150         self.ui.dsb_absCurv.setEnabled(True)
151         self.ui.dsb_posiAngul.setEnabled(False)
152         self.ui.rb_absCurv.setChecked(True)
153         #self.ui.rb_absCurv.click()
154       self.ui.rb_fissExt.setChecked(dico['rbFissExt'])
155       self.ui.cb_forceEllipse.setChecked(dico['cbForceEllipse'])
156       incomplet = self.testval(dico)
157       pass
158     
159     def testval(self, dico):
160       incomplet = False
161       if dico['angle'] < -180.0:
162         self.ui.dsb_angle.setPalette(self.redPalette)
163         incomplet = True
164       else:
165         self.ui.dsb_angle.setPalette(self.blackPalette)
166         
167       if dico['rCintr'] == 0.0:
168         self.ui.dsb_rCintr.setPalette(self.redPalette)
169         incomplet = True
170       else:
171         self.ui.dsb_rCintr.setPalette(self.blackPalette)
172         
173       if dico['lTubeP1'] == 0.0:  
174         self.ui.dsb_lTubeP1.setPalette(self.redPalette)
175         incomplet = True
176       else:
177         self.ui.dsb_lTubeP1.setPalette(self.blackPalette)
178         
179       if dico['lTubeP2'] == 0.0:  
180         self.ui.dsb_lTubeP2.setPalette(self.redPalette)
181         incomplet = True
182       else:
183         self.ui.dsb_lTubeP2.setPalette(self.blackPalette)
184         
185       if dico['epais'] == 0.0:  
186         self.ui.dsb_epais.setPalette(self.redPalette)
187         incomplet = True
188       else:
189         self.ui.dsb_epais.setPalette(self.blackPalette)
190         
191       if dico['dext'] == 0.0:  
192         self.ui.dsb_dext.setPalette(self.redPalette)
193         incomplet = True
194       else:
195         self.ui.dsb_dext.setPalette(self.blackPalette)
196         
197       if dico['profondeur'] == 0.0:  
198         self.ui.dsb_profondeur.setPalette(self.redPalette)
199         incomplet = True
200       else:
201         self.ui.dsb_profondeur.setPalette(self.blackPalette)
202         
203       if dico['longueur'] == 0.0:  
204         self.ui.dsb_longueur.setPalette(self.redPalette)
205         incomplet = True
206       else:
207         self.ui.dsb_longueur.setPalette(self.blackPalette)
208         
209       if dico['azimut'] < -180.0:  
210         self.ui.dsb_azimut.setPalette(self.redPalette)
211         incomplet = True
212       else:
213         self.ui.dsb_azimut.setPalette(self.blackPalette)
214         
215       if dico['orientation'] < 0.0:  
216         self.ui.dsb_orientation.setPalette(self.redPalette)
217         incomplet = True
218       else:
219         self.ui.dsb_orientation.setPalette(self.blackPalette)
220         
221       if dico['posiAngul'] < -180.0 and dico['rbPosiAngul'] == True:  
222         self.ui.dsb_posiAngul.setPalette(self.redPalette)
223         incomplet = True
224       else:
225         self.ui.dsb_posiAngul.setPalette(self.blackPalette)
226         
227       if dico['absCurv'] == 0.0 and dico['rbPosiAngul'] == False:  
228         self.ui.dsb_absCurv.setPalette(self.redPalette)
229         incomplet = True
230       else:
231         self.ui.dsb_absCurv.setPalette(self.blackPalette)
232         
233       if dico['nbTranches'] == 7:  
234         self.ui.sb_nbTranches.setPalette(self.redPalette)
235         incomplet = True
236       else:
237         self.ui.sb_nbTranches.setPalette(self.blackPalette)
238         
239       if dico['nbCouronnes'] == 1:  
240         self.ui.sb_nbCouronne.setPalette(self.redPalette)
241         incomplet = True
242       else:
243         self.ui.sb_nbCouronne.setPalette(self.blackPalette)
244         
245       if dico['nbSecteurs'] == 3:  
246         self.ui.sb_nbSecteur.setPalette(self.redPalette)
247         incomplet = True
248       else:
249         self.ui.sb_nbSecteur.setPalette(self.blackPalette)
250         
251       print "incomplet: ", incomplet
252       return incomplet
253     
254     def fileDefault(self):
255       filedef = os.path.expanduser("~/.config/salome/dialogFissureCoude.dic")
256       print filedef
257       return filedef
258     
259     def writeDefault(self, dico):
260       filedef = self.fileDefault()
261       f = open(filedef, 'w')
262       f.write(str(dico))
263       f.close()
264     
265     def readValPrec(self):
266       filedef = self.fileDefault()
267       if os.path.exists(filedef):
268         f = open(filedef, 'r')
269         txt = f.read()
270         dico = eval(txt)
271         print dico
272         self.initDialog(dico)
273
274     def resetVal(self):
275       #self.initDefaut()
276       self.initDialog(self.defaut)
277       
278     def sauver(self):
279       print "sauver"
280       fileDiag = QFileDialog(self)
281       fileDiag.setFileMode(QFileDialog.AnyFile)
282       fileDiag.setNameFilter("Parametres *.dic (*.dic)")
283       fileDiag.setViewMode(QFileDialog.List)
284       if fileDiag.exec_() :
285         fileNames = fileDiag.selectedFiles()
286         filedef = fileNames[0]
287         dico = self.creeDico()
288         f = open(filedef, 'w')
289         f.write(str(dico))
290         f.close()
291         
292     def recharger(self):
293       print "recharger"
294       fileDiag = QFileDialog(self)
295       fileDiag.setFileMode(QFileDialog.ExistingFile)
296       fileDiag.setNameFilter("Parametres *.dic (*.dic)")
297       fileDiag.setViewMode(QFileDialog.Detail)
298       if fileDiag.exec_() :
299         fileNames = fileDiag.selectedFiles()
300         filedef = fileNames[0]
301         print filedef
302         if os.path.exists(filedef):
303           f = open(filedef, 'r')
304           txt = f.read()
305           dico = eval(txt)
306           print dico
307           self.initDialog(dico)
308          
309     def creeDico(self):
310       dico = dict(
311         angle             = self.ui.dsb_angle.value(),
312         rCintr            = self.ui.dsb_rCintr.value(),
313         lTubeP1           = self.ui.dsb_lTubeP1.value(),
314         lTubeP2           = self.ui.dsb_lTubeP2.value(),
315         epais             = self.ui.dsb_epais.value(),
316         dext              = self.ui.dsb_dext.value(),
317         profondeur        = self.ui.dsb_profondeur.value(),
318         longueur          = self.ui.dsb_longueur.value(),
319         azimut            = self.ui.dsb_azimut.value(),
320         orientation       = self.ui.dsb_orientation.value(),
321         posiAngul         = self.ui.dsb_posiAngul.value(),
322         absCurv           = self.ui.dsb_absCurv.value(),
323         nbTranches        = self.ui.sb_nbTranches.value(),
324         nbCouronnes       = self.ui.sb_nbCouronne.value(),
325         nbSecteurs        = self.ui.sb_nbSecteur.value(),
326         cbOptDiscrSain    = self.ui.cb_optDiscrSain.isChecked(),
327         cbOptDiscrFiss    = self.ui.cb_optDiscrFiss.isChecked(),
328         rbPosiAngul       = self.ui.rb_posiAngul.isChecked(),
329         rbFissExt         = self.ui.rb_fissExt.isChecked(),
330         cbForceEllipse    = self.ui.cb_forceEllipse.isChecked(),
331         nbAxeTubeP1       = self.ui.sb_nbAxeTubeP1.value(),
332         nbAxeTubeP2       = self.ui.sb_nbAxeTubeP2.value(),
333         nbAxeCoude        = self.ui.sb_nbAxeCoude.value(),
334         nbCirconf         = self.ui.sb_nbCirconf.value(),
335         nbEpaisseur       = self.ui.sb_nbEpaisseur.value(),
336         rayonTore         = self.ui.dsb_rayonTore.value(),
337         aretesFaceFissure = self.ui.dsb_aretesFaceFissure.value(),
338         influence         = self.ui.dsb_influence.value(),
339         )
340       print dico
341       return dico
342       
343     def checkValues(self):
344       return self.NOK
345
346     def execute(self):
347       from blocFissure.gmu import initLog
348       #initLog.setDebug()
349       initLog.setVerbose() # don't set the level too early, to be able to modify it
350       from blocFissure.gmu import geomsmesh
351       from blocFissure.gmu.casStandard import casStandard
352       from blocFissure.ihm.fissureCoude_ihm import fissureCoude_ihm
353       
354       dico = self.creeDico()
355       NOK = self.testval(dico)
356       if not(NOK):
357         dico['lenSegPipe'] = (dico['longueur'] + math.pi*dico['profondeur'])/dico['nbTranches']
358         print 'lenSegPipe', dico['lenSegPipe']
359         areteMinAngle = (dico['rCintr'] -dico['dext']/2.0)*(dico['angle']*math.pi/180.0)/dico['nbAxeCoude']
360         print'areteMinAngle', areteMinAngle
361         areteMinCirco = dico['dext']*math.pi/(2*dico['nbCirconf'])
362         print'areteMinCirco', areteMinCirco
363         areteMinEpais = dico['epais']/dico['nbEpaisseur']
364         print'areteMinEpais', areteMinEpais
365         if dico['influence'] == 0:
366           dico['influence'] = max(areteMinAngle, areteMinCirco, areteMinEpais)
367           print 'influence', dico['influence']
368         if dico['aretesFaceFissure'] == 0:
369           dico['aretesFaceFissure'] = (areteMinAngle + areteMinCirco)/2.0
370           print 'aretesFaceFissure', dico['aretesFaceFissure']
371         if dico['rbPosiAngul'] == False:
372           rmoy = (dico['dext'] - dico['epais'])/2.0
373           eta = 1
374           if dico['rbFissExt'] == False:
375             eta = -1
376           dico['posiAngul'] = (180.0/math.pi)*dico['absCurv']/(dico['rCintr']+(rmoy+eta*dico['epais']/2.0)*math.cos(math.pi*dico['azimut']/180.))
377           print 'posiAngul' , dico['posiAngul']
378         
379         self.writeDefault(dico)
380         self.ui.lb_calcul.show()
381         probleme = fissureCoude_ihm(0)
382         probleme.setDicoParams(dico)
383         probleme.executeProbleme()
384       self.NOK = NOK
385       self.accept()
386     
387     pass 
388
389 # ----------------------------------------------------------------------------
390                      
391   window = fissureCoudeDialog()
392 #  window.ui.dsb_tolerance.setValue(0.01)
393   retry = True
394   while(retry):
395     retry = False
396     window.exec_()
397     result = window.result()
398     if result:
399       # dialog accepted
400       print "dialog accepted, check"
401       retry = window.checkValues()
402     else:
403       print "dialog rejected, exit"
404   pass
405