Salome HOME
Merge branch 'master' into gni/evolution
[modules/smesh.git] / src / Tools / blocFissure / ihm / fissureGenerale_plugin.py
index e7c0ef3571521d5340aa83182359cabc5abf0557..3eefae078be303f337181c7b6952ed11fb2cc242 100644 (file)
@@ -1,11 +1,11 @@
 # -*- coding: utf-8 -*-
 
-# Copyright (C) 2006-2015  EDF R&D
+# Copyright (C) 2006-2021  EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
 # License as published by the Free Software Foundation; either
-# version 2.1 of the License.
+# version 2.1 of the License, or (at your option) any later version.
 #
 # This library is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
 
+"""Pilotage de la fenêtre de dialogue"""
+
 # if you already have plugins defined in a salome_plugins.py file, add this file at the end.
 # if not, copy this file as ${HOME}/Plugins/smesh_plugins.py or ${APPLI}/Plugins/smesh_plugins.py
 
-import sys, traceback
-import math
+import sys
+import traceback
 from blocFissure import gmu
 
 def fissureGeneraleDlg(context):
-  # get context study, studyId, salomeGui
+  """get context study, salomeGui"""
   study = context.study
-  studyId = context.studyId
   sg = context.sg
-  
+
   import os
   #import subprocess
   #import tempfile
-  from PyQt4 import QtCore
-  from PyQt4 import QtGui
-  from PyQt4.QtGui import QFileDialog
-  from PyQt4.QtGui import QMessageBox
-  from PyQt4.QtGui import QPalette
-  from PyQt4.QtGui import QColor
-  from fissureGenerale_ui import Ui_Dialog
-  
-  class fissureGeneraleDialog(QtGui.QDialog):
-    
+  from PyQt5 import QtCore
+  from PyQt5 import QtWidgets
+  from PyQt5 import QtGui
+  from PyQt5.QtWidgets import QFileDialog
+  from PyQt5.QtWidgets import QMessageBox
+  from PyQt5.QtGui import QPalette
+  from PyQt5.QtGui import QColor
+  from blocFissure.ihm.fissureGenerale_ui import Ui_Dialog
+
+  class fissureGeneraleDialog(QtWidgets.QDialog):
+    """classe du dialogue"""
+
     def __init__(self):
-      print "__init__"
-      QtGui.QDialog.__init__(self)
+      print("__init__")
+      QtWidgets.QDialog.__init__(self)
       # Set up the user interface from Designer.
       self.ui = Ui_Dialog()
       self.ui.setupUi(self)
-      
+
       self.blackPalette = self.ui.dsb_influence.palette()
       self.redPalette = QPalette()
       self.redPalette.setColor(QPalette.Text, QColor(255,0,0))
       self.NOK = False
-      
+
       self.initDefaut()
       self.initDialog(self.defaut)
       self.ui.lb_calcul.hide()
-      
+
       # Connect up the buttons.
-      self.connect(self.ui.pb_valPrec, QtCore.SIGNAL("clicked()"),
-                   self.readValPrec)
-      self.connect(self.ui.pb_reset, QtCore.SIGNAL("clicked()"),
-                   self.resetVal)
-      self.connect(self.ui.pb_recharger, QtCore.SIGNAL("clicked()"),
-                   self.recharger)
-      self.connect(self.ui.pb_sauver, QtCore.SIGNAL("clicked()"),
-                   self.sauver)
-      self.connect(self.ui.pb_maillage, QtCore.SIGNAL("clicked()"),
-                   self.selectMaillage)
-      self.connect(self.ui.pb_facefiss, QtCore.SIGNAL("clicked()"),
-                   self.selectFacefiss)
-      self.disconnect(self.ui.bb_OkCancel, QtCore.SIGNAL("accepted()"), self.accept)
-      self.connect(self.ui.bb_OkCancel, QtCore.SIGNAL("accepted()"),
-                   self.execute)
-    
+
+      self.ui.pb_exemple.clicked.connect(self.genereExemples)
+      self.ui.pb_valPrec.clicked.connect(self.readValPrec)
+      self.ui.pb_reset.clicked.connect(self.resetVal)
+      self.ui.pb_recharger.clicked.connect(self.recharger)
+      self.ui.pb_sauver.clicked.connect(self.sauver)
+      self.ui.pb_maillage.clicked.connect(self.selectMaillage)
+      self.ui.pb_facefiss.clicked.connect(self.selectFacefiss)
+      self.ui.pb_reptrav.clicked.connect(self.selectReptrav)
+      self.ui.bb_OkCancel.accepted.disconnect(self.accept)
+      self.ui.bb_OkCancel.accepted.connect(self.execute)
+
     def initDefaut(self):
