From 330463b25243ae3f9339edb4d4009d403931bde1 Mon Sep 17 00:00:00 2001 From: Paul RASCLE Date: Fri, 12 Feb 2016 23:21:05 +0100 Subject: [PATCH] plugin dialog blocFissure general --- src/Tools/blocFissure/ihm/CMakeLists.txt | 1 + src/Tools/blocFissure/ihm/fissureGenerale.ui | 184 ++++++++--- .../blocFissure/ihm/fissureGenerale_plugin.py | 297 ++++++++++++++++++ src/Tools/smesh_plugins.py | 8 + 4 files changed, 448 insertions(+), 42 deletions(-) create mode 100644 src/Tools/blocFissure/ihm/fissureGenerale_plugin.py diff --git a/src/Tools/blocFissure/ihm/CMakeLists.txt b/src/Tools/blocFissure/ihm/CMakeLists.txt index 0ee274979..24e80f8ea 100644 --- a/src/Tools/blocFissure/ihm/CMakeLists.txt +++ b/src/Tools/blocFissure/ihm/CMakeLists.txt @@ -26,6 +26,7 @@ SET(plugin_SCRIPTS __init__.py fissureCoude_ihm.py fissureCoude_plugin.py + fissureGenerale_plugin.py dialogFissureCoude.dic ) diff --git a/src/Tools/blocFissure/ihm/fissureGenerale.ui b/src/Tools/blocFissure/ihm/fissureGenerale.ui index 3f1528ff0..3f2cf9c3d 100644 --- a/src/Tools/blocFissure/ihm/fissureGenerale.ui +++ b/src/Tools/blocFissure/ihm/fissureGenerale.ui @@ -7,7 +7,7 @@ 0 0 631 - 490 + 560 @@ -16,25 +16,46 @@ <html><head/><body><p>Insertion d'un maillage de fissure dans un maillage hexaédrique sain.</p><p>Le maillage sain est fourni sous forme de fichier Med.</p><p>La face de fissure est décrite par une géométrie dans un fichier brep.</p><p>La ou les arêtes de fond de fissure sont données par leurs index dans la face de fissure.</p><p>La procédure identfie des mailles saines à enlever et remailler, construit un maillage régulier rayonnant autour de la ligne de fond de fissure, reconstitue les faces externes en triangles, complète la zone à remailler en tétraèdres.</p></body></html> - - + + maillage sain et géometries de fissure - - - - - - <html><head/><body><p>sélection du fichier med du maillage sain (hexaèdres)</p></body></html> - + + + + - maillage sain + index edges fond fissure + + + + + + + <html><head/><body><p>Index des edges décrivant le fond de fissure, dans la face de fissure.</p><p>Sous forme d'une liste Python.</p><p>Exemples :<span style=" color:#00ffff;"/><span style=" font-style:italic; color:#00ffff;">[5,9]</span> ou <span style=" font-style:italic; color:#00ffff;">[3]</span></p><p>(on peut récupérer ces valeurs à l'aide du dialogue de création de groupes d'edges, dans GEOM)</p></body></html> + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + @@ -59,36 +80,15 @@ - - - - - - - - index edges fond fissure - - - - - + + - <html><head/><body><p>Index des edges décrivant le fond de fissure, dans la face de fissure.</p><p>Sous forme d'une liste Python.</p><p>Exemples :<span style=" color:#00ffff;"/><span style=" font-style:italic; color:#00ffff;">[5,9]</span> ou <span style=" font-style:italic; color:#00ffff;">[3]</span></p><p>(on peut récupérer ces valeurs à l'aide du dialogue de création de groupes d'edges, dans GEOM)</p></body></html> - - - - - - - Qt::Horizontal + <html><head/><body><p>sélection du fichier med du maillage sain (hexaèdres)</p></body></html> - - - 40 - 20 - + + maillage sain - + @@ -97,7 +97,7 @@ - + @@ -119,6 +119,9 @@ <html><head/><body><p>La zone remaillée contiendra toutes les mailles du maillage sain à une distance de la face de fissure inférieure à cette valeur.</p></body></html> + + 5 + @@ -156,6 +159,9 @@ <html><head/><body><p>Pour faciliter la détermination de la zone à remailler, il faut des points sur la face de fissure, suffisament resserrés, en relation avec la taille des mailles du maillage sain.</p><p>Ces points sont obtenus par pré maillage de la face de fissure, en triangles. On donne la taille min et max des triangles.</p></body></html> + + 5 + 1000000.000000000000000 @@ -173,6 +179,9 @@ <html><head/><body><p>Pour faciliter la détermination de la zone à remailler, il faut des points sur la face de fissure, suffisament resserrés, en relation avec la taille des mailles du maillage sain.</p><p>Ces points sont obtenus par pré maillage de la face de fissure, en triangles. On donne la taille min et max des triangles.</p></body></html> + + 5 + 1000000.000000000000000 @@ -225,6 +234,9 @@ <html><head/><body><p>Pipe rayonnant construit sur le fond de fissure :</p><p>Rayon du pipe.</p></body></html> + + 5 + 1000000.000000000000000 @@ -242,6 +254,9 @@ <html><head/><body><p>Pipe rayonnant construit sur le fond de fissure :</p><p>Longueur des mailles le long de la ligne de fond de fissure.</p></body></html> + + 5 + 1000000.000000000000000 @@ -329,6 +344,9 @@ <html><head/><body><p>Faces externes de la zone à remailler.</p><p>Mailage en triangles : valeur cible des arêtes.</p></body></html> + + 5 + 1000000.000000000000000 @@ -368,7 +386,7 @@ - + Qt::Vertical @@ -381,8 +399,90 @@ - - + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 24 + + + + --- Calcul en cours --- + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + réinitialisation de tous les paramètres à leur valeur par défaut + + + Reset + + + + + + + réinitialisation de tous les paramètres à leur valeur de la précédente éxécution + + + Précédent + + + + + + + réinitialisation des paramètres à partir d'un fichier préalablement sauvegardé + + + Recharger + + + + + + + sauvegarde des paramètres dans un fichier à choisir + + + Sauver + + + diff --git a/src/Tools/blocFissure/ihm/fissureGenerale_plugin.py b/src/Tools/blocFissure/ihm/fissureGenerale_plugin.py new file mode 100644 index 000000000..c0a208059 --- /dev/null +++ b/src/Tools/blocFissure/ihm/fissureGenerale_plugin.py @@ -0,0 +1,297 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2006-2015 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. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# 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 +from blocFissure import gmu +from blocFissure.gmu import initLog +#initLog.setDebug() +initLog.setVerbose() + +from blocFissure.gmu import geomsmesh +from blocFissure.gmu.casStandard import casStandard + +def fissureGeneraleDlg(context): + # get context study, studyId, 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): + + def __init__(self): + QtGui.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) + + 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) + + + 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.dsb_influence.setValue(dico['lgInfluence']) + self.ui.dsb_meshBrepMin.setValue(dico['meshBrep'][0]) + self.ui.dsb_meshBrepMax.setValue(dico['meshBrep'][1]) + self.ui.dsb_rayonPipe.setValue(dico['rayonPipe']) + self.ui.dsb_lenSegPipe.setValue(dico['lenSegPipe']) + 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 + + def testval(self, dico): + incomplet = False + if not os.path.lexists(dico['maillageSain']): + self.ui.le_maillage.setPalette(self.redPalette) + incomplet = True + else: + self.ui.le_maillage.setPalette(self.blackPalette) + if not os.path.lexists(dico['brepFaceFissure']): + 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)" + incomplet = True + edgeFissIdsOK=False + break + except: + print "except eval" + incomplet = True + edgeFissIdsOK=False + if edgeFissIdsOK: + self.ui.le_fondfiss.setPalette(self.blackPalette) + else: + self.ui.le_fondfiss.setPalette(self.redPalette) + if dico['meshBrep'][0] == 0: + self.ui.dsb_meshBrepMin.setPalette(self.redPalette) + incomplet = True + else: + self.ui.dsb_meshBrepMin.setPalette(self.blackPalette) + if dico['meshBrep'][1] == 0: + self.ui.dsb_meshBrepMax.setPalette(self.redPalette) + incomplet = True + else: + self.ui.dsb_meshBrepMax.setPalette(self.blackPalette) + if dico['rayonPipe'] == 0: + self.ui.dsb_rayonPipe.setPalette(self.redPalette) + incomplet = True + else: + self.ui.dsb_rayonPipe.setPalette(self.blackPalette) + if dico['lenSegPipe'] == 0: + self.ui.dsb_lenSegPipe.setPalette(self.redPalette) + incomplet = True + else: + self.ui.dsb_lenSegPipe.setPalette(self.blackPalette) + if dico['areteFaceFissure'] == 0: + self.ui.dsb_areteFaceFissure.setPalette(self.redPalette) + incomplet = True + else: + self.ui.dsb_areteFaceFissure.setPalette(self.blackPalette) + + print "incomplet: ", incomplet + return incomplet + + def fileDefault(self): + filedef = os.path.expanduser("~/.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() + + def readValPrec(self): + filedef = self.fileDefault() + if os.path.exists(filedef): + f = open(filedef, 'r') + txt = f.read() + dico = eval(txt) + print dico + self.initDialog(dico) + + def resetVal(self): + #self.initDefaut() + self.initDialog(self.defaut) + + def sauver(self): + print "sauver" + fileDiag = QFileDialog(self) + fileDiag.setFileMode(QFileDialog.AnyFile) + fileDiag.setNameFilter("Parametres *.dic (*.dic)") + fileDiag.setViewMode(QFileDialog.List) + if fileDiag.exec_() : + fileNames = fileDiag.selectedFiles() + filedef = fileNames[0] + dico = self.creeDico() + f = open(filedef, 'w') + f.write(str(dico)) + f.close() + + def recharger(self): + print "recharger" + fileDiag = QFileDialog(self) + fileDiag.setFileMode(QFileDialog.ExistingFile) + fileDiag.setNameFilter("Parametres *.dic (*.dic)") + fileDiag.setViewMode(QFileDialog.Detail) + if fileDiag.exec_() : + fileNames = fileDiag.selectedFiles() + filedef = fileNames[0] + print filedef + if os.path.exists(filedef): + f = open(filedef, 'r') + txt = f.read() + dico = eval(txt) + print dico + self.initDialog(dico) + + def selectMaillage(self): + fileDiag = QFileDialog(self) + fileDiag.setFileMode(QFileDialog.ExistingFile) + fileDiag.setNameFilter("Maillage *.med (*.med)") + fileDiag.setViewMode(QFileDialog.Detail) + if fileDiag.exec_() : + fileNames = fileDiag.selectedFiles() + filedef = fileNames[0] + print filedef + self.ui.le_maillage.setText(filedef) + + def selectFacefiss(self): + fileDiag = QFileDialog(self) + fileDiag.setFileMode(QFileDialog.ExistingFile) + fileDiag.setNameFilter("Face fissure *.brep (*.brep)") + fileDiag.setViewMode(QFileDialog.Detail) + if fileDiag.exec_() : + fileNames = fileDiag.selectedFiles() + filedef = fileNames[0] + print filedef + self.ui.le_facefiss.setText(filedef) + + 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() + ) + print dico + return dico + + def checkValues(self): + return self.NOK + + def execute(self): + dico = self.creeDico() + NOK = self.testval(dico) + if not(NOK): + self.writeDefault(dico) + self.ui.lb_calcul.show() + execInstance = casStandard(dico) + self.NOK = NOK + self.accept() + + pass + +# ---------------------------------------------------------------------------- + + window = fissureGeneraleDialog() + retry = True + while(retry): + retry = False + window.exec_() + result = window.result() + if result: + # dialog accepted + print "dialog accepted, check" + retry = window.checkValues() + else: + print "dialog rejected, exit" + pass + diff --git a/src/Tools/smesh_plugins.py b/src/Tools/smesh_plugins.py index c82bb172d..330f4482d 100644 --- a/src/Tools/smesh_plugins.py +++ b/src/Tools/smesh_plugins.py @@ -66,6 +66,14 @@ try: except: salome_pluginsmanager.logger.info('ERROR: Meshed Pipe with a crack plug-in is unavailable') pass +try: + from blocFissure.ihm.fissureGenerale_plugin import fissureGeneraleDlg + salome_pluginsmanager.AddFunction('Add a crack in a mesh', + 'Insert a crack in an hexahedral mesh with blocFissure tool', + fissureGeneraleDlg) +except: + salome_pluginsmanager.logger.info('ERROR: Meshed Pipe with a crack plug-in is unavailable') + pass # ZCracks plugin requires the module EFICAS to be installed # thus it is first tested if this module is available before -- 2.30.2