merge from BR_pluginMGCleaner tag mergeto_v7_main_17jun13

This commit is contained in:
cvw 2013-06-17 14:56:45 +00:00
parent 3d7ec410f2
commit dc02ba1daa
15 changed files with 1125 additions and 1001 deletions

File diff suppressed because it is too large Load Diff

View File

@ -15,7 +15,7 @@ You usually don't have to set this parameter but you can choose to limit the amo
- **File** - **File**
You can change the file used to store the remeshing hypothesis. see paragraph :ref:`hypothesis-label` for further informations. You can change the file used to store remeshing hypotheses. see paragraph :ref:`hypothesis-label` for further informations.
.. image:: images/Generic.png .. image:: images/Generic.png
:align: center :align: center

View File

@ -12,7 +12,7 @@ RSTFILES = lct.rst \
Generics_params.rst \ Generics_params.rst \
Advanced_params.rst Advanced_params.rst
EXTRA_DIST += $(RSTFILES) images EXTRA_DIST += $(RSTFILES) images files
# You can set these variables from the command line. # You can set these variables from the command line.
SPHINXOPTS = SPHINXOPTS =

View File

@ -61,7 +61,7 @@ This is the main remeshing Option. Yams always does quality improvement. It is
- **Mesh for finite element computation : Coarsening** - **Mesh for finite element computation : Coarsening**
The given surface triangulation is modfied in accordance to a size map. The latter is the intrinsic size map (computed automatically and based on the surface properties, i.e. the local curvatures). One should use this option to coarsen the mesh, when a regular mesh for computation purposes is desired, i.e. a mesh with good aspect ratios or good quality elements. The given surface triangulation is modified in accordance to a size map. The latter is the intrinsic size map (computed automatically and based on the surface properties, i.e. the local curvatures). One should use this option to coarsen the mesh, when a regular mesh for computation purposes is desired, i.e. a mesh with good aspect ratios or good quality elements.
It is equivalent to Yams's batch option -1. It is equivalent to Yams's batch option -1.

View File

@ -4,17 +4,23 @@
How to save Yams Parameters How to save Yams Parameters
=========================== ===========================
As Yams hypothesis are not meshing hypothesis for Salome (but hypothesis for yams), parameters Yams hypothesis is not meshing hypothesis for Salome, but hypothesis for yams.
are stored in a special file. Default file is $HOME/.yams.dat. It is strongly recommended that you The current set of parameters is automatically written in the salome study object browser when you run computation.
change this name if you want to preserve the way you obtain a mesh : This file is never cleaned.
All sets of parameters are logged in it.
Theses parameters could also be stored in a special file.
Default file is $HOME/.yams.dat.
This ASCII file is appended, and never cleaned.
- To save the current setting, click on "Save Params" pushbutton. In frame "Plug-in Generic Options":
- A set of parameters is automatically written in the .yams.dat file when you run computation.
- Restoring the default settings can be done by pushing "Default Params".
- "Loading Params" will reload the last set of parameters
- To save the current setting in this file, click on "Save" pushbutton.
- To load the last set of parameters saved, click on "Load" pushbutton.
At the bottom of the dialog window:
- To save a current setting in the study object browser, click on "Save" pushbutton.
- To load a current setting from the study object browser, click on "Load" pushbutton.
- To load the default setting, click on "Default" pushbutton. .
**example of .yams.dat** **example of .yams.dat**
@ -22,39 +28,25 @@ All sets of parameters are logged in it.
.. code-block:: python .. code-block:: python
# Save intermediate params # YAMS hypothesis parameters
# Params for mesh :
Optimisation ='Quality improvement Only (0)'
Units ='Relative'
Chordal_Tolerance_Deviation=1.0
Ridge_Detection=True
Split_Edge=False
Point_Smoothing=True
Geometrical_Approximation=0.04
Ridge_Angle=45.0
Maximum_Size=-2.0
Minimum_Size=-2.0
Mesh_Gradation=1.3
Verbosity=3
Memory=0
# Params for Hypothese : monHypo_Yams_0
# Params for mesh : Mesh_1 # Params for mesh : Mesh_1
Optimisation ='Quality improvement Only (0)' # Date : 23/05/13 14:23:18
Units ='Relative' # Command : yams -v 3 -O 0 -Drelative,tolerance=0.100000,maxsize=0.010000,minsize=0.000000 /tmp/ForYams_1.mesh
Chordal_Tolerance_Deviation=1.0 Optimisation=Quality improvement Only (0)
Ridge_Detection=True Units=Relative
Split_Edge=False ChordalToleranceDeviation=0.1
Point_Smoothing=True RidgeDetection=True
Geometrical_Approximation=0.04 SplitEdge=False
Ridge_Angle=45.0 PointSmoothing=True
Maximum_Size=-2.0 GeometricalApproximation=0.04
Minimum_Size=-2.0 RidgeAngle=45.0
Mesh_Gradation=1.3 MaximumSize=0.01
MinimumSize=0.0
MeshGradation=1.3
Verbosity=3 Verbosity=3
Memory=0 Memory=0

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 63 KiB

View File

@ -11,6 +11,8 @@ Mesh module for remeshing 2D Surface.
Yams plug-in uses Distene commercial software Yams, which is an **automatic surface remeshing tool**. Yams plug-in uses Distene commercial software Yams, which is an **automatic surface remeshing tool**.
This plug_in offers only the most common functionnalities of the tool. This plug_in offers only the most common functionnalities of the tool.
.. note::
for a complete documentation, see :download:`Yams whitepaper <files/YamsWhitePaper_3.2.pdf>`.
Contents: Contents:
@ -19,8 +21,8 @@ Contents:
lct.rst lct.rst
Mandatory_params.rst Mandatory_params.rst
Generics_params.rst
Advanced_params.rst Advanced_params.rst
Generics_params.rst
editHypo.rst editHypo.rst