-      self.defaut = dict(
-        nomCas            = 'angleCube',
-        maillageSain      = os.path.join(gmu.pathBloc, 'materielCasTests/CubeAngle.med'),
-        brepFaceFissure   = os.path.join(gmu.pathBloc, "materielCasTests/CubeAngleFiss.brep"),
-        edgeFissIds       = [4],
-        lgInfluence       = 20,
-        meshBrep          = (5,10),
-        rayonPipe         = 5,
-        lenSegPipe        = 2.5,
-        nbSegRad          = 5,
-        nbSegCercle       = 32,
-        areteFaceFissure  = 10)
-
-      
+      self.defaut = dict( \
+        nomCas            = "angleCube", \
+        maillageSain      = os.path.join(gmu.pathBloc, "materielCasTests", "CubeAngle.med"), \
+        CAOFaceFissure    = os.path.join(gmu.pathBloc, "materielCasTests", "CubeAngleFiss.brep"), \
+        edgeFiss          = [3], \
+        lgInfluence       = 20, \
+        meshBrep          = (5,10), \
+        rayonPipe         = 5, \
+        lenSegPipe        = 2.5, \
+        nbSegRad          = 5, \
+        nbSegCercle       = 32, \
+        areteFaceFissure  = 10, \
+        areteVives        = 0, \
+        reptrav           = os.curdir, \
+        nomres            = "maillage_avec_fissure", \
+        verbosite         = 0)
+
+
     def initDialog(self, dico):
       self.ui.le_maillage.setText(dico['maillageSain'])
-      self.ui.le_facefiss.setText(dico['brepFaceFissure'])
-      self.ui.le_fondfiss.setText(str(dico['edgeFissIds']))
+      self.ui.le_facefiss.setText(dico['CAOFaceFissure'])
+      self.ui.le_fondfiss.setText(str(dico['edgeFiss']))
       self.ui.dsb_influence.setValue(dico['lgInfluence'])
       self.ui.dsb_meshBrepMin.setValue(dico['meshBrep'][0])
       self.ui.dsb_meshBrepMax.setValue(dico['meshBrep'][1])
@@ -105,9 +108,15 @@ def fissureGeneraleDlg(context):
       self.ui.sb_couronnes.setValue(dico['nbSegRad'])
       self.ui.sb_secteurs.setValue(dico['nbSegCercle'])
       self.ui.dsb_areteFaceFissure.setValue(dico['areteFaceFissure'])
-      incomplet = self.testval(dico)
-      pass
-  
+      if 'aretesVives' in dico:
+        self.ui.dsb_aretesVives.setValue(dico['aretesVives'])
+      else:
+        self.ui.dsb_aretesVives.setValue(0)
+      self.ui.le_reptrav.setText(os.path.abspath(dico['reptrav']))
+      self.ui.le_nomres.setText(os.path.split(dico['nomres'])[1])
+      self.ui.cb_log.setCurrentIndex(dico['verbosite'])
+      #incomplet = self.testval(dico)
+
     def testval(self, dico):
       incomplet = False
       if not os.path.lexists(dico['maillageSain']):
@@ -115,25 +124,40 @@ def fissureGeneraleDlg(context):
         incomplet = True
       else:
         self.ui.le_maillage.setPalette(self.blackPalette)
-      if not os.path.lexists(dico['brepFaceFissure']):
+      cao_file = dico['CAOFaceFissure']
+      if not os.path.lexists(cao_file):
         self.ui.le_facefiss.setPalette(self.redPalette)
         incomplet = True
       else:
