Salome HOME
Merge branch 'V8_3_BR' into ngr/python3_dev
[modules/smesh.git] / src / Tools / blocFissure / ihm / fissureGenerale_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 sys, traceback
26 import math
27 from blocFissure import gmu
28
29 def fissureGeneraleDlg(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 PyQt5 import QtCore
39   from PyQt5 import QtWidgets
40   from PyQt5 import QtGui
41   from PyQt5.QtWidgets import QFileDialog
42   from PyQt5.QtWidgets import QMessageBox
43   from PyQt5.QtGui import QPalette
44   from PyQt5.QtGui import QColor
45   from blocFissure.ihm.fissureGenerale_ui import Ui_Dialog
46
47   class fissureGeneraleDialog(QtWidgets.QDialog):
48
49     def __init__(self):
50       print("__init__")
51       QtWidgets.QDialog.__init__(self)
52       # Set up the user interface from Designer.
53       self.ui = Ui_Dialog()
54       self.ui.setupUi(self)
55
56       self.blackPalette = self.ui.dsb_influence.palette()
57       self.redPalette = QPalette()
58       self.redPalette.setColor(QPalette.Text, QColor(255,0,0))
59       self.NOK = False
60
61       self.initDefaut()
62       self.initDialog(self.defaut)
63       self.ui.lb_calcul.hide()
64
65       # Connect up the buttons.
66
67       self.ui.pb_exemple.clicked.connect(self.genereExemples)
68       self.ui.pb_valPrec.clicked.connect(self.readValPrec)
69       self.ui.pb_reset.clicked.connect(self.resetVal)
70       self.ui.pb_recharger.clicked.connect(self.recharger)
71       self.ui.pb_sauver.clicked.connect(self.sauver)
72       self.ui.pb_maillage.clicked.connect(self.selectMaillage)
73       self.ui.pb_facefiss.clicked.connect(self.selectFacefiss)
74       self.ui.pb_reptrav.clicked.connect(self.selectReptrav)
75       self.ui.bb_OkCancel.accepted.disconnect(self.accept)
76       self.ui.bb_OkCancel.accepted.connect(self.execute)
77
78     def initDefaut(self):
79       self.defaut = dict(
80         nomCas            = 'angleCube',
81         maillageSain      = os.path.join(gmu.pathBloc, 'materielCasTests/CubeAngle.med'),
82         brepFaceFissure   = os.path.join(gmu.pathBloc, "materielCasTests/CubeAngleFiss.brep"),
83         edgeFissIds       = [4],
84         lgInfluence       = 20,
85         meshBrep          = (5,10),
86         rayonPipe         = 5,
87         lenSegPipe        = 2.5,
88         nbSegRad          = 5,
89         nbSegCercle       = 32,
90         areteFaceFissure  = 10,
91         areteVives        = 0,
92         reptrav           = '.',
93         nomres            = 'casStandard_fissure.med',
94         verbosite         = 0)
95
96
97     def initDialog(self, dico):
98       self.ui.le_maillage.setText(dico['maillageSain'])
99       self.ui.le_facefiss.setText(dico['brepFaceFissure'])
100       self.ui.le_fondfiss.setText(str(dico['edgeFissIds']))
101       self.ui.dsb_influence.setValue(dico['lgInfluence'])
102       self.ui.dsb_meshBrepMin.setValue(dico['meshBrep'][0])
103       self.ui.dsb_meshBrepMax.setValue(dico['meshBrep'][1])
104       self.ui.dsb_rayonPipe.setValue(dico['rayonPipe'])
105       self.ui.dsb_lenSegPipe.setValue(dico['lenSegPipe'])
106       self.ui.sb_couronnes.setValue(dico['nbSegRad'])
107       self.ui.sb_secteurs.setValue(dico['nbSegCercle'])
108       self.ui.dsb_areteFaceFissure.setValue(dico['areteFaceFissure'])
109       if 'aretesVives' in dico:
110         self.ui.dsb_aretesVives.setValue(dico['aretesVives'])
111       else:
112         self.ui.dsb_aretesVives.setValue(0)
113       self.ui.le_reptrav.setText(os.path.abspath(dico['reptrav']))
114       self.ui.le_nomres.setText(os.path.split(dico['nomres'])[1])
115       self.ui.cb_log.setCurrentIndex(dico['verbosite'])
116       incomplet = self.testval(dico)
117       pass
118
119     def testval(self, dico):
120       incomplet = False
121       if not os.path.lexists(dico['maillageSain']):
122         self.ui.le_maillage.setPalette(self.redPalette)
123         incomplet = True
124       else:
125         self.ui.le_maillage.setPalette(self.blackPalette)
126       if not os.path.lexists(dico['brepFaceFissure']):
127         self.ui.le_facefiss.setPalette(self.redPalette)
128         incomplet = True
129       else:
130         self.ui.le_facefiss.setPalette(self.blackPalette)
131       edgeFissIdsOK=True
132       try:
133         l = dico['edgeFissIds']
134         for i in l:
135           if not isinstance(i, int):
136             print("not isinstance(i, int)")
137             incomplet = True
138             edgeFissIdsOK=False
139             break
140       except:
141         print("except eval")
142         incomplet = True
143         edgeFissIdsOK=False
144       if edgeFissIdsOK:
145         self.ui.le_fondfiss.setPalette(self.blackPalette)
146       else:
147         self.ui.le_fondfiss.setPalette(self.redPalette)
148       if dico['meshBrep'][0] == 0:
149         self.ui.dsb_meshBrepMin.setPalette(self.redPalette)
150         incomplet = True
151       else:
152         self.ui.dsb_meshBrepMin.setPalette(self.blackPalette)
153       if dico['meshBrep'][1] == 0:
154         self.ui.dsb_meshBrepMax.setPalette(self.redPalette)
155         incomplet = True
156       else:
157         self.ui.dsb_meshBrepMax.setPalette(self.blackPalette)
158       if dico['rayonPipe'] == 0:
159         self.ui.dsb_rayonPipe.setPalette(self.redPalette)
160         incomplet = True
161       else:
162         self.ui.dsb_rayonPipe.setPalette(self.blackPalette)
163       if dico['lenSegPipe'] == 0:
164         self.ui.dsb_lenSegPipe.setPalette(self.redPalette)
165         incomplet = True
166       else:
167         self.ui.dsb_lenSegPipe.setPalette(self.blackPalette)
168       if dico['areteFaceFissure'] == 0:
169         self.ui.dsb_areteFaceFissure.setPalette(self.redPalette)
170         incomplet = True
171       else:
172         self.ui.dsb_areteFaceFissure.setPalette(self.blackPalette)
173
174       print("incomplet: ", incomplet)
175       return incomplet
176
177     def fileDefault(self):
178       filedef = os.path.expanduser("~/.config/salome/dialogFissureGenerale.dic")
179       print(filedef)
180       return filedef
181
182     def writeDefault(self, dico):
183       filedef = self.fileDefault()
184       with open(filedef, 'w') as f:
185           f.write(str(dico))
186
187     def genereExemples(self):
188       maillageSain      = os.path.join(gmu.pathBloc, 'materielCasTests/CubeAngle.med')
189       brepFaceFissure   = os.path.join(gmu.pathBloc, "materielCasTests/CubeAngleFiss.brep")
190       if (os.path.exists(maillageSain) and os.path.exists(brepFaceFissure)):
191         self.initDialog(self.defaut)
192       else:
193         self.ui.lb_calcul.setText("--- Generation exemples en cours ---")
194         self.ui.lb_calcul.show()
195         from blocFissure.materielCasTests import genereMateriel
196         self.ui.lb_calcul.hide()
197         self.initDialog(self.defaut)
198
199     def readValPrec(self):
200       filedef = self.fileDefault()
201       if os.path.exists(filedef):
202         with open(filedef, 'r') as f:
203             txt = f.read()
204         dico = eval(txt)
205         print(dico)
206         self.initDialog(dico)
207
208     def resetVal(self):
209       #self.initDefaut()
210       self.initDialog(self.defaut)
211
212     def setLogVerbosity(self, logfile):
213       from blocFissure.gmu import initLog # le mode de log s'initialise une seule fois
214       print("setLogVerbosity")
215       index = self.ui.cb_log.currentIndex()
216       print(index)
217       if index == 0:
218         initLog.setRelease(logfile)
219       elif index == 1:
220         initLog.setVerbose(logfile)
221       elif index == 2:
222         initLog.setDebug(logfile)
223
224
225     def sauver(self):
226       print("sauver")
227       fileDiag = QFileDialog(self)
228       fileDiag.setFileMode(QFileDialog.AnyFile)
229       fileDiag.setNameFilter("Parametres *.dic (*.dic)")
230       fileDiag.setViewMode(QFileDialog.List)
231       if fileDiag.exec_() :
232         fileNames = fileDiag.selectedFiles()
233         print(fileNames)
234         filedef = fileNames[0]
235         if filedef[-4:] not in ['.dic']:
236           filedef += '.dic'
237         dico = self.creeDico()
238         with open(filedef, 'w') as f:
239           f.write(str(dico))
240
241     def recharger(self):
242       print("recharger")
243       fileDiag = QFileDialog(self)
244       fileDiag.setFileMode(QFileDialog.ExistingFile)
245       fileDiag.setNameFilter("Parametres *.dic (*.dic)")
246       fileDiag.setViewMode(QFileDialog.Detail)
247       if fileDiag.exec_() :
248         fileNames = fileDiag.selectedFiles()
249         filedef = fileNames[0]
250         print(filedef)
251         if os.path.exists(filedef):
252           with open(filedef, 'r') as f:
253             txt = f.read()
254           dico = eval(txt)
255           print(dico)
256           self.initDialog(dico)
257
258     def selectMaillage(self):
259       fileDiag = QFileDialog(self)
260       fileDiag.setFileMode(QFileDialog.ExistingFile)
261       fileDiag.setNameFilter("Maillage *.med (*.med)")
262       fileDiag.setViewMode(QFileDialog.Detail)
263       if fileDiag.exec_() :
264         fileNames = fileDiag.selectedFiles()
265         filedef = fileNames[0]
266         print(filedef)
267         self.ui.le_maillage.setText(filedef)
268
269     def selectFacefiss(self):
270       fileDiag = QFileDialog(self)
271       fileDiag.setFileMode(QFileDialog.ExistingFile)
272       fileDiag.setNameFilter("Face fissure *.brep (*.brep)")
273       fileDiag.setViewMode(QFileDialog.Detail)
274       if fileDiag.exec_() :
275         fileNames = fileDiag.selectedFiles()
276         filedef = fileNames[0]
277         print(filedef)
278         self.ui.le_facefiss.setText(filedef)
279
280     def selectReptrav(self):
281       fileDiag = QFileDialog(self)
282       fileDiag.setFileMode(QFileDialog.Directory)
283       fileDiag.setViewMode(QFileDialog.Detail)
284       fileDiag.setDirectory(self.ui.le_reptrav.text())
285       if fileDiag.exec_() :
286         fileNames = fileDiag.selectedFiles()
287         reptrav = str(fileNames[0])
288         print("reptrav ", reptrav)
289         self.ui.le_reptrav.setText(os.path.abspath(reptrav))
290
291
292     def selectNomres(self):
293       fileDiag = QFileDialog(self)
294       fileDiag.setFileMode(QFileDialog.AnyFile)
295       fileDiag.setViewMode(QFileDialog.Detail)
296       nomres=str(os.path.split(str(self.ui.le_nomres.text()))[1])
297       fileDiag.setDirectory(self.ui.le_reptrav.text())
298       fileDiag.selectFile(nomres)
299       fileDiag.setNameFilter("Maillage *.med (*.med)")
300       self.ui.le_nomres.setText(nomres)
301       if fileDiag.exec_() :
302         fileNames = fileDiag.selectedFiles()
303         tempnom = os.path.split(str(fileNames[0]))[1]
304         print("nomres ", tempnom)
305         self.ui.le_nomres.setText(tempnom)
306       else:
307         self.ui.le_nomres.setText(nomres)
308
309     def creeDico(self):
310       dico = dict(
311                   maillageSain     = str(self.ui.le_maillage.text()),
312                   brepFaceFissure  = str(self.ui.le_facefiss.text()),
313                   edgeFissIds      = eval(str(self.ui.le_fondfiss.text())),
314                   lgInfluence      = self.ui.dsb_influence.value(),
315                   meshBrep         = [self.ui.dsb_meshBrepMin.value(),self.ui.dsb_meshBrepMax.value()],
316                   rayonPipe        = self.ui.dsb_rayonPipe.value(),
317                   lenSegPipe       = self.ui.dsb_lenSegPipe.value(),
318                   nbSegRad         = self.ui.sb_couronnes.value(),
319                   nbSegCercle      = self.ui.sb_secteurs.value(),
320                   areteFaceFissure = self.ui.dsb_areteFaceFissure.value(),
321                   aretesVives      = self.ui.dsb_aretesVives.value(),
322                   reptrav          = str(self.ui.le_reptrav.text()),
323                   nomres           = str(self.ui.le_nomres.text()),
324                   verbosite        = self.ui.cb_log.currentIndex()
325                   )
326       print(dico)
327       return dico
328
329     def checkValues(self):
330       return self.NOK
331
332     def execute(self):
333       print("execute")
334       dico = self.creeDico()
335       NOK = self.testval(dico)
336       if not(NOK):
337         self.writeDefault(dico)
338         self.ui.lb_calcul.setText("--- Calcul en cours ---")
339         self.ui.lb_calcul.show()
340         logfile=os.path.join(dico['reptrav'], dico['nomres']+".log")
341         self.setLogVerbosity(logfile)
342         from blocFissure.gmu import geomsmesh               # après intialisation log dans setLogVerbosity
343         from blocFissure.gmu.casStandard import casStandard # après intialisation log dans setLogVerbosity
344         from blocFissure.gmu.fissError import fissError
345         try:
346           execInstance = casStandard(dico)
347         except fissError as erreur:
348           print('-'*60)
349           print(type(erreur))
350           print('-'*60)
351           print(erreur.msg)
352           print('-'*60)
353           for ligne in erreur.pile:
354             print(repr(ligne))
355           print('-'*60)
356           texte = erreur.msg
357 #           texte += +"<br>" +'-'*60 +"<br>"
358 #           for ligne in erreur.pile:
359 #             texte += repr(ligne) +"<br>"
360           mbox = QMessageBox(self)
361           mbox.setWindowTitle("erreur blocFissure")
362           mbox.setText(str(texte))
363           mbox.exec_()
364 #        except Exception as erreur:
365 #          print "exception non répertoriée"
366       self.NOK = NOK
367       self.ui.lb_calcul.hide()
368       #self.accept()
369
370     pass
371
372 # ----------------------------------------------------------------------------
373
374   print("main")
375   window = fissureGeneraleDialog()
376   retry = True
377   while(retry):
378     retry = False
379     window.exec_()
380     result = window.result()
381     if result:
382       # dialog accepted
383       print("dialog accepted, check")
384       retry = window.checkValues()
385     else:
386       print("dialog rejected, exit")
387   pass
388