View File

@ -1,7 +1,7 @@
Running Yams Plug-in Running Yams Plug-in
===================== =====================
Yamms plug-in can be invoked via SMESH Plugin item in Mesh menu bar Yams plug-in can be invoked via SMESH Plugin item in Mesh menu bar
.. image:: images/AppelYams.png .. image:: images/AppelYams.png
:align: center :align: center

View File

@ -1,4 +1,4 @@
# -*- coding: iso-8859-1 -*- # -*- coding: utf-8 -*-
# Copyright (C) 2007-2013 EDF R&D # Copyright (C) 2007-2013 EDF R&D
# #
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
@ -28,45 +28,59 @@ from PyQt4.QtCore import *
# Import des panels # Import des panels
# ------------------------------- #
from ViewText import Ui_ViewExe from ViewText import Ui_ViewExe
class MonViewText(Ui_ViewExe,QDialog):
# ------------------------------- # class MonViewText(Ui_ViewExe, QDialog):
""" """
Classe permettant la visualisation de texte Classe permettant la visualisation de texte
""" """
def __init__(self,parent,txt): def __init__(self, parent, txt):
QDialog.__init__(self,parent) QDialog.__init__(self,parent)
self.pere=parent
self.setupUi(self) self.setupUi(self)
self.resize( QSize(600,600).expandedTo(self.minimumSizeHint()) ) self.resize( QSize(1000,600).expandedTo(self.minimumSizeHint()) )
self.connect( self.PB_Ok,SIGNAL("clicked()"), self, SLOT("close()") ) #self.connect( self.PB_Ok,SIGNAL("clicked()"), self, SLOT("close()") )
self.connect( self.PB_Ok,SIGNAL("clicked()"), self.theClose )
self.connect( self.PB_Save,SIGNAL("clicked()"), self.saveFile ) self.connect( self.PB_Save,SIGNAL("clicked()"), self.saveFile )
self.monExe=QProcess(self) self.monExe=QProcess(self)
self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOut ) self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOut )
self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErr ) self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErr )
self.connect(self.monExe, SIGNAL("finished(int )"), self.exeFinished )
# Je n arrive pas a utiliser le setEnvironment du QProcess # Je n arrive pas a utiliser le setEnvironment du QProcess
# fonctionne hors Salome mais pas dans Salome ??? # fonctionne hors Salome mais pas dans Salome ???
LICENCE=os.environ['DISTENE_LICENCE_FILE_FOR_YAMS'] cmds=''
txt='export DISTENE_LICENSE_FILE='+LICENCE+';'+ txt try :
LICENCE_FILE=os.environ["DISTENE_LICENCE_FILE_FOR_YAMS"]
except:
LICENCE_FILE=''
try :
PATH=os.environ["DISTENE_PATH_FOR_YAMS"]
except:
PATH=''
if LICENCE_FILE != '':
cmds+='source '+LICENCE_FILE+'\n'
else:
cmds+="# $DISTENE_LICENCE_FILE_FOR_YAMS NOT SET\n"
if PATH != '':
cmds+='export PATH='+PATH+':$PATH\n'
else:
cmds+="# $DISTENE_PATH_FOR_YAMS NOT SET\n"
#cmds+='env\n'
cmds+='rm -f '+self.parent().fichierOut+'\n'
cmds+=txt+'\n'
cmds+='echo END_OF_Yams\n'
pid=self.monExe.pid() pid=self.monExe.pid()
nomFichier='/tmp/yam_'+str(pid)+'.py' nomFichier='/tmp/Yams_'+str(pid)+'.sh'
f=open(nomFichier,'w') f=open(nomFichier,'w')
f.write(txt) f.write(cmds)
f.close() f.close()
maBidouille='sh ' + nomFichier maBidouille='sh ' + nomFichier
self.monExe.start(maBidouille) self.monExe.start(maBidouille)
self.monExe.closeWriteChannel() self.monExe.closeWriteChannel()
self.enregistreResultatsDone=False
self.show() self.show()
def exeFinished(self):
self.pere.enregistreResultat()
def saveFile(self): def saveFile(self):
#recuperation du nom du fichier #recuperation du nom du fichier
savedir=os.environ['HOME'] savedir=os.environ['HOME']
@ -84,8 +98,19 @@ class MonViewText(Ui_ViewExe,QDialog):
def readFromStdErr(self): def readFromStdErr(self):
a=self.monExe.readAllStandardError() a=self.monExe.readAllStandardError()
self.TB_Exe.append(QString.fromUtf8(a.data(),len(a))) ; self.TB_Exe.append(QString.fromUtf8(a.data(),len(a)))
def readFromStdOut(self) : def readFromStdOut(self) :
a=self.monExe.readAllStandardOutput() a=self.monExe.readAllStandardOutput()
self.TB_Exe.append(QString.fromUtf8(a.data(),len(a))) ; aa=QString.fromUtf8(a.data(),len(a))
self.TB_Exe.append(aa)
if "END_OF_Yams" in aa:
self.parent().enregistreResultat()
self.enregistreResultatsDone=True
#self.theClose()
def theClose(self):
if not self.enregistreResultatsDone:
self.parent().enregistreResultat()
self.enregistreResultatsDone=True
self.close()

