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