-        self.ui.le_facefiss.setPalette(self.blackPalette)
-      edgeFissIdsOK=True
-      try:
-        l = dico['edgeFissIds']
-        for i in l:
-          if not isinstance(i, int):
-            print"not isinstance(i, int)"
+        suffix = os.path.basename(cao_file).split(".")[-1]
+        if ( suffix.upper() not in ("BREP","XAO") ):
+          print ("Suffixe inconnu pour le fichier {}".format(cao_file))
+          self.ui.le_facefiss.setPalette(self.redPalette)
+          incomplet = True
+        else:
+          self.ui.le_facefiss.setPalette(self.blackPalette)
+      if dico['edgeFiss']:
+        edgeFissOK=True
+        param_0 = dico['edgeFiss'][0]
+        type_param_id = type(param_0)
+        for param in dico['edgeFiss'][1:]:
+          if not isinstance(param,type_param_id):
+            print ("La donnée {} n'est pas du même type que la première de la liste : {}.".format(param,type(param)))
+            incomplet = True
+            edgeFissOK=False
+        if edgeFissOK:
+          if isinstance(param_0, int):
+            pass
+          elif isinstance(param_0, str):
+            pass
+          else:
+            print("Il faut une liste de noms de groupes d'arêtes ou une liste d'IDs d'arêtes.")
             incomplet = True
-            edgeFissIdsOK=False
-            break
-      except:
-        print "except eval"
+            edgeFissOK=False
+      else:
         incomplet = True
-        edgeFissIdsOK=False
-      if edgeFissIdsOK:
+        edgeFissOK=False
+      if edgeFissOK:
         self.ui.le_fondfiss.setPalette(self.blackPalette)
       else:
         self.ui.le_fondfiss.setPalette(self.redPalette)
@@ -162,63 +186,75 @@ def fissureGeneraleDlg(context):
         incomplet = True
       else:
         self.ui.dsb_areteFaceFissure.setPalette(self.blackPalette)
-    
-      print "incomplet: ", incomplet
+
+      print("incomplet: ", incomplet)
       return incomplet
-    
+
     def fileDefault(self):
-      filedef = os.path.expanduser("~/.config/salome/dialogFissureGenerale.dic")
-      print filedef
+      filedef = os.path.expanduser( os.path.join(os.environ["HOME"], ".config", "salome", "dialogFissureGenerale.dic") )
+      print(filedef)
       return filedef
-    
+
     def writeDefault(self, dico):
       filedef = self.fileDefault()
-      f = open(filedef, 'w')
-      f.write(str(dico))
-      f.close()
-    
+      with open(filedef, 'w') as fichier:
+        fichier.write(str(dico))
+
+    def genereExemples(self):
+      maillageSain      = os.path.join(gmu.pathBloc, "materielCasTests", "CubeAngle.med")
+      CAOFaceFissure    = os.path.join(gmu.pathBloc, "materielCasTests", "CubeAngleFiss.brep")
+      if (os.path.exists(maillageSain) and os.path.exists(CAOFaceFissure )):
+        self.initDialog(self.defaut)
+      else:
+        self.ui.lb_calcul.setText("--- Generation exemples en cours ---")
+        self.ui.lb_calcul.show()
+        from blocFissure.materielCasTests import genereMateriel
+        self.ui.lb_calcul.hide()
+        self.initDialog(self.defaut)
+
     def readValPrec(self):
       filedef = self.fileDefault()
       if os.path.exists(filedef):
-        f = open(filedef, 'r')
-        txt = f.read()
+        with open(filedef, 'r') as fichier:
+          txt = fichier.read()
         dico = eval(txt)
-        print dico
+        print(dico)
         self.initDialog(dico)
 
     def resetVal(self):
       #self.initDefaut()
       self.initDialog(self.defaut)
-      
-    def setLogVerbosity(self):
+
+    def setLogVerbosity(self, logfile):
       from blocFissure.gmu import initLog # le mode de log s'initialise une seule fois
-      print "setLogVerbosity"
+      print("setLogVerbosity")
       index = self.ui.cb_log.currentIndex()
-      print index
+      print(index)
       if index == 0:
-        initLog.setRelease()
+        initLog.setRelease(logfile)
       elif index == 1:
