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**
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
:align: center

View File

@ -12,7 +12,7 @@ RSTFILES = lct.rst \
Generics_params.rst \
Advanced_params.rst
EXTRA_DIST += $(RSTFILES) images
EXTRA_DIST += $(RSTFILES) images files
# You can set these variables from the command line.
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**
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.

View File

@ -4,17 +4,23 @@
How to save Yams Parameters
===========================
As Yams hypothesis are not meshing hypothesis for Salome (but hypothesis for yams), parameters
are stored in a special file. Default file is $HOME/.yams.dat. It is strongly recommended that you
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.
Yams hypothesis is not meshing hypothesis for Salome, but hypothesis for yams.
The current set of parameters is automatically written in the salome study object browser when you run computation.
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.
- 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
In frame "Plug-in Generic Options":
- 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**
@ -22,39 +28,25 @@ All sets of parameters are logged in it.
.. code-block:: python
# Save intermediate params
# 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
# YAMS hypothesis parameters
# Params for mesh : Mesh_1
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
# Date : 23/05/13 14:23:18
# Command : yams -v 3 -O 0 -Drelative,tolerance=0.100000,maxsize=0.010000,minsize=0.000000 /tmp/ForYams_1.mesh
Optimisation=Quality improvement Only (0)
Units=Relative
ChordalToleranceDeviation=0.1
RidgeDetection=True
SplitEdge=False
PointSmoothing=True
GeometricalApproximation=0.04
RidgeAngle=45.0
MaximumSize=0.01
MinimumSize=0.0
MeshGradation=1.3
Verbosity=3
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**.
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:
@ -19,8 +21,8 @@ Contents:
lct.rst
Mandatory_params.rst
Generics_params.rst
Advanced_params.rst
Generics_params.rst
editHypo.rst

View File

@ -1,7 +1,7 @@
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
:align: center

View File

