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