1 # -*- coding: utf-8 -*-
3 # Copyright (C) 2006-2021 EDF R&D
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.
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.
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
19 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 """Pilotage de la fenêtre de dialogue"""
24 # if you already have plugins defined in a salome_plugins.py file, add this file at the end.
25 # if not, copy this file as ${HOME}/Plugins/smesh_plugins.py or ${APPLI}/Plugins/smesh_plugins.py
29 from blocFissure import gmu
31 def fissureGeneraleDlg(context):
32 """get context study, salomeGui"""
39 from PyQt5 import QtCore
40 from PyQt5 import QtWidgets
41 from PyQt5 import QtGui
42 from PyQt5.QtWidgets import QFileDialog
43 from PyQt5.QtWidgets import QMessageBox
44 from PyQt5.QtGui import QPalette
45 from PyQt5.QtGui import QColor
46 from blocFissure.ihm.fissureGenerale_ui import Ui_Dialog
48 class fissureGeneraleDialog(QtWidgets.QDialog):
49 """classe du dialogue"""
53 QtWidgets.QDialog.__init__(self)
54 # Set up the user interface from Designer.
58 self.blackPalette = self.ui.dsb_influence.palette()
59 self.redPalette = QPalette()
60 self.redPalette.setColor(QPalette.Text, QColor(255,0,0))
64 self.initDialog(self.defaut)
65 self.ui.lb_calcul.hide()
67 # Connect up the buttons.
69 self.ui.pb_exemple.clicked.connect(self.genereExemples)
70 self.ui.pb_valPrec.clicked.connect(self.readValPrec)
71 self.ui.pb_reset.clicked.connect(self.resetVal)
72 self.ui.pb_recharger.clicked.connect(self.recharger)
73 self.ui.pb_sauver.clicked.connect(self.sauver)
74 self.ui.pb_maillage.clicked.connect(self.selectMaillage)
75 self.ui.pb_facefiss.clicked.connect(self.selectFacefiss)
76 self.ui.pb_reptrav.clicked.connect(self.selectReptrav)
77 self.ui.bb_OkCancel.accepted.disconnect(self.accept)
78 self.ui.bb_OkCancel.accepted.connect(self.execute)
82 nomCas = "angleCube", \
83 maillageSain = os.path.join(gmu.pathBloc, "materielCasTests", "CubeAngle.med"), \
84 CAOFaceFissure = os.path.join(gmu.pathBloc, "materielCasTests", "CubeAngleFiss.brep"), \
92 areteFaceFissure = 10, \
94 reptrav = os.curdir, \
95 nomres = "maillage_avec_fissure", \
99 def initDialog(self, dico):
100 self.ui.le_maillage.setText(dico['maillageSain'])
101 self.ui.le_facefiss.setText(dico['CAOFaceFissure'])
102 self.ui.le_fondfiss.setText(str(dico['edgeFiss']))
103 self.ui.dsb_influence.setValue(dico['lgInfluence'])
104 self.ui.dsb_meshBrepMin.setValue(dico['meshBrep'][0])
105 self.ui.dsb_meshBrepMax.setValue(dico['meshBrep'][1])
106 self.ui.dsb_rayonPipe.setValue(dico['rayonPipe'])
107 self.ui.dsb_lenSegPipe.setValue(dico['lenSegPipe'])
108 self.ui.sb_couronnes.setValue(dico['nbSegRad'])
109 self.ui.sb_secteurs.setValue(dico['nbSegCercle'])
110 self.ui.dsb_areteFaceFissure.setValue(dico['areteFaceFissure'])
111 if 'aretesVives' in dico:
112 self.ui.dsb_aretesVives.setValue(dico['aretesVives'])
114 self.ui.dsb_aretesVives.setValue(0)
115 self.ui.le_reptrav.setText(os.path.abspath(dico['reptrav']))
116 self.ui.le_nomres.setText(os.path.split(dico['nomres'])[1])
117 self.ui.cb_log.setCurrentIndex(dico['verbosite'])
118 #incomplet = self.testval(dico)
120 def testval(self, dico):
122 if not os.path.lexists(dico['maillageSain']):
123 self.ui.le_maillage.setPalette(self.redPalette)
126 self.ui.le_maillage.setPalette(self.blackPalette)
127 cao_file = dico['CAOFaceFissure']
128 if not os.path.lexists(cao_file):
129 self.ui.le_facefiss.setPalette(self.redPalette)
132 suffix = os.path.basename(cao_file).split(".")[-1]
133 if ( suffix.upper() not in ("BREP","XAO") ):
134 print ("Suffixe inconnu pour le fichier {}".format(cao_file))
135 self.ui.le_facefiss.setPalette(self.redPalette)
138 self.ui.le_facefiss.setPalette(self.blackPalette)
141 param_0 = dico['edgeFiss'][0]
142 type_param_id = type(param_0)
143 for param in dico['edgeFiss'][1:]:
144 if not isinstance(param,type_param_id):
145 print ("La donnée {} n'est pas du même type que la première de la liste : {}.".format(param,type(param)))
149 if isinstance(param_0, int):
151 elif isinstance(param_0, str):
154 print("Il faut une liste de noms de groupes d'arêtes ou une liste d'IDs d'arêtes.")
161 self.ui.le_fondfiss.setPalette(self.blackPalette)
163 self.ui.le_fondfiss.setPalette(self.redPalette)
164 if dico['meshBrep'][0] == 0:
165 self.ui.dsb_meshBrepMin.setPalette(self.redPalette)
168 self.ui.dsb_meshBrepMin.setPalette(self.blackPalette)
169 if dico['meshBrep'][1] == 0:
170 self.ui.dsb_meshBrepMax.setPalette(self.redPalette)
173 self.ui.dsb_meshBrepMax.setPalette(self.blackPalette)
174 if dico['rayonPipe'] == 0:
175 self.ui.dsb_rayonPipe.setPalette(self.redPalette)
178 self.ui.dsb_rayonPipe.setPalette(self.blackPalette)
179 if dico['lenSegPipe'] == 0:
180 self.ui.dsb_lenSegPipe.setPalette(self.redPalette)
183 self.ui.dsb_lenSegPipe.setPalette(self.blackPalette)
184 if dico['areteFaceFissure'] == 0:
185 self.ui.dsb_areteFaceFissure.setPalette(self.redPalette)
188 self.ui.dsb_areteFaceFissure.setPalette(self.blackPalette)
190 print("incomplet: ", incomplet)
193 def fileDefault(self):
194 filedef = os.path.expanduser( os.path.join(os.environ["HOME"], ".config", "salome", "dialogFissureGenerale.dic") )
198 def writeDefault(self, dico):
199 filedef = self.fileDefault()
200 with open(filedef, 'w') as fichier:
201 fichier.write(str(dico))
203 def genereExemples(self):
204 maillageSain = os.path.join(gmu.pathBloc, "materielCasTests", "CubeAngle.med")
205 CAOFaceFissure = os.path.join(gmu.pathBloc, "materielCasTests", "CubeAngleFiss.brep")
206 if (os.path.exists(maillageSain) and os.path.exists(CAOFaceFissure )):
207 self.initDialog(self.defaut)
209 self.ui.lb_calcul.setText("--- Generation exemples en cours ---")
210 self.ui.lb_calcul.show()
211 from blocFissure.materielCasTests import genereMateriel
212 self.ui.lb_calcul.hide()
213 self.initDialog(self.defaut)
215 def readValPrec(self):
216 filedef = self.fileDefault()
217 if os.path.exists(filedef):
218 with open(filedef, 'r') as fichier:
222 self.initDialog(dico)
226 self.initDialog(self.defaut)
228 def setLogVerbosity(self, logfile):
229 from blocFissure.gmu import initLog # le mode de log s'initialise une seule fois
230 print("setLogVerbosity")
231 index = self.ui.cb_log.currentIndex()
234 initLog.setRelease(logfile)
236 initLog.setVerbose(logfile)
238 initLog.setDebug(logfile)
242 fileDiag = QFileDialog(self)
243 fileDiag.setFileMode(QFileDialog.AnyFile)
244 fileDiag.setNameFilter("Parametres *.dic (*.dic)")
245 fileDiag.setViewMode(QFileDialog.List)
246 if fileDiag.exec_() :
247 fileNames = fileDiag.selectedFiles()
249 filedef = fileNames[0]
250 if filedef[-4:] not in ['.dic']:
252 dico = self.creeDico()
253 with open(filedef, 'w') as fichier:
254 fichier.write(str(dico))
258 fileDiag = QFileDialog(self)
259 fileDiag.setFileMode(QFileDialog.ExistingFile)
260 fileDiag.setNameFilter("Parametres *.dic (*.dic)")
261 fileDiag.setViewMode(QFileDialog.Detail)
262 if fileDiag.exec_() :
263 fileNames = fileDiag.selectedFiles()
264 filedef = fileNames[0]
266 if os.path.exists(filedef):
267 with open(filedef, 'r') as fichier:
271 self.initDialog(dico)
273 def selectMaillage(self):
274 fileDiag = QFileDialog(self)
275 fileDiag.setFileMode(QFileDialog.ExistingFile)
276 fileDiag.setNameFilter("Maillage *.med (*.med)")
277 fileDiag.setViewMode(QFileDialog.Detail)
278 if fileDiag.exec_() :
279 fileNames = fileDiag.selectedFiles()
280 filedef = fileNames[0]
282 self.ui.le_maillage.setText(filedef)
284 def selectFacefiss(self):
285 fileDiag = QFileDialog(self)
286 fileDiag.setFileMode(QFileDialog.ExistingFile)
287 fileDiag.setNameFilter("Face fissure *.brep (*.brep)")
288 fileDiag.setViewMode(QFileDialog.Detail)
289 if fileDiag.exec_() :
290 fileNames = fileDiag.selectedFiles()
291 filedef = fileNames[0]
293 self.ui.le_facefiss.setText(filedef)
295 def selectReptrav(self):
296 fileDiag = QFileDialog(self)
297 fileDiag.setFileMode(QFileDialog.Directory)
298 fileDiag.setViewMode(QFileDialog.Detail)
299 fileDiag.setDirectory(self.ui.le_reptrav.text())
300 if fileDiag.exec_() :
301 fileNames = fileDiag.selectedFiles()
302 reptrav = str(fileNames[0])
303 print("reptrav ", reptrav)
304 self.ui.le_reptrav.setText(os.path.abspath(reptrav))
307 def selectNomres(self):
308 fileDiag = QFileDialog(self)
309 fileDiag.setFileMode(QFileDialog.AnyFile)
310 fileDiag.setViewMode(QFileDialog.Detail)
311 nomres=str(os.path.split(str(self.ui.le_nomres.text()))[1])
312 fileDiag.setDirectory(self.ui.le_reptrav.text())
313 fileDiag.selectFile(nomres)
314 fileDiag.setNameFilter("Maillage *.med (*.med)")
315 self.ui.le_nomres.setText(nomres)
316 if fileDiag.exec_() :
317 fileNames = fileDiag.selectedFiles()
318 tempnom = os.path.split(str(fileNames[0]))[1]
319 print("nomres ", tempnom)
320 self.ui.le_nomres.setText(tempnom)
322 self.ui.le_nomres.setText(nomres)
326 maillageSain = str(self.ui.le_maillage.text()), \
327 CAOFaceFissure = str(self.ui.le_facefiss.text()), \
328 edgeFiss = eval(str(self.ui.le_fondfiss.text())), \
329 lgInfluence = self.ui.dsb_influence.value(), \
330 meshBrep = [self.ui.dsb_meshBrepMin.value(),self.ui.dsb_meshBrepMax.value()], \
331 rayonPipe = self.ui.dsb_rayonPipe.value(), \
332 lenSegPipe = self.ui.dsb_lenSegPipe.value(), \
333 nbSegRad = self.ui.sb_couronnes.value(), \
334 nbSegCercle = self.ui.sb_secteurs.value(), \
335 areteFaceFissure = self.ui.dsb_areteFaceFissure.value(), \
336 aretesVives = self.ui.dsb_aretesVives.value(), \
337 reptrav = str(self.ui.le_reptrav.text()), \
338 nomres = str(self.ui.le_nomres.text()), \
339 verbosite = self.ui.cb_log.currentIndex() \
344 def checkValues(self):
349 dico = self.creeDico()
350 NOK = self.testval(dico)
352 self.writeDefault(dico)
353 self.ui.lb_calcul.setText("--- Calcul en cours ---")
354 self.ui.lb_calcul.show()
355 logfile=os.path.join(dico['reptrav'], dico['nomres']+".log")
356 self.setLogVerbosity(logfile)
357 from blocFissure.gmu import geomsmesh # après intialisation log dans setLogVerbosity
358 from blocFissure.gmu.casStandard import casStandard # après intialisation log dans setLogVerbosity
359 from blocFissure.gmu.fissError import fissError
361 execInstance = casStandard(dico)
362 except fissError as erreur:
368 for ligne in erreur.pile:
372 # texte += +"<br>" +'-'*60 +"<br>"
373 # for ligne in erreur.pile:
374 # texte += repr(ligne) +"<br>"
375 mbox = QMessageBox(self)
376 mbox.setWindowTitle("erreur blocFissure")
377 mbox.setText(str(texte))
379 # except Exception as erreur:
380 # print "exception non répertoriée"
382 self.ui.lb_calcul.hide()
385 # ----------------------------------------------------------------------------
388 window = fissureGeneraleDialog()
393 result = window.result()
396 print("dialog accepted, check")
397 retry = window.checkValues()
399 print("dialog rejected, exit")