@ -1,4 +1,4 @@
# -*- coding: iso-8859-1 -*-
# -*- coding: utf-8 -*-
# Copyright (C) 2007-2013 EDF R&D
#
# This library is free software; you can redistribute it and/or
@ -28,45 +28,59 @@ from PyQt4.QtCore import *
# Import des panels
# ------------------------------- #
from ViewText import Ui_ViewExe
class MonViewText(Ui_ViewExe,QDialog):
# ------------------------------- #
class MonViewText(Ui_ViewExe, QDialog):
"""
Classe permettant la visualisation de texte
"""
def __init__(self,parent,txt):
def __init__(self, parent, txt):
QDialog.__init__(self,parent)
self.pere=parent
self.setupUi(self)
self.resize( QSize(600,600).expandedTo(self.minimumSizeHint()) )
self.connect( self.PB_Ok,SIGNAL("clicked()"), self, SLOT("close()") )
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.theClose )
self.connect( self.PB_Save,SIGNAL("clicked()"), self.saveFile )
self.monExe=QProcess(self)
self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOut )
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
# fonctionne hors Salome mais pas dans Salome ???
LICENCE=os.environ['DISTENE_LICENCE_FILE_FOR_YAMS']
txt='export DISTENE_LICENSE_FILE='+LICENCE+';'+ txt
cmds=''
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()
nomFichier='/tmp/yam_'+str(pid)+'.py'
nomFichier='/tmp/Yams_'+str(pid)+'.sh'
f=open(nomFichier,'w')
f.write(txt)
f.write(cmds)
f.close()
maBidouille='sh ' + nomFichier
self.monExe.start(maBidouille)
self.monExe.closeWriteChannel()
self.enregistreResultatsDone=False
self.show()
def exeFinished(self):
self.pere.enregistreResultat()
def saveFile(self):
#recuperation du nom du fichier
savedir=os.environ['HOME']
@ -84,8 +98,19 @@ class MonViewText(Ui_ViewExe,QDialog):
def readFromStdErr(self):
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) :
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 -*-
# 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
# 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
#
# Modules Python
# Modules Eficas
@ -31,275 +32,463 @@ class MonYamsPlugDialog(Ui_YamsPlugDialog,QWidget):
"""
"""
def __init__(self):
QWidget.__init__(self)
self.setupUi(self)
self.connecterSignaux()
self.fichierIn=""
self.fichierOut=""
self.MeshIn=""
self.num=1
QWidget.__init__(self)
self.setupUi(self)
self.connecterSignaux()
self.fichierIn=""
self.fichierOut=""
self.MeshIn=""
self.commande=""
self.num=1
self.__selectedMesh=None
# 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("")
# complex whith QResources: not used
# The icon are supposed to be located in the $SMESH_ROOT_DIR/share/salome/resources/smesh folder,
# other solution could be in the same folder than this python module file:
# iconfolder=os.path.dirname(os.path.abspath(__file__))
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) :
self.connect(self.PB_Cancel,SIGNAL("clicked()"),self.PBCancelPressed)
self.connect(self.PB_Default,SIGNAL("clicked()"),self.clean)
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_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_Cancel,SIGNAL("clicked()"),self.PBCancelPressed)
self.connect(self.PB_Default,SIGNAL("clicked()"),self.clean)
self.connect(self.PB_Help,SIGNAL("clicked()"),self.PBHelpPressed)
self.connect(self.PB_OK,SIGNAL("clicked()"),self.PBOKPressed)
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):
try :
maDoc=os.environ['DISTENE_YAMS_DOC_PDF']
except Exception:
QMessageBox.warning( self, "Help unavailable", str(maDoc) + " not found")
command="xdg-open "+maDoc+";"
subprocess.call(command, shell=True)
try :
mydir=os.environ["SMESH_ROOT_DIR"]
except Exception:
QMessageBox.warning(self, "Help", "Help unavailable $SMESH_ROOT_DIR not found")
return
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):
if not(self.PrepareLigneCommande()) : return
self.PBSavePressed(NomHypo=True)
maFenetre=MonViewText(self,self.commande)
if not(self.PrepareLigneCommande()):
#warning done yet
#QMessageBox.warning(self, "Compute", "Command not found")
return
maFenetre=MonViewText(self,self.commande)
def enregistreResultat(self):
if not(os.path.isfile(self.fichierOut)) : return
import smesh
import SMESH
import salome
from salome.kernel import studyedit
import smesh
import SMESH
import salome
from salome.kernel import studyedit
maStudy=studyedit.getActiveStudy()
smesh.SetCurrentStudy(maStudy)
(outputMesh, status) = smesh.CreateMeshesFromGMF(self.fichierOut)
meshname = 'yams'+str(self.num)
smesh.SetName(outputMesh.GetMesh(), meshname)
outputMesh.Compute()
if not os.path.isfile(self.fichierOut):
QMessageBox.warning(self, "Compute", "Result file "+self.fichierOut+" not found")
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() #
moduleEntry=self.editor.findOrCreateComponent("SMESH","SMESH")
HypReMeshEntry = self.editor.findOrCreateItem( moduleEntry, name = 'HypoForRemesh',
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]
newLink=monStudyBuilder.NewObject(SOMesh)
monStudyBuilder.Addreference(newLink, newStudyIter);
if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(0)
self.num+=1
return True
meshname = name+"_YAMS_"+str(self.num)
smesh.SetName(outputMesh.GetMesh(), meshname)
outputMesh.Compute() #no algorithms message for "Mesh_x" has been computed with warnings: - global 1D algorithm is missing
self.editor = studyedit.getStudyEditor() #
moduleEntry=self.editor.findOrCreateComponent("SMESH","SMESH")
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=" ; "))
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):
if NomHypo : text = '# Params for Hypothese : monHypo_Yams_'+str(self.num - 1)+"\n"
else : text = '# Save intermediate params \n'
text += "# Params for mesh : " + self.LE_MeshSmesh.text() +'\n'
for RB in self.GBOptim.findChildren(QRadioButton,):
if RB.isChecked()==True:
text+="Optimisation ='"+RB.text()+"'\n"
break
for RB in self.GBUnit.findChildren(QRadioButton,):
if RB.isChecked()==True:
text+="Units ='"+RB.text()+"'\n"
text+='Chordal_Tolerance_Deviation='+str(self.SP_Tolerance.value())+'\n'
from datetime import datetime
if not(self.PrepareLigneCommande()): return
text = "# YAMS hypothesis parameters\n"
text += "# Params for mesh : " + self.LE_MeshSmesh.text() +"\n"
text += datetime.now().strftime("# Date : %d/%m/%y %H:%M:%S\n")
text += "# Command : "+self.commande+"\n"
text += self.getResumeData(separator="\n")
text += "\n\n"
text+='Ridge_Detection=' + str(self.CB_Ridge.isChecked())+'\n'
text+='Split_Edge=' + str(self.CB_SplitEdge.isChecked())+'\n'
text+='Point_Smoothing=' + str(self.CB_Point.isChecked())+'\n'
text+='Geometrical_Approximation='+ str(self.SP_Geomapp.value()) +'\n'
text+='Ridge_Angle=' + str(self.SP_Ridge.value()) +'\n'
text+='Maximum_Size=' + str(self.SP_MaxSize.value()) +'\n'
text+='Minimum_Size=' + str(self.SP_MaxSize.value()) +'\n'
text+='Mesh_Gradation=' + str(self.SP_Gradation.value())+'\n'
try:
f=open(self.paramsFile,"a")
except:
QMessageBox.warning(self, "File", "Unable to open "+self.paramsFile)
return
try:
f.write(text)
except:
QMessageBox.warning(self, "File", "Unable to write "+self.paramsFile)
return
f.close()
text+='Verbosity=' + str(self.SP_Verbosity.value())+'\n'
text+='Memory=' + str(self.SP_Memory.value())+'\n'
text+='\n\n'
def PBSaveHypPressed(self):
"""save hypothesis in Object Browser"""
#QMessageBox.warning(self, "save Object Browser YAMS Hypothesis", "TODO")
import smesh
import SMESH
import salome
from salome.kernel import studyedit
try :
f=open(self.paramsFile,'a')
except :
QMessageBox.warning( self, "File", "Unable to open "+self.paramsFile)
return
try :
f.write(text)
except :
QMessageBox.warning( self, "File", "Unable to write "+self.paramsFile)
return
f.close()
maStudy=studyedit.getActiveStudy()
smesh.SetCurrentStudy(maStudy)
self.editor = studyedit.getStudyEditor()
moduleEntry=self.editor.findOrCreateComponent("SMESH","SMESH")
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):
try :
f=open(self.paramsFile,'r')
except :
QMessageBox.warning( self, "File", "Unable to open "+self.paramsFile)
return
try :
text=f.read()
except :
QMessageBox.warning( self, "File", "Unable to read "+self.paramsFile)
return
f.close()
d={}
exec text in d
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'])
self.CB_Point.setChecked(d['Point_Smoothing'])
self.CB_SplitEdge.setChecked(d['Split_Edge'])
self.SP_Geomapp.setValue(d['Geometrical_Approximation'])
self.SP_Ridge.setValue(d['Ridge_Angle'])
self.SP_MaxSize.setValue(d['Maximum_Size'])
self.SP_MinSize.setValue(d['Minimum_Size'])
self.SP_Gradation.setValue(d['Mesh_Gradation'])
self.SP_Verbosity.setValue(d['Verbosity'])
self.SP_Memory.setValue(d['Memory'])
"""load last hypothesis saved in tail of file"""
try:
f=open(self.paramsFile,"r")
except:
QMessageBox.warning(self, "File", "Unable to open "+self.paramsFile)
return
try:
text=f.read()
except:
QMessageBox.warning(self, "File", "Unable to read "+self.paramsFile)
return
f.close()
self.loadResumeData(text, separator="\n")
def PBLoadHypPressed(self):
"""load hypothesis saved in Object Browser"""
#QMessageBox.warning(self, "load Object Browser YAMS hypothesis", "TODO")
import salome
from salome.kernel import studyedit
from salome.smesh.smeshstudytools import SMeshStudyTools
from salome.gui import helper as guihelper
from omniORB import CORBA
mySObject, myEntry = guihelper.getSObjectSelected()
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):
self.close()
self.close()
def PBMeshFilePressed(self):
fd = QFileDialog(self, "select an existing Mesh file", self.LE_MeshFile.text(), "Mesh-Files (*.mesh);;All Files (*)")
if fd.exec_():
infile = fd.selectedFiles()[0]
self.LE_MeshFile.setText(infile)
self.fichierIn=infile.toLatin1()
fd = QFileDialog(self, "select an existing Mesh file", self.LE_MeshFile.text(), "Mesh-Files (*.mesh);;All Files (*)")
if fd.exec_():
infile = fd.selectedFiles()[0]
self.LE_MeshFile.setText(infile)
self.fichierIn=infile.toLatin1()
self.MeshIn=""
self.LE_MeshSmesh.setText("")
def setParamsFileName(self):
fd = QFileDialog(self, "select a file", self.LE_ParamsFile.text(), "dat Files (*.dat);;All Files (*)")
if fd.exec_():
infile = fd.selectedFiles()[0]
self.LE_ParamsFile.setText(infile)
self.paramsFile=infile.toLatin1()
fd = QFileDialog(self, "select a file", self.LE_ParamsFile.text(), "dat Files (*.dat);;All Files (*)")
if fd.exec_():
infile = fd.selectedFiles()[0]
self.LE_ParamsFile.setText(infile)
self.paramsFile=infile.toLatin1()
def meshFileNameChanged(self):
self.fichierIn=self.LE_MeshFile.text()
if os.path.exists(self.fichierIn): return
QMessageBox.warning( self, "Unknown File", "File doesn't exist")
self.fichierIn=str(self.LE_MeshFile.text())
#print "meshFileNameChanged", self.fichierIn
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):
self.paramsFile=self.LE_ParamsFile.text()
self.paramsFile=self.LE_ParamsFile.text()
def PBMeshSmeshPressed(self):
import salome
import smesh
from salome.kernel import studyedit
from salome.smesh.smeshstudytools import SMeshStudyTools
from salome.gui import helper as guihelper
from omniORB import CORBA
import salome
import smesh
from salome.kernel import studyedit
from salome.smesh.smeshstudytools import SMeshStudyTools
from salome.gui import helper as guihelper
from omniORB import CORBA
mySObject, myEntry = guihelper.getSObjectSelected()
if CORBA.is_nil(mySObject) or mySObject==None:
QMessageBox.critical(self, "Mesh", "select an input mesh")
return
self.smeshStudyTool = SMeshStudyTools()
mySObject, myEntry = guihelper.getSObjectSelected()
if CORBA.is_nil(mySObject) or mySObject==None:
QMessageBox.critical(self, "Mesh", "select an input mesh")
return
self.smeshStudyTool = SMeshStudyTools()
try:
self.__selectedMesh = self.smeshStudyTool.getMeshObjectFromSObject(mySObject)
if CORBA.is_nil(self.__selectedMesh):
QMessageBox.critical(self, "Mesh", "select an input mesh")
return
myName = mySObject.GetName()
self.MeshIn=myName
self.LE_MeshSmesh.setText(myName)
except:
QMessageBox.critical(self, "Mesh", "select an input mesh")
return
if CORBA.is_nil(self.__selectedMesh):
QMessageBox.critical(self, "Mesh", "select an input mesh")
return
myName = mySObject.GetName()
#print "MeshSmeshNameChanged", myName
self.MeshIn=myName
self.LE_MeshSmesh.setText(myName)
self.LE_MeshFile.setText("")
self.fichierIn=""
def prepareFichier(self):
self.fichierIn="/tmp/PourYam_"+str(self.num)+".mesh"
import SMESH
self.__selectedMesh.ExportGMF(self.__selectedMesh,self.fichierIn, True)
self.fichierIn="/tmp/ForYams_"+str(self.num)+".mesh"
import SMESH
self.__selectedMesh.ExportGMF(self.__selectedMesh, self.fichierIn, True)
def PrepareLigneCommande(self):
self.commande="yams "
verbosity=str(self.SP_Verbosity.value())
self.commande+="-v "+verbosity
for obj in self.mesRB.children():
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.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
if self.fichierIn=="" and self.MeshIn=="":
QMessageBox.critical(self, "Mesh", "select an input mesh")
return False
if self.__selectedMesh!=None: self.prepareFichier()
if not (os.path.isfile(self.fichierIn)):
QMessageBox.critical(self, "File", "unable to read GMF Mesh in "+str(self.fichierIn))
return False
self.commande="yams"
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()
deb=os.path.splitext(self.fichierIn)
self.fichierOut=deb[0]+'.d.meshb'
deb=os.path.splitext(self.fichierIn)
self.fichierOut=deb[0] + ".d.meshb"
if self.RB_Absolute.isChecked()==True :
self.commande+=' -Dabsolute'
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.RB_Absolute.isChecked()==True :
self.commande+=" -Dabsolute"
else :
self.commande+=" -Drelative"
v=self.SP_toStr(self.SP_Tolerance)
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()
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
self.commande+=" "+self.fichierIn
return True
def clean(self):
self.RB_0.setChecked(True)
self.RB_G.setChecked(False)
self.RB_U.setChecked(False)
self.RB_S.setChecked(False)
self.RB_2.setChecked(False)
self.RB_1.setChecked(False)
self.RB_Absolute.setChecked(False)
self.RB_Relative.setChecked(True)
self.SP_Tolerance.setProperty("value", 0.1)
self.SP_Geomapp.setProperty("value", 0.04)
self.SP_Ridge.setProperty("value", 45.0)
self.SP_Gradation.setProperty("value", 1.3)
self.CB_Ridge.setChecked(True)
self.CB_Point.setChecked(True)
self.CB_SplitEdge.setChecked(False)
self.SP_MaxSize.setProperty("value", -2.0)
self.SP_MinSize.setProperty("value", -2.0)
self.SP_Verbosity.setProperty("value", 3)
self.SP_Memory.setProperty("value", 0)
self.RB_0.setChecked(True)
self.RB_G.setChecked(False)
self.RB_U.setChecked(False)
self.RB_S.setChecked(False)
self.RB_2.setChecked(False)
self.RB_1.setChecked(False)
self.RB_Absolute.setChecked(False)
self.RB_Relative.setChecked(True)
self.SP_Tolerance.setProperty("text", "10.")
self.SP_Geomapp.setProperty("value", 0.04)
self.SP_Ridge.setProperty("value", 45.0)
self.SP_Gradation.setProperty("value", 1.3)
self.CB_Ridge.setChecked(True)
self.CB_Point.setChecked(True)
self.CB_SplitEdge.setChecked(False)
self.SP_MaxSize.setProperty("value", -2.0)
self.SP_MinSize.setProperty("value", -2.0)
self.SP_Verbosity.setProperty("value", 3)
self.SP_Memory.setProperty("value", 0)
__dialog=None
def getDialog():
@ -314,3 +503,23 @@ def getDialog():
# __dialog.clean()
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
#
# This library is free software; you can redistribute it and/or
@ -34,11 +35,12 @@ def YamsLct(context):
from PyQt4.QtGui import QFileDialog
from PyQt4.QtGui import QMessageBox
#prior test to avoid unnecessary user GUI work with ending crash
try :
os.environ['DISTENE_LICENCE_FILE_FOR_YAMS']
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
import monYamsPlugDialog
window=monYamsPlugDialog.getDialog()
window=monYamsPlugDialog.getDialog()
window.show()