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