View File

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (C) 2007-2013 EDF R&D # Copyright (C) 2007-2013 EDF R&D
# #
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public
@ -17,6 +17,7 @@
# #
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
# #
# Modules Python # Modules Python
# Modules Eficas # Modules Eficas
@ -31,275 +32,463 @@ class MonYamsPlugDialog(Ui_YamsPlugDialog,QWidget):
""" """
""" """
def __init__(self): def __init__(self):
QWidget.__init__(self) QWidget.__init__(self)
self.setupUi(self) self.setupUi(self)
self.connecterSignaux() self.connecterSignaux()
self.fichierIn="" self.fichierIn=""
self.fichierOut="" self.fichierOut=""
self.MeshIn="" self.MeshIn=""
self.num=1 self.commande=""
self.num=1
self.__selectedMesh=None
# Ces parametres ne sont pas remis à rien par le clean # complex whith QResources: not used
self.paramsFile= os.path.abspath(os.path.join(os.environ['HOME'],'.yams.dat')) # The icon are supposed to be located in the $SMESH_ROOT_DIR/share/salome/resources/smesh folder,
self.LE_ParamsFile.setText(self.paramsFile) # other solution could be in the same folder than this python module file:
self.LE_MeshFile.setText("") # iconfolder=os.path.dirname(os.path.abspath(__file__))
self.LE_MeshSmesh.setText("")
self.iconfolder=os.environ["SMESH_ROOT_DIR"]+"/share/salome/resources/smesh"
#print "monYamsPlugDialog iconfolder",iconfolder
icon = QIcon()
icon.addFile(os.path.join(self.iconfolder,"select1.png"))
self.PB_LoadHyp.setIcon(icon)
self.PB_LoadHyp.setToolTip("hypothesis from Salome Object Browser")
self.PB_SaveHyp.setIcon(icon)
self.PB_SaveHyp.setToolTip("hypothesis to Salome Object Browser")
self.PB_MeshSmesh.setIcon(icon)
self.PB_MeshSmesh.setToolTip("source mesh from Salome Object Browser")
icon = QIcon()
icon.addFile(os.path.join(self.iconfolder,"open.png"))
self.PB_ParamsFileExplorer.setIcon(icon)
self.PB_Load.setIcon(icon)
self.PB_Load.setToolTip("hypothesis from file")
self.PB_Save.setIcon(icon)
self.PB_Save.setToolTip("hypothesis to file")
self.PB_MeshFile.setIcon(icon)
self.PB_MeshFile.setToolTip("source mesh from a file in disk")
#Ces parametres ne sont pas remis à rien par le clean
self.paramsFile= os.path.abspath(os.path.join(os.environ["HOME"],".yams.dat"))
self.LE_ParamsFile.setText(self.paramsFile)
self.LE_MeshFile.setText("")
self.LE_MeshSmesh.setText("")
v1=QDoubleValidator(self)
v1.setBottom(0.)
#v1.setTop(1000.) #per thousand... only if relative
v1.setDecimals(2)
self.SP_Tolerance.setValidator(v1)
self.SP_Tolerance.titleForWarning="Chordal Tolerance"
self.resize(800, 600)
self.clean()
def connecterSignaux(self) : def connecterSignaux(self) :
self.connect(self.PB_Cancel,SIGNAL("clicked()"),self.PBCancelPressed) self.connect(self.PB_Cancel,SIGNAL("clicked()"),self.PBCancelPressed)
self.connect(self.PB_Default,SIGNAL("clicked()"),self.clean) self.connect(self.PB_Default,SIGNAL("clicked()"),self.clean)
self.connect(self.PB_Help,SIGNAL("clicked()"),self.PBHelpPressed) self.connect(self.PB_Help,SIGNAL("clicked()"),self.PBHelpPressed)
self.connect(self.PB_Load,SIGNAL("clicked()"),self.PBLoadPressed) self.connect(self.PB_OK,SIGNAL("clicked()"),self.PBOKPressed)
self.connect(self.PB_OK,SIGNAL("clicked()"),self.PBOKPressed)
self.connect(self.PB_Save,SIGNAL("clicked()"),self.PBSavePressed)
self.connect(self.PB_MeshFile,SIGNAL("clicked()"),self.PBMeshFilePressed)
self.connect(self.PB_MeshSmesh,SIGNAL("clicked()"),self.PBMeshSmeshPressed)
self.connect(self.PB_ParamsFileExplorer,SIGNAL("clicked()"),self.setParamsFileName)
self.connect(self.LE_MeshFile,SIGNAL("returnPressed()"),self.meshFileNameChanged)
self.connect(self.LE_ParamsFile,SIGNAL("returnPressed()"),self.paramsFileNameChanged)
self.connect(self.PB_Load,SIGNAL("clicked()"),self.PBLoadPressed)
self.connect(self.PB_Save,SIGNAL("clicked()"),self.PBSavePressed)
self.connect(self.PB_LoadHyp,SIGNAL("clicked()"),self.PBLoadHypPressed)
self.connect(self.PB_SaveHyp,SIGNAL("clicked()"),self.PBSaveHypPressed)
self.connect(self.PB_MeshFile,SIGNAL("clicked()"),self.PBMeshFilePressed)
self.connect(self.PB_MeshSmesh,SIGNAL("clicked()"),self.PBMeshSmeshPressed)
self.connect(self.LE_MeshSmesh,SIGNAL("returnPressed()"),self.meshSmeshNameChanged)
self.connect(self.PB_ParamsFileExplorer,SIGNAL("clicked()"),self.setParamsFileName)
self.connect(self.LE_MeshFile,SIGNAL("returnPressed()"),self.meshFileNameChanged)
self.connect(self.LE_ParamsFile,SIGNAL("returnPressed()"),self.paramsFileNameChanged)
def PBHelpPressed(self): def PBHelpPressed(self):
try : try :
maDoc=os.environ['DISTENE_YAMS_DOC_PDF'] mydir=os.environ["SMESH_ROOT_DIR"]
except Exception: except Exception:
QMessageBox.warning( self, "Help unavailable", str(maDoc) + " not found") QMessageBox.warning(self, "Help", "Help unavailable $SMESH_ROOT_DIR not found")
command="xdg-open "+maDoc+";" return
subprocess.call(command, shell=True) maDoc=mydir+"/share/doc/salome/gui/SMESH/yams/_downloads/YamsWhitePaper_3.2.pdf"
command="xdg-open "+maDoc+";"
subprocess.call(command, shell=True)
def PBOKPressed(self): def PBOKPressed(self):
if not(self.PrepareLigneCommande()) : return if not(self.PrepareLigneCommande()):
self.PBSavePressed(NomHypo=True) #warning done yet
maFenetre=MonViewText(self,self.commande) #QMessageBox.warning(self, "Compute", "Command not found")
return
maFenetre=MonViewText(self,self.commande)
def enregistreResultat(self): def enregistreResultat(self):
if not(os.path.isfile(self.fichierOut)) : return import smesh
import smesh import SMESH
import SMESH import salome
import salome from salome.kernel import studyedit
from salome.kernel import studyedit
maStudy=studyedit.getActiveStudy() if not os.path.isfile(self.fichierOut):
smesh.SetCurrentStudy(maStudy) QMessageBox.warning(self, "Compute", "Result file "+self.fichierOut+" not found")
(outputMesh, status) = smesh.CreateMeshesFromGMF(self.fichierOut)
meshname = 'yams'+str(self.num)
smesh.SetName(outputMesh.GetMesh(), meshname)
outputMesh.Compute()
maStudy=studyedit.getActiveStudy()
smesh.SetCurrentStudy(maStudy)
(outputMesh, status) = smesh.CreateMeshesFromGMF(self.fichierOut)
name=str(self.LE_MeshSmesh.text())
initialMeshFile=None
initialMeshObject=None
if name=="":
a=str(self.fichierIn)
name=os.path.basename(os.path.splitext(a)[0])
initialMeshFile=a
else:
initialMeshObject=maStudy.FindObjectByName(name ,"SMESH")[0]
self.editor = studyedit.getStudyEditor() # meshname = name+"_YAMS_"+str(self.num)
moduleEntry=self.editor.findOrCreateComponent("SMESH","SMESH") smesh.SetName(outputMesh.GetMesh(), meshname)
HypReMeshEntry = self.editor.findOrCreateItem( moduleEntry, name = 'HypoForRemesh', outputMesh.Compute() #no algorithms message for "Mesh_x" has been computed with warnings: - global 1D algorithm is missing
comment = 'HypoForRemshing')
monStudyBuilder=maStudy.NewBuilder();
monStudyBuilder.NewCommand();
newStudyIter=monStudyBuilder.NewObject(HypReMeshEntry)
aNameAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeName")
hypoName = 'monHypo_Yams_'+str(self.num)
aNameAttrib.SetValue(hypoName)
aCommentAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeComment")
aCommentAttrib.SetValue(str(self.commande))
SOMesh=maStudy.FindObjectByName(meshname ,"SMESH")[0] self.editor = studyedit.getStudyEditor() #
newLink=monStudyBuilder.NewObject(SOMesh) moduleEntry=self.editor.findOrCreateComponent("SMESH","SMESH")
monStudyBuilder.Addreference(newLink, newStudyIter); HypReMeshEntry = self.editor.findOrCreateItem(
if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(0) moduleEntry, name = "Plugins Hypotheses", icon="mesh_tree_hypo.png") #, comment = "HypoForRemeshing" )
self.num+=1
return True monStudyBuilder=maStudy.NewBuilder()
monStudyBuilder.NewCommand()
newStudyIter=monStudyBuilder.NewObject(HypReMeshEntry)
self.editor.setAttributeValue(newStudyIter, "AttributeName", "YAMS Parameters_"+str(self.num))
self.editor.setAttributeValue(newStudyIter, "AttributeComment", self.getResumeData(separator=" ; "))
SOMesh=maStudy.FindObjectByName(meshname ,"SMESH")[0]
if initialMeshFile!=None:
newStudyFileName=monStudyBuilder.NewObject(SOMesh)
self.editor.setAttributeValue(newStudyFileName, "AttributeName", "meshFile")
self.editor.setAttributeValue(newStudyFileName, "AttributeExternalFileDef", initialMeshFile)
self.editor.setAttributeValue(newStudyFileName, "AttributeComment", initialMeshFile)
if initialMeshObject!=None:
newLink=monStudyBuilder.NewObject(SOMesh)
monStudyBuilder.Addreference(newLink, initialMeshObject)
newLink=monStudyBuilder.NewObject(SOMesh)
monStudyBuilder.Addreference(newLink, newStudyIter)
if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(0)
self.num+=1
return True
def PBSavePressed(self,NomHypo=False): def PBSavePressed(self,NomHypo=False):
if NomHypo : text = '# Params for Hypothese : monHypo_Yams_'+str(self.num - 1)+"\n" from datetime import datetime
else : text = '# Save intermediate params \n' if not(self.PrepareLigneCommande()): return
text += "# Params for mesh : " + self.LE_MeshSmesh.text() +'\n' text = "# YAMS hypothesis parameters\n"
for RB in self.GBOptim.findChildren(QRadioButton,): text += "# Params for mesh : " + self.LE_MeshSmesh.text() +"\n"
if RB.isChecked()==True: text += datetime.now().strftime("# Date : %d/%m/%y %H:%M:%S\n")
text+="Optimisation ='"+RB.text()+"'\n" text += "# Command : "+self.commande+"\n"
break text += self.getResumeData(separator="\n")
for RB in self.GBUnit.findChildren(QRadioButton,): text += "\n\n"
if RB.isChecked()==True:
text+="Units ='"+RB.text()+"'\n"
text+='Chordal_Tolerance_Deviation='+str(self.SP_Tolerance.value())+'\n'
text+='Ridge_Detection=' + str(self.CB_Ridge.isChecked())+'\n' try:
text+='Split_Edge=' + str(self.CB_SplitEdge.isChecked())+'\n' f=open(self.paramsFile,"a")
text+='Point_Smoothing=' + str(self.CB_Point.isChecked())+'\n' except:
text+='Geometrical_Approximation='+ str(self.SP_Geomapp.value()) +'\n' QMessageBox.warning(self, "File", "Unable to open "+self.paramsFile)
text+='Ridge_Angle=' + str(self.SP_Ridge.value()) +'\n' return
text+='Maximum_Size=' + str(self.SP_MaxSize.value()) +'\n' try:
text+='Minimum_Size=' + str(self.SP_MaxSize.value()) +'\n' f.write(text)
text+='Mesh_Gradation=' + str(self.SP_Gradation.value())+'\n' except:
QMessageBox.warning(self, "File", "Unable to write "+self.paramsFile)
return
f.close()
text+='Verbosity=' + str(self.SP_Verbosity.value())+'\n' def PBSaveHypPressed(self):
text+='Memory=' + str(self.SP_Memory.value())+'\n' """save hypothesis in Object Browser"""
text+='\n\n' #QMessageBox.warning(self, "save Object Browser YAMS Hypothesis", "TODO")
try : import smesh
f=open(self.paramsFile,'a') import SMESH
except : import salome
QMessageBox.warning( self, "File", "Unable to open "+self.paramsFile) from salome.kernel import studyedit
return
try : maStudy=studyedit.getActiveStudy()
f.write(text) smesh.SetCurrentStudy(maStudy)
except :
QMessageBox.warning( self, "File", "Unable to write "+self.paramsFile) self.editor = studyedit.getStudyEditor()
return moduleEntry=self.editor.findOrCreateComponent("SMESH","SMESH")
f.close() HypReMeshEntry = self.editor.findOrCreateItem(
moduleEntry, name = "Plugins Hypotheses", icon="mesh_tree_hypo.png") #, comment = "HypoForRemeshing" )
monStudyBuilder=maStudy.NewBuilder()
monStudyBuilder.NewCommand()
newStudyIter=monStudyBuilder.NewObject(HypReMeshEntry)
self.editor.setAttributeValue(newStudyIter, "AttributeName", "YAMS Parameters_"+str(self.num))
self.editor.setAttributeValue(newStudyIter, "AttributeComment", self.getResumeData(separator=" ; "))
if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(0)
self.num+=1
return True
def SP_toStr(self, widget):
"""only for a QLineEdit widget"""
#cr, pos=widget.validator().validate(res, 0) #n.b. "1,3" is acceptable !locale!
try:
val=float(widget.text())
except:
QMessageBox.warning(self, widget.titleForWarning, "float value is incorrect: '"+widget.text()+"'")
res=str(widget.validator().bottom())
widget.setProperty("text", res)
return res
valtest=widget.validator().bottom()
if valtest!=None:
if val<valtest:
QMessageBox.warning(self, widget.titleForWarning, "float value is under minimum: "+str(val)+" < "+str(valtest))
res=str(valtest)
widget.setProperty("text", res)
return res
valtest=widget.validator().top()
if valtest!=None:
if val>valtest:
QMessageBox.warning(self, widget.titleForWarning, "float value is over maximum: "+str(val)+" > "+str(valtest))
res=str(valtest)
widget.setProperty("text", res)
return res
return str(val)
def getResumeData(self, separator="\n"):
text=""
for RB in self.GBOptim.findChildren(QRadioButton,):
if RB.isChecked()==True:
text+="Optimisation="+RB.text()+separator
break
if self.RB_Absolute.isChecked():
text+="Units=absolute"+separator
else:
text+="Units=relative"+separator
v=self.SP_toStr(self.SP_Tolerance)
text+="ChordalToleranceDeviation="+v+separator
text+="RidgeDetection="+str(self.CB_Ridge.isChecked())+separator
text+="SplitEdge="+str(self.CB_SplitEdge.isChecked())+separator
text+="PointSmoothing="+str(self.CB_Point.isChecked())+separator
text+="GeometricalApproximation="+str(self.SP_Geomapp.value())+separator
text+="RidgeAngle="+str(self.SP_Ridge.value())+separator
text+="MaximumSize="+str(self.SP_MaxSize.value())+separator
text+="MinimumSize="+str(self.SP_MinSize.value())+separator
text+="MeshGradation="+str(self.SP_Gradation.value())+separator
text+="Verbosity="+str(self.SP_Verbosity.value())+separator
text+="Memory="+str(self.SP_Memory.value())+separator
return str(text)
def loadResumeData(self, hypothesis, separator="\n"):
text=str(hypothesis)
self.clean()
for slig in reversed(text.split(separator)):
lig=slig.strip()
#print "load ResumeData",lig
if lig=="": continue #skip blanck lines
if lig[0]=="#": break
try:
tit,value=lig.split("=")
if tit=="Optimisation":
for RB in self.GBUnit.findChildren(QRadioButton,):
RB.setChecked(False)
for RB in self.GBUnit.findChildren(QRadioButton,):
if RB.text()==value :
RB.setChecked(True)
break
if tit=="Units":
if value=="absolute":
self.RB_Absolute.setChecked(True)
self.RB_Relative.setChecked(False)
else:
self.RB_Absolute.setChecked(False)
self.RB_Relative.setChecked(True)
if tit=="ChordalToleranceDeviation": self.SP_Tolerance.setProperty("text", float(value))
if tit=="RidgeDetection": self.CB_Ridge.setChecked(value=="True")
if tit=="SplitEdge": self.CB_SplitEdge.setChecked(value=="True")
if tit=="PointSmoothing": self.CB_Point.setChecked(value=="True")
if tit=="GeometricalApproximation": self.SP_Geomapp.setProperty("value", float(value))
if tit=="RidgeAngle": self.SP_Ridge.setProperty("value", float(value))
if tit=="MaximumSize": self.SP_MaxSize.setProperty("value", float(value))
if tit=="MinimumSize": self.SP_MinSize.setProperty("value", float(value))
if tit=="MeshGradation": self.SP_Gradation.setProperty("value", float(value))
if tit=="Verbosity": self.SP_Verbosity.setProperty("value", int(float(value)))
if tit=="Memory": self.SP_Memory.setProperty("value", float(value))
except:
QMessageBox.warning(self, "load YAMS Hypothesis", "Problem on '"+lig+"'")
def PBLoadPressed(self): def PBLoadPressed(self):
try : """load last hypothesis saved in tail of file"""
f=open(self.paramsFile,'r') try:
except : f=open(self.paramsFile,"r")
QMessageBox.warning( self, "File", "Unable to open "+self.paramsFile) except:
return QMessageBox.warning(self, "File", "Unable to open "+self.paramsFile)
try : return
text=f.read() try:
except : text=f.read()
QMessageBox.warning( self, "File", "Unable to read "+self.paramsFile) except:
return QMessageBox.warning(self, "File", "Unable to read "+self.paramsFile)
f.close() return
d={} f.close()
exec text in d self.loadResumeData(text, separator="\n")
for RB in self.GBOptim.findChildren(QRadioButton,):
if d['Optimisation']== RB.text():
RB.setChecked(True)
break
for RB in self.GBUnit.findChildren(QRadioButton,):
if d['Units']== RB.text():
RB.setChecked(True)
break
self.SP_Tolerance.setValue(d['Chordal_Tolerance_Deviation'])
self.CB_Ridge.setChecked(d['Ridge_Detection']) def PBLoadHypPressed(self):
self.CB_Point.setChecked(d['Point_Smoothing']) """load hypothesis saved in Object Browser"""
self.CB_SplitEdge.setChecked(d['Split_Edge']) #QMessageBox.warning(self, "load Object Browser YAMS hypothesis", "TODO")
self.SP_Geomapp.setValue(d['Geometrical_Approximation']) import salome
self.SP_Ridge.setValue(d['Ridge_Angle']) from salome.kernel import studyedit
self.SP_MaxSize.setValue(d['Maximum_Size']) from salome.smesh.smeshstudytools import SMeshStudyTools
self.SP_MinSize.setValue(d['Minimum_Size']) from salome.gui import helper as guihelper
self.SP_Gradation.setValue(d['Mesh_Gradation']) from omniORB import CORBA
self.SP_Verbosity.setValue(d['Verbosity']) mySObject, myEntry = guihelper.getSObjectSelected()
self.SP_Memory.setValue(d['Memory']) if CORBA.is_nil(mySObject) or mySObject==None:
QMessageBox.critical(self, "Hypothese", "select an Object Browser YAMS hypothesis")
return
text=mySObject.GetComment()
#a verification
if "Optimisation=" not in text:
QMessageBox.critical(self, "Load Hypothese", "Object Browser selection not a YAMS Hypothesis")
return
self.loadResumeData(text, separator=" ; ")
return
def PBCancelPressed(self): def PBCancelPressed(self):
self.close() self.close()
def PBMeshFilePressed(self): def PBMeshFilePressed(self):
fd = QFileDialog(self, "select an existing Mesh file", self.LE_MeshFile.text(), "Mesh-Files (*.mesh);;All Files (*)") fd = QFileDialog(self, "select an existing Mesh file", self.LE_MeshFile.text(), "Mesh-Files (*.mesh);;All Files (*)")
if fd.exec_(): if fd.exec_():
infile = fd.selectedFiles()[0] infile = fd.selectedFiles()[0]
self.LE_MeshFile.setText(infile) self.LE_MeshFile.setText(infile)
self.fichierIn=infile.toLatin1() self.fichierIn=infile.toLatin1()
self.MeshIn=""
self.LE_MeshSmesh.setText("")
def setParamsFileName(self): def setParamsFileName(self):
fd = QFileDialog(self, "select a file", self.LE_ParamsFile.text(), "dat Files (*.dat);;All Files (*)") fd = QFileDialog(self, "select a file", self.LE_ParamsFile.text(), "dat Files (*.dat);;All Files (*)")
if fd.exec_(): if fd.exec_():
infile = fd.selectedFiles()[0] infile = fd.selectedFiles()[0]
self.LE_ParamsFile.setText(infile) self.LE_ParamsFile.setText(infile)
self.paramsFile=infile.toLatin1() self.paramsFile=infile.toLatin1()
def meshFileNameChanged(self): def meshFileNameChanged(self):
self.fichierIn=self.LE_MeshFile.text() self.fichierIn=str(self.LE_MeshFile.text())
if os.path.exists(self.fichierIn): return #print "meshFileNameChanged", self.fichierIn
QMessageBox.warning( self, "Unknown File", "File doesn't exist") if os.path.exists(self.fichierIn):
self.__selectedMesh=None
self.MeshIn=""
self.LE_MeshSmesh.setText("")
return
QMessageBox.warning(self, "Mesh file", "File doesn't exist")
def meshSmeshNameChanged(self):
"""only change by GUI mouse selection, otherwise clear"""
self.__selectedMesh = None
self.MeshIn=""
self.LE_MeshSmesh.setText("")
self.fichierIn=""
return
def paramsFileNameChanged(self): def paramsFileNameChanged(self):
self.paramsFile=self.LE_ParamsFile.text() self.paramsFile=self.LE_ParamsFile.text()
def PBMeshSmeshPressed(self): def PBMeshSmeshPressed(self):
import salome import salome
import smesh import smesh
from salome.kernel import studyedit from salome.kernel import studyedit
from salome.smesh.smeshstudytools import SMeshStudyTools from salome.smesh.smeshstudytools import SMeshStudyTools
from salome.gui import helper as guihelper from salome.gui import helper as guihelper
from omniORB import CORBA from omniORB import CORBA
mySObject, myEntry = guihelper.getSObjectSelected() mySObject, myEntry = guihelper.getSObjectSelected()
if CORBA.is_nil(mySObject) or mySObject==None: if CORBA.is_nil(mySObject) or mySObject==None:
QMessageBox.critical(self, "Mesh", "select an input mesh") QMessageBox.critical(self, "Mesh", "select an input mesh")
return return
self.smeshStudyTool = SMeshStudyTools() self.smeshStudyTool = SMeshStudyTools()
try:
self.__selectedMesh = self.smeshStudyTool.getMeshObjectFromSObject(mySObject) self.__selectedMesh = self.smeshStudyTool.getMeshObjectFromSObject(mySObject)
if CORBA.is_nil(self.__selectedMesh): except:
QMessageBox.critical(self, "Mesh", "select an input mesh") QMessageBox.critical(self, "Mesh", "select an input mesh")
return return
myName = mySObject.GetName() if CORBA.is_nil(self.__selectedMesh):
self.MeshIn=myName QMessageBox.critical(self, "Mesh", "select an input mesh")
self.LE_MeshSmesh.setText(myName) return
myName = mySObject.GetName()
#print "MeshSmeshNameChanged", myName
self.MeshIn=myName
self.LE_MeshSmesh.setText(myName)
self.LE_MeshFile.setText("")
self.fichierIn=""
def prepareFichier(self): def prepareFichier(self):
self.fichierIn="/tmp/PourYam_"+str(self.num)+".mesh" self.fichierIn="/tmp/ForYams_"+str(self.num)+".mesh"
import SMESH import SMESH
self.__selectedMesh.ExportGMF(self.__selectedMesh,self.fichierIn, True) self.__selectedMesh.ExportGMF(self.__selectedMesh, self.fichierIn, True)
def PrepareLigneCommande(self): def PrepareLigneCommande(self):
self.commande="yams " if self.fichierIn=="" and self.MeshIn=="":
verbosity=str(self.SP_Verbosity.value()) QMessageBox.critical(self, "Mesh", "select an input mesh")
self.commande+="-v "+verbosity return False
for obj in self.mesRB.children(): if self.__selectedMesh!=None: self.prepareFichier()
try : if not (os.path.isfile(self.fichierIn)):
if obj.isChecked(): QMessageBox.critical(self, "File", "unable to read GMF Mesh in "+str(self.fichierIn))
self.style=obj.objectName().remove(0,3) return False
self.style.replace("_","-")
break
except :
pass
self.commande+=" -O "+self.style.toLatin1()
if self.fichierIn=="" and self.MeshIn=="" :
QMessageBox.critical(self, "Mesh", "select an input mesh")
return False
if self.MeshIn!="" : self.prepareFichier()
if not (os.path.isfile(self.fichierIn)):
QMessageBox.critical(self, "File", "unable to read GMF Mesh in "+str(self.fichierIn))
return False
deb=os.path.splitext(self.fichierIn) self.commande="yams"
self.fichierOut=deb[0]+'.d.meshb' verbosity=str(self.SP_Verbosity.value())
self.commande+=" -v "+verbosity
for obj in self.GBOptim.findChildren(QRadioButton,):
try:
if obj.isChecked():
self.style=obj.objectName().remove(0,3)
self.style.replace("_","-")
break
except:
pass
self.commande+=" -O "+self.style.toLatin1()
if self.RB_Absolute.isChecked()==True : deb=os.path.splitext(self.fichierIn)
self.commande+=' -Dabsolute' self.fichierOut=deb[0] + ".d.meshb"
else :
self.commande+=' -Drelative'
self.commande+=',tolerance=%f'%self.SP_Tolerance.value()
if self.CB_Ridge.isChecked()==False : self.commande+=',-nr'
if self.CB_Point.isChecked()==False : self.commande+=',-ns'
if self.SP_Geomapp.value()!=0.04 : self.commande+=',geomapp=%f'%self.SP_Geomapp.value()
if self.SP_Ridge.value()!=45.0 : self.commande+=',ridge=%f'%self.SP_Ridge.value()
if self.SP_MaxSize.value()!=100 : self.commande+=',maxsize=%f'%self.SP_MaxSize.value()
if self.SP_MinSize.value()!=5 : self.commande+=',minsize=%f'%self.SP_MinSize.value()
if self.SP_Gradation.value()!=1.3 : self.commande+=',gradation=%f'%self.SP_MaxSize.value()
if self.CB_SplitEdge.isChecked()==True : self.commande+=',splitedge=1'
if self.SP_Verbosity.value()!=3 : self.commande+=' -v %d'%self.SP_Verbosity.value() if self.RB_Absolute.isChecked()==True :
if self.SP_Memory.value()!=0 : self.commande+=' -m %d'%self.SP_Memory.value() self.commande+=" -Dabsolute"
else :
self.commande+=" -Drelative"
self.commande+=" "+self.fichierIn v=self.SP_toStr(self.SP_Tolerance)
return True self.commande+=",tolerance="+v
if self.CB_Ridge.isChecked()==False : self.commande+=",-nr"
if self.CB_Point.isChecked()==False : self.commande+=",-ns"
if self.SP_Geomapp.value()!=0.04 : self.commande+=",geomapp=%f"%self.SP_Geomapp.value()
if self.SP_Ridge.value()!=45.0 : self.commande+=",ridge=%f"%self.SP_Ridge.value()
if self.SP_MaxSize.value()!=100 : self.commande+=",maxsize=%f"%self.SP_MaxSize.value()
if self.SP_MinSize.value()!=5 : self.commande+=",minsize=%f"%self.SP_MinSize.value()
if self.SP_Gradation.value()!=1.3 : self.commande+=",gradation=%f"%self.SP_MaxSize.value()
if self.CB_SplitEdge.isChecked()==True : self.commande+=",splitedge=1"
if self.SP_Verbosity.value()!=3 : self.commande+=" -v %d"%self.SP_Verbosity.value()
if self.SP_Memory.value()!=0 : self.commande+=" -m %d"%self.SP_Memory.value()
self.commande+=" "+self.fichierIn
return True
def clean(self): def clean(self):
self.RB_0.setChecked(True) self.RB_0.setChecked(True)
self.RB_G.setChecked(False) self.RB_G.setChecked(False)
self.RB_U.setChecked(False) self.RB_U.setChecked(False)
self.RB_S.setChecked(False) self.RB_S.setChecked(False)
self.RB_2.setChecked(False) self.RB_2.setChecked(False)
self.RB_1.setChecked(False) self.RB_1.setChecked(False)
self.RB_Absolute.setChecked(False) self.RB_Absolute.setChecked(False)
self.RB_Relative.setChecked(True) self.RB_Relative.setChecked(True)
self.SP_Tolerance.setProperty("value", 0.1) self.SP_Tolerance.setProperty("text", "10.")
self.SP_Geomapp.setProperty("value", 0.04) self.SP_Geomapp.setProperty("value", 0.04)
self.SP_Ridge.setProperty("value", 45.0) self.SP_Ridge.setProperty("value", 45.0)
self.SP_Gradation.setProperty("value", 1.3) self.SP_Gradation.setProperty("value", 1.3)
self.CB_Ridge.setChecked(True) self.CB_Ridge.setChecked(True)
self.CB_Point.setChecked(True) self.CB_Point.setChecked(True)
self.CB_SplitEdge.setChecked(False) self.CB_SplitEdge.setChecked(False)
self.SP_MaxSize.setProperty("value", -2.0) self.SP_MaxSize.setProperty("value", -2.0)
self.SP_MinSize.setProperty("value", -2.0) self.SP_MinSize.setProperty("value", -2.0)
self.SP_Verbosity.setProperty("value", 3) self.SP_Verbosity.setProperty("value", 3)
self.SP_Memory.setProperty("value", 0) self.SP_Memory.setProperty("value", 0)
__dialog=None __dialog=None
def getDialog(): def getDialog():
@ -314,3 +503,23 @@ def getDialog():
# __dialog.clean() # __dialog.clean()
return __dialog return __dialog
#
# ==============================================================================
# Basic use cases and unit test functions
# ==============================================================================
#
def TEST_MonYamsPlugDialog():
#print "TEST_YamsMonPlugDialog"
import sys
from PyQt4.QtGui import QApplication
from PyQt4.QtCore import QObject, SIGNAL, SLOT
app = QApplication(sys.argv)
QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
dlg=MonYamsPlugDialog()
dlg.show()
sys.exit(app.exec_())
if __name__ == "__main__":
TEST_MonYamsPlugDialog()
pass

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
# Copyright (C) 2006-2013 EDF R&D # Copyright (C) 2006-2013 EDF R&D
# #
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
@ -34,10 +35,11 @@ def YamsLct(context):
from PyQt4.QtGui import QFileDialog from PyQt4.QtGui import QFileDialog
from PyQt4.QtGui import QMessageBox from PyQt4.QtGui import QMessageBox
#prior test to avoid unnecessary user GUI work with ending crash
try : try :
os.environ['DISTENE_LICENCE_FILE_FOR_YAMS'] os.environ['DISTENE_LICENCE_FILE_FOR_YAMS']
except: except:
QMessageBox.warning(None,"Products","Distene's products are not installed") QMessageBox.warning(None,"Products","Distene's product Yams is not installed.\nrequired environment variable:\nDISTENE_LICENCE_FILE_FOR_YAMS='/.../dlim8.var.sh'")
return return
import monYamsPlugDialog import monYamsPlugDialog
window=monYamsPlugDialog.getDialog() window=monYamsPlugDialog.getDialog()