Salome HOME
Pascale Noyret and rnc :
[modules/smesh.git] / src / Tools / YamsPlug / monYamsPlugDialog.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2012   EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20 # Modules Python
21 # Modules Eficas
22
23 import os
24 from YamsPlugDialog import Ui_YamsPlugDialog
25 from monViewText import MonViewText
26 from PyQt4.QtGui import *
27 from PyQt4.QtCore import *
28
29
30 class MonYamsPlugDialog(Ui_YamsPlugDialog,QWidget):
31   """
32   """
33   def __init__(self):
34         QWidget.__init__(self)
35         self.setupUi(self)
36         self.connecterSignaux()
37         self.fichierIn=""
38         self.fichierOut=""
39         self.MeshIn="" 
40         self.num=1
41
42 #       Ces parametres ne sont pas remis à rien par le clean
43         self.paramsFile= os.path.abspath(os.path.join(os.environ['HOME'],'.yams.dat'))
44         self.LE_ParamsFile.setText(self.paramsFile)
45         self.LE_MeshFile.setText("")
46         self.LE_MeshSmesh.setText("")
47
48   def connecterSignaux(self) :
49         self.connect(self.PB_Cancel,SIGNAL("clicked()"),self.PBCancelPressed)
50         self.connect(self.PB_Default,SIGNAL("clicked()"),self.clean)
51         self.connect(self.PB_Help,SIGNAL("clicked()"),self.PBHelpPressed)
52         self.connect(self.PB_Load,SIGNAL("clicked()"),self.PBLoadPressed)
53         self.connect(self.PB_OK,SIGNAL("clicked()"),self.PBOKPressed)
54         self.connect(self.PB_Save,SIGNAL("clicked()"),self.PBSavePressed)
55         self.connect(self.PB_MeshFile,SIGNAL("clicked()"),self.PBMeshFilePressed)
56         self.connect(self.PB_MeshSmesh,SIGNAL("clicked()"),self.PBMeshSmeshPressed)
57         self.connect(self.PB_ParamsFileExplorer,SIGNAL("clicked()"),self.setParamsFileName)
58         self.connect(self.LE_MeshFile,SIGNAL("returnPressed()"),self.meshFileNameChanged)
59         self.connect(self.LE_ParamsFile,SIGNAL("returnPressed()"),self.paramsFileNameChanged)
60
61
62   def PBHelpPressed(self):
63         try :
64           maDoc=os.environ['DISTENE_YAMS_DOC_PDF']
65         except Exception:
66           QMessageBox.warning( self, "Help unavailable", str(maDoc) + " not found")
67         try :  
68           commande='kpdf '+maDoc
69           os.system (commande)
70         except Exception:
71           old_ld=os.getenv("LD_LIBRARY_PATH")
72           command="unset LD_LIBRARY_PATH;"
73           command+="okular "+maDoc+";"
74           command+="export LD_LIBRARY_PATH=%s"%old_ld
75           os.system(command)
76
77   def PBOKPressed(self):
78         if not(self.PrepareLigneCommande()) : return
79         self.PBSavePressed(NomHypo=True)
80         maFenetre=MonViewText(self,self.commande)
81         if os.path.isfile(self.fichierOut) :self.enregistreResultat()
82
83   def enregistreResultat(self):
84         import smesh
85         import SMESH
86         import salome
87         from salome.kernel import studyedit
88
89         maStudy=studyedit.getActiveStudy()
90         smesh.SetCurrentStudy(maStudy)
91         (outputMesh, status) = smesh.CreateMeshesFromGMF(self.fichierOut)
92         meshname = 'yams'+str(self.num)
93         smesh.SetName(outputMesh.GetMesh(), meshname)
94         outputMesh.Compute()
95
96
97         self.editor = studyedit.getStudyEditor()    # 
98         moduleEntry=self.editor.findOrCreateComponent("SMESH","SMESH")
99         HypReMeshEntry = self.editor.findOrCreateItem( moduleEntry, name = 'HypoForRemesh',
100                                            comment = 'HypoForRemshing')
101         monStudyBuilder=maStudy.NewBuilder();
102         monStudyBuilder.NewCommand();
103         newStudyIter=monStudyBuilder.NewObject(HypReMeshEntry)
104         aNameAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeName")
105         hypoName = 'monHypo_Yams_'+str(self.num)
106         aNameAttrib.SetValue(hypoName)
107         aCommentAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeComment")
108         aCommentAttrib.SetValue(str(self.commande))
109         
110         SOMesh=maStudy.FindObjectByName(meshname ,"SMESH")[0]
111         newLink=monStudyBuilder.NewObject(SOMesh)
112         monStudyBuilder.Addreference(newLink, newStudyIter);
113         if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(0)
114         self.num+=1
115         return True
116
117   def PBSavePressed(self,NomHypo=False):
118         if NomHypo : text = '# Params for Hypothese : monHypo_Yams_'+str(self.num - 1)+"\n"
119         else :       text = '# Save intermediate params \n' 
120         text += "# Params for mesh : " +  self.LE_MeshSmesh.text() +'\n'
121         for RB in self.GBOptim.findChildren(QRadioButton,):
122             if RB.isChecked()==True:
123                text+="Optimisation ='"+RB.text()+"'\n"
124                break
125         for RB in self.GBUnit.findChildren(QRadioButton,):
126             if RB.isChecked()==True:
127                text+="Units ='"+RB.text()+"'\n"
128         text+='Chordal_Tolerance_Deviation='+str(self.SP_Tolerance.value())+'\n'
129
130         text+='Ridge_Detection=' + str(self.CB_Ridge.isChecked())+'\n'
131         text+='Split_Edge='      + str(self.CB_SplitEdge.isChecked())+'\n'
132         text+='Point_Smoothing=' + str(self.CB_Point.isChecked())+'\n'
133         text+='Geometrical_Approximation='+ str(self.SP_Geomapp.value())  +'\n'
134         text+='Ridge_Angle='              + str(self.SP_Ridge.value())    +'\n'
135         text+='Maximum_Size='             + str(self.SP_MaxSize.value())  +'\n'
136         text+='Minimum_Size='             + str(self.SP_MaxSize.value())  +'\n'
137         text+='Mesh_Gradation='           + str(self.SP_Gradation.value())+'\n'
138
139         text+='Verbosity='                + str(self.SP_Verbosity.value())+'\n'
140         text+='Memory='                   + str(self.SP_Memory.value())+'\n'
141         text+='\n\n'
142
143         try :
144            f=open(self.paramsFile,'a')
145         except :
146            QMessageBox.warning( self, "File", "Unable to open "+self.paramsFile)
147            return
148         try :
149            f.write(text)
150         except :
151            QMessageBox.warning( self, "File", "Unable to write "+self.paramsFile)
152            return
153         f.close()
154
155   def PBLoadPressed(self):
156         try :
157            f=open(self.paramsFile,'r')
158         except :
159            QMessageBox.warning( self, "File", "Unable to open "+self.paramsFile)
160            return
161         try :
162            text=f.read()
163         except :
164            QMessageBox.warning( self, "File", "Unable to read "+self.paramsFile)
165            return
166         f.close()
167         d={}
168         exec text in d
169         for RB in self.GBOptim.findChildren(QRadioButton,):
170             if d['Optimisation']== RB.text():
171                RB.setChecked(True)
172                break
173         for RB in self.GBUnit.findChildren(QRadioButton,):
174             if d['Units']== RB.text():
175                RB.setChecked(True)
176                break
177         self.SP_Tolerance.setValue(d['Chordal_Tolerance_Deviation'])
178
179         self.CB_Ridge.setChecked(d['Ridge_Detection'])
180         self.CB_Point.setChecked(d['Point_Smoothing'])
181         self.CB_SplitEdge.setChecked(d['Split_Edge'])
182         self.SP_Geomapp.setValue(d['Geometrical_Approximation'])
183         self.SP_Ridge.setValue(d['Ridge_Angle'])
184         self.SP_MaxSize.setValue(d['Maximum_Size'])
185         self.SP_MinSize.setValue(d['Minimum_Size'])
186         self.SP_Gradation.setValue(d['Mesh_Gradation'])
187
188         self.SP_Verbosity.setValue(d['Verbosity'])
189         self.SP_Memory.setValue(d['Memory'])
190
191
192   def PBCancelPressed(self):
193         self.close()
194
195   def PBMeshFilePressed(self):
196        fd = QFileDialog(self, "select an existing Mesh file", self.LE_MeshFile.text(), "Mesh-Files (*.mesh);;All Files (*)")
197        if fd.exec_():
198           infile = fd.selectedFiles()[0]
199           self.LE_MeshFile.setText(infile)
200           self.fichierIn=infile.toLatin1()
201
202   def setParamsFileName(self):
203        fd = QFileDialog(self, "select a file", self.LE_ParamsFile.text(), "dat Files (*.dat);;All Files (*)")
204        if fd.exec_():
205           infile = fd.selectedFiles()[0]
206           self.LE_ParamsFile.setText(infile)
207           self.paramsFile=infile.toLatin1()
208
209
210   def meshFileNameChanged(self):
211       self.fichierIn=self.LE_MeshFile.text()
212       if os.path.exists(self.fichierIn): return
213       QMessageBox.warning( self, "Unknown File", "File doesn't exist")
214
215   def paramsFileNameChanged(self):
216       self.paramsFile=self.LE_ParamsFile.text()
217
218   def PBMeshSmeshPressed(self):
219       import salome
220       import smesh
221       from salome.kernel import studyedit
222       from salome.smesh.smeshstudytools import SMeshStudyTools
223       from salome.gui import helper as guihelper
224       from omniORB import CORBA
225
226       mySObject, myEntry = guihelper.getSObjectSelected()
227       if CORBA.is_nil(mySObject) or mySObject==None:
228          QMessageBox.critical(self, "Mesh", "select an input mesh")
229          return
230       self.smeshStudyTool = SMeshStudyTools()
231       self.__selectedMesh = self.smeshStudyTool.getMeshObjectFromSObject(mySObject)
232       if CORBA.is_nil(self.__selectedMesh):
233          QMessageBox.critical(self, "Mesh", "select an input mesh")
234          return
235       myName = mySObject.GetName()
236       self.MeshIn=myName
237       self.LE_MeshSmesh.setText(myName)
238
239   def prepareFichier(self):
240       self.fichierIn="/tmp/PourYam_"+str(self.num)+".mesh"
241       import SMESH
242       self.__selectedMesh.ExportGMF(self.__selectedMesh,self.fichierIn, True)
243
244   def PrepareLigneCommande(self):
245       self.commande="yams "
246       verbosity=str(self.SP_Verbosity.value())
247       self.commande+="-v "+verbosity
248       for obj in self.mesRB.children():
249           try :
250            if obj.isChecked():
251               self.style=obj.objectName().remove(0,3)
252               self.style.replace("_","-")
253               break
254           except :
255               pass
256       self.commande+=" -O "+self.style.toLatin1()
257       if self.fichierIn=="" and self.MeshIn=="" :
258          QMessageBox.critical(self, "Mesh", "select an input mesh")
259          return False
260       if self.MeshIn!="" : self.prepareFichier()
261       if not (os.path.isfile(self.fichierIn)):
262          QMessageBox.critical(self, "File", "unable to read GMF Mesh in "+str(self.fichierIn))
263          return False
264
265       deb=os.path.splitext(self.fichierIn)
266       self.fichierOut=deb[0]+'.d.meshb'
267
268       if self.RB_Absolute.isChecked()==True :
269          self.commande+=' -Dabsolute'
270       else :
271          self.commande+=' -Drelative'
272       self.commande+=',tolerance=%f'%self.SP_Tolerance.value()
273       if self.CB_Ridge.isChecked()==False : self.commande+=',nr'
274       if self.CB_Point.isChecked()==False : self.commande+=',ns'
275       if self.SP_Geomapp.value()!=0.04 : self.commande+=',geomapp=%f'%self.SP_Geomapp.value()
276       if self.SP_Ridge.value()!=45.0 : self.commande+=',ridge=%f'%self.SP_Ridge.value()
277       if self.SP_MaxSize.value()!=100 : self.commande+=',maxsize=%f'%self.SP_MaxSize.value()
278       if self.SP_MinSize.value()!=5 : self.commande+=',minsize=%f'%self.SP_MinSize.value()
279       if self.SP_Gradation.value()!=1.3 : self.commande+=',gradation=%f'%self.SP_MaxSize.value()
280       if self.CB_SplitEdge.isChecked()==True : self.commande+=',splitedge=1'
281
282       if self.SP_Verbosity.value()!=3 : self.commande+=' -v %d'%self.SP_Verbosity.value()
283       if self.SP_Memory.value()!=0 : self.commande+=' -m %d'%self.SP_Memory.value()
284
285       self.commande+=" "+self.fichierIn
286       return True
287
288   def clean(self):
289         self.RB_0.setChecked(True)
290         self.RB_G.setChecked(False)
291         self.RB_U.setChecked(False)
292         self.RB_S.setChecked(False)
293         self.RB_2.setChecked(False)
294         self.RB_1.setChecked(False)
295         self.RB_Absolute.setChecked(False)
296         self.RB_Relative.setChecked(True)
297         self.SP_Tolerance.setProperty("value", 0.1)
298         self.SP_Geomapp.setProperty("value", 0.04)
299         self.SP_Ridge.setProperty("value", 45.0)
300         self.SP_Gradation.setProperty("value", 1.3)
301         self.CB_Ridge.setChecked(True)
302         self.CB_Point.setChecked(True)
303         self.CB_SplitEdge.setChecked(False)
304         self.SP_MaxSize.setProperty("value", -2.0)
305         self.SP_MinSize.setProperty("value", -2.0)
306         self.SP_Verbosity.setProperty("value", 3)
307         self.SP_Memory.setProperty("value", 0)
308
309
310 __dialog=None
311 def getDialog():
312     """
313     This function returns a singleton instance of the plugin dialog.
314     c est obligatoire pour faire un show sans parent...
315     """
316     global __dialog
317     if __dialog is None:
318         __dialog = MonYamsPlugDialog()
319     #else :
320     #   __dialog.clean()
321     return __dialog
322