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