# -*- coding: utf-8 -*-
# Copyright (C) 2006-2016 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, 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
# 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
def fissureGeneraleDlg(context):
# get context study, studyId, salomeGui
study = context.study
studyId = context.studyId
sg = context.sg
import os
#import subprocess
#import tempfile
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):
def __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.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,
areteVives = 0,
reptrav = '.',
nomres = 'casStandard_fissure.med',
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.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'])
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)
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()
with open(filedef, 'w') as f:
f.write(str(dico))
def genereExemples(self):
maillageSain = os.path.join(gmu.pathBloc, 'materielCasTests/CubeAngle.med')
brepFaceFissure = os.path.join(gmu.pathBloc, "materielCasTests/CubeAngleFiss.brep")
if (os.path.exists(maillageSain) and os.path.exists(brepFaceFissure)):
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):
with open(filedef, 'r') as f:
txt = f.read()
dico = eval(txt)
print(dico)
self.initDialog(dico)
def resetVal(self):
#self.initDefaut()
self.initDialog(self.defaut)
def setLogVerbosity(self, logfile):
from blocFissure.gmu import initLog # le mode de log s'initialise une seule fois
print("setLogVerbosity")
index = self.ui.cb_log.currentIndex()
print(index)
if index == 0:
initLog.setRelease(logfile)
elif index == 1:
initLog.setVerbose(logfile)
elif index == 2:
initLog.setDebug(logfile)
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()
print(fileNames)
filedef = fileNames[0]
if filedef[-4:] not in ['.dic']:
filedef += '.dic'
dico = self.creeDico()
with open(filedef, 'w') as f:
f.write(str(dico))
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):
with open(filedef, 'r') as f:
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 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(),
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)
return dico
def checkValues(self):
return self.NOK
def execute(self):
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()
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
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 += +"
" +'-'*60 +"
"
# for ligne in erreur.pile:
# texte += repr(ligne) +"
"
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.ui.lb_calcul.hide()
#self.accept()
pass
# ----------------------------------------------------------------------------
print("main")
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