-        initLog.setVerbose()
+        initLog.setVerbose(logfile)
       elif index == 2:
-        initLog.setDebug()
-      
-      
+        initLog.setDebug(logfile)
+
     def sauver(self):
-      print "sauver"
+      print("sauver")
       fileDiag = QFileDialog(self)
       fileDiag.setFileMode(QFileDialog.AnyFile)
       fileDiag.setNameFilter("Parametres *.dic (*.dic)")
       fileDiag.setViewMode(QFileDialog.List)
       if fileDiag.exec_() :
         fileNames = fileDiag.selectedFiles()
+        print(fileNames)
         filedef = fileNames[0]
+        if filedef[-4:] not in ['.dic']:
+          filedef += '.dic'
         dico = self.creeDico()
-        f = open(filedef, 'w')
-        f.write(str(dico))
-        f.close()
-        
+        with open(filedef, 'w') as fichier:
+          fichier.write(str(dico))
+
     def recharger(self):
-      print "recharger"
+      print("recharger")
       fileDiag = QFileDialog(self)
       fileDiag.setFileMode(QFileDialog.ExistingFile)
       fileDiag.setNameFilter("Parametres *.dic (*.dic)")
@@ -226,14 +262,14 @@ def fissureGeneraleDlg(context):
       if fileDiag.exec_() :
         fileNames = fileDiag.selectedFiles()
         filedef = fileNames[0]
-        print filedef
+        print(filedef)
         if os.path.exists(filedef):
-          f = open(filedef, 'r')
-          txt = f.read()
+          with open(filedef, 'r') as fichier:
+            txt = fichier.read()
           dico = eval(txt)
-          print dico
+          print(dico)
           self.initDialog(dico)
-          
+
     def selectMaillage(self):
       fileDiag = QFileDialog(self)
       fileDiag.setFileMode(QFileDialog.ExistingFile)
@@ -242,9 +278,9 @@ def fissureGeneraleDlg(context):
       if fileDiag.exec_() :
         fileNames = fileDiag.selectedFiles()
         filedef = fileNames[0]
-        print filedef
+        print(filedef)
         self.ui.le_maillage.setText(filedef)
-         
+
     def selectFacefiss(self):
       fileDiag = QFileDialog(self)
       fileDiag.setFileMode(QFileDialog.ExistingFile)
@@ -253,47 +289,102 @@ def fissureGeneraleDlg(context):
       if fileDiag.exec_() :
         fileNames = fileDiag.selectedFiles()
         filedef = fileNames[0]
-        print filedef
+        print(filedef)
         self.ui.le_facefiss.setText(filedef)
-         
+
+    def selectReptrav(self):
+      fileDiag = QFileDialog(self)
+      fileDiag.setFileMode(QFileDialog.Directory)
+      fileDiag.setViewMode(QFileDialog.Detail)
+      fileDiag.setDirectory(self.ui.le_reptrav.text())
+      if fileDiag.exec_() :
+        fileNames = fileDiag.selectedFiles()
+        reptrav = str(fileNames[0])
+        print("reptrav ", reptrav)
+        self.ui.le_reptrav.setText(os.path.abspath(reptrav))
+
+
+    def selectNomres(self):
+      fileDiag = QFileDialog(self)
+      fileDiag.setFileMode(QFileDialog.AnyFile)
+      fileDiag.setViewMode(QFileDialog.Detail)
+      nomres=str(os.path.split(str(self.ui.le_nomres.text()))[1])
+      fileDiag.setDirectory(self.ui.le_reptrav.text())
+      fileDiag.selectFile(nomres)
+      fileDiag.setNameFilter("Maillage *.med (*.med)")
+      self.ui.le_nomres.setText(nomres)
+      if fileDiag.exec_() :
+        fileNames = fileDiag.selectedFiles()
+        tempnom = os.path.split(str(fileNames[0]))[1]
+        print("nomres ", tempnom)
+        self.ui.le_nomres.setText(tempnom)
+      else:
+        self.ui.le_nomres.setText(nomres)
+
     def creeDico(self):
