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