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