-      dico = dict(
-                  maillageSain     = str(self.ui.le_maillage.text()),
-                  brepFaceFissure  = str(self.ui.le_facefiss.text()),
-                  edgeFissIds      = eval(str(self.ui.le_fondfiss.text())),
-                  lgInfluence      = self.ui.dsb_influence.value(),
-                  meshBrep         = [self.ui.dsb_meshBrepMin.value(),self.ui.dsb_meshBrepMax.value()],
-                  rayonPipe        = self.ui.dsb_rayonPipe.value(),
-                  lenSegPipe       = self.ui.dsb_lenSegPipe.value(),
-                  nbSegRad         = self.ui.sb_couronnes.value(),
-                  nbSegCercle      = self.ui.sb_secteurs.value(),
-                  areteFaceFissure = self.ui.dsb_areteFaceFissure.value()
+      dico = dict( \
+                  maillageSain     = str(self.ui.le_maillage.text()), \
+                  CAOFaceFissure   = str(self.ui.le_facefiss.text()), \
+                  edgeFiss         = eval(str(self.ui.le_fondfiss.text())), \
+                  lgInfluence      = self.ui.dsb_influence.value(), \
+                  meshBrep         = [self.ui.dsb_meshBrepMin.value(),self.ui.dsb_meshBrepMax.value()], \
+                  rayonPipe        = self.ui.dsb_rayonPipe.value(), \
+                  lenSegPipe       = self.ui.dsb_lenSegPipe.value(), \
+                  nbSegRad         = self.ui.sb_couronnes.value(), \
+                  nbSegCercle      = self.ui.sb_secteurs.value(), \
+                  areteFaceFissure = self.ui.dsb_areteFaceFissure.value(), \
+                  aretesVives      = self.ui.dsb_aretesVives.value(), \
+                  reptrav          = str(self.ui.le_reptrav.text()), \
+                  nomres           = str(self.ui.le_nomres.text()), \
+                  verbosite        = self.ui.cb_log.currentIndex() \
                   )
-      print dico
+      print(dico)
       return dico
-      
+
     def checkValues(self):
       return self.NOK
 
     def execute(self):
-      print "execute"
+      print("execute")
       dico = self.creeDico()
       NOK = self.testval(dico)
       if not(NOK):
         self.writeDefault(dico)
+        self.ui.lb_calcul.setText("--- Calcul en cours ---")
         self.ui.lb_calcul.show()
-        self.setLogVerbosity()
+        logfile=os.path.join(dico['reptrav'], dico['nomres']+".log")
+        self.setLogVerbosity(logfile)
         from blocFissure.gmu import geomsmesh               # après intialisation log dans setLogVerbosity
         from blocFissure.gmu.casStandard import casStandard # après intialisation log dans setLogVerbosity
-        execInstance = casStandard(dico)
+        from blocFissure.gmu.fissError import fissError
+        try:
+          execInstance = casStandard(dico)
+        except fissError as erreur:
+          print('-'*60)
+          print(type(erreur))
+          print('-'*60)
+          print(erreur.msg)
+          print('-'*60)
+          for ligne in erreur.pile:
+            print(repr(ligne))
+          print('-'*60)
+          texte = erreur.msg
+#           texte += +"<br>" +'-'*60 +"<br>"
+#           for ligne in erreur.pile:
+#             texte += repr(ligne) +"<br>"
+          mbox = QMessageBox(self)
+          mbox.setWindowTitle("erreur blocFissure")
+          mbox.setText(str(texte))
+          mbox.exec_()
+#        except Exception as erreur:
+#          print "exception non répertoriée"
       self.NOK = NOK
-      self.accept()
-    
-    pass 
+      self.ui.lb_calcul.hide()
+      #self.accept()
 
 # ----------------------------------------------------------------------------
-  
-  print "main"                   
+
+  print("main")
   window = fissureGeneraleDialog()
   retry = True
   while(retry):
@@ -302,9 +393,7 @@ def fissureGeneraleDlg(context):
     result = window.result()
     if result:
       # dialog accepted
-      print "dialog accepted, check"
+      print("dialog accepted, check")
       retry = window.checkValues()
     else:
-      print "dialog rejected, exit"
-  pass
-  
+      print("dialog rejected, exit")