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