diff --git a/src/Tools/MGCleanerPlug/MGCleanerMonPlugDialog.py b/src/Tools/MGCleanerPlug/MGCleanerMonPlugDialog.py index 59d64fa83..667df5ccf 100644 --- a/src/Tools/MGCleanerPlug/MGCleanerMonPlugDialog.py +++ b/src/Tools/MGCleanerPlug/MGCleanerMonPlugDialog.py @@ -98,9 +98,9 @@ class MGCleanerMonPlugDialog(Ui_MGCleanerPlugDialog,QWidget): self.connect(self.CB_ComputedToleranceDisplacement,SIGNAL("stateChanged(int)"),self.SP_ToleranceDisplacement.setDisabled) self.connect(self.CB_ComputedResolutionLength,SIGNAL("stateChanged(int)"),self.SP_ResolutionLength.setDisabled) self.connect(self.CB_ComputedOverlapDistance,SIGNAL("stateChanged(int)"),self.SP_OverlapDistance.setDisabled) - + def PBHelpPressed(self): - try : + try: mydir=os.environ["SMESH_ROOT_DIR"] except Exception: QMessageBox.warning( self, "Help unavailable $SMESH_ROOT_DIR not found") @@ -159,7 +159,7 @@ class MGCleanerMonPlugDialog(Ui_MGCleanerPlugDialog,QWidget): def PBSavePressed(self): from datetime import datetime if not(self.PrepareLigneCommande()): return - text = "# MGCleaner hypothesis parameters\n" + text = "# MGCleaner 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" @@ -202,6 +202,7 @@ class MGCleanerMonPlugDialog(Ui_MGCleanerPlugDialog,QWidget): hypoName = "HypoMGC_"+str(self.num) aNameAttrib.SetValue(hypoName) aCommentAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeComment") + #print "getResumeData",type(self.getResumeData(separator=" ; ")),self.getResumeData(separator=" ; ") aCommentAttrib.SetValue(self.getResumeData(separator=" ; ")) if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(0) @@ -217,21 +218,21 @@ class MGCleanerMonPlugDialog(Ui_MGCleanerPlugDialog,QWidget): 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 + 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 str(text) def loadResumeData(self, hypothesis, separator="\n"): text=str(hypothesis) @@ -409,7 +410,7 @@ class MGCleanerMonPlugDialog(Ui_MGCleanerPlugDialog,QWidget): #self.commande="mg-cleaner.exe --in " + self.fichierIn + " --out " + self.fichierOut + " --fix2pass" #return True #print "PrepareLigneCommande '"+self.fichierIn+"' '"+self.MeshIn+"'",self.__selectedMesh - if self.fichierIn=="" and self.MeshIn=="" : + if self.fichierIn=="" and self.MeshIn=="": QMessageBox.critical(self, "Mesh", "select an input mesh") return False if self.__selectedMesh!=None: self.prepareFichier() diff --git a/src/Tools/MGCleanerPlug/MGCleanerPlugDialog.ui b/src/Tools/MGCleanerPlug/MGCleanerPlugDialog.ui index 8b853509d..73eda3035 100644 --- a/src/Tools/MGCleanerPlug/MGCleanerPlugDialog.ui +++ b/src/Tools/MGCleanerPlug/MGCleanerPlugDialog.ui @@ -188,7 +188,7 @@ - Optimisation + Options diff --git a/src/Tools/YamsPlug/YamsPlugDialog.ui b/src/Tools/YamsPlug/YamsPlugDialog.ui index 2bb101ba7..1d33bb476 100644 --- a/src/Tools/YamsPlug/YamsPlugDialog.ui +++ b/src/Tools/YamsPlug/YamsPlugDialog.ui @@ -190,15 +190,27 @@ Optimisation - - - - 10 - 30 - 611 - 209 - - + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 30 + 20 + + + + + + @@ -324,8 +336,13 @@ good quality elements + - + + + + + @@ -567,7 +584,7 @@ If the Units parameter is absolute, the tolerance parameter is expressed in mode If not set (ridge detection disabled), Yams will not try to detect any new ridge edge by its own mechanism : it will consider as ridge only the ridges given in the mesh. -All non-ridge edges that would have been detected as ridge by the Ridge angle paramaeter +All non-ridge edges that would have been detected as ridge by the ridge angle parameter (see below) will be considered as part of the same continuous patch. This option should not be checked when all the known ridges of the mesh are given and when all other possible ridges are not geometric ridges to take into account. @@ -631,7 +648,7 @@ New created vertices are saved in the .mesh file under keyword section 'Vertices 10 140 750 - 280 + 270 @@ -915,21 +932,6 @@ Default is 3. 25 - - The program requires roughly about 370 bytes per point. It is thus possible to estimate a priori -the required memory size to complete a job. As an example of memory space needed, a mesh -of 543,652 points (1,087,716 triangles) requires 182 Mbytes (about 351 bytes per point). Conversely, -a workstation having 512 Mbytes of memory can handle a mesh of about 2,750,000 points. -The memory needed for mesh modification is allocated dynamically at the beginning of the procedure -(data reading), based on the initial triangulation size. When the program reaches the amount of maximal -memory allowed, it will stop inserting points and, if possible, the current mesh will be saved as it is, -valid and conformal, provided the input mesh was valid and conformal. -Specify the memory if: -- the automatically allocated memory reveals insufficient when the user asked to enrich the given mesh. -- you want to limit the amount of memory used by the program. -If the input mesh size requires more memory than requested or if the allocated memory (user defined or not) -exceeds the machine capabilities, the tool will stop because of insufficient memory. - 100000 @@ -946,18 +948,25 @@ exceeds the machine capabilities, the tool will stop because of insufficient mem 600 30 - - - - 130 - 700 - 600 - 30 - Memory size (in Mbytes) + + The program requires roughly about 370 bytes per point. It is thus possible to estimate a priori +the required memory size to complete a job. As an example of memory space needed, a mesh +of 543,652 points (1,087,716 triangles) requires 182 Mbytes (about 351 bytes per point). Conversely, +a workstation having 512 Mbytes of memory can handle a mesh of about 2,750,000 points. +The memory needed for mesh modification is allocated dynamically at the beginning of the procedure +(data reading), based on the initial triangulation size. When the program reaches the amount of maximal +memory allowed, it will stop inserting points and, if possible, the current mesh will be saved as it is, +valid and conformal, provided the input mesh was valid and conformal. +Specify the memory if: +- the automatically allocated memory reveals insufficient when the user asked to enrich the given mesh. +- you want to limit the amount of memory used by the program. +If the input mesh size requires more memory than requested or if the allocated memory (user defined or not) +exceeds the machine capabilities, the tool will stop because of insufficient memory. + diff --git a/src/Tools/YamsPlug/monYamsPlugDialog.py b/src/Tools/YamsPlug/monYamsPlugDialog.py index 850f2a7a0..b708699b7 100644 --- a/src/Tools/YamsPlug/monYamsPlugDialog.py +++ b/src/Tools/YamsPlug/monYamsPlugDialog.py @@ -32,290 +32,417 @@ 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 - # 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__)) + # 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__)) - iconfolder=os.environ['SMESH_ROOT_DIR']+'/share/salome/resources/smesh' - #print "monYamsPlugDialog iconfolder",iconfolder - icon = QIcon() - icon.addFile(os.path.join(iconfolder,"select1.png")) - self.PB_MeshSmesh.setIcon(icon) - icon = QIcon() - icon.addFile(os.path.join(iconfolder,"open.png")) - self.PB_ParamsFileExplorer.setIcon(icon) + 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("") + #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("") + 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 : - mydir=os.environ['SMESH_ROOT_DIR'] - except Exception: - QMessageBox.warning( self, "Help unavailable $SMESH_ROOT_DIR not found") - maDoc=mydir+"/share/doc/salome/gui/SMESH/yams/_downloads/YamsWhitePaper_3.2.pdf" - command="xdg-open "+maDoc+";" - subprocess.call(command, shell=True) - + try : + mydir=os.environ["SMESH_ROOT_DIR"] + except Exception: + QMessageBox.warning( self, "Help unavailable $SMESH_ROOT_DIR not found") + 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 os.path.isfile(self.fichierOut) :self.enregistreResultat() + if not(self.PrepareLigneCommande()) : return + maFenetre=MonViewText(self,self.commande) + if os.path.isfile(self.fichierOut): self.enregistreResultat() def enregistreResultat(self): - 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() + #print "enregistreResultat" + maStudy=studyedit.getActiveStudy() + smesh.SetCurrentStudy(maStudy) + (outputMesh, status) = smesh.CreateMeshesFromGMF(self.fichierOut) + 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+"_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 = 'HypoForRemesh', - comment = 'HypoForRemeshing') - monStudyBuilder=maStudy.NewBuilder(); - monStudyBuilder.NewCommand(); - newStudyIter=monStudyBuilder.NewObject(HypReMeshEntry) - aNameAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeName") - hypoName = 'anHypo_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 + self.editor = studyedit.getStudyEditor() # + moduleEntry=self.editor.findOrCreateComponent("SMESH","SMESH") + HypReMeshEntry = self.editor.findOrCreateItem( + moduleEntry, name = "YAMS Hypotheses", icon="mesh_tree_algo.png") #, comment = "HypoForRemeshing" ) + + monStudyBuilder=maStudy.NewBuilder(); + monStudyBuilder.NewCommand(); + newStudyIter=monStudyBuilder.NewObject(HypReMeshEntry) + aNameAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeName") + hypoName = "HypoYams_"+str(self.num) + aNameAttrib.SetValue(hypoName) + aCommentAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeComment") + 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): - if NomHypo : text = '# Params for Hypothese : anHypo_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 = "YAMS Hypotheses", icon="mesh_tree_algo.png") #, comment = "HypoForRemeshing" ) + + monStudyBuilder=maStudy.NewBuilder() + monStudyBuilder.NewCommand() + newStudyIter=monStudyBuilder.NewObject(HypReMeshEntry) + aNameAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeName") + hypoName = "HypoYams_"+str(self.num) + aNameAttrib.SetValue(hypoName) + aCommentAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeComment") + #print "getResumeData",type(self.getResumeData(separator=" ; ")),self.getResumeData(separator=" ; ") + aCommentAttrib.SetValue(self.getResumeData(separator=" ; ")) + + if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(0) + self.num+=1 + return True + + def getResumeData(self, separator="\n"): + text="" + for RB in self.GBOptim.findChildren(QRadioButton,): + if RB.isChecked()==True: + text+="Optimisation="+RB.text()+separator + break + for RB in self.GBUnit.findChildren(QRadioButton,): + if RB.isChecked()==True: + text+="Units="+RB.text()+separator + text+="ChordalToleranceDeviation="+str(self.SP_Tolerance.value())+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=="ChordalToleranceDeviation": self.SP_Tolerance.setProperty("value", 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 + + #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 "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, "Unknown File", "File doesn't exist") + + def meshSmeshNameChanged(self): + """only change by GUI mouse selection, otherwise clear""" + #self.MeshIn=str(self.LE_MeshSmesh.text()) + #print "meshSmeshNameChanged", self.MeshIn + 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" + 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.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("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) __dialog=None def getDialog(): @@ -330,3 +457,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