more load/save hypothesis

This commit is contained in:
cvw 2013-05-16 12:48:52 +00:00
parent 72e70c5f55
commit 56e5750537
2 changed files with 482 additions and 342 deletions

View File

@ -45,14 +45,25 @@ class MGCleanerMonPlugDialog(Ui_MGCleanerPlugDialog,QWidget):
# other solution could be in the same folder than this python module file:
# iconfolder=os.path.dirname(os.path.abspath(__file__))
iconfolder=os.environ["SMESH_ROOT_DIR"]+"/share/salome/resources/smesh"
self.iconfolder=os.environ["SMESH_ROOT_DIR"]+"/share/salome/resources/smesh"
#print "MGCleanerMonPlugDialog iconfolder",iconfolder
icon = QIcon()
icon.addFile(os.path.join(iconfolder,"select1.png"))
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(iconfolder,"open.png"))
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"],".MGCleaner.dat"))
@ -66,9 +77,13 @@ class MGCleanerMonPlugDialog(Ui_MGCleanerPlugDialog,QWidget):
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_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.PB_ParamsFileExplorer,SIGNAL("clicked()"),self.setParamsFileName)
@ -93,8 +108,8 @@ class MGCleanerMonPlugDialog(Ui_MGCleanerPlugDialog,QWidget):
def PBOKPressed(self):
if not(self.PrepareLigneCommande()): return
self.PBSavePressed(NomHypo=True)
maFenetre=MGCleanerMonViewText(self,self.commande)
maFenetre=MGCleanerMonViewText(self, self.commande)
#print "compute Pressed"
if os.path.isfile(self.fichierOut): self.enregistreResultat()
def enregistreResultat(self):
@ -103,64 +118,52 @@ class MGCleanerMonPlugDialog(Ui_MGCleanerPlugDialog,QWidget):
import salome
from salome.kernel import studyedit
#print "enregistreResultat"
maStudy=studyedit.getActiveStudy()
smesh.SetCurrentStudy(maStudy)
(outputMesh, status) = smesh.CreateMeshesFromGMF(self.fichierOut)
meshname = "MGCleaner"+str(self.num)
name=str(self.LE_MeshSmesh.text())
if name=="":
#print "name new MESH",self.LE_MeshFile.text()
a=str(self.fichierIn)
name=os.path.basename(os.path.splitext(a)[0])
meshname = name+"_MGC_"+str(self.num)
smesh.SetName(outputMesh.GetMesh(), meshname)
outputMesh.Compute()
outputMesh.Compute() #no algorithms message for "Mesh_x" has been computed with warnings: - global 1D algorithm is missing
self.editor = studyedit.getStudyEditor() #
self.editor = studyedit.getStudyEditor()
moduleEntry=self.editor.findOrCreateComponent("SMESH","SMESH")
HypReMeshEntry = self.editor.findOrCreateItem( moduleEntry, name = "HypoForRemesh",
comment = "HypoForRemeshing")
monStudyBuilder=maStudy.NewBuilder();
monStudyBuilder.NewCommand();
HypReMeshEntry = self.editor.findOrCreateItem(
moduleEntry, name = "MGCleaner Hypotheses", icon="mesh_tree_algo.png") #, comment = "HypoForRemeshing" )
monStudyBuilder=maStudy.NewBuilder()
monStudyBuilder.NewCommand()
newStudyIter=monStudyBuilder.NewObject(HypReMeshEntry)
aNameAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeName")
hypoName = "anHypo_MGCleaner_"+str(self.num)
hypoName = "HypoMGC_"+str(self.num)
aNameAttrib.SetValue(hypoName)
aCommentAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeComment")
aCommentAttrib.SetValue(str(self.commande))
aCommentAttrib.SetValue(self.getResumeData(separator=" ; "))
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
def PBSavePressed(self,NomHypo=False):
def PBSavePressed(self, NomHypo=False):
from datetime import datetime
if NomHypo:
text = "# Params for Hypothese : anHypo_MGCleaner_"+str(self.num - 1)+"\n"
text = "# Params for Hypothese : Hypo_MGCleaner_"+str(self.num - 1)+"\n"
else:
text = "# Save intermediate params \n"
text += "# Params for mesh : " + self.LE_MeshSmesh.text() +"\n"
if self.RB_Fix1.isChecked():
CheckOrFix="fix1pass"
else:
if self.RB_Fix2.isChecked():
CheckOrFix="fix2pass"
else:
CheckOrFix="check"
text+="CheckOrFix=" + CheckOrFix+"\n"
text+="PreserveTopology=" + str(self.CB_PreserveTopology.isChecked())+"\n"
text+="FillHoles=" + str(self.CB_FillHoles.isChecked())+"\n"
text+="MinHoleSize=" + str(self.SP_MinHoleSize.value())+"\n"
text+="ComputedToleranceDisplacement=" + str(self.CB_ComputedToleranceDisplacement.isChecked())+"\n"
text+="ToleranceDisplacement=" + str(self.SP_ToleranceDisplacement.value())+"\n"
text+="ComputedResolutionLength=" + str(self.CB_ComputedResolutionLength.isChecked())+"\n"
text+="ResolutionLength=" + str(self.SP_ResolutionLength.value())+"\n"
text+="FoldingAngle=" + str(self.SP_FoldingAngle.value())+"\n"
text+="RemeshPlanes=" + str(self.CB_RemeshPlanes.isChecked())+"\n"
text+="ComputedOverlapDistance=" + str(self.CB_ComputedOverlapDistance.isChecked())+"\n"
text+="OverlapDistance=" + str(self.SP_OverlapDistance.value())+"\n"
text+="OverlapAngle=" + str(self.SP_OverlapAngle.value())+"\n"
text+="Verbosity=" + str(self.SP_Verbosity.value())+"\n"
text+="\n\n"
text += datetime.now().strftime("# Date : %d/%m/%y %H:%M:%S\n")
text += self.getResumeData(separator="\n")
text += "\n\n"
try:
f=open(self.paramsFile,"a")
@ -174,23 +177,67 @@ class MGCleanerMonPlugDialog(Ui_MGCleanerPlugDialog,QWidget):
return
f.close()
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()
def PBSaveHypPressed(self):
"""save hypothesis in Object Browser"""
#QMessageBox.warning(self, "save Object Browser MGCleaner Hypothesis", "TODO")
import smesh
import SMESH
import salome
from salome.kernel import studyedit
maStudy=studyedit.getActiveStudy()
smesh.SetCurrentStudy(maStudy)
self.editor = studyedit.getStudyEditor()
moduleEntry=self.editor.findOrCreateComponent("SMESH","SMESH")
HypReMeshEntry = self.editor.findOrCreateItem(
moduleEntry, name = "MGCleaner Hypotheses", icon="mesh_tree_algo.png") #, comment = "HypoForRemeshing" )
monStudyBuilder=maStudy.NewBuilder()
monStudyBuilder.NewCommand()
newStudyIter=monStudyBuilder.NewObject(HypReMeshEntry)
aNameAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeName")
hypoName = "HypoMGC_"+str(self.num)
aNameAttrib.SetValue(hypoName)
aCommentAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeComment")
aCommentAttrib.SetValue(self.getResumeData(separator=" ; "))
if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(0)
self.num+=1
return True
def getResumeData(self, separator="\n"):
text=""
if self.RB_Fix1.isChecked():
CheckOrFix="fix1pass"
else:
if self.RB_Fix2.isChecked():
CheckOrFix="fix2pass"
else:
CheckOrFix="check"
text+="CheckOrFix=" + CheckOrFix+separator
text+="PreserveTopology=" + str(self.CB_PreserveTopology.isChecked())+separator
text+="FillHoles=" + str(self.CB_FillHoles.isChecked())+separator
text+="MinHoleSize=" + str(self.SP_MinHoleSize.value())+separator
text+="ComputedToleranceDisplacement=" + str(self.CB_ComputedToleranceDisplacement.isChecked())+separator
text+="ToleranceDisplacement=" + str(self.SP_ToleranceDisplacement.value())+separator
text+="ComputedResolutionLength=" + str(self.CB_ComputedResolutionLength.isChecked())+separator
text+="ResolutionLength=" + str(self.SP_ResolutionLength.value())+separator
text+="FoldingAngle=" + str(self.SP_FoldingAngle.value())+separator
text+="RemeshPlanes=" + str(self.CB_RemeshPlanes.isChecked())+separator
text+="ComputedOverlapDistance=" + str(self.CB_ComputedOverlapDistance.isChecked())+separator
text+="OverlapDistance=" + str(self.SP_OverlapDistance.value())+separator
text+="OverlapAngle=" + str(self.SP_OverlapAngle.value())+separator
text+="Verbosity=" + str(self.SP_Verbosity.value())+separator
return text
def loadResumeData(self, hypothesis, separator="\n"):
text=str(hypothesis)
self.clean()
for slig in reversed(text.split("\n")):
for slig in reversed(text.split(separator)):
lig=slig.strip()
#print "load params",self.paramsFile,lig
#print "load ResumeData",lig
if lig=="": continue #skip blanck lines
if lig[0]=="#": break
try:
@ -202,22 +249,69 @@ class MGCleanerMonPlugDialog(Ui_MGCleanerPlugDialog,QWidget):
if value=="fix1pass": self.RB_Fix1.setChecked(True)
if value=="fix2pass": self.RB_Fix2.setChecked(True)
if value=="check": self.RB_Check.setChecked(True)
if tit=="PreserveTopology": self.CB_PreserveTopology.setChecked(bool(value))
if tit=="FillHoles": self.CB_FillHoles.setChecked(bool(value))
if tit=="PreserveTopology": self.CB_PreserveTopology.setChecked(value=="True")
if tit=="FillHoles": self.CB_FillHoles.setChecked(value=="True")
if tit=="MinHoleSize": self.SP_MinHoleSize.setProperty("value", float(value))
if tit=="ComputedToleranceDisplacement": self.CB_ComputedToleranceDisplacement.setChecked(bool(value))
if tit=="ComputedToleranceDisplacement": self.CB_ComputedToleranceDisplacement.setChecked(value=="True")
if tit=="ToleranceDisplacement": self.SP_ToleranceDisplacement.setProperty("value", float(value))
if tit=="ComputedResolutionLength": self.CB_ComputedResolutionLength.setChecked(bool(value))
if tit=="ComputedResolutionLength": self.CB_ComputedResolutionLength.setChecked(value=="True")
if tit=="ResolutionLength": self.SP_ResolutionLength.setProperty("value", float(value))
if tit=="FoldingAngle": self.SP_FoldingAngle.setProperty("value", float(value))
if tit=="RemeshPlanes": self.CB_RemeshPlanes.setChecked(bool(value))
if tit=="ComputedOverlapDistance": self.CB_ComputedOverlapDistance.setChecked(bool(value))
if tit=="RemeshPlanes": self.CB_RemeshPlanes.setChecked(value=="True")
if tit=="ComputedOverlapDistance": self.CB_ComputedOverlapDistance.setChecked(value=="True")
if tit=="OverlapDistance": self.SP_OverlapDistance.setProperty("value", float(value))
if tit=="OverlapAngle": self.SP_OverlapAngle.setProperty("value", float(value))
if tit=="Verbosity": self.SP_Verbosity.setProperty("value", int(float(value)))
except:
QMessageBox.warning(self, "File", "Problem to read '"+lig+"'")
QMessageBox.warning(self, "load MGCleaner Hypothesis", "Problem on '"+lig+"'")
def PBLoadPressed(self):
"""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 MGCleaner 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 MGCleaner hypothesis")
return
#for i in dir(mySObject): print "dir mySObject",i
#print "GetAllAttributes",mySObject.GetAllAttributes()
#print "GetComment",mySObject.GetComment()
#print "GetName",mySObject.GetName()
#could be renamed...
#if mySObject.GetFather().GetName()!="MGCleaner Hypotheses":
# QMessageBox.critical(self, "Hypothese", "not a child of MGCleaner Hypotheses")
# return
text=mySObject.GetComment()
#a verification
if "CheckOrFix=" not in text:
QMessageBox.critical(self, "Load Hypothese", "Object Browser selection not a MGCleaner Hypothesis")
return
self.loadResumeData(text, separator=" ; ")
return
def PBCancelPressed(self):
self.close()
@ -228,6 +322,8 @@ class MGCleanerMonPlugDialog(Ui_MGCleanerPlugDialog,QWidget):
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 (*)")
@ -237,8 +333,12 @@ class MGCleanerMonPlugDialog(Ui_MGCleanerPlugDialog,QWidget):
self.paramsFile=infile.toLatin1()
def meshFileNameChanged(self):
self.fichierIn=self.LE_MeshFile.text()
if os.path.exists(self.fichierIn): return
self.fichierIn=str(self.LE_MeshFile.text())
#print "meshFileNameChanged", self.fichierIn
if os.path.exists(self.fichierIn):
self.MeshIn=""
self.LE_MeshSmesh.setText("")
return
QMessageBox.warning( self, "Unknown File", "File doesn't exist")
def paramsFileNameChanged(self):
@ -257,16 +357,23 @@ class MGCleanerMonPlugDialog(Ui_MGCleanerPlugDialog,QWidget):
QMessageBox.critical(self, "Mesh", "select an input mesh")
return
self.smeshStudyTool = SMeshStudyTools()
try:
self.__selectedMesh = self.smeshStudyTool.getMeshObjectFromSObject(mySObject)
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/PourMGCleaner_"+str(self.num)+".mesh"
self.fichierIn="/tmp/ForMGCleaner_"+str(self.num)+".mesh"
import SMESH
self.__selectedMesh.ExportGMF(self.__selectedMesh,self.fichierIn, True)
@ -300,7 +407,8 @@ class MGCleanerMonPlugDialog(Ui_MGCleanerPlugDialog,QWidget):
verbosity=str(self.SP_Verbosity.value())
self.commande+=" --verbose " + verbosity
self.commande+=" --in " + self.fichierIn
deb=os.path.splitext(self.fichierIn)
#print "self.fichierIn",self.fichierIn,type(self.fichierIn)
deb=os.path.splitext(str(self.fichierIn))
self.fichierOut=deb[0] + "_fix.mesh"
self.commande+=" --out "+self.fichierOut
if self.RB_Fix1.isChecked():
@ -362,6 +470,28 @@ def getDialog():
return __dialog
#
# ==============================================================================
# For memory
# ==============================================================================
#
def TEST_standalone():
"""
works only if a salome is launched yet with a study loaded
to launch standalone python do:
/export/home/wambeke/2013/V6_main_MGC_CO6.4_64/APPLI/runSession
python
or (do not works)
python /export/home/wambeke/2013/V6_main_MGC_CO6.4_64/INSTALL/SMESH/share/salome/plugins/smesh/MGCleanerMonPlugDialog.py
"""
import salome
import smesh
import SMESH
from salome.kernel import studyedit
salome.salome_init()
maStudy=studyedit.getActiveStudy()
#etc...a mano...
#
# ==============================================================================
# Basic use cases and unit test functions
@ -381,3 +511,5 @@ def TEST_MGCleanerMonPlugDialog():
if __name__ == "__main__":
TEST_MGCleanerMonPlugDialog()
#TEST_standalone()
pass

View File

@ -62,24 +62,62 @@
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="PB_SaveHyp">
<property name="text">
<string>Save</string>
</property>
<property name="iconSize">
<size>
<width>18</width>
<height>18</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="PB_LoadHyp">
<property name="text">
<string>Load</string>
</property>
<property name="iconSize">
<size>
<width>18</width>
<height>18</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="PB_Save">
<property name="text">
<string>Save Params</string>
<string>Save</string>
</property>
<property name="iconSize">
<size>
<width>18</width>
<height>18</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="PB_Load">
<property name="text">
<string>Load Params</string>
<string>Load</string>
</property>
<property name="iconSize">
<size>
<width>18</width>
<height>18</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="PB_Default">
<property name="text">
<string>Default Params</string>
<string>Default</string>
</property>
</widget>
</item>
@ -295,8 +333,8 @@ Default is not to mesh planes.</string>
<rect>
<x>40</x>
<y>70</y>
<width>191</width>
<height>33</height>
<width>190</width>
<height>31</height>
</rect>
</property>
<property name="font">
@ -305,7 +343,13 @@ Default is not to mesh planes.</string>
</font>
</property>
<property name="text">
<string>Mesh File (GMF format)</string>
<string>Mesh File GMF format</string>
</property>
<property name="iconSize">
<size>
<width>18</width>
<height>18</height>
</size>
</property>
</widget>
<widget class="QLineEdit" name="LE_MeshFile">
@ -326,18 +370,14 @@ Default is not to mesh planes.</string>
<widget class="QPushButton" name="PB_MeshSmesh">
<property name="geometry">
<rect>
<x>190</x>
<x>40</x>
<y>30</y>
<width>41</width>
<width>190</width>
<height>31</height>
</rect>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset>
<normaloff>:select1.png</normaloff>:select1.png</iconset>
<string>Mesh Object Browser</string>
</property>
<property name="iconSize">
<size>
@ -364,34 +404,6 @@ Default is not to mesh planes.</string>
</font>
</property>
</widget>
<widget class="QLabel" name="label_7">
<property name="geometry">
<rect>
<x>40</x>
<y>30</y>
<width>141</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
<strikeout>false</strikeout>
</font>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string>Smesh mesh</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
<property name="margin">
<number>0</number>
</property>
</widget>
<widget class="QLabel" name="label_8">
<property name="geometry">
<rect>
@ -795,7 +807,7 @@ From 0 (no detail) to 10 (very detailed).
Default is 3.</string>
</property>
<property name="text">
<string>Verbosity Level</string>
<string>Verbosity level</string>
</property>
</widget>
@ -823,7 +835,7 @@ Default is 3.</string>
</rect>
</property>
<property name="text">
<string>File used to save MGCleaner Params :</string>
<string>File used to save MGCleaner hypothesis parameters :</string>
</property>
</widget>
<widget class="QPushButton" name="PB_ParamsFileExplorer">
@ -838,10 +850,6 @@ Default is 3.</string>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset>
<normaloff>:open.png</normaloff>:open.png</iconset>
</property>
</widget>
<widget class="QLineEdit" name="LE_ParamsFile">
<property